Module: sip-router
Branch: master
Commit: 7b7791c3e578e57ab33e9381d876ac3cf9103b8b
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7b7791c…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Sat May 28 08:57:19 2011 +0200
rpproxy: new function rtpproxy_manage()
- auto-pilot function to handle rtp proxy session management
- it can take same kind of parameters as rtpproxy_offer()
- embeds the functionality of rtpproxy_offer(), rtpproxy_answer() and
unfroce_rtp_proxy():
- if INVITE with SDP, then do rtpproxy offer
- if INVITE with sdp, when tm is loaded, mark transaction with
internal flag FL_SDP_BODY to know that the 1xx and 2xx are for rtp
answer
- if ACK with SDP, then do rtpproxy answer
- if BYE or CANCEL, then do unforce rtpproxy
- if reply to INVITE with code >= 300 do unfrce rtp proxy
- if reply with SDP to INVITE having code 1xx and 2xx, then do rtpproxy
answer if the request had SDP or tm is not loaded, otherwise do
rtpproxy offer
---
modules/rtpproxy/rtpproxy.c | 101 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 101 insertions(+), 0 deletions(-)
diff --git a/modules/rtpproxy/rtpproxy.c b/modules/rtpproxy/rtpproxy.c
index 23a8a2d..15cfcc1 100644
--- a/modules/rtpproxy/rtpproxy.c
+++ b/modules/rtpproxy/rtpproxy.c
@@ -219,6 +219,7 @@
#include "../../socket_info.h"
#include "../../mod_fix.h"
#include "../../dset.h"
+#include "../../modules/tm/tm_load.h"
#include "rtpproxy.h"
#include "rtpproxy_funcs.h"
#include "rtpproxy_stream.h"
@@ -290,6 +291,9 @@ static int rtpproxy_answer1_f(struct sip_msg *, char *, char *);
static int rtpproxy_answer2_f(struct sip_msg *, char *, char *);
static int rtpproxy_offer1_f(struct sip_msg *, char *, char *);
static int rtpproxy_offer2_f(struct sip_msg *, char *, char *);
+static int rtpproxy_manage0(struct sip_msg *msg, char *flags, char *ip);
+static int rtpproxy_manage1(struct sip_msg *msg, char *flags, char *ip);
+static int rtpproxy_manage2(struct sip_msg *msg, char *flags, char *ip);
static int add_rtpproxy_socks(struct rtpp_set * rtpp_list, char * rtpproxy);
static int fixup_set_id(void ** param, int param_no);
@@ -334,6 +338,9 @@ static unsigned int rtpp_no = 0;
static int *rtpp_socks = 0;
+/* tm */
+static struct tm_binds tmb;
+
/*0-> disabled, 1 ->enabled*/
unsigned int *natping_state=0;
@@ -379,6 +386,15 @@ static cmd_export_t cmds[] = {
{"rtpproxy_stop_stream2uas",(cmd_function)rtpproxy_stop_stream2uas2_f,0,
NULL, 0,
ANY_ROUTE },
+ {"rtpproxy_manage", (cmd_function)rtpproxy_manage0, 0,
+ 0, 0,
+ ANY_ROUTE},
+ {"rtpproxy_manage", (cmd_function)rtpproxy_manage1, 1,
+ 0, 0,
+ ANY_ROUTE},
+ {"rtpproxy_manage", (cmd_function)rtpproxy_manage2, 2,
+ 0, 0,
+ ANY_ROUTE},
{0, 0, 0, 0, 0, 0}
};
@@ -860,6 +876,12 @@ mod_init(void)
if (rtpp_strings)
pkg_free(rtpp_strings);
+ if (load_tm_api( &tmb ) < 0)
+ {
+ LM_DBG("could not load the TM-functions - answer-offer model"
+ " auto-detection is disabled\n");
+ memset(&tmb, 0, sizeof(struct tm_binds));
+ }
return 0;
}
@@ -1663,6 +1685,85 @@ set_rtp_proxy_set_f(struct sip_msg * msg, char * str1, char *
str2)
}
static int
+rtpproxy_manage(struct sip_msg *msg, char *flags, char *ip)
+{
+ char *cp = NULL;
+ char newip[IP_ADDR_MAX_STR_SIZE];
+ int method;
+ int nosdp;
+
+ if(msg->cseq==NULL && ((parse_headers(msg, HDR_CSEQ_F, 0)==-1)
+ || (msg->cseq==NULL)))
+ {
+ LM_ERR("no CSEQ header\n");
+ return -1;
+ }
+
+ method = get_cseq(msg)->method_id;
+
+ if(!(method==METHOD_INVITE || method==METHOD_ACK || method==METHOD_CANCEL
+ || method==METHOD_BYE))
+ return -1;
+
+ if(method==METHOD_CANCEL || method==METHOD_BYE)
+ return unforce_rtp_proxy_f(msg, 0, 0);
+
+ if(ip==NULL)
+ {
+ cp = ip_addr2a(&msg->rcv.dst_ip);
+ strcpy(newip, cp);
+ }
+
+ nosdp = parse_sdp(msg);
+
+ if(msg->first_line.type == SIP_REQUEST) {
+ if(method==METHOD_ACK && nosdp==0)
+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 0,
+ (ip!=NULL)?1:0);
+ if(method==METHOD_INVITE && nosdp==0) {
+ msg->msg_flags |= FL_SDP_BODY;
+ if(tmb.t_gett!=NULL && tmb.t_gett()!=NULL)
+ tmb.t_gett()->uas.request->msg_flags |= FL_SDP_BODY;
+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 1,
+ (ip!=NULL)?1:0);
+ }
+ } else if(msg->first_line.type == SIP_REPLY) {
+ if(msg->first_line.u.reply.statuscode>=300)
+ return unforce_rtp_proxy_f(msg, 0, 0);
+ if(nosdp==0) {
+ if(tmb.t_gett==NULL || tmb.t_gett()==NULL
+ || tmb.t_gett()==T_UNDEFINED)
+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 0,
+ (ip!=NULL)?1:0);
+ if(tmb.t_gett()->uas.request->msg_flags & FL_SDP_BODY)
+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 0,
+ (ip!=NULL)?1:0);
+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 1,
+ (ip!=NULL)?1:0);
+ }
+ }
+ return -1;
+}
+
+static int
+rtpproxy_manage0(struct sip_msg *msg, char *flags, char *ip)
+{
+ return rtpproxy_manage(msg, 0, 0);
+}
+
+static int
+rtpproxy_manage1(struct sip_msg *msg, char *flags, char *ip)
+{
+ return rtpproxy_manage(msg, flags, 0);
+}
+
+static int
+rtpproxy_manage2(struct sip_msg *msg, char *flags, char *ip)
+{
+ return rtpproxy_manage(msg, flags, ip);
+}
+
+static int
rtpproxy_offer1_f(struct sip_msg *msg, char *str1, char *str2)
{
char *cp;