Hello,

attached patch shows a new function in sdpops module: sdp_get_ip_c

It receives as parameter an avp variable, and stores there every connection IP for each stream. If a stream has not c IP, then it returns session default one.


Any opinion or criticism?


Kind regards,
Vicente.
diff --git modules/sdpops/sdpops_mod.c modules/sdpops/sdpops_mod.c
index b70b553..5ff359f 100644
--- modules/sdpops/sdpops_mod.c
+++ modules/sdpops/sdpops_mod.c
@@ -49,6 +49,7 @@ static int w_sdp_with_codecs_by_name(sip_msg_t* msg, char* codec, char *bar);
 static int w_sdp_remove_media(sip_msg_t* msg, char* media, char *bar);
 static int w_sdp_print(sip_msg_t* msg, char* level, char *bar);
 static int w_get_sdp(sip_msg_t* msg, char *bar);
+static int w_sdp_get_ip_c(sip_msg_t* msg, char *avp);
 
 static int mod_init(void);
 
@@ -77,6 +78,8 @@ static cmd_export_t cmds[] = {
 		1, fixup_igp_null,  0, ANY_ROUTE},
 	{"sdp_get",                  (cmd_function)w_get_sdp,
 		1, 0,  0, ANY_ROUTE},
+	{"sdp_get_ip_c",               (cmd_function)w_sdp_get_ip_c,
+	    1, 0, 0, ANY_ROUTE},
 	{"bind_sdpops",                (cmd_function)bind_sdpops,
 		1, 0, 0, 0},
 	{0, 0, 0, 0, 0, 0}
@@ -990,6 +993,107 @@ static int w_get_sdp(sip_msg_t* msg, char *avp)
 /**
  *
  */
+static int w_sdp_get_ip_c(sip_msg_t* msg, char *avp)
+{
+	sdp_info_t *sdp = NULL;
+	int sdp_session_num;
+	int sdp_stream_num;
+	sdp_session_cell_t *sdp_session;
+	sdp_stream_cell_t *sdp_stream;
+	str session_ip;
+	int i;
+	int_str avp_val;
+	int_str avp_name;
+	static unsigned short avp_type = 0;
+	str s;
+	pv_spec_t *avp_spec = NULL;
+
+	s.s = avp; s.len = strlen(s.s);
+	if(pv_locate_name(&s) != s.len) {
+		LM_ERR("invalid parameter\n");
+		return -1;
+	}
+	if(((avp_spec = pv_cache_get(&s)) == NULL)
+			|| avp_spec->type!=PVT_AVP) {
+		LM_ERR("malformed or non AVP %s AVP definition\n", avp);
+		return -1;
+	}
+
+	if(pv_get_avp_name(0, &avp_spec->pvp, &avp_name, &avp_type)!=0) {
+		LM_ERR("[%s]- invalid AVP definition\n", avp);
+		return -1;
+	}
+
+	if(parse_sdp(msg) < 0) {
+		LM_ERR("Unable to parse sdp\n");
+		return -1;
+	}
+
+	sdp = (sdp_info_t*)msg->body;
+
+	if(sdp==NULL) {
+		LM_DBG("No sdp body\n");
+		return -1;
+	}
+
+	sdp_session_num = 0;
+	i = 0;
+	session_ip.s = NULL;
+	session_ip.len = 0;
+	for(;;)
+	{
+		sdp_session = get_sdp_session_sdp(sdp, sdp_session_num);
+		if(!sdp_session) break;
+		if((sdp_session->ip_addr.s!=NULL) && (sdp_session->ip_addr.len!=0))
+		{
+			LM_DBG("Found IP address in session: %.*s\n",
+				   sdp_session->ip_addr.len, sdp_session->ip_addr.s);
+
+			session_ip.s = sdp_session->ip_addr.s;
+			session_ip.len = sdp_session->ip_addr.len;
+		}
+
+		sdp_stream_num = 0;
+		for(;;)
+		{
+			sdp_stream = get_sdp_stream_sdp(sdp, sdp_session_num,
+							sdp_stream_num);
+			if(!sdp_stream) break;
+			if((sdp_stream->ip_addr.s!=NULL) && (sdp_stream->ip_addr.len!=0))
+			{
+				avp_val.s.s = sdp_stream->ip_addr.s;
+				avp_val.s.len = sdp_stream->ip_addr.len;
+				LM_DBG("Found IP address: %.*s\n",
+					   sdp_stream->ip_addr.len, sdp_stream->ip_addr.s);
+			} else {
+				if((session_ip.s == NULL) || (session_ip.len == 0)) {
+					LM_ERR("No connection IP available in this stream\n");
+					return -1;
+				}
+				avp_val.s.s = session_ip.s;
+				avp_val.s.len = session_ip.len;
+				LM_DBG("Using session IP address: %.*s\n", session_ip.len,
+					   session_ip.s);
+			}
+			if(add_avp(AVP_VAL_STR | avp_type, avp_name, avp_val) != 0)
+			{
+				LM_ERR("Failed to add IP address avp");
+				return -1;
+			}
+			sdp_stream_num++;
+		}
+		sdp_session_num++;
+	}
+
+	if(i==0)
+		return -1;
+
+	return 0;
+}
+
+/**
+ *
+ */
 int bind_sdpops(struct sdpops_binds *sob){
 	if (sob == NULL) {
 		LM_WARN("bind_sdpops: Cannot load sdpops API into a NULL pointer\n");
_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to