From 60703e86eff4849501938b2dcbb85382a9febb9d Mon Sep 17 00:00:00 2001 From: Mikko Lehto Date: Wed, 16 Nov 2016 13:48:26 +0200 Subject: [PATCH] modules/sdpops: add optional media parameter to sdp_remove_line_by_prefix() - allows removing lines only within media description --- modules/sdpops/api.h | 2 +- modules/sdpops/doc/sdpops_admin.xml | 2 +- modules/sdpops/sdpops_mod.c | 146 +++++++++++++++++++++------- 3 files changed, 113 insertions(+), 37 deletions(-) diff --git a/modules/sdpops/api.h b/modules/sdpops/api.h index eba0c654891..39e6eab552f 100644 --- a/modules/sdpops/api.h +++ b/modules/sdpops/api.h @@ -41,7 +41,7 @@ typedef struct sdpops_binds { sdp_keep_media_t sdp_keep_codecs_by_name; sdp_remove_media_t sdp_remove_media; sdp_remove_media_t sdp_remove_transport; - sdp_remove_media_t sdp_remove_line_by_prefix; + sdp_remove_media_type_t sdp_remove_line_by_prefix; sdp_remove_media_type_t sdp_remove_codecs_by_id; sdp_remove_media_type_t sdp_remove_codecs_by_name; } sdpops_api_t; diff --git a/modules/sdpops/doc/sdpops_admin.xml b/modules/sdpops/doc/sdpops_admin.xml index 3c27b125c3b..2c14c9bacd2 100644 --- a/modules/sdpops/doc/sdpops_admin.xml +++ b/modules/sdpops/doc/sdpops_admin.xml @@ -126,7 +126,7 @@ sdp_remove_codecs_by_name("PCMU,PCMA,GSM");
- <function moreinfo="none">sdp_remove_line_by_prefix(string)</function> + <function moreinfo="none">sdp_remove_line_by_prefix(string [, mtype])</function> Remove all SDP attribute lines beginning with 'string' diff --git a/modules/sdpops/sdpops_mod.c b/modules/sdpops/sdpops_mod.c index 5813e291407..7d26868f2f5 100644 --- a/modules/sdpops/sdpops_mod.c +++ b/modules/sdpops/sdpops_mod.c @@ -42,7 +42,7 @@ MODULE_VERSION -static int w_sdp_remove_line_by_prefix(sip_msg_t* msg, char* prefix, char* bar); +static int w_sdp_remove_line_by_prefix(sip_msg_t* msg, char* prefix, char* media); static int w_sdp_remove_codecs_by_id(sip_msg_t* msg, char* codecs, char *media); static int w_sdp_remove_codecs_by_name(sip_msg_t* msg, char* codecs, char *media); static int w_sdp_keep_codecs_by_id(sip_msg_t* msg, char* codecs, char *media); @@ -73,6 +73,8 @@ static int mod_init(void); static cmd_export_t cmds[] = { {"sdp_remove_line_by_prefix", (cmd_function)w_sdp_remove_line_by_prefix, 1, fixup_spve_null, 0, ANY_ROUTE}, + {"sdp_remove_line_by_prefix", (cmd_function)w_sdp_remove_line_by_prefix, + 2, fixup_spve_spve, 0, ANY_ROUTE}, {"sdp_remove_codecs_by_id", (cmd_function)w_sdp_remove_codecs_by_id, 1, fixup_spve_null, 0, ANY_ROUTE}, {"sdp_remove_codecs_by_id", (cmd_function)w_sdp_remove_codecs_by_id, @@ -390,31 +392,7 @@ int sdp_remove_codecs_by_id(sip_msg_t* msg, str* codecs, str* media) return 0; } -/** - * @brief remove all SDP lines that begin with prefix - * @return -1 - error; 0 - no lines found ; 1..N - N lines deleted - */ -int sdp_remove_line_by_prefix(sip_msg_t* msg, str* prefix) -{ - str body = {NULL, 0}; - - if(parse_sdp(msg) != 0) { - LM_ERR("Unable to parse SDP\n"); - return -1; - } - - body.s = ((sdp_info_t*)msg->body)->raw_sdp.s; - body.len = ((sdp_info_t*)msg->body)->raw_sdp.len; - - if (body.s==NULL) { - LM_ERR("failed to get the message body\n"); - return -1; - } - - if (body.len==0) { - LM_DBG("message body has zero length\n"); - return -1; - } +int sdp_remove_line_lump_by_prefix(sip_msg_t* msg, str* body, str* prefix) { char *ptr = NULL; str line = {NULL, 0}; @@ -422,7 +400,7 @@ int sdp_remove_line_by_prefix(sip_msg_t* msg, str* prefix) int found = 0; struct lump *anchor = NULL; - ptr = find_sdp_line(body.s, body.s + body.len, prefix->s[0]); + ptr = find_sdp_line(body->s, body->s + body->len, prefix->s[0]); while (ptr) { if (sdp_locate_line(msg, ptr, &line) != 0) @@ -431,9 +409,9 @@ int sdp_remove_line_by_prefix(sip_msg_t* msg, str* prefix) return -1; } - if (body.s + body.len < line.s + prefix->len) // check if strncmp would run too far + if (body->s + body->len < line.s + prefix->len) // check if strncmp would run too far { - //LM_DBG("done searching, prefix string >%.*s< (%d) does not fit into remaining buffer space (%ld) \n", prefix->len, prefix->s, prefix->len, body.s + body.len - line.s); + //LM_DBG("done searching, prefix string >%.*s< (%d) does not fit into remaining buffer space (%ld) \n", prefix->len, prefix->s, prefix->len, body->s + body->len - line.s); break; } @@ -465,7 +443,7 @@ int sdp_remove_line_by_prefix(sip_msg_t* msg, str* prefix) //LM_DBG("updated remove >%.*s< (%d)\n", remove.len, remove.s, remove.len); } - ptr = find_next_sdp_line(ptr, body.s + body.len, prefix->s[0], NULL); + ptr = find_next_sdp_line(ptr, body->s + body->len, prefix->s[0], NULL); } if (found) { @@ -483,13 +461,102 @@ int sdp_remove_line_by_prefix(sip_msg_t* msg, str* prefix) return 0; } +/** + * @brief remove all SDP lines that begin with prefix + * @return -1 - error; 0 - no lines found ; 1..N - N lines deleted + */ +int sdp_remove_line_by_prefix(sip_msg_t* msg, str* prefix, str* media) +{ + str body = {NULL, 0}; + int sdp_session_num = 0; + int sdp_stream_num = 0; + int found = 0; + + if(parse_sdp(msg) != 0) { + LM_ERR("Unable to parse SDP\n"); + return -1; + } + + body.s = ((sdp_info_t*)msg->body)->raw_sdp.s; + body.len = ((sdp_info_t*)msg->body)->raw_sdp.len; + + if (body.s==NULL) { + LM_ERR("failed to get the message body\n"); + return -1; + } + + if (body.len==0) { + LM_DBG("message body has zero length\n"); + return -1; + } + + if (media->s==NULL || media->len==0 ) { + LM_DBG("media type filter not set\n"); + found = sdp_remove_line_lump_by_prefix(msg, &body, prefix); + } else { + LM_DBG("using media type filter: %.*s\n",media->len, media->s); + + sdp_session_cell_t* sdp_session; + sdp_stream_cell_t* sdp_stream; + + sdp_session_num = 0; + for (;;) { + sdp_session = get_sdp_session(msg, sdp_session_num); + if(!sdp_session) break; + sdp_stream_num = 0; + for (;;) { + sdp_stream = get_sdp_stream(msg, sdp_session_num, sdp_stream_num); + if(!sdp_stream) break; + if( sdp_stream->media.len == media->len && + strncasecmp(sdp_stream->media.s, media->s, media->len) == 0) { + + LM_DBG("range for media type %.*s: %ld - %ld\n", + sdp_stream->media.len, sdp_stream->media.s, + sdp_stream->raw_stream.s - body.s, + sdp_stream->raw_stream.s + sdp_stream->raw_stream.len - body.s + ); + + found += sdp_remove_line_lump_by_prefix(msg,&(sdp_stream->raw_stream),prefix); + + } + sdp_stream_num++; + } + sdp_session_num++; + } + } + return found; +} + + +/* + +int sdp_remove_str_codec_id_attrs(sip_msg_t* msg, sdp_stream_cell_t* sdp_stream, str *rm_codec) + + str aline = {0, 0}; + sdp_payload_attr_t *payload; + struct lump *anchor; + + payload = sdp_stream->payload_attr; + while (payload) { + LM_DBG("a= ... for codec %.*s/%.*s\n", + payload->rtp_payload.len, payload->rtp_payload.s, + payload->rtp_enc.len, payload->rtp_enc.s); + if(rm_codec->len==payload->rtp_payload.len + && strncmp(payload->rtp_payload.s, rm_codec->s, + rm_codec->len)==0) { + if(payload->rtp_enc.s!=NULL) { + if(sdp_locate_line(msg, payload->rtp_enc.s, &aline)==0) +*/ + + /** * removes all SDP lines that begin with script provided prefix * @return -1 - error; 1 - found */ -static int w_sdp_remove_line_by_prefix(sip_msg_t* msg, char* prefix, char* bar) +static int w_sdp_remove_line_by_prefix(sip_msg_t* msg, char* prefix, char* media) { - str prfx = {NULL, 0}; + str lprefix = {NULL, 0}; + str lmedia = {NULL, 0}; if(prefix==0) { @@ -497,14 +564,23 @@ static int w_sdp_remove_line_by_prefix(sip_msg_t* msg, char* prefix, char* bar) return -1; } - if (get_str_fparam(&prfx, msg, (fparam_t*)prefix)) + if (get_str_fparam(&lprefix, msg, (fparam_t*)prefix)) { LM_ERR("unable to determine prefix\n"); return -1; } - LM_DBG("Removing SDP lines with prefix: %.*s\n", prfx.len, prfx.s); - if ( sdp_remove_line_by_prefix(msg, &prfx) < 0) + if (media != NULL) { + if (get_str_fparam(&lmedia, msg, (fparam_t*)media)) + { + LM_ERR("unable to get the media type\n"); + return -1; + } + } + + LM_DBG("Removing SDP lines with prefix: %.*s\n", lprefix.len, lprefix.s); + + if ( sdp_remove_line_by_prefix(msg, &lprefix, &lmedia) < 0) return -1; return 1; }