From 33489c45d7bcacda38c4e5b14c8f9c38f026462d Mon Sep 17 00:00:00 2001 From: Camille Oudot Date: Mon, 2 Feb 2015 17:09:07 +0100 Subject: [PATCH 1/4] modules/rtpengine: return the new SDP in an AVP if the new module param `write_sdp_avp` is set to a valid avp specifier, the SDP returned by rtpengine in the offer/answer operations is returned in the specified AVP instead of the message body --- modules/rtpengine/doc/rtpengine_admin.xml | 20 ++++++++ modules/rtpengine/rtpengine.c | 59 ++++++++++++++++++++--- 2 files changed, 71 insertions(+), 8 deletions(-) diff --git a/modules/rtpengine/doc/rtpengine_admin.xml b/modules/rtpengine/doc/rtpengine_admin.xml index 4a1ea6f400b..7a01b0d0380 100644 --- a/modules/rtpengine/doc/rtpengine_admin.xml +++ b/modules/rtpengine/doc/rtpengine_admin.xml @@ -257,6 +257,26 @@ modparam("rtpengine", "setid_avp", "$avp(setid)") ... modparam("rtpengine", "force_send_interface", "10.3.7.123") ... + + + +
+ <varname>write_sdp_avp</varname> (string) + + If this parameter is set to a valid AVP specifier, the + SDP returned by rtpengine in the offer/answer operations + is returned in the specified SDP instead of the + message body. + + + There is no default value. + + + Set <varname>write_sdp_avp</varname> parameter + +... +modparam("rtpengine", "write_sdp_avp", "$avp(sdp)") +...
diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 5ff6f364843..5415d0b6d74 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -211,8 +211,14 @@ static int *rtpp_socks = 0; static int setid_avp_type; static int_str setid_avp; +static str write_sdp_avp = {NULL, 0}; +static avp_name_t write_sdp_avp_name; +static unsigned short write_sdp_avp_flags; + + char* force_send_ip_str=""; + typedef struct rtpp_set_link { struct rtpp_set *rset; pv_spec_t *rpv; @@ -282,6 +288,7 @@ static param_export_t params[] = { {"setid_avp", PARAM_STRING, &setid_avp_param }, {"force_send_interface", PARAM_STRING, &force_send_ip_str }, {"rtp_inst_pvar", PARAM_STR, &rtp_inst_pv_param }, + {"write_sdp_avp", PARAM_STR, &write_sdp_avp }, {0, 0, 0} }; @@ -853,6 +860,21 @@ mod_init(void) setid_avp_type = avp_flags; } + if (write_sdp_avp.len > 0) { + avp_spec = pv_cache_get(&write_sdp_avp); + if (avp_spec==NULL || (avp_spec->type != PVT_AVP)) { + LM_ERR("write_sdp_avp: malformed or non AVP definition <%.*s>\n", + write_sdp_avp.len, write_sdp_avp.s); + return -1; + } + if (pv_get_avp_name(0, &(avp_spec->pvp), &write_sdp_avp_name, + &write_sdp_avp_flags) != 0) { + LM_ERR("write_sdp_avp: invalid AVP definition <%.*s>\n", + write_sdp_avp.len, write_sdp_avp.s); + return -1; + } + } + if (rtpp_strings) pkg_free(rtpp_strings); @@ -1962,6 +1984,7 @@ rtpengine_offer_answer(struct sip_msg *msg, const char *flags, int op, int more) bencode_item_t *dict; str body, newbody; struct lump *anchor; + avp_value_t avp_val; dict = rtpp_function_call_ok(&bencbuf, msg, op, flags, &body); if (!dict) @@ -1978,14 +2001,34 @@ rtpengine_offer_answer(struct sip_msg *msg, const char *flags, int op, int more) if (more) body_intermediate = newbody; else { - anchor = del_lump(msg, body.s - msg->buf, body.len, 0); - if (!anchor) { - LM_ERR("del_lump failed\n"); - goto error_free; - } - if (!insert_new_lump_after(anchor, newbody.s, newbody.len, 0)) { - LM_ERR("insert_new_lump_after failed\n"); - goto error_free; + if (write_sdp_avp.len > 0) { + avp_val.s.len = newbody.len; + avp_val.s.s = shm_malloc(avp_val.s.len); + + if (avp_val.s.s == NULL) { + LM_ERR("No more PKG memory\n"); + goto error_free; + } + + memcpy(avp_val.s.s, newbody.s, avp_val.s.len); + pkg_free(newbody.s); + + if (add_avp(AVP_VAL_STR | write_sdp_avp_flags, write_sdp_avp_name, avp_val) != 0) + { + LM_ERR("Failed to add SDP avp %.*s\n", write_sdp_avp.len, write_sdp_avp.s); + pkg_free(avp_val.s.s); + return -1; + } + } else { + anchor = del_lump(msg, body.s - msg->buf, body.len, 0); + if (!anchor) { + LM_ERR("del_lump failed\n"); + goto error_free; + } + if (!insert_new_lump_after(anchor, newbody.s, newbody.len, 0)) { + LM_ERR("insert_new_lump_after failed\n"); + goto error_free; + } } } From 43dd3ad1c54a6c15adf329e7eb2d95dcd4258b01 Mon Sep 17 00:00:00 2001 From: Camille Oudot Date: Mon, 2 Feb 2015 17:16:07 +0100 Subject: [PATCH 2/4] rtpengine: README update --- modules/rtpengine/README | 70 +++++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/modules/rtpengine/README b/modules/rtpengine/README index 85d568bd0fd..442abea395a 100644 --- a/modules/rtpengine/README +++ b/modules/rtpengine/README @@ -67,6 +67,8 @@ Richard Fuchs 4.5. extra_id_pv (string) 4.6. setid_avp (string) 4.7. force_send_interface (string) + 4.8. write_sdp_avp (string) + 4.9. rtp_inst_pvar (string) 5. Functions @@ -97,15 +99,17 @@ Richard Fuchs 1.5. Set extra_id_pv parameter 1.6. Set setid_avp parameter 1.7. Set force_send_interface parameter - 1.8. set_rtpengine_set usage - 1.9. rtpengine_offer usage - 1.10. rtpengine_answer usage - 1.11. rtpengine_delete usage - 1.12. rtpengine_manage usage - 1.13. start_recording usage - 1.14. $rtpstat Usage - 1.15. nh_enable_rtpp usage - 1.16. nh_show_rtpp usage + 1.8. Set write_sdp_avp parameter + 1.9. Set rtp_inst_pvar parameter + 1.10. set_rtpengine_set usage + 1.11. rtpengine_offer usage + 1.12. rtpengine_answer usage + 1.13. rtpengine_delete usage + 1.14. rtpengine_manage usage + 1.15. start_recording usage + 1.16. $rtpstat Usage + 1.17. nh_enable_rtpp usage + 1.18. nh_show_rtpp usage Chapter 1. Admin Guide @@ -127,6 +131,8 @@ Chapter 1. Admin Guide 4.5. extra_id_pv (string) 4.6. setid_avp (string) 4.7. force_send_interface (string) + 4.8. write_sdp_avp (string) + 4.9. rtp_inst_pvar (string) 5. Functions @@ -216,6 +222,8 @@ Chapter 1. Admin Guide 4.5. extra_id_pv (string) 4.6. setid_avp (string) 4.7. force_send_interface (string) + 4.8. write_sdp_avp (string) + 4.9. rtp_inst_pvar (string) 4.1. rtpengine_sock (string) @@ -314,6 +322,32 @@ modparam("rtpengine", "setid_avp", "$avp(setid)") modparam("rtpengine", "force_send_interface", "10.3.7.123") ... +4.8. write_sdp_avp (string) + + If this parameter is set to a valid AVP specifier, the SDP returned by + rtpengine in the offer/answer operations is returned in the specified + SDP instead of the message body. + + There is no default value. + + Example 1.8. Set write_sdp_avp parameter +... +modparam("rtpengine", "write_sdp_avp", "$avp(sdp)") +... + +4.9. rtp_inst_pvar (string) + + A pseudo variable to store the chosen RTP Engine IP address. If this + parameter is set, the IP address and port of the instance chosen will + be stored in the given variable. + + By default, this parameter is not set. + + Example 1.9. Set rtp_inst_pvar parameter +... +modparam("rtpproxy", "rtp_inst_pvar", "$avp(RTP_INSTANCE)") +... + 5. Functions 5.1. set_rtpengine_set(setid[, setid]) @@ -345,7 +379,7 @@ modparam("rtpengine", "force_send_interface", "10.3.7.123") This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, BRANCH_ROUTE. - Example 1.8. set_rtpengine_set usage + Example 1.10. set_rtpengine_set usage ... set_rtpengine_set("2"); rtpengine_offer(); @@ -515,7 +549,7 @@ rtpengine_offer(); This function can be used from ANY_ROUTE. - Example 1.9. rtpengine_offer usage + Example 1.11. rtpengine_offer usage route { ... if (is_method("INVITE")) { @@ -559,7 +593,7 @@ onreply_route[2] This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE. - Example 1.10. rtpengine_answer usage + Example 1.12. rtpengine_answer usage See rtpengine_offer() function example above for example. @@ -572,7 +606,7 @@ onreply_route[2] This function can be used from ANY_ROUTE. - Example 1.11. rtpengine_delete usage + Example 1.13. rtpengine_delete usage ... rtpengine_delete(); ... @@ -602,7 +636,7 @@ rtpengine_delete(); This function can be used from ANY_ROUTE. - Example 1.12. rtpengine_manage usage + Example 1.14. rtpengine_manage usage ... rtpengine_manage(); ... @@ -615,7 +649,7 @@ rtpengine_manage(); This function can be used from REQUEST_ROUTE and ONREPLY_ROUTE. - Example 1.13. start_recording usage + Example 1.15. start_recording usage ... start_recording(); ... @@ -631,7 +665,7 @@ start_recording(); packet counters. The statistics must be retrieved before the session is deleted (before rtpengine_delete()). - Example 1.14. $rtpstat Usage + Example 1.16. $rtpstat Usage ... append_hf("X-RTP-Statistics: $rtpstat\r\n"); ... @@ -654,7 +688,7 @@ start_recording(); NOTE: if a RTP proxy is defined multiple times (in the same or diferente sete), all of its instances will be enables/disabled. - Example 1.15. nh_enable_rtpp usage + Example 1.17. nh_enable_rtpp usage ... $ kamctl fifo nh_enable_rtpp udp:192.168.2.133:8081 0 ... @@ -666,7 +700,7 @@ $ kamctl fifo nh_enable_rtpp udp:192.168.2.133:8081 0 No parameter. - Example 1.16. nh_show_rtpp usage + Example 1.18. nh_show_rtpp usage ... $ kamctl fifo nh_show_rtpp ... From f3d0dd543f983873acce86dc253340c10fdbcfbc Mon Sep 17 00:00:00 2001 From: Camille Oudot Date: Mon, 2 Feb 2015 20:16:46 +0100 Subject: [PATCH 3/4] modules/rtpengine: fix returning SDP in pvar - use of (pvar_spec_t).setf setter to be more generic - parameter rename write_sdp_avp -> write_sdp_pv --- modules/rtpengine/rtpengine.c | 46 +++++++++++++---------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 5415d0b6d74..ff9223db3b1 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -211,9 +211,8 @@ static int *rtpp_socks = 0; static int setid_avp_type; static int_str setid_avp; -static str write_sdp_avp = {NULL, 0}; -static avp_name_t write_sdp_avp_name; -static unsigned short write_sdp_avp_flags; +static str write_sdp_pvar_str = {NULL, 0}; +static pv_spec_t* write_sdp_pvar = NULL; char* force_send_ip_str=""; @@ -288,7 +287,7 @@ static param_export_t params[] = { {"setid_avp", PARAM_STRING, &setid_avp_param }, {"force_send_interface", PARAM_STRING, &force_send_ip_str }, {"rtp_inst_pvar", PARAM_STR, &rtp_inst_pv_param }, - {"write_sdp_avp", PARAM_STR, &write_sdp_avp }, + {"write_sdp_pv", PARAM_STR, &write_sdp_pvar_str }, {0, 0, 0} }; @@ -860,18 +859,13 @@ mod_init(void) setid_avp_type = avp_flags; } - if (write_sdp_avp.len > 0) { - avp_spec = pv_cache_get(&write_sdp_avp); - if (avp_spec==NULL || (avp_spec->type != PVT_AVP)) { - LM_ERR("write_sdp_avp: malformed or non AVP definition <%.*s>\n", - write_sdp_avp.len, write_sdp_avp.s); - return -1; - } - if (pv_get_avp_name(0, &(avp_spec->pvp), &write_sdp_avp_name, - &write_sdp_avp_flags) != 0) { - LM_ERR("write_sdp_avp: invalid AVP definition <%.*s>\n", - write_sdp_avp.len, write_sdp_avp.s); - return -1; + if (write_sdp_pvar_str.len > 0) { + write_sdp_pvar = pv_cache_get(&write_sdp_pvar_str); + if (write_sdp_pvar == NULL + || (write_sdp_pvar->type != PVT_AVP && write_sdp_pvar->type != PVT_SCRIPTVAR) ) { + LM_ERR("write_sdp_pv: not a valid AVP or VAR definition <%.*s>\n", + write_sdp_pvar_str.len, write_sdp_pvar_str.s); + return -1; } } @@ -1984,7 +1978,7 @@ rtpengine_offer_answer(struct sip_msg *msg, const char *flags, int op, int more) bencode_item_t *dict; str body, newbody; struct lump *anchor; - avp_value_t avp_val; + pv_value_t pv_val; dict = rtpp_function_call_ok(&bencbuf, msg, op, flags, &body); if (!dict) @@ -2001,24 +1995,18 @@ rtpengine_offer_answer(struct sip_msg *msg, const char *flags, int op, int more) if (more) body_intermediate = newbody; else { - if (write_sdp_avp.len > 0) { - avp_val.s.len = newbody.len; - avp_val.s.s = shm_malloc(avp_val.s.len); + if (write_sdp_pvar!= NULL) { + pv_val.rs = newbody; + pv_val.flags = PV_VAL_STR; - if (avp_val.s.s == NULL) { - LM_ERR("No more PKG memory\n"); + if (write_sdp_pvar->setf(msg,&write_sdp_pvar->pvp, (int)EQ_T, &pv_val) < 0) + { + LM_ERR("error setting pvar <%.*s>\n", write_sdp_pvar_str.len, write_sdp_pvar_str.s); goto error_free; } - memcpy(avp_val.s.s, newbody.s, avp_val.s.len); pkg_free(newbody.s); - if (add_avp(AVP_VAL_STR | write_sdp_avp_flags, write_sdp_avp_name, avp_val) != 0) - { - LM_ERR("Failed to add SDP avp %.*s\n", write_sdp_avp.len, write_sdp_avp.s); - pkg_free(avp_val.s.s); - return -1; - } } else { anchor = del_lump(msg, body.s - msg->buf, body.len, 0); if (!anchor) { From 1c5da02c9df644652d4528d7e83cab97c9c46c0b Mon Sep 17 00:00:00 2001 From: Camille Oudot Date: Tue, 3 Feb 2015 10:20:48 +0100 Subject: [PATCH 4/4] rtpengine: updated doc --- modules/rtpengine/README | 14 +++++++------- modules/rtpengine/doc/rtpengine_admin.xml | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/rtpengine/README b/modules/rtpengine/README index 442abea395a..6492f2a59f4 100644 --- a/modules/rtpengine/README +++ b/modules/rtpengine/README @@ -67,7 +67,7 @@ Richard Fuchs 4.5. extra_id_pv (string) 4.6. setid_avp (string) 4.7. force_send_interface (string) - 4.8. write_sdp_avp (string) + 4.8. write_sdp_pv (string) 4.9. rtp_inst_pvar (string) 5. Functions @@ -131,7 +131,7 @@ Chapter 1. Admin Guide 4.5. extra_id_pv (string) 4.6. setid_avp (string) 4.7. force_send_interface (string) - 4.8. write_sdp_avp (string) + 4.8. write_sdp_pv (string) 4.9. rtp_inst_pvar (string) 5. Functions @@ -222,7 +222,7 @@ Chapter 1. Admin Guide 4.5. extra_id_pv (string) 4.6. setid_avp (string) 4.7. force_send_interface (string) - 4.8. write_sdp_avp (string) + 4.8. write_sdp_pv (string) 4.9. rtp_inst_pvar (string) 4.1. rtpengine_sock (string) @@ -322,11 +322,11 @@ modparam("rtpengine", "setid_avp", "$avp(setid)") modparam("rtpengine", "force_send_interface", "10.3.7.123") ... -4.8. write_sdp_avp (string) +4.8. write_sdp_pv (string) - If this parameter is set to a valid AVP specifier, the SDP returned by - rtpengine in the offer/answer operations is returned in the specified - SDP instead of the message body. + If this parameter is set to a valid AVP or script var specifier, the + SDP returned by rtpengine in the offer/answer operations is returned in + the specified variable instead of the message body. There is no default value. diff --git a/modules/rtpengine/doc/rtpengine_admin.xml b/modules/rtpengine/doc/rtpengine_admin.xml index 7a01b0d0380..84f11c3e933 100644 --- a/modules/rtpengine/doc/rtpengine_admin.xml +++ b/modules/rtpengine/doc/rtpengine_admin.xml @@ -260,12 +260,12 @@ modparam("rtpengine", "force_send_interface", "10.3.7.123") -
- <varname>write_sdp_avp</varname> (string) +
+ <varname>write_sdp_pv</varname> (string) - If this parameter is set to a valid AVP specifier, the + If this parameter is set to a valid AVP or script var specifier, the SDP returned by rtpengine in the offer/answer operations - is returned in the specified SDP instead of the + is returned in the specified variable instead of the message body.