mirror of https://github.com/sipwise/kamailio.git
Change-Id: Ib28574d46ddddaf6233daec03c1d20a65edf5f70changes/90/23690/3
parent
42c06a4bf7
commit
43db61933f
@ -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 {
|
||||
Loading…
Reference in new issue