diff --git a/channels/chan_sip.c b/channels/chan_sip.c index becd4c2c00..61d2805505 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -4973,10 +4973,7 @@ static void free_via(struct sip_via *v) return; } - if (v->via) { - ast_free(v->via); - } - + ast_free(v->via); ast_free(v); } @@ -5099,6 +5096,21 @@ static int addr_is_multicast(struct in_addr *addr) return ((ntohl(addr->s_addr) & 0xf0000000) == 0xe0000000); } +/*! + * \brief Process the Via header according to RFC 3261 section 18.2.2. + * \param p a sip_pvt structure that will be modified according to the received + * header + * \param req a sip request with a Via header to process + * + * This function will update the destination of the response according to the + * Via header in the request and RFC 3261 section 18.2.2. We do not have a + * transport layer so we ignore certain values like the 'received' param (we + * set the destination address to the addres the request came from in the + * respprep() function). + * + * \retval -1 error + * \retval 0 success + */ static int process_via(struct sip_pvt *p, const struct sip_request *req) { struct sip_via *via = parse_via(get_header(req, "Via")); @@ -5123,17 +5135,13 @@ static int process_via(struct sip_pvt *p, const struct sip_request *req) p->sa.sin_family = AF_INET; memcpy(&p->sa.sin_addr, hp->h_addr, sizeof(p->sa.sin_addr)); - if (via->port) { - p->sa.sin_port = via->port; - } else { - p->sa.sin_port = STANDARD_SIP_PORT; - } - if (addr_is_multicast(&p->sa.sin_addr)) { setsockopt(sipsock, IPPROTO_IP, IP_MULTICAST_TTL, &via->ttl, sizeof(via->ttl)); } } + p->sa.sin_port = htons(via->port ? via->port : STANDARD_SIP_PORT); + free_via(via); return 0; } @@ -6785,6 +6793,9 @@ static int respprep(struct sip_request *resp, struct sip_pvt *p, const char *msg /* default to routing the response to the address where the request * came from. Since we don't have a transport layer, we do this here. + * The process_via() function will update the port to either the port + * specified in the via header or the default port later on (per RFC + * 3261 section 18.2.2). */ p->sa = p->recv;