[sr-dev] git:master:2baa05ad: rtpengine: add support for via-branch=extra option

Richard Fuchs rfuchs at sipwise.com
Mon Mar 4 18:37:21 CET 2019


Module: kamailio
Branch: master
Commit: 2baa05ad2336f5e1286218b6516b7b8ef16037a2
URL: https://github.com/kamailio/kamailio/commit/2baa05ad2336f5e1286218b6516b7b8ef16037a2

Author: Richard Fuchs <rfuchs at sipwise.com>
Committer: Richard Fuchs <rfuchs at 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/2baa05ad2336f5e1286218b6516b7b8ef16037a2.diff
Patch: https://github.com/kamailio/kamailio/commit/2baa05ad2336f5e1286218b6516b7b8ef16037a2.patch

---

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;




More information about the sr-dev mailing list