mirror of
https://github.com/asterisk/asterisk.git
synced 2026-07-20 10:57:18 -07:00
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/branches/1.4@118646 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -306,6 +306,7 @@ Changes since Asterisk 1.2:
|
||||
o canreinvite variable can also now be set to 'nonat'
|
||||
o rtsavesysname variable added
|
||||
o JitterBuffer support added
|
||||
o t38pt_usertpsource variable added
|
||||
23. skinny.conf
|
||||
o port variable renamed to bindport
|
||||
o JitterBuffer support added
|
||||
|
||||
+15
-1
@@ -795,10 +795,11 @@ struct sip_auth {
|
||||
#define SIP_PAGE2_RFC2833_COMPENSATE (1 << 25) /*!< 25: ???? */
|
||||
#define SIP_PAGE2_BUGGY_MWI (1 << 26) /*!< 26: Buggy CISCO MWI fix */
|
||||
#define SIP_PAGE2_OUTGOING_CALL (1 << 27) /*!< 27: Is this an outgoing call? */
|
||||
#define SIP_PAGE2_UDPTL_DESTINATION (1 << 28) /*!< 28: 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_T38SUPPORT | SIP_PAGE2_RFC2833_COMPENSATE | SIP_PAGE2_BUGGY_MWI | SIP_PAGE2_UDPTL_DESTINATION)
|
||||
|
||||
/* SIP packet flags */
|
||||
#define SIP_PKT_DEBUG (1 << 0) /*!< Debug this packet */
|
||||
@@ -5203,6 +5204,16 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req)
|
||||
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_log(LOG_DEBUG,"Peer T.38 UDPTL is at port %s:%d\n",ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
|
||||
@@ -16294,6 +16305,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;
|
||||
|
||||
|
||||
@@ -484,7 +484,7 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls
|
||||
; videosupport videosupport
|
||||
; maxcallbitrate maxcallbitrate
|
||||
; rfc2833compensate mailbox
|
||||
; username
|
||||
; t38pt_usertpsource username
|
||||
; template
|
||||
; fromdomain
|
||||
; regexten
|
||||
@@ -498,6 +498,7 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls
|
||||
; sendrpid
|
||||
; outboundproxy
|
||||
; rfc2833compensate
|
||||
; t38pt_usertpsource
|
||||
|
||||
;[sip_proxy]
|
||||
; For incoming calls only. Example: FWD (Free World Dialup)
|
||||
@@ -662,3 +663,7 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls
|
||||
;host=dynamic
|
||||
;rfc2833compensate=yes ; Compensate for pre-1.4 DTMF transmission from another Asterisk machine.
|
||||
; You must have this turned on or DTMF reception will work improperly.
|
||||
;t38pt_usertpsource=yes ; Use the source IP address of RTP as the destination IP address for UDPTL packets
|
||||
; if the nat option is enabled. If a single RTP packet is received Asterisk will know the
|
||||
; external IP address of the remote device. If port forwarding is done at the client side
|
||||
; then UDPTL will flow to the remote device.
|
||||
|
||||
Reference in New Issue
Block a user