Module: kamailio Branch: master Commit: 2baa05ad2336f5e1286218b6516b7b8ef16037a2 URL: https://github.com/kamailio/kamailio/commit/2baa05ad2336f5e1286218b6516b7b8e...
Author: Richard Fuchs rfuchs@sipwise.com Committer: Richard Fuchs rfuchs@sipwise.com Date: 2019-03-04T12:06:38-05:00
rtpengine: add support for via-branch=extra option
---
Modified: src/modules/rtpengine/rtpengine.c
---
Diff: https://github.com/kamailio/kamailio/commit/2baa05ad2336f5e1286218b6516b7b8e... Patch: https://github.com/kamailio/kamailio/commit/2baa05ad2336f5e1286218b6516b7b8e...
---
diff --git a/src/modules/rtpengine/rtpengine.c b/src/modules/rtpengine/rtpengine.c index 54f448e222..f27503c6cc 100644 --- a/src/modules/rtpengine/rtpengine.c +++ b/src/modules/rtpengine/rtpengine.c @@ -77,6 +77,7 @@ #include "../../core/rpc.h" #include "../../core/rpc_lookup.h" #include "../../core/kemi.h" +#include "../../core/char_msg_val.h" #include "../../modules/tm/tm_load.h" #include "rtpengine.h" #include "rtpengine_funcs.h" @@ -199,7 +200,7 @@ static int rtpengine_query1_f(struct sip_msg *, char *, char *);
static int parse_flags(struct ng_flags_parse *, struct sip_msg *, enum rtpe_operation *, const char *);
-static int rtpengine_offer_answer(struct sip_msg *msg, const char *flags, int op, int more); +static int rtpengine_offer_answer(struct sip_msg *msg, const char *flags, enum rtpe_operation op, int more); static int fixup_set_id(void ** param, int param_no); static int set_rtpengine_set_f(struct sip_msg * msg, char * str1, char * str2); static struct rtpp_set * select_rtpp_set(unsigned int id_set); @@ -2212,6 +2213,8 @@ static int parse_flags(struct ng_flags_parse *ng_flags, struct sip_msg *msg, enu ng_flags->via = 3; else if (str_eq(&val, "extra")) ng_flags->via = -1; + else if (str_eq(&val, "next")) + ng_flags->via = -2; else goto error; goto next; @@ -2304,6 +2307,8 @@ static bencode_item_t *rtpp_function_call(bencode_buffer_t *bencbuf, struct sip_ struct rtpp_node *node; char *cp; pv_value_t pv_val; + char md5[MD5_LEN]; + char branch_buf[MAX_BRANCH_PARAM_LEN];
/*** get & init basic stuff needed ***/
@@ -2387,12 +2392,30 @@ static bencode_item_t *rtpp_function_call(bencode_buffer_t *bencbuf, struct sip_ bencode_dictionary_add_str(ng_flags.dict, "call-id", &ng_flags.call_id);
if (ng_flags.via) { - if (ng_flags.via == 1 || ng_flags.via == 2) - ret = get_via_branch(msg, ng_flags.via, &viabranch); - else if (ng_flags.via == -1 && extra_id_pv) - ret = get_extra_id(msg, &viabranch); - else - ret = -1; + ret = -1; + switch (ng_flags.via) { + case 3: + ng_flags.via = (msg->first_line.type == SIP_REPLY) ? 2 : 1; + /* fall thru */ + case 1: + case 2: + ret = get_via_branch(msg, ng_flags.via, &viabranch); + break; + case -1: + if (extra_id_pv) + ret = get_extra_id(msg, &viabranch); + break; + case -2: + if (!char_msg_val(msg, md5)) + break; + msg->hash_index = hash(msg->callid->body, get_cseq(msg)->number); + + viabranch.s = branch_buf; + if (branch_builder(msg->hash_index, 0, md5, 0, branch_buf, &viabranch.len)) + ret = 0; + break; + } + if (ret == -1 || viabranch.len == 0) { LM_ERR("can't get Via branch/extra ID\n"); goto error; @@ -3555,7 +3578,7 @@ rtpengine_answer1_f(struct sip_msg *msg, char *str1, char *str2) }
static int -rtpengine_offer_answer(struct sip_msg *msg, const char *flags, int op, int more) +rtpengine_offer_answer(struct sip_msg *msg, const char *flags, enum rtpe_operation op, int more) { bencode_buffer_t bencbuf; bencode_item_t *dict;