浏览代码

ims_qos: option to use received ip, port and proto from via

- can help with Rx_AAR_Register when EPC is behind a NAT
- there could be an Rx AAR failure due to wrong IP address
in Framed IP address field of Rx AAR message when EPC is behind a NAT
Supreeth Herle 1 年之前
父节点
当前提交
b00190ff69
共有 2 个文件被更改,包括 25 次插入7 次删除
  1. 20 7
      src/modules/ims_qos/ims_qos_mod.c
  2. 5 0
      src/modules/ims_qos/ims_qos_mod.h

+ 20 - 7
src/modules/ims_qos/ims_qos_mod.c

@@ -166,6 +166,8 @@ int omit_flow_ports = 0;
 int rs_default_bandwidth = 0;
 int rr_default_bandwidth = 0;
 
+ims_qos_params_t _imsqos_params = {.recv_mode = 0};
+
 /* commands wrappers and fixups */
 static int w_rx_aar(struct sip_msg *msg, char *route, char *dir, char *id,
 		int id_type, int cfg_type);
@@ -253,7 +255,7 @@ static param_export_t params[] = {{"rx_dest_realm", PARAM_STR, &rx_dest_realm},
 				&regex_sdp_ip_prefix_to_maintain_in_fd},
 		{"include_rtcp_fd", INT_PARAM, &include_rtcp_fd},
 		{"suspend_transaction", INT_PARAM, &_ims_qos_suspend_transaction},
-		{0, 0, 0}};
+		{"recv_mode", PARAM_INT, &_imsqos_params.recv_mode}, {0, 0, 0}};
 
 
 /** module exports */
@@ -1463,19 +1465,30 @@ static int w_rx_aar_register(
 		goto error;
 	}
 
-	//we use the received IP address for the framed_ip_address
-	recv_ip.s = ip_addr2a(&msg->rcv.src_ip);
-	recv_ip.len = strlen(ip_addr2a(&msg->rcv.src_ip));
+	char buff[IP_ADDR_MAX_STR_SIZE];
+	if(_imsqos_params.recv_mode == 0) {
+		//we use the received IP address for the framed_ip_address
+		recv_ip.s = ip_addr2a(&msg->rcv.src_ip);
+		recv_ip.len = strlen(ip_addr2a(&msg->rcv.src_ip));
+
+		recv_port = msg->rcv.src_port;
+		recv_proto = msg->rcv.proto;
+	} else {
+		memset(&recv_ip, 0, sizeof(str));
+		memcpy(&buff, vb->host.s, vb->host.len);
+		buff[vb->host.len] = 0;
+		recv_ip.s = buff;
+		recv_ip.len = strlen(buff);
 
+		recv_port = via_port;
+		recv_proto = via_proto;
+	}
 	ip_version = check_ip_version(recv_ip);
 	if(!ip_version) {
 		LM_ERR("check_ip_version returned 0 \n");
 		goto error;
 	}
 
-	recv_port = msg->rcv.src_port;
-	recv_proto = msg->rcv.proto;
-
 	LM_DBG("Message received IP address is: [%.*s]\n", recv_ip.len, recv_ip.s);
 	LM_DBG("Message via is [%d://%.*s:%d]\n", vb->proto, vb->host.len,
 			vb->host.s, via_port);

+ 5 - 0
src/modules/ims_qos/ims_qos_mod.h

@@ -49,6 +49,11 @@
 
 #define MOD_NAME "ims_qos"
 
+typedef struct ims_qos_params
+{
+	int recv_mode;
+} ims_qos_params_t;
+
 /** callback functions */
 
 struct AAAMessage;