aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_sip.c
diff options
context:
space:
mode:
Diffstat (limited to 'channels/chan_sip.c')
-rw-r--r--channels/chan_sip.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 8c7be2b37..fb501816e 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1720,7 +1720,7 @@ static int sip_queryoption(struct ast_channel *chan, int option, void *data, int
static const char *sip_get_callid(struct ast_channel *chan);
static int handle_request_do(struct sip_request *req, struct sockaddr_in *sin);
-static int sip_standard_port(struct sip_socket s);
+static int sip_standard_port(enum sip_transport type, int port);
static int sip_prepare_socket(struct sip_pvt *p);
static int sip_parse_host(char *line, int lineno, char **hostname, int *portnum, enum sip_transport *transport);
@@ -8776,14 +8776,16 @@ static void extract_uri(struct sip_pvt *p, struct sip_request *req)
/*! \brief Build contact header - the contact header we send out */
static void build_contact(struct sip_pvt *p)
{
- /* Construct Contact: header */
+
+ int ourport = ntohs(p->ourip.sin_port);
+
if (p->socket.type & SIP_TRANSPORT_UDP) {
- if (!sip_standard_port(p->socket))
- ast_string_field_build(p, our_contact, "<sip:%s%s%s:%d>", p->exten, ast_strlen_zero(p->exten) ? "" : "@", ast_inet_ntoa(p->ourip.sin_addr), ntohs(p->socket.port));
+ if (!sip_standard_port(p->socket.type, ourport))
+ ast_string_field_build(p, our_contact, "<sip:%s%s%s:%d>", p->exten, ast_strlen_zero(p->exten) ? "" : "@", ast_inet_ntoa(p->ourip.sin_addr), ourport);
else
ast_string_field_build(p, our_contact, "<sip:%s%s%s>", p->exten, ast_strlen_zero(p->exten) ? "" : "@", ast_inet_ntoa(p->ourip.sin_addr));
} else
- ast_string_field_build(p, our_contact, "<sip:%s%s%s:%d;transport=%s>", p->exten, ast_strlen_zero(p->exten) ? "" : "@", ast_inet_ntoa(p->ourip.sin_addr), ntohs(p->socket.port), get_transport_pvt(p));
+ ast_string_field_build(p, our_contact, "<sip:%s%s%s:%d;transport=%s>", p->exten, ast_strlen_zero(p->exten) ? "" : "@", ast_inet_ntoa(p->ourip.sin_addr), ourport, get_transport(p->socket.type));
}
/*! \brief Build the Remote Party-ID & From using callingpres options */
@@ -8876,6 +8878,7 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, int sipmetho
const char *l = NULL; /* XXX what is this, exactly ? */
const char *n = NULL; /* XXX what is this, exactly ? */
const char *urioptions = "";
+ int ourport;
if (ast_test_flag(&p->flags[0], SIP_USEREQPHONE)) {
const char *s = p->username; /* being a string field, cannot be NULL */
@@ -8932,8 +8935,9 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, int sipmetho
l = tmp_l;
}
- if (!sip_standard_port(p->socket) && ast_strlen_zero(p->fromdomain))
- snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s:%d>;tag=%s", n, l, S_OR(p->fromdomain, ast_inet_ntoa(p->ourip.sin_addr)), ntohs(p->socket.port), p->tag);
+ ourport = ntohs(p->ourip.sin_port);
+ if (!sip_standard_port(p->socket.type, ourport) && ast_strlen_zero(p->fromdomain))
+ snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s:%d>;tag=%s", n, l, ast_inet_ntoa(p->ourip.sin_addr), ourport, p->tag);
else
snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=%s", n, l, S_OR(p->fromdomain, ast_inet_ntoa(p->ourip.sin_addr)), p->tag);
@@ -19003,13 +19007,18 @@ static int handle_request_do(struct sip_request *req, struct sockaddr_in *sin)
return 1;
}
-/*! \brief Returns the port to use for this socket */
-static int sip_standard_port(struct sip_socket s)
+/*! \brief Returns the port to use for this socket
+ *
+ * \param type The type of transport used
+ * \param port Port we are checking to see if it's the standard port.
+ * \note port is expected in host byte order
+ */
+static int sip_standard_port(enum sip_transport type, int port)
{
- if (s.type & SIP_TRANSPORT_TLS)
- return s.port == htons(STANDARD_TLS_PORT);
+ if (type & SIP_TRANSPORT_TLS)
+ return port == STANDARD_TLS_PORT;
else
- return s.port == htons(STANDARD_SIP_PORT);
+ return port == STANDARD_SIP_PORT;
}
/*!