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