summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2008-05-28 14:29:01 +0000
committerJoshua Colp <jcolp@digium.com>2008-05-28 14:29:01 +0000
commite4d1b39bd81fde458257d60d0f7db324e3489bbd (patch)
tree0e360294402c765b18827a7ce00a4a29b84f222b /channels
parentbf13b4df4e490955e0eaebec56e81560b17d876d (diff)
Merged revisions 118646 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r118646 | file | 2008-05-28 11:23:34 -0300 (Wed, 28 May 2008) | 4 lines Add an option to use the source IP address of RTP as the destination IP address of UDPTL when a specific option is enabled. If the remote side is properly configured (ports forwarded) then UDPTL will flow. (closes issue #10417) Reported by: cstadlmann ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@118647 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 9dbbcfe7b..0fcc579d6 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1010,11 +1010,12 @@ struct sip_auth {
#define SIP_PAGE2_RFC2833_COMPENSATE (1 << 25) /*!< DP: Compensate for buggy RFC2833 implementations */
#define SIP_PAGE2_BUGGY_MWI (1 << 26) /*!< DP: Buggy CISCO MWI fix */
#define SIP_PAGE2_REGISTERTRYING (1 << 29) /*!< DP: Send 100 Trying on REGISTER attempts */
+#define SIP_PAGE2_UDPTL_DESTINATION (1 << 30) /*!< DP: Use source IP of RTP as destination if NAT is enabled */
#define SIP_PAGE2_FLAGS_TO_COPY \
(SIP_PAGE2_ALLOWSUBSCRIBE | SIP_PAGE2_ALLOWOVERLAP | SIP_PAGE2_VIDEOSUPPORT | \
SIP_PAGE2_T38SUPPORT | SIP_PAGE2_RFC2833_COMPENSATE | SIP_PAGE2_BUGGY_MWI | \
- SIP_PAGE2_TEXTSUPPORT )
+ SIP_PAGE2_TEXTSUPPORT | SIP_PAGE2_UDPTL_DESTINATION)
/*@}*/
@@ -6889,6 +6890,16 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
if (p->udptl) {
if (udptlportno > 0) {
sin.sin_port = htons(udptlportno);
+ if (ast_test_flag(&p->flags[0], SIP_NAT) && ast_test_flag(&p->flags[1], SIP_PAGE2_UDPTL_DESTINATION)) {
+ struct sockaddr_in peer;
+ ast_rtp_get_peer(p->rtp, &peer);
+ if (peer.sin_addr.s_addr) {
+ memcpy(&sin.sin_addr, &peer.sin_addr, sizeof(&sin.sin_addr));
+ if (debug) {
+ ast_log(LOG_DEBUG, "Peer T.38 UDPTL is set behind NAT and with destination, destination address now %s\n", ast_inet_ntoa(sin.sin_addr));
+ }
+ }
+ }
ast_udptl_set_peer(p->udptl, &sin);
if (debug)
ast_debug(1, "Peer T.38 UDPTL is at port %s:%d\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
@@ -20455,6 +20466,9 @@ static int handle_common_options(struct ast_flags *flags, struct ast_flags *mask
} else if (!strcasecmp(v->name, "buggymwi")) {
ast_set_flag(&mask[1], SIP_PAGE2_BUGGY_MWI);
ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_BUGGY_MWI);
+ } else if (!strcasecmp(v->name, "t38pt_usertpsource")) {
+ ast_set_flag(&mask[1], SIP_PAGE2_UDPTL_DESTINATION);
+ ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_UDPTL_DESTINATION);
} else
res = 0;