diff --git a/debian/patches/series b/debian/patches/series index bbabb3ad3..425fe7f82 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -49,3 +49,4 @@ sipwise/extend_stats.patch sipwise/avpops_avp_subst_pvar.patch sipwise/tt37692.patch sipwise/dtmf-blocking.patch +sipwise/media-blocking.patch diff --git a/debian/patches/sipwise/media-blocking.patch b/debian/patches/sipwise/media-blocking.patch new file mode 100644 index 000000000..f6c2303b1 --- /dev/null +++ b/debian/patches/sipwise/media-blocking.patch @@ -0,0 +1,186 @@ +--- a/src/modules/rtpengine/rtpengine.c ++++ b/src/modules/rtpengine/rtpengine.c +@@ -115,7 +115,7 @@ + #define CPORT "22222" + + struct ng_flags_parse { +- int via, to, packetize, transport; ++ int via, to, packetize, transport, directional; + bencode_item_t *dict, *flags, *direction, *replace, *rtcp_mux; + str call_id, from_tag, to_tag; + }; +@@ -130,6 +130,8 @@ + [OP_STOP_RECORDING] = "stop recording", + [OP_BLOCK_DTMF] = "block DTMF", + [OP_UNBLOCK_DTMF] = "unblock DTMF", ++ [OP_BLOCK_MEDIA] = "block media", ++ [OP_UNBLOCK_MEDIA] = "unblock media", + }; + + struct minmax_mos_stats { +@@ -173,6 +175,8 @@ + static int stop_recording_f(struct sip_msg *, char *, char *); + static int block_dtmf_f(struct sip_msg *, char *, char *); + static int unblock_dtmf_f(struct sip_msg *, char *, char *); ++static int block_media_f(struct sip_msg *, char *, char *); ++static int unblock_media_f(struct sip_msg *, char *, char *); + static int rtpengine_answer1_f(struct sip_msg *, char *, char *); + static int rtpengine_offer1_f(struct sip_msg *, char *, char *); + static int rtpengine_delete1_f(struct sip_msg *, char *, char *); +@@ -304,6 +308,24 @@ + {"unblock_dtmf", (cmd_function)unblock_dtmf_f, 0, + 0, 0, + ANY_ROUTE}, ++ {"block_media", (cmd_function)block_media_f, 0, ++ 0, 0, ++ ANY_ROUTE }, ++ {"unblock_media", (cmd_function)unblock_media_f, 0, ++ 0, 0, ++ ANY_ROUTE}, ++ {"block_dtmf", (cmd_function)block_dtmf_f, 1, ++ fixup_spve_null, 0, ++ ANY_ROUTE }, ++ {"unblock_dtmf", (cmd_function)unblock_dtmf_f, 1, ++ fixup_spve_null, 0, ++ ANY_ROUTE}, ++ {"block_media", (cmd_function)block_media_f, 1, ++ fixup_spve_null, 0, ++ ANY_ROUTE }, ++ {"unblock_media", (cmd_function)unblock_media_f, 1, ++ fixup_spve_null, 0, ++ ANY_ROUTE}, + {"rtpengine_offer", (cmd_function)rtpengine_offer1_f, 0, + 0, 0, + ANY_ROUTE}, +@@ -1999,6 +2021,7 @@ + if (!val.s) + goto error; + ng_flags->from_tag = val; ++ ng_flags->directional = 1; + } + else + goto generic; +@@ -2050,8 +2073,12 @@ + if (!ng_flags->packetize) + goto error; + bencode_dictionary_add_integer(ng_flags->dict, "repacketize", ng_flags->packetize); +- goto next; + } ++ else if (str_eq(&key, "directional")) ++ ng_flags->directional = 1; ++ else ++ goto generic; ++ goto next; + break; + + case 12: +@@ -2171,6 +2198,11 @@ + else + bencode_dictionary_add_str(ng_flags.dict, "sdp", &body); + } ++ else if (op == OP_BLOCK_DTMF || op == OP_BLOCK_MEDIA || op == OP_UNBLOCK_DTMF ++ || op == OP_UNBLOCK_MEDIA) ++ { ++ ng_flags.flags = bencode_list(bencbuf); ++ } + + /*** parse flags & build dictionary ***/ + +@@ -2234,7 +2266,13 @@ + ) ); + bencode_list_add_string(item, ip_addr2a(&msg->rcv.src_ip)); + +- if ((msg->first_line.type == SIP_REQUEST && op != OP_ANSWER) ++ if (op == OP_BLOCK_DTMF || op == OP_BLOCK_MEDIA || op == OP_UNBLOCK_DTMF ++ || op == OP_UNBLOCK_MEDIA) ++ { ++ if (ng_flags.directional) ++ bencode_dictionary_add_str(ng_flags.dict, "from-tag", &ng_flags.from_tag); ++ } ++ else if ((msg->first_line.type == SIP_REQUEST && op != OP_ANSWER) + || (msg->first_line.type == SIP_REPLY && op == OP_DELETE) + || (msg->first_line.type == SIP_REPLY && op == OP_ANSWER)) + { +@@ -3506,13 +3544,69 @@ + static int + block_dtmf_f(struct sip_msg* msg, char *str1, char *str2) + { +- return rtpengine_rtpp_set_wrap(msg, rtpengine_block_dtmf_wrap, NULL, 1); ++ str flags; ++ flags.s = NULL; ++ if (str1) { ++ if (get_str_fparam(&flags, msg, (fparam_t *) str1)) { ++ LM_ERR("Error getting string parameter\n"); ++ return -1; ++ } ++ } ++ ++ return rtpengine_rtpp_set_wrap(msg, rtpengine_block_dtmf_wrap, flags.s, 1); + } + + static int + unblock_dtmf_f(struct sip_msg* msg, char *str1, char *str2) + { +- return rtpengine_rtpp_set_wrap(msg, rtpengine_unblock_dtmf_wrap, NULL, 1); ++ str flags; ++ flags.s = NULL; ++ if (str1) { ++ if (get_str_fparam(&flags, msg, (fparam_t *) str1)) { ++ LM_ERR("Error getting string parameter\n"); ++ return -1; ++ } ++ } ++ ++ return rtpengine_rtpp_set_wrap(msg, rtpengine_unblock_dtmf_wrap, flags.s, 1); ++} ++ ++static int rtpengine_block_media_wrap(struct sip_msg *msg, void *d, int more) { ++ return rtpp_function_call_simple(msg, OP_BLOCK_MEDIA, d); ++} ++ ++static int rtpengine_unblock_media_wrap(struct sip_msg *msg, void *d, int more) { ++ return rtpp_function_call_simple(msg, OP_UNBLOCK_MEDIA, d); ++} ++ ++static int ++block_media_f(struct sip_msg* msg, char *str1, char *str2) ++{ ++ str flags; ++ flags.s = NULL; ++ if (str1) { ++ if (get_str_fparam(&flags, msg, (fparam_t *) str1)) { ++ LM_ERR("Error getting string parameter\n"); ++ return -1; ++ } ++ } ++ ++ return rtpengine_rtpp_set_wrap(msg, rtpengine_block_media_wrap, flags.s, 1); ++} ++ ++static int ++unblock_media_f(struct sip_msg* msg, char *str1, char *str2) ++{ ++ str flags; ++ flags.s = NULL; ++ if (str1) { ++ if (get_str_fparam(&flags, msg, (fparam_t *) str1)) { ++ LM_ERR("Error getting string parameter\n"); ++ return -1; ++ } ++ } ++ ++ return rtpengine_rtpp_set_wrap(msg, rtpengine_unblock_media_wrap, flags.s, 1); + } + + static int rtpengine_rtpstat_wrap(struct sip_msg *msg, void *d, int more) { +--- a/src/modules/rtpengine/rtpengine.h ++++ b/src/modules/rtpengine/rtpengine.h +@@ -40,6 +40,8 @@ + OP_PING, + OP_BLOCK_DTMF, + OP_UNBLOCK_DTMF, ++ OP_BLOCK_MEDIA, ++ OP_UNBLOCK_MEDIA, + }; + + struct rtpp_node {