summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
Diffstat (limited to 'res')
-rw-r--r--res/res_pjsip_sdp_rtp.c11
-rw-r--r--res/res_pjsip_session.c10
-rw-r--r--res/res_pjsip_t38.c11
3 files changed, 21 insertions, 11 deletions
diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c
index b8ae8c185..16ffaca3f 100644
--- a/res/res_pjsip_sdp_rtp.c
+++ b/res/res_pjsip_sdp_rtp.c
@@ -1506,7 +1506,7 @@ static void change_outgoing_sdp_stream_media_address(pjsip_tx_data *tdata, struc
{
RAII_VAR(struct ast_sip_transport_state *, transport_state, ast_sip_get_transport_state(ast_sorcery_object_get_id(transport)), ao2_cleanup);
char host[NI_MAXHOST];
- struct ast_sockaddr addr = { { 0, } };
+ struct ast_sockaddr our_sdp_addr = { { 0, } };
/* If the stream has been rejected there will be no connection line */
if (!stream->conn || !transport_state) {
@@ -1514,10 +1514,13 @@ static void change_outgoing_sdp_stream_media_address(pjsip_tx_data *tdata, struc
}
ast_copy_pj_str(host, &stream->conn->addr, sizeof(host));
- ast_sockaddr_parse(&addr, host, PARSE_PORT_FORBID);
+ ast_sockaddr_parse(&our_sdp_addr, host, PARSE_PORT_FORBID);
- /* Is the address within the SDP inside the same network? */
- if (ast_sip_transport_is_local(transport_state, &addr)) {
+ /* Reversed check here. We don't check the remote endpoint being
+ * in our local net, but whether our outgoing session IP is
+ * local. If it is not, we won't do rewriting. No localnet
+ * configured? Always rewrite. */
+ if (ast_sip_transport_is_nonlocal(transport_state, &our_sdp_addr) && transport_state->localnet) {
return;
}
ast_debug(5, "Setting media address to %s\n", ast_sockaddr_stringify_host(&transport_state->external_media_address));
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index ab6fce2c8..3d73862b6 100644
--- a/res/res_pjsip_session.c
+++ b/res/res_pjsip_session.c
@@ -3190,12 +3190,16 @@ static void session_outgoing_nat_hook(pjsip_tx_data *tdata, struct ast_sip_trans
if (sdp->conn) {
char host[NI_MAXHOST];
- struct ast_sockaddr addr = { { 0, } };
+ struct ast_sockaddr our_sdp_addr = { { 0, } };
ast_copy_pj_str(host, &sdp->conn->addr, sizeof(host));
- ast_sockaddr_parse(&addr, host, PARSE_PORT_FORBID);
+ ast_sockaddr_parse(&our_sdp_addr, host, PARSE_PORT_FORBID);
- if (ast_sip_transport_is_nonlocal(transport_state, &addr)) {
+ /* Reversed check here. We don't check the remote
+ * endpoint being in our local net, but whether our
+ * outgoing session IP is local. If it is, we'll do
+ * rewriting. No localnet configured? Always rewrite. */
+ if (ast_sip_transport_is_local(transport_state, &our_sdp_addr) || !transport_state->localnet) {
ast_debug(5, "Setting external media address to %s\n", ast_sockaddr_stringify_host(&transport_state->external_media_address));
pj_strdup2(tdata->pool, &sdp->conn->addr, ast_sockaddr_stringify_host(&transport_state->external_media_address));
}
diff --git a/res/res_pjsip_t38.c b/res/res_pjsip_t38.c
index 58da6a080..5f04f0e32 100644
--- a/res/res_pjsip_t38.c
+++ b/res/res_pjsip_t38.c
@@ -871,7 +871,7 @@ static void change_outgoing_sdp_stream_media_address(pjsip_tx_data *tdata, struc
{
RAII_VAR(struct ast_sip_transport_state *, transport_state, ast_sip_get_transport_state(ast_sorcery_object_get_id(transport)), ao2_cleanup);
char host[NI_MAXHOST];
- struct ast_sockaddr addr = { { 0, } };
+ struct ast_sockaddr our_sdp_addr = { { 0, } };
/* If the stream has been rejected there will be no connection line */
if (!stream->conn || !transport_state) {
@@ -879,10 +879,13 @@ static void change_outgoing_sdp_stream_media_address(pjsip_tx_data *tdata, struc
}
ast_copy_pj_str(host, &stream->conn->addr, sizeof(host));
- ast_sockaddr_parse(&addr, host, PARSE_PORT_FORBID);
+ ast_sockaddr_parse(&our_sdp_addr, host, PARSE_PORT_FORBID);
- /* Is the address within the SDP inside the same network? */
- if (ast_sip_transport_is_local(transport_state, &addr)) {
+ /* Reversed check here. We don't check the remote endpoint being
+ * in our local net, but whether our outgoing session IP is
+ * local. If it is not, we won't do rewriting. No localnet
+ * configured? Always rewrite. */
+ if (ast_sip_transport_is_nonlocal(transport_state, &our_sdp_addr) && transport_state->localnet) {
return;
}
ast_debug(5, "Setting media address to %s\n", ast_sockaddr_stringify_host(&transport_state->external_media_address));