@ -1010,11 +1010,12 @@ struct sip_auth {
# define SIP_PAGE2_RFC2833_COMPENSATE (1 << 25) /*!< DP: Compensate for buggy RFC2833 implementations */
# 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_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_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 \
# define SIP_PAGE2_FLAGS_TO_COPY \
( SIP_PAGE2_ALLOWSUBSCRIBE | SIP_PAGE2_ALLOWOVERLAP | SIP_PAGE2_VIDEOSUPPORT | \
( 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_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 ( p - > udptl ) {
if ( udptlportno > 0 ) {
if ( udptlportno > 0 ) {
sin . sin_port = htons ( udptlportno ) ;
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 ) ;
ast_udptl_set_peer ( p - > udptl , & sin ) ;
if ( debug )
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 ) ) ;
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 " ) ) {
} else if ( ! strcasecmp ( v - > name , " buggymwi " ) ) {
ast_set_flag ( & mask [ 1 ] , SIP_PAGE2_BUGGY_MWI ) ;
ast_set_flag ( & mask [ 1 ] , SIP_PAGE2_BUGGY_MWI ) ;
ast_set2_flag ( & flags [ 1 ] , ast_true ( v - > value ) , 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
} else
res = 0 ;
res = 0 ;