[sr-dev] git:master:6045c62f: siputils: added optional mode parameter to is_first_hop()

Daniel-Constantin Mierla miconda at gmail.com
Tue May 11 15:39:01 CEST 2021


Module: kamailio
Branch: master
Commit: 6045c62f4ebaf861cf725ea7c1e560b22f7a5379
URL: https://github.com/kamailio/kamailio/commit/6045c62f4ebaf861cf725ea7c1e560b22f7a5379

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2021-05-11T15:16:36+02:00

siputils: added optional mode parameter to is_first_hop()

- if set to 1, skip checking for loops
- exported to kemi as is_first_hop_mode(int mode)

---

Modified: src/modules/siputils/sipops.c
Modified: src/modules/siputils/sipops.h
Modified: src/modules/siputils/siputils.c

---

Diff:  https://github.com/kamailio/kamailio/commit/6045c62f4ebaf861cf725ea7c1e560b22f7a5379.diff
Patch: https://github.com/kamailio/kamailio/commit/6045c62f4ebaf861cf725ea7c1e560b22f7a5379.patch

---

diff --git a/src/modules/siputils/sipops.c b/src/modules/siputils/sipops.c
index 95b1baa5d0..fb1040c6ba 100644
--- a/src/modules/siputils/sipops.c
+++ b/src/modules/siputils/sipops.c
@@ -140,12 +140,12 @@ int w_is_supported(sip_msg_t *msg, char *_option, char *p2)
 }
 
 
-int is_first_hop(sip_msg_t *msg)
+int is_first_hop_mode(sip_msg_t *msg, int mode)
 {
 	int ret;
 	rr_t* r = NULL;
 	sip_uri_t puri;
-	struct ip_addr *ip;
+	struct ip_addr *ip = NULL;
 
 	if(msg==NULL)
 		return -1;
@@ -180,10 +180,12 @@ int is_first_hop(sip_msg_t *msg)
 			LM_DBG("failed to parse uri in first record-route header\n");
 			return -1;
 		}
-		if (((ip = str2ip(&(puri.host))) == NULL)
-				&& ((ip = str2ip6(&(puri.host))) == NULL)) {
-			LM_DBG("uri host is not an ip address\n");
-			return -1;
+		if(mode==0) {
+			if (((ip = str2ip(&(puri.host))) == NULL)
+					&& ((ip = str2ip6(&(puri.host))) == NULL)) {
+				LM_DBG("uri host is not an ip address\n");
+				return -1;
+			}
 		}
 		ret = check_self(&puri.host, (puri.port.s)?puri.port_no:0,
 				(puri.transport_val.s)?puri.proto:0);
@@ -191,13 +193,15 @@ int is_first_hop(sip_msg_t *msg)
 			LM_DBG("top record route uri is not myself\n");
 			return -1;
 		}
-		if (ip_addr_cmp(ip, &(msg->rcv.src_ip))
-				&& ((msg->rcv.src_port == puri.port_no)
-					|| ((puri.port.len == 0) && (msg->rcv.src_port == 5060)))
-				&& (puri.proto==msg->rcv.proto
-					|| (puri.proto==0 && msg->rcv.proto==PROTO_UDP)) ) {
-			LM_DBG("source address matches top record route uri - loop\n");
-			return -1;
+		if(mode==0) {
+			if (ip_addr_cmp(ip, &(msg->rcv.src_ip))
+					&& ((msg->rcv.src_port == puri.port_no)
+						|| ((puri.port.len == 0) && (msg->rcv.src_port == 5060)))
+					&& (puri.proto==msg->rcv.proto
+						|| (puri.proto==0 && msg->rcv.proto==PROTO_UDP)) ) {
+				LM_DBG("source address matches top record route uri - loop\n");
+				return -1;
+			}
 		}
 		/* todo - check spirals */
 		return 1;
@@ -206,6 +210,23 @@ int is_first_hop(sip_msg_t *msg)
 	}
 }
 
+int w_is_first_hop_mode(sip_msg_t *msg, char *p1mode, char *p2)
+{
+	int mode = 0;
+
+	if(fixup_get_ivalue(msg, (gparam_t*)p1mode, &mode)<0) {
+		LM_ERR("failed to get mode parameter\n");
+		return -1;
+	}
+
+	return is_first_hop_mode(msg, mode);
+}
+
+int is_first_hop(sip_msg_t *msg)
+{
+	return is_first_hop_mode(msg, 0);
+}
+
 int w_is_first_hop(sip_msg_t *msg, char *p1, char *p2)
 {
 	return is_first_hop(msg);
diff --git a/src/modules/siputils/sipops.h b/src/modules/siputils/sipops.h
index 27ac0c035e..97d885c71c 100644
--- a/src/modules/siputils/sipops.h
+++ b/src/modules/siputils/sipops.h
@@ -40,5 +40,7 @@ int w_is_gruu(sip_msg_t *msg, char *uri1, char *p2);
 int w_is_supported(sip_msg_t *msg, char *_option, char *p2);
 int w_is_first_hop(sip_msg_t *msg, char *p1, char *p2);
 int is_first_hop(sip_msg_t *msg);
+int w_is_first_hop_mode(sip_msg_t *msg, char *p1mode, char *p2);
+int is_first_hop_mode(sip_msg_t *msg, int mode);
 
 #endif
diff --git a/src/modules/siputils/siputils.c b/src/modules/siputils/siputils.c
index 33a3c40a61..57ae9fb262 100644
--- a/src/modules/siputils/siputils.c
+++ b/src/modules/siputils/siputils.c
@@ -185,6 +185,8 @@ static cmd_export_t cmds[]={
 		0, ANY_ROUTE},
 	{"is_first_hop",  (cmd_function)w_is_first_hop,          0, 0,
 		0, ANY_ROUTE},
+	{"is_first_hop",  (cmd_function)w_is_first_hop,          1, fixup_igp_null,
+		fixup_free_igp_null, ANY_ROUTE},
 	{"is_tel_number", (cmd_function)is_tel_number,           1, fixup_spve_null,
 		0, ANY_ROUTE},
 	{"is_numeric", (cmd_function)is_numeric,                 1, fixup_spve_null,
@@ -571,6 +573,11 @@ static sr_kemi_t sr_kemi_siputils_exports[] = {
 		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
 			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
 	},
+	{ str_init("siputils"), str_init("is_first_hop_mode"),
+		SR_KEMIP_INT, is_first_hop_mode,
+		{ SR_KEMIP_INT, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
 	{ str_init("siputils"), str_init("is_uri"),
 		SR_KEMIP_INT, ki_is_uri,
 		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,




More information about the sr-dev mailing list