|
|
|
@ -3937,47 +3937,47 @@ static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, struct s
|
|
|
|
|
if (ast_strlen_zero(oh))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if (!copied) { /* Only check for empty rport in topmost via header */
|
|
|
|
|
char iabuf[INET_ADDRSTRLEN];
|
|
|
|
|
char *rport;
|
|
|
|
|
if (!copied) { /* Only check for empty rport in topmost via header */
|
|
|
|
|
char iabuf[INET_ADDRSTRLEN];
|
|
|
|
|
char *rport;
|
|
|
|
|
|
|
|
|
|
/* Find ;rport; (empty request) */
|
|
|
|
|
rport = strstr(oh, ";rport");
|
|
|
|
|
if (rport && *(rport+6) == '=')
|
|
|
|
|
rport = NULL; /* We already have a parameter to rport */
|
|
|
|
|
/* Find ;rport; (empty request) */
|
|
|
|
|
rport = strstr(oh, ";rport");
|
|
|
|
|
if (rport && *(rport+6) == '=')
|
|
|
|
|
rport = NULL; /* We already have a parameter to rport */
|
|
|
|
|
|
|
|
|
|
if (rport && ast_test_flag(&p->flags[0], SIP_NAT) == SIP_NAT_ALWAYS) {
|
|
|
|
|
/* We need to add received port - rport */
|
|
|
|
|
char tmp[256], *end;
|
|
|
|
|
if (rport && ast_test_flag(&p->flags[0], SIP_NAT) == SIP_NAT_ALWAYS) {
|
|
|
|
|
/* We need to add received port - rport */
|
|
|
|
|
char tmp[256], *end;
|
|
|
|
|
|
|
|
|
|
ast_copy_string(tmp, oh, sizeof(tmp));
|
|
|
|
|
ast_copy_string(tmp, oh, sizeof(tmp));
|
|
|
|
|
|
|
|
|
|
rport = strstr(tmp, ";rport");
|
|
|
|
|
rport = strstr(tmp, ";rport");
|
|
|
|
|
|
|
|
|
|
if (rport) {
|
|
|
|
|
end = strchr(rport + 1, ';');
|
|
|
|
|
if (end)
|
|
|
|
|
memmove(rport, end, strlen(end) + 1);
|
|
|
|
|
else
|
|
|
|
|
*rport = '\0';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Add rport to first VIA header if requested */
|
|
|
|
|
/* Whoo hoo! Now we can indicate port address translation too! Just
|
|
|
|
|
another RFC (RFC3581). I'll leave the original comments in for
|
|
|
|
|
posterity. */
|
|
|
|
|
snprintf(new, sizeof(new), "%s;received=%s;rport=%d",
|
|
|
|
|
tmp, ast_inet_ntoa(iabuf, sizeof(iabuf), p->recv.sin_addr),
|
|
|
|
|
ntohs(p->recv.sin_port));
|
|
|
|
|
} else {
|
|
|
|
|
/* We should *always* add a received to the topmost via */
|
|
|
|
|
snprintf(new, sizeof(new), "%s;received=%s",
|
|
|
|
|
oh, ast_inet_ntoa(iabuf, sizeof(iabuf), p->recv.sin_addr));
|
|
|
|
|
if (rport) {
|
|
|
|
|
end = strchr(rport + 1, ';');
|
|
|
|
|
if (end)
|
|
|
|
|
memmove(rport, end, strlen(end) + 1);
|
|
|
|
|
else
|
|
|
|
|
*rport = '\0';
|
|
|
|
|
}
|
|
|
|
|
oh = new; /* the header to copy */
|
|
|
|
|
} /* else add the following via headers untouched */
|
|
|
|
|
add_header(req, field, oh);
|
|
|
|
|
copied++;
|
|
|
|
|
|
|
|
|
|
/* Add rport to first VIA header if requested */
|
|
|
|
|
/* Whoo hoo! Now we can indicate port address translation too! Just
|
|
|
|
|
another RFC (RFC3581). I'll leave the original comments in for
|
|
|
|
|
posterity. */
|
|
|
|
|
snprintf(new, sizeof(new), "%s;received=%s;rport=%d",
|
|
|
|
|
tmp, ast_inet_ntoa(iabuf, sizeof(iabuf), p->recv.sin_addr),
|
|
|
|
|
ntohs(p->recv.sin_port));
|
|
|
|
|
} else {
|
|
|
|
|
/* We should *always* add a received to the topmost via */
|
|
|
|
|
snprintf(new, sizeof(new), "%s;received=%s",
|
|
|
|
|
oh, ast_inet_ntoa(iabuf, sizeof(iabuf), p->recv.sin_addr));
|
|
|
|
|
}
|
|
|
|
|
oh = new; /* the header to copy */
|
|
|
|
|
} /* else add the following via headers untouched */
|
|
|
|
|
add_header(req, field, oh);
|
|
|
|
|
copied++;
|
|
|
|
|
}
|
|
|
|
|
if (!copied) {
|
|
|
|
|
ast_log(LOG_NOTICE, "No header field '%s' present to copy\n", field);
|
|
|
|
|