diff --git a/modules/rtpengine/README b/modules/rtpengine/README index 85d568bd0fd..6492f2a59f4 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_pv (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_pv (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_pv (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_pv (string) + + 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. + + 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 ... diff --git a/modules/rtpengine/doc/rtpengine_admin.xml b/modules/rtpengine/doc/rtpengine_admin.xml index 4a1ea6f400b..84f11c3e933 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_pv</varname> (string) + + 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. + + + 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..ff9223db3b1 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -211,8 +211,13 @@ static int *rtpp_socks = 0; static int setid_avp_type; static int_str setid_avp; +static str write_sdp_pvar_str = {NULL, 0}; +static pv_spec_t* write_sdp_pvar = NULL; + + char* force_send_ip_str=""; + typedef struct rtpp_set_link { struct rtpp_set *rset; pv_spec_t *rpv; @@ -282,6 +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_pv", PARAM_STR, &write_sdp_pvar_str }, {0, 0, 0} }; @@ -853,6 +859,16 @@ mod_init(void) setid_avp_type = avp_flags; } + 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; + } + } + if (rtpp_strings) pkg_free(rtpp_strings); @@ -1962,6 +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; + pv_value_t pv_val; dict = rtpp_function_call_ok(&bencbuf, msg, op, flags, &body); if (!dict) @@ -1978,14 +1995,28 @@ 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_pvar!= NULL) { + pv_val.rs = newbody; + pv_val.flags = PV_VAL_STR; + + 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; + } + + pkg_free(newbody.s); + + } 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; + } } }