From 95a2bacb001299a7b48c82ccf7a38bbc0050ed28 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 12 Jul 2013 11:56:45 -0400 Subject: [PATCH] implement second parameter to rtpproxy_offer/answer/manage --- debian/patches/sipwise/rtproxy-ng.patch | 77 +++++++++---------------- 1 file changed, 27 insertions(+), 50 deletions(-) diff --git a/debian/patches/sipwise/rtproxy-ng.patch b/debian/patches/sipwise/rtproxy-ng.patch index 950ffa06a..37f2a92fb 100644 --- a/debian/patches/sipwise/rtproxy-ng.patch +++ b/debian/patches/sipwise/rtproxy-ng.patch @@ -2926,7 +2926,7 @@ + --- /dev/null +++ b/modules/rtpproxy-ng/rtpproxy.c -@@ -0,0 +1,1966 @@ +@@ -0,0 +1,1943 @@ +/* $Id$ + * + * Copyright (C) 2003-2008 Sippy Software, Inc., http://www.sippysoft.com @@ -3225,9 +3225,9 @@ + +static char *gencookie(); +static int rtpp_test(struct rtpp_node*, int, int); -+static int unforce_rtp_proxy_f(struct sip_msg *, char *, char *); ++static int unforce_rtp_proxy_f(struct sip_msg *, const char *, char *); +static int unforce_rtp_proxy1_f(struct sip_msg *, char *, char *); -+static int force_rtp_proxy(struct sip_msg *, char *, char *, int, int); ++static int force_rtp_proxy(struct sip_msg *, const char *, const str *, int); +static int start_recording_f(struct sip_msg *, char *, char *); +static int rtpproxy_answer1_f(struct sip_msg *, char *, char *); +static int rtpproxy_answer2_f(struct sip_msg *, char *, char *); @@ -4017,7 +4017,7 @@ +}; + +static bencode_item_t *rtpp_function_call(bencode_buffer_t *bencbuf, struct sip_msg *msg, -+ enum rtpp_operation op, const char *flags_str, str *body_out) ++ enum rtpp_operation op, const char *flags_str, const str *force_addr, str *body_out) +{ + bencode_item_t *dict, *flags, *direction, *replace, *item; + str callid, from_tag, to_tag, body, viabranch, error; @@ -4221,6 +4221,9 @@ + ) ); + bencode_list_add_string(item, ip_addr2a(&msg->rcv.src_ip)); + ++ if (force_addr && force_addr->len) ++ bencode_dictionary_add_str(dict, "media address", force_addr); ++ + if ((msg->first_line.type == SIP_REQUEST && op != OP_ANSWER) + || (msg->first_line.type == SIP_REPLY && op == OP_ANSWER)) + { @@ -4288,7 +4291,7 @@ +static int rtpp_function_call_simple(struct sip_msg *msg, enum rtpp_operation op, const char *flags_str) { + bencode_buffer_t bencbuf; + -+ if (!rtpp_function_call(&bencbuf, msg, op, flags_str, NULL)) ++ if (!rtpp_function_call(&bencbuf, msg, op, flags_str, NULL, NULL)) + return -1; + + bencode_buffer_free(&bencbuf); @@ -4296,10 +4299,10 @@ +} + +static bencode_item_t *rtpp_function_call_ok(bencode_buffer_t *bencbuf, struct sip_msg *msg, -+ enum rtpp_operation op, const char *flags_str, str *body) { ++ enum rtpp_operation op, const char *flags_str, const str *force_addr, str *body) { + bencode_item_t *ret; + -+ ret = rtpp_function_call(bencbuf, msg, op, flags_str, body); ++ ret = rtpp_function_call(bencbuf, msg, op, flags_str, force_addr, body); + if (!ret) + return NULL; + @@ -4596,7 +4599,7 @@ + + +static int -+unforce_rtp_proxy_f(struct sip_msg* msg, char* str1, char* str2) ++unforce_rtp_proxy_f(struct sip_msg* msg, const char* str1, char* str2) +{ + return rtpp_function_call_simple(msg, OP_DELETE, str1); +} @@ -4645,10 +4648,8 @@ +} + +static int -+rtpproxy_manage(struct sip_msg *msg, char *flags, char *ip) ++rtpproxy_manage(struct sip_msg *msg, const char *flags, const str *force_addr) +{ -+ char *cp = NULL; -+ char newip[IP_ADDR_MAX_STR_SIZE]; + int method; + int nosdp; + @@ -4668,12 +4669,6 @@ + if(method==METHOD_CANCEL || method==METHOD_BYE) + return unforce_rtp_proxy_f(msg, flags, 0); + -+ if(ip==NULL) -+ { -+ cp = ip_addr2a(&msg->rcv.dst_ip); -+ strcpy(newip, cp); -+ } -+ + if(msg->msg_flags & FL_SDP_BODY) + nosdp = 0; + else @@ -4681,11 +4676,9 @@ + + if(msg->first_line.type == SIP_REQUEST) { + if(method==METHOD_ACK && nosdp==0) -+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 0, -+ (ip!=NULL)?1:0); ++ return force_rtp_proxy(msg, flags, force_addr, OP_ANSWER); + if(method==METHOD_UPDATE && nosdp==0) -+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 1, -+ (ip!=NULL)?1:0); ++ return force_rtp_proxy(msg, flags, force_addr, OP_OFFER); + if(method==METHOD_INVITE && nosdp==0) { + msg->msg_flags |= FL_SDP_BODY; + if(tmb.t_gett!=NULL && tmb.t_gett()!=NULL @@ -4693,25 +4686,20 @@ + tmb.t_gett()->uas.request->msg_flags |= FL_SDP_BODY; + if(route_type==FAILURE_ROUTE) + return unforce_rtp_proxy_f(msg, flags, 0); -+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 1, -+ (ip!=NULL)?1:0); ++ return force_rtp_proxy(msg, flags, force_addr, OP_OFFER); + } + } else if(msg->first_line.type == SIP_REPLY) { + if(msg->first_line.u.reply.statuscode>=300) + return unforce_rtp_proxy_f(msg, flags, 0); + if(nosdp==0) { + if(method==METHOD_UPDATE) -+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 0, -+ (ip!=NULL)?1:0); ++ return force_rtp_proxy(msg, flags, force_addr, OP_ANSWER); + if(tmb.t_gett==NULL || tmb.t_gett()==NULL + || tmb.t_gett()==T_UNDEFINED) -+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 0, -+ (ip!=NULL)?1:0); ++ return force_rtp_proxy(msg, flags, force_addr, OP_ANSWER); + if(tmb.t_gett()->uas.request->msg_flags & FL_SDP_BODY) -+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 0, -+ (ip!=NULL)?1:0); -+ return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 1, -+ (ip!=NULL)?1:0); ++ return force_rtp_proxy(msg, flags, force_addr, OP_ANSWER); ++ return force_rtp_proxy(msg, flags, force_addr, OP_OFFER); + } + } + return -1; @@ -4738,24 +4726,19 @@ + str ip_str; + fixup_get_svalue(msg, (gparam_p)flags, &flag_str); + fixup_get_svalue(msg, (gparam_p)ip, &ip_str); -+ return rtpproxy_manage(msg, flag_str.s, ip_str.s); ++ return rtpproxy_manage(msg, flag_str.s, &ip_str); +} + +static int +rtpproxy_offer1_f(struct sip_msg *msg, char *str1, char *str2) +{ -+ char *cp; -+ char newip[IP_ADDR_MAX_STR_SIZE]; + str flags; + -+ cp = ip_addr2a(&msg->rcv.dst_ip); -+ strcpy(newip, cp); -+ + 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 force_rtp_proxy(msg, flags.s, NULL, OP_OFFER); +} + +static int @@ -4765,28 +4748,23 @@ + + get_str_fparam(&flags, msg, (fparam_t *) param1); + get_str_fparam(&new_ip, msg, (fparam_t *) param2); -+ return force_rtp_proxy(msg, flags.s, new_ip.s, 1, 1); ++ return force_rtp_proxy(msg, flags.s, &new_ip, OP_OFFER); +} + +static int +rtpproxy_answer1_f(struct sip_msg *msg, char *str1, char *str2) +{ -+ 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) + return -1; + -+ cp = ip_addr2a(&msg->rcv.dst_ip); -+ strcpy(newip, cp); -+ + 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 force_rtp_proxy(msg, flags.s, NULL, OP_ANSWER); +} + +static int @@ -4801,19 +4779,18 @@ + + get_str_fparam(&flags, msg, (fparam_t *) param1); + get_str_fparam(&new_ip, msg, (fparam_t *) param2); -+ return force_rtp_proxy(msg, flags.s, new_ip.s, 0, 1); ++ return force_rtp_proxy(msg, flags.s, &new_ip, OP_ANSWER); +} + -+/* XXX forcedIP */ +static int -+force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forcedIP) ++force_rtp_proxy(struct sip_msg *msg, const char *flags, const str *force_addr, int op) +{ + bencode_buffer_t bencbuf; + bencode_item_t *dict; + str body, newbody; + struct lump *anchor; + -+ dict = rtpp_function_call_ok(&bencbuf, msg, offer ? OP_OFFER : OP_ANSWER, str1, &body); ++ dict = rtpp_function_call_ok(&bencbuf, msg, op, flags, force_addr, &body); + if (!dict) + return -1; + @@ -4861,7 +4838,7 @@ + static char buf[256]; + str ret; + -+ dict = rtpp_function_call_ok(&bencbuf, msg, OP_QUERY, NULL, NULL); ++ dict = rtpp_function_call_ok(&bencbuf, msg, OP_QUERY, NULL, NULL, NULL); + if (!dict) + return -1; +