return;
}
- if (v->via) {
- ast_free(v->via);
- }
-
+ ast_free(v->via);
ast_free(v);
}
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"));
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;
}
/* 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;