diff --git a/src/modules/rtpproxy/rtpproxy.c b/src/modules/rtpproxy/rtpproxy.c index e445ea39d35..87e534e4b30 100644 --- a/src/modules/rtpproxy/rtpproxy.c +++ b/src/modules/rtpproxy/rtpproxy.c @@ -1913,20 +1913,28 @@ rtpproxy_manage2(struct sip_msg *msg, char *flags, char *ip) } static int -rtpproxy_offer1_f(struct sip_msg *msg, char *str1, char *str2) +rtpproxy_offer1_helper_f(struct sip_msg *msg, char *flags) { char *cp; char newip[IP_ADDR_MAX_STR_SIZE]; - str flags; cp = ip_addr2a(&msg->rcv.dst_ip); strcpy(newip, cp); + return force_rtp_proxy(msg, flags, newip, 1, 0); +} + + static int +rtpproxy_offer1_f(struct sip_msg *msg, char *str1, char *str2) +{ + str flags; + if (str1) get_str_fparam(&flags, msg, (fparam_t *) str1); else flags.s = NULL; - return force_rtp_proxy(msg, flags.s, newip, 1, 0); + + return rtpproxy_offer1_helper_f(msg, flags.s); } static int @@ -1940,11 +1948,10 @@ rtpproxy_offer2_f(struct sip_msg *msg, char *param1, char *param2) } static int -rtpproxy_answer1_f(struct sip_msg *msg, char *str1, char *str2) +rtpproxy_answer1_helper_f(struct sip_msg *msg, char *flags) { char *cp; char newip[IP_ADDR_MAX_STR_SIZE]; - str flags; if (msg->first_line.type == SIP_REQUEST) if (msg->first_line.u.request.method_value != METHOD_ACK) @@ -1953,11 +1960,20 @@ rtpproxy_answer1_f(struct sip_msg *msg, char *str1, char *str2) cp = ip_addr2a(&msg->rcv.dst_ip); strcpy(newip, cp); + return force_rtp_proxy(msg, flags, newip, 0, 0); +} + + static int +rtpproxy_answer1_f(struct sip_msg *msg, char *str1, char *str2) +{ + str flags; + if (str1) get_str_fparam(&flags, msg, (fparam_t *) str1); else flags.s = NULL; - return force_rtp_proxy(msg, flags.s, newip, 0, 0); + + return rtpproxy_answer1_helper_f(msg, flags.s); } static int @@ -2712,7 +2728,7 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, } -static int start_recording_f(struct sip_msg* msg, char *foo, char *bar) +static int ki_start_recording(sip_msg_t* msg) { int nitems; str callid = {0, 0}; @@ -2769,6 +2785,11 @@ static int start_recording_f(struct sip_msg* msg, char *foo, char *bar) return 1; } +static int start_recording_f(struct sip_msg* msg, char *foo, char *bar) +{ + return ki_start_recording(msg); +} + /* * Returns the current RTP-Statistics from the RTP-Proxy */ @@ -2873,6 +2894,83 @@ static int ki_rtpproxy_manage_ip(sip_msg_t *msg, str *flags, str *mip) ((mip && mip->len>0)?mip->s:NULL)); } +static int ki_set_rtp_proxy_set(sip_msg_t *msg, int rset) +{ + selected_rtpp_set = select_rtpp_set(rset); + if(selected_rtpp_set==NULL) { + LM_ERR("could not locate rtpproxy set %d\n", rset); + return -1; + } + current_msg_id = msg->id; + return 1; +} + +static int ki_rtpproxy_destroy0(sip_msg_t *msg) +{ + return unforce_rtp_proxy(msg, NULL); +} + +static int ki_rtpproxy_destroy(sip_msg_t *msg, str *flags) +{ + if(flags==NULL || flags->len<=0) + return unforce_rtp_proxy(msg, NULL); + return unforce_rtp_proxy(msg, flags->s); +} + +static int ki_rtpproxy_offer0(sip_msg_t *msg) +{ + return rtpproxy_offer1_helper_f(msg, NULL); +} + +static int ki_rtpproxy_offer(sip_msg_t *msg, str *flags) +{ + if(flags==NULL || flags->len<=0) + return rtpproxy_offer1_helper_f(msg, NULL); + return rtpproxy_offer1_helper_f(msg, flags->s); +} + +static int ki_rtpproxy_offer_ip(sip_msg_t *msg, str *flags, str *mip) +{ + return force_rtp_proxy(msg, flags->s, mip->s, 1, 1); +} + +static int ki_rtpproxy_answer0(sip_msg_t *msg) +{ + return rtpproxy_answer1_helper_f(msg, NULL); +} + +static int ki_rtpproxy_answer(sip_msg_t *msg, str *flags) +{ + if(flags==NULL || flags->len<=0) + return rtpproxy_answer1_helper_f(msg, NULL); + return rtpproxy_answer1_helper_f(msg, flags->s); +} + +static int ki_rtpproxy_answer_ip(sip_msg_t *msg, str *flags, str *mip) +{ + return force_rtp_proxy(msg, flags->s, mip->s, 0, 1); +} + +static int ki_rtpproxy_stream2uac(sip_msg_t* msg, str* pname, int count) +{ + return rtpproxy_stream(msg, pname, count, 1); +} + +static int ki_rtpproxy_stream2uas(sip_msg_t* msg, str* pname, int count) +{ + return rtpproxy_stream(msg, pname, count, 0); +} + +static int ki_rtpproxy_stop_stream2uac(sip_msg_t *msg) +{ + return rtpproxy_stop_stream(msg, 1); +} + +static int ki_rtpproxy_stop_stream2uas(sip_msg_t* msg) +{ + return rtpproxy_stop_stream(msg, 0); +} + /** * */ @@ -2892,6 +2990,76 @@ static sr_kemi_t sr_kemi_rtpproxy_exports[] = { { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } }, + { str_init("rtpproxy"), str_init("set_rtpproxy_set"), + SR_KEMIP_INT, ki_set_rtp_proxy_set, + { SR_KEMIP_INT, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_destroy0"), + SR_KEMIP_INT, ki_rtpproxy_destroy0, + { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_destroy"), + SR_KEMIP_INT, ki_rtpproxy_destroy, + { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("start_recording"), + SR_KEMIP_INT, ki_start_recording, + { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_offer0"), + SR_KEMIP_INT, ki_rtpproxy_offer0, + { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_offer"), + SR_KEMIP_INT, ki_rtpproxy_offer, + { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_offer_ip"), + SR_KEMIP_INT, ki_rtpproxy_offer_ip, + { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_answer0"), + SR_KEMIP_INT, ki_rtpproxy_answer0, + { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_answer"), + SR_KEMIP_INT, ki_rtpproxy_answer, + { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_answer_ip"), + SR_KEMIP_INT, ki_rtpproxy_answer_ip, + { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_stream2uac"), + SR_KEMIP_INT, ki_rtpproxy_stream2uac, + { SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_stream2uas"), + SR_KEMIP_INT, ki_rtpproxy_stream2uas, + { SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_stop_stream2uac"), + SR_KEMIP_INT, ki_rtpproxy_stop_stream2uac, + { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("rtpproxy"), str_init("rtpproxy_stop_stream2uas"), + SR_KEMIP_INT, ki_rtpproxy_stop_stream2uas, + { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, { {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } } }; diff --git a/src/modules/rtpproxy/rtpproxy_stream.c b/src/modules/rtpproxy/rtpproxy_stream.c index 8e010e00557..c20074f4e62 100644 --- a/src/modules/rtpproxy/rtpproxy_stream.c +++ b/src/modules/rtpproxy/rtpproxy_stream.c @@ -71,7 +71,7 @@ fixup_var_str_int(void **param, int param_no) return 0; } - static int + int rtpproxy_stream(struct sip_msg* msg, str *pname, int count, int stream2uac) { int nitems; @@ -160,7 +160,7 @@ rtpproxy_stream2uas2_f(struct sip_msg* msg, char* str1, char* str2) return rtpproxy_stream2_f(msg, str1, (int)(long)str2, 0); } - static int + int rtpproxy_stop_stream(struct sip_msg* msg, int stream2uac) { int nitems; diff --git a/src/modules/rtpproxy/rtpproxy_stream.h b/src/modules/rtpproxy/rtpproxy_stream.h index 1bf349ec190..ce056a407e5 100644 --- a/src/modules/rtpproxy/rtpproxy_stream.h +++ b/src/modules/rtpproxy/rtpproxy_stream.h @@ -29,8 +29,10 @@ #define _RTPPROXY_STREAM_H int fixup_var_str_int(void **, int); +int rtpproxy_stream(struct sip_msg* msg, str *pname, int count, int stream2uac); int rtpproxy_stream2uac2_f(struct sip_msg *, char *, char *); int rtpproxy_stream2uas2_f(struct sip_msg *, char *, char *); +int rtpproxy_stop_stream(struct sip_msg* msg, int stream2uac); int rtpproxy_stop_stream2uac2_f(struct sip_msg *, char *, char *); int rtpproxy_stop_stream2uas2_f(struct sip_msg *, char *, char *);