diff --git a/ChangeLog b/ChangeLog index c537df9..acaaafa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 0.7.3 ===== + 27-Oct-2009: - Make local UA to local UA calls work better with UAs that + blindly practice symmetric RTP and ignore the SDP media + description completely (did anyone shout X-Lite?) 0.7.2 ===== diff --git a/src/proxy.c b/src/proxy.c index 34f4633..cc5d273 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2008 Thomas Ries + Copyright (C) 2002-2009 Thomas Ries This file is part of Siproxd. @@ -779,6 +779,7 @@ int proxy_rewrite_invitation_body(sip_ticket_t *ticket, int direction){ sdp_connection_t *sdp_conn; sdp_media_t *sdp_med; int rtp_direction=0; + int call_direction=0; int have_c_media=0; int isrtp = 0 ; @@ -850,18 +851,22 @@ if (configuration.debuglevel) if (MSG_IS_REQUEST(mymsg)) { if (direction == DIR_INCOMING) { memcpy(&map_addr, &inside_addr, sizeof (map_addr)); - rtp_direction = DIR_OUTGOING; + rtp_direction = DIR_OUTGOING; + call_direction = DIR_INCOMING; } else { memcpy(&map_addr, &outside_addr, sizeof (map_addr)); - rtp_direction = DIR_INCOMING; + rtp_direction = DIR_INCOMING; + call_direction = DIR_OUTGOING; } } else /* MSG_IS_REPONSE(mymsg) */ { if (direction == DIR_INCOMING) { memcpy(&map_addr, &inside_addr, sizeof (map_addr)); - rtp_direction = DIR_OUTGOING; + rtp_direction = DIR_OUTGOING; + call_direction = DIR_OUTGOING; } else { memcpy(&map_addr, &outside_addr, sizeof (map_addr)); - rtp_direction = DIR_INCOMING; + rtp_direction = DIR_INCOMING; + call_direction = DIR_INCOMING; } } @@ -1104,9 +1109,12 @@ if (configuration.debuglevel) } } + /* + * Start the RTP stream + */ sts = rtp_start_fwd(osip_message_get_call_id(mymsg), client_id, - rtp_direction, + rtp_direction, call_direction, media_stream_no, map_addr, &map_port, addr_media, msg_port, diff --git a/src/rtpproxy.c b/src/rtpproxy.c index 2145171..a0c9528 100644 --- a/src/rtpproxy.c +++ b/src/rtpproxy.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2003-2008 Thomas Ries + Copyright (C) 2003-2009 Thomas Ries This file is part of Siproxd. @@ -73,7 +73,7 @@ int rtpproxy_init( void ) { * STS_FAILURE on error */ int rtp_start_fwd (osip_call_id_t *callid, client_id_t client_id, - int direction, int media_stream_no, + int direction, int call_direction, int media_stream_no, struct in_addr local_ipaddr, int *local_port, struct in_addr remote_ipaddr, int remote_port, int isrtp) { @@ -91,7 +91,7 @@ int rtp_start_fwd (osip_call_id_t *callid, client_id_t client_id, } } sts = rtp_relay_start_fwd (callid, client_id, - direction, media_stream_no, + direction, call_direction, media_stream_no, local_ipaddr, local_port, remote_ipaddr, remote_port, dejitter); } else { diff --git a/src/rtpproxy.h b/src/rtpproxy.h index 1df4f41..17d3cab 100644 --- a/src/rtpproxy.h +++ b/src/rtpproxy.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2003-2008 Thomas Ries + Copyright (C) 2003-2009 Thomas Ries This file is part of Siproxd. @@ -50,6 +50,7 @@ typedef struct { char callid_host[CALLIDHOST_SIZE]; /* --"-- */ client_id_t client_id; int direction; /* Direction of RTP stream */ + int call_direction; /* Direction of Call DIR_x */ int media_stream_no; timecontrol_t tc; /* de-jitter feature */ struct in_addr local_ipaddr; /* local IP */ @@ -65,7 +66,7 @@ typedef struct { */ int rtp_relay_init(void); int rtp_relay_start_fwd (osip_call_id_t *callid, client_id_t client_id, - int rtp_direction, int media_stream_no, + int rtp_direction, int call_direction, int media_stream_no, struct in_addr local_ipaddr, int *local_port, struct in_addr remote_ipaddr, int remote_port, int dejitter); diff --git a/src/rtpproxy_relay.c b/src/rtpproxy_relay.c index a1ca245..6f79d8f 100644 --- a/src/rtpproxy_relay.c +++ b/src/rtpproxy_relay.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2003-2008 Thomas Ries + Copyright (C) 2003-2009 Thomas Ries This file is part of Siproxd. @@ -487,7 +487,7 @@ static void *rtpproxy_main(void *arg) { * STS_FAILURE on error */ int rtp_relay_start_fwd (osip_call_id_t *callid, client_id_t client_id, - int rtp_direction, + int rtp_direction, int call_direction, int media_stream_no, struct in_addr local_ipaddr, int *local_port, struct in_addr remote_ipaddr, int remote_port, int dejitter) { @@ -526,9 +526,10 @@ int rtp_relay_start_fwd (osip_call_id_t *callid, client_id_t client_id, } DEBUGC(DBCLASS_RTP,"rtp_relay_start_fwd: starting RTP proxy " - "stream for: CallID=%s@%s [Client-ID=%s] (%s) #=%i", + "stream for: CallID=%s@%s [Client-ID=%s] (%s,%s) #=%i", callid->number, callid->host, client_id.idstring, ((rtp_direction == DIR_INCOMING) ? "incoming RTP" : "outgoing RTP"), + ((call_direction == DIR_INCOMING) ? "incoming Call" : "outgoing Call"), media_stream_no); /* lock mutex */ @@ -1004,13 +1005,14 @@ static void rtpproxy_kill( void ) { /* * match_socket * matches and cross connects two rtp_proxytable entries - * (corresponds to the two data directions of one RTP stream) + * (corresponds to the two data directions of one RTP stream + * within one call). */ static void match_socket (int rtp_proxytable_idx) { int j; int rtp_direction = rtp_proxytable[rtp_proxytable_idx].direction; + int call_direction = rtp_proxytable[rtp_proxytable_idx].call_direction; int media_stream_no = rtp_proxytable[rtp_proxytable_idx].media_stream_no; -/*chnnel int channel = rtp_proxytable[rtp_proxytable_idx].channel;*/ osip_call_id_t callid; callid.number = rtp_proxytable[rtp_proxytable_idx].callid_number; @@ -1028,10 +1030,10 @@ static void match_socket (int rtp_proxytable_idx) { * - different client ID */ if ( (rtp_proxytable[j].rtp_rx_sock != 0) && - (compare_callid(&callid, &cid) == STS_SUCCESS) && - (media_stream_no == rtp_proxytable[j].media_stream_no) && - (rtp_direction != rtp_proxytable[j].direction) /* channel: && - (channel == rtp_proxytable[j].channel)*/ ) { + (compare_callid(&callid, &cid) == STS_SUCCESS) && // same Call-ID + (call_direction == rtp_proxytable[j].call_direction) && // same Call direction + (media_stream_no == rtp_proxytable[j].media_stream_no) && // same stream + (rtp_direction != rtp_proxytable[j].direction) ) { // opposite RTP dir char remip1[16], remip2[16]; char lclip1[16], lclip2[16]; diff --git a/src/siproxd.h b/src/siproxd.h index 8b77910..711b7d7 100644 --- a/src/siproxd.h +++ b/src/siproxd.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2008 Thomas Ries + Copyright (C) 2002-2009 Thomas Ries This file is part of Siproxd. @@ -217,7 +217,7 @@ int make_default_config(void); /*X*/ /* rtpproxy.c */ int rtpproxy_init( void ); /*X*/ int rtp_start_fwd (osip_call_id_t *callid, client_id_t client_id, /*X*/ - int direction, int media_stream_no, + int direction, int call_direction, int media_stream_no, struct in_addr outbound_ipaddr, int *outboundport, struct in_addr lcl_client_ipaddr, int lcl_clientport, int isrtp);