Module: sip-router Branch: master Commit: c889ca572607e4715132b2f3911f795e2bb43bbc URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c889ca57...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Sun Mar 13 23:04:18 2011 +0100
sdpops: added functions to print sdp and check media type
- sdp_print(level) - print the parsed sdp structure to the debug 'level' (integer representation of log levels). Good for debug purposes - sdp_with_media(type) - return true if the sdp has 'media=type'
---
modules/sdpops/sdpops_mod.c | 103 +++++++++++++++++++++++++++++++++++++++--- 1 files changed, 95 insertions(+), 8 deletions(-)
diff --git a/modules/sdpops/sdpops_mod.c b/modules/sdpops/sdpops_mod.c index bc118ca..e49c968 100644 --- a/modules/sdpops/sdpops_mod.c +++ b/modules/sdpops/sdpops_mod.c @@ -38,13 +38,18 @@ MODULE_VERSION
static int w_sdp_remove_codecs_by_id(sip_msg_t* msg, char* codecs, char *bar); -static int fixup_sdp_remove_codecs_by_id(void** param, int param_no); +static int w_sdp_with_media(sip_msg_t* msg, char* media, char *bar); +static int w_sdp_print(sip_msg_t* msg, char* level, char *bar);
static int mod_init(void);
static cmd_export_t cmds[] = { {"sdp_remove_codecs_by_id", (cmd_function)w_sdp_remove_codecs_by_id, - 1, fixup_sdp_remove_codecs_by_id, 0, ANY_ROUTE}, + 1, fixup_spve_null, 0, ANY_ROUTE}, + {"sdp_with_media", (cmd_function)w_sdp_with_media, + 1, fixup_spve_null, 0, ANY_ROUTE}, + {"sdp_print", (cmd_function)w_sdp_print, + 1, fixup_igp_null, 0, ANY_ROUTE}, {0, 0, 0, 0, 0} };
@@ -183,8 +188,6 @@ int sdp_remove_codecs_by_id(sip_msg_t* msg, str* codecs)
sdp = (sdp_info_t*)msg->body;
- print_sdp(sdp, L_DBG); - sdp_session_num = 0; for(;;) { @@ -246,12 +249,96 @@ static int w_sdp_remove_codecs_by_id(sip_msg_t* msg, char* codecs, char* bar)
/** - * + * @brief check 'media' matches the value of any 'm=value ...' lines + * @return -1 - error; 0 - not found; 1 - found */ -static int fixup_sdp_remove_codecs_by_id(void** param, int param_no) +static int sdp_with_media(sip_msg_t *msg, str *media) { - if (param_no == 1) { - return fixup_spve_null(param, 1); + 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; + + if(parse_sdp(msg) < 0) { + LM_ERR("Unable to parse sdp\n"); + return -1; + } + + LM_ERR("attempting to search for media type: [%.*s]\n", + media->len, media->s); + + sdp = (sdp_info_t*)msg->body; + + 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; + + LM_DBG("stream %d of %d - media [%.*s]\n", + sdp_stream_num, sdp_session_num, + sdp_stream->media.len, sdp_stream->media.s); + if(media->len==sdp_stream->media.len + && strncasecmp(sdp_stream->media.s, media->s, + media->len)==0) + return 1; + sdp_stream_num++; + } + sdp_session_num++; } + return 0; } + +/** + * + */ +static int w_sdp_with_media(sip_msg_t* msg, char* media, char *bar) +{ + str lmedia = {0, 0}; + + if(media==0) + { + LM_ERR("invalid parameters\n"); + return -1; + } + + if(fixup_get_svalue(msg, (gparam_p)media, &lmedia)!=0) + { + LM_ERR("unable to get the media value\n"); + return -1; + } + + if(sdp_with_media(msg, &lmedia)<=0) + return -1; + return 1; +} + + +static int w_sdp_print(sip_msg_t* msg, char* level, char *bar) +{ + sdp_info_t *sdp = NULL; + int llevel = L_DBG; + + if(parse_sdp(msg) < 0) { + LM_ERR("Unable to parse sdp\n"); + return -1; + } + + if(fixup_get_ivalue(msg, (gparam_p)level, &llevel)!=0) + { + LM_ERR("unable to get the debug level value\n"); + return -1; + } + + sdp = (sdp_info_t*)msg->body; + + print_sdp(sdp, llevel); + return 1; +}
Hi Daniel,
nice, new module! But here is something from my wishlist:
Apart from removing codecs, it would be great to have a function to remove all codecs but some wanted ones, e.g.:
sdp_limit_codecs("0,8,101");
which would remove all codecs except those with type 0,8 and 101 (if offered). A function like this should return false, if the codecs are not present. And, of course, it would be great, if one could limit the media-types to certain ones: e.g. allow only m=audio, not m=video (or others)....
That would be my wishlist for this module... (otherwise we/i can add this later, if i really require this)
Carsten
2011/3/14 Daniel-Constantin Mierla miconda@gmail.com:
Module: sip-router Branch: master Commit: c889ca572607e4715132b2f3911f795e2bb43bbc URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c889ca57...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Sun Mar 13 23:04:18 2011 +0100
sdpops: added functions to print sdp and check media type
- sdp_print(level) - print the parsed sdp structure to the debug 'level'
(integer representation of log levels). Good for debug purposes
- sdp_with_media(type) - return true if the sdp has 'media=type'
modules/sdpops/sdpops_mod.c | 103 +++++++++++++++++++++++++++++++++++++++--- 1 files changed, 95 insertions(+), 8 deletions(-)
diff --git a/modules/sdpops/sdpops_mod.c b/modules/sdpops/sdpops_mod.c index bc118ca..e49c968 100644 --- a/modules/sdpops/sdpops_mod.c +++ b/modules/sdpops/sdpops_mod.c @@ -38,13 +38,18 @@ MODULE_VERSION
static int w_sdp_remove_codecs_by_id(sip_msg_t* msg, char* codecs, char *bar); -static int fixup_sdp_remove_codecs_by_id(void** param, int param_no); +static int w_sdp_with_media(sip_msg_t* msg, char* media, char *bar); +static int w_sdp_print(sip_msg_t* msg, char* level, char *bar);
static int mod_init(void);
static cmd_export_t cmds[] = { {"sdp_remove_codecs_by_id", (cmd_function)w_sdp_remove_codecs_by_id,
- 1, fixup_sdp_remove_codecs_by_id, 0, ANY_ROUTE},
- 1, fixup_spve_null, 0, ANY_ROUTE},
- {"sdp_with_media", (cmd_function)w_sdp_with_media,
- 1, fixup_spve_null, 0, ANY_ROUTE},
- {"sdp_print", (cmd_function)w_sdp_print,
- 1, fixup_igp_null, 0, ANY_ROUTE},
{0, 0, 0, 0, 0} };
@@ -183,8 +188,6 @@ int sdp_remove_codecs_by_id(sip_msg_t* msg, str* codecs)
sdp = (sdp_info_t*)msg->body;
- print_sdp(sdp, L_DBG);
sdp_session_num = 0; for(;;) { @@ -246,12 +249,96 @@ static int w_sdp_remove_codecs_by_id(sip_msg_t* msg, char* codecs, char* bar)
/**
- @brief check 'media' matches the value of any 'm=value ...' lines
- @return -1 - error; 0 - not found; 1 - found
*/ -static int fixup_sdp_remove_codecs_by_id(void** param, int param_no) +static int sdp_with_media(sip_msg_t *msg, str *media) {
- if (param_no == 1) {
- return fixup_spve_null(param, 1);
- 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;
- if(parse_sdp(msg) < 0) {
- LM_ERR("Unable to parse sdp\n");
- return -1;
- }
- LM_ERR("attempting to search for media type: [%.*s]\n",
- media->len, media->s);
- sdp = (sdp_info_t*)msg->body;
- 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;
- LM_DBG("stream %d of %d - media [%.*s]\n",
- sdp_stream_num, sdp_session_num,
- sdp_stream->media.len, sdp_stream->media.s);
- if(media->len==sdp_stream->media.len
- && strncasecmp(sdp_stream->media.s, media->s,
- media->len)==0)
- return 1;
- sdp_stream_num++;
- }
- sdp_session_num++;
}
return 0; }
+/**
- */
+static int w_sdp_with_media(sip_msg_t* msg, char* media, char *bar) +{
- str lmedia = {0, 0};
- if(media==0)
- {
- LM_ERR("invalid parameters\n");
- return -1;
- }
- if(fixup_get_svalue(msg, (gparam_p)media, &lmedia)!=0)
- {
- LM_ERR("unable to get the media value\n");
- return -1;
- }
- if(sdp_with_media(msg, &lmedia)<=0)
- return -1;
- return 1;
+}
+static int w_sdp_print(sip_msg_t* msg, char* level, char *bar) +{
- sdp_info_t *sdp = NULL;
- int llevel = L_DBG;
- if(parse_sdp(msg) < 0) {
- LM_ERR("Unable to parse sdp\n");
- return -1;
- }
- if(fixup_get_ivalue(msg, (gparam_p)level, &llevel)!=0)
- {
- LM_ERR("unable to get the debug level value\n");
- return -1;
- }
- sdp = (sdp_info_t*)msg->body;
- print_sdp(sdp, llevel);
- return 1;
+}
sr-dev mailing list sr-dev@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
Hi Carsten,
indeed the module is at beginning, but for sure will get more features before we will release next major version. Some of your needs are matching items in my plans for this module, for the moment time is the only constraint, so I will add as I have some time or a need for such features. Feel free to add your own extensions to the module when you have time/needs/ideas.
Thanks, Daniel
On 3/14/11 9:15 AM, Carsten Bock wrote:
Hi Daniel,
nice, new module! But here is something from my wishlist:
Apart from removing codecs, it would be great to have a function to remove all codecs but some wanted ones, e.g.:
sdp_limit_codecs("0,8,101");
which would remove all codecs except those with type 0,8 and 101 (if offered). A function like this should return false, if the codecs are not present. And, of course, it would be great, if one could limit the media-types to certain ones: e.g. allow only m=audio, not m=video (or others)....
That would be my wishlist for this module... (otherwise we/i can add this later, if i really require this)
Carsten
2011/3/14 Daniel-Constantin Mierlamiconda@gmail.com:
Module: sip-router Branch: master Commit: c889ca572607e4715132b2f3911f795e2bb43bbc URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c889ca57...
Author: Daniel-Constantin Mierlamiconda@gmail.com Committer: Daniel-Constantin Mierlamiconda@gmail.com Date: Sun Mar 13 23:04:18 2011 +0100
sdpops: added functions to print sdp and check media type
- sdp_print(level) - print the parsed sdp structure to the debug 'level' (integer representation of log levels). Good for debug purposes
- sdp_with_media(type) - return true if the sdp has 'media=type'
modules/sdpops/sdpops_mod.c | 103 +++++++++++++++++++++++++++++++++++++++--- 1 files changed, 95 insertions(+), 8 deletions(-)
diff --git a/modules/sdpops/sdpops_mod.c b/modules/sdpops/sdpops_mod.c index bc118ca..e49c968 100644 --- a/modules/sdpops/sdpops_mod.c +++ b/modules/sdpops/sdpops_mod.c @@ -38,13 +38,18 @@ MODULE_VERSION
static int w_sdp_remove_codecs_by_id(sip_msg_t* msg, char* codecs, char *bar); -static int fixup_sdp_remove_codecs_by_id(void** param, int param_no); +static int w_sdp_with_media(sip_msg_t* msg, char* media, char *bar); +static int w_sdp_print(sip_msg_t* msg, char* level, char *bar);
static int mod_init(void);
static cmd_export_t cmds[] = { {"sdp_remove_codecs_by_id", (cmd_function)w_sdp_remove_codecs_by_id,
1, fixup_sdp_remove_codecs_by_id, 0, ANY_ROUTE},
1, fixup_spve_null, 0, ANY_ROUTE},
{"sdp_with_media", (cmd_function)w_sdp_with_media,
1, fixup_spve_null, 0, ANY_ROUTE},
{"sdp_print", (cmd_function)w_sdp_print,
};1, fixup_igp_null, 0, ANY_ROUTE}, {0, 0, 0, 0, 0}
@@ -183,8 +188,6 @@ int sdp_remove_codecs_by_id(sip_msg_t* msg, str* codecs)
sdp = (sdp_info_t*)msg->body;
print_sdp(sdp, L_DBG);
sdp_session_num = 0; for(;;) {
@@ -246,12 +249,96 @@ static int w_sdp_remove_codecs_by_id(sip_msg_t* msg, char* codecs, char* bar)
/**
- @brief check 'media' matches the value of any 'm=value ...' lines
*/
- @return -1 - error; 0 - not found; 1 - found
-static int fixup_sdp_remove_codecs_by_id(void** param, int param_no) +static int sdp_with_media(sip_msg_t *msg, str *media) {
if (param_no == 1) {
return fixup_spve_null(param, 1);
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;
if(parse_sdp(msg)< 0) {
LM_ERR("Unable to parse sdp\n");
return -1;
}
LM_ERR("attempting to search for media type: [%.*s]\n",
media->len, media->s);
sdp = (sdp_info_t*)msg->body;
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;
LM_DBG("stream %d of %d - media [%.*s]\n",
sdp_stream_num, sdp_session_num,
sdp_stream->media.len, sdp_stream->media.s);
if(media->len==sdp_stream->media.len
+&& strncasecmp(sdp_stream->media.s, media->s,
media->len)==0)
return 1;
sdp_stream_num++;
}
sdp_session_num++; }
}return 0;
+/**
- */
+static int w_sdp_with_media(sip_msg_t* msg, char* media, char *bar) +{
str lmedia = {0, 0};
if(media==0)
{
LM_ERR("invalid parameters\n");
return -1;
}
if(fixup_get_svalue(msg, (gparam_p)media,&lmedia)!=0)
{
LM_ERR("unable to get the media value\n");
return -1;
}
if(sdp_with_media(msg,&lmedia)<=0)
return -1;
return 1;
+}
+static int w_sdp_print(sip_msg_t* msg, char* level, char *bar) +{
sdp_info_t *sdp = NULL;
int llevel = L_DBG;
if(parse_sdp(msg)< 0) {
LM_ERR("Unable to parse sdp\n");
return -1;
}
if(fixup_get_ivalue(msg, (gparam_p)level,&llevel)!=0)
{
LM_ERR("unable to get the debug level value\n");
return -1;
}
sdp = (sdp_info_t*)msg->body;
print_sdp(sdp, llevel);
return 1;
+}
sr-dev mailing list sr-dev@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
Carsten Bock wrote:
But here is something from my wishlist:
Apart from removing codecs, it would be great to have a function to remove all codecs but some wanted ones, e.g.:
sdp_limit_codecs("0,8,101");
which would remove all codecs except those with type 0,8 and 101 (if offered).
Alternatively or, indeed, preferably codec names please.
Regards, Martin, who could rant for hours about vendors not getting the concept of dynamic payload types into their heads. Rocket science it ain't.
Hi Martin,
that is coming also, the reason I named sdp_remove_codecs_by_id(...) so at some point will be *_by_name(...). I developed the function while being offline so it was hard to find the table with the mapping between codecs names and ids.
Probably can be found at IANA site, but, if anyone has a link that he/she can share quickly, it would be great.
Cheers, Daniel
On 3/14/11 10:21 AM, Martin Hoffmann wrote:
Carsten Bock wrote:
But here is something from my wishlist:
Apart from removing codecs, it would be great to have a function to remove all codecs but some wanted ones, e.g.:
sdp_limit_codecs("0,8,101");
which would remove all codecs except those with type 0,8 and 101 (if offered).
Alternatively or, indeed, preferably codec names please.
Regards, Martin, who could rant for hours about vendors not getting the concept of dynamic payload types into their heads. Rocket science it ain't.
sr-dev mailing list sr-dev@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
Daniel-Constantin Mierla wrote:
that is coming also, the reason I named sdp_remove_codecs_by_id(...) so at some point will be *_by_name(...).
Cool. Although, the fact that this functionality is needed at all is saying quite a bit about the state of affairs.
I developed the function while being offline so it was hard to find the table with the mapping between codecs names and ids.
http://www.iana.org/assignments/rtp-parameters
It is only a few anyways and they should all be listed in RFC 3551 since those static assignments are kept for backwards compatibility only.
Regards, Martin