Change in osmo-ttcn3-hacks[master]: PCU: add IPv6 support for SNS

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

lynxis lazus gerrit-no-reply at lists.osmocom.org
Mon Sep 7 00:21:27 UTC 2020


lynxis lazus has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20003 )


Change subject: PCU: add IPv6 support for SNS
......................................................................

PCU: add IPv6 support for SNS

With PCUIF 10 the remote can be IPv4 or IPv6.
Add all missing parts including SNS IPv6 elements,
the support to omit IPv4 elements and a PCU_Tests_SNSv6.cfg
configuration to run all tests with IPv6

Change-Id: I43d64caca600fff78f3fbbb3e8179f447f235d46
---
M library/NS_Emulation.ttcn
M library/Osmocom_Gb_Types.ttcn
M pcu/PCU_Tests_SNS.ttcn
A pcu/PCU_Tests_SNSv6.cfg
4 files changed, 183 insertions(+), 40 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/03/20003/1

diff --git a/library/NS_Emulation.ttcn b/library/NS_Emulation.ttcn
index 6f9bc39..ebacac1 100644
--- a/library/NS_Emulation.ttcn
+++ b/library/NS_Emulation.ttcn
@@ -232,7 +232,7 @@
 			setverdict(fail, "SNS-SIZE from unexpected NSEI");
 			self.stop;
 		}
-		[] NSCP.receive(t_NS_RecvFrom(tr_SNS_CONFIG(config.nsei, true,
+		[config.remote_proto == PCUIF_ADDR_TYPE_IPV4] NSCP.receive(t_NS_RecvFrom(tr_SNS_CONFIG(config.nsei, true,
 				    {tr_SNS_IPv4(config.remote_ip, config.remote_udp_port)}))) -> value rf {
 			/* blindly acknowledge whatever the PCU sends */
 			NSCP.send(t_NS_Send(g_conn_id, ts_SNS_CONFIG_ACK(config.nsei, omit)));
@@ -249,6 +249,23 @@
 				}
 			}
 		}
+		[config.remote_proto == PCUIF_ADDR_TYPE_IPV6] NSCP.receive(t_NS_RecvFrom(tr_SNS_CONFIG(config.nsei, true, omit,
+				    {tr_SNS_IPv6(config.remote_ip, config.remote_udp_port)}))) -> value rf {
+			/* blindly acknowledge whatever the PCU sends */
+			NSCP.send(t_NS_Send(g_conn_id, ts_SNS_CONFIG_ACK(config.nsei, omit)));
+			/* send a SNS-CONFIG in response and expect a SNS-CONFIG-ACK */
+			var IP6_Elements v6 := { valueof(ts_SNS_IPv6(config.local_ip, config.local_udp_port)) };
+			NSCP.send(t_NS_Send(g_conn_id, ts_SNS_CONFIG(config.nsei, true, omit, v6)));
+			alt {
+			[] NSCP.receive(t_NS_RecvFrom(tr_SNS_CONFIG_ACK(config.nsei, omit))) {
+				/* success */
+				}
+			[] NSCP.receive(t_NS_RecvFrom(tr_SNS_CONFIG_ACK(config.nsei, ?))) {
+				setverdict(fail, "Unexpected SNS-CONFIG-NACK");
+				self.stop;
+				}
+			}
+		}
 		[] NSCP.receive(t_NS_RecvFrom(tr_SNS_CONFIG(config.nsei, false, ?))) { /* ignore */}
 		[] NSCP.receive(t_NS_RecvFrom(tr_SNS_CONFIG(config.nsei, true, ?))) {
 			setverdict(fail, "Unexpected SNS-CONFIG content");
diff --git a/library/Osmocom_Gb_Types.ttcn b/library/Osmocom_Gb_Types.ttcn
index 3aeba8f..a2b9499 100644
--- a/library/Osmocom_Gb_Types.ttcn
+++ b/library/Osmocom_Gb_Types.ttcn
@@ -230,6 +230,40 @@
 		return e;
 	}
 
+	template (value) IP6_Element ts_SNS_IPv6(charstring ip, integer udp_port,
+						 uint8_t sig_weight := 1, uint8_t data_weight := 1) := {
+		ipAddress := f_inet6_addr(ip),
+		uDP_Port := int2oct(udp_port, 2),
+		signallingWeight := int2oct(sig_weight, 1),
+		dataWeight := int2oct(data_weight, 1)
+	}
+	function tr_SNS_IPv6(template charstring ip, template integer udp_port,
+				template uint8_t sig_weight := ?, template uint8_t data_weight := ?)
+	return template IP6_Element {
+		var template IP6_Element e;
+		if (istemplatekind(ip, "?")) {
+			e.ipAddress := ?;
+		} else {
+			e.ipAddress := f_inet6_addr(valueof(ip));
+		}
+		if (istemplatekind(udp_port, "?")) {
+			e.uDP_Port := ?;
+		} else {
+			e.uDP_Port := int2oct(valueof(udp_port), 2);
+		}
+		if (istemplatekind(sig_weight, "?")) {
+			e.signallingWeight := ?;
+		} else {
+			e.signallingWeight := int2oct(valueof(sig_weight), 1);
+		}
+		if (istemplatekind(data_weight, "?")) {
+			e.dataWeight := ?;
+		} else {
+			e.dataWeight := int2oct(valueof(data_weight), 1);
+		}
+		return e;
+	}
+
 
 	template (value) PDU_NS ts_NS_RESET(NsCause cause, Nsvci nsvci, Nsei nsei) := {
 		pDU_NS_Reset := {
@@ -526,7 +560,7 @@
 	}
 
 	template (value) PDU_NS ts_SNS_CONFIG(Nsei nsei, boolean end_flag,
-					template (omit) IP4_Elements v4,
+					template (omit) IP4_Elements v4 := omit,
 					template (omit) IP6_Elements v6 := omit) := {
 		pDU_SNS_Config := {
 			nsPduType := '0F'O,
@@ -537,7 +571,7 @@
 		}
 	}
 	template PDU_NS tr_SNS_CONFIG(template Nsei nsei, template boolean end_flag,
-					template IP4_Elements v4,
+					template IP4_Elements v4 := omit,
 					template IP6_Elements v6 := omit) := {
 		pDU_SNS_Config := {
 			nsPduType := '0F'O,
diff --git a/pcu/PCU_Tests_SNS.ttcn b/pcu/PCU_Tests_SNS.ttcn
index fc98979..957b56b 100644
--- a/pcu/PCU_Tests_SNS.ttcn
+++ b/pcu/PCU_Tests_SNS.ttcn
@@ -26,9 +26,16 @@
 runs on RAW_NS_CT {
 	log("f_incoming_sns_size(idx=", idx, ")");
 	var PDU_NS rx;
-	/* expect one single SNS-SIZE with RESET flag; one remote v4 EP; no v6 EP */
-	rx := f_ns_exp(tr_SNS_SIZE(g_nsconfig[idx].nsei, rst_flag := true, max_nsvcs := 8,
-				   num_v4 := 4, num_v6 := omit), idx);
+
+	if (mp_nsconfig.remote_proto == PCUIF_ADDR_TYPE_IPV4) {
+		/* expect one single SNS-SIZE with RESET flag; one remote v4 EP; no v6 EP */
+		rx := f_ns_exp(tr_SNS_SIZE(g_nsconfig[idx].nsei, rst_flag := true, max_nsvcs := 8,
+					   num_v4 := 4, num_v6 := omit), idx);
+	} else {
+		/* expect one single SNS-SIZE with RESET flag; no v4 EP; one remote v6 EP */
+		rx := f_ns_exp(tr_SNS_SIZE(g_nsconfig[idx].nsei, rst_flag := true, max_nsvcs := 8,
+					   num_v4 := omit, num_v6 := 4), idx);
+	}
 	NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_SIZE_ACK(g_nsconfig[idx].nsei, cause)));
 }
 
@@ -37,9 +44,15 @@
 runs on RAW_NS_CT {
 	log("f_outgoing_sns_size(idx=", idx, ")");
 	var PDU_NS rx;
-	NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_SIZE(g_nsconfig[idx].nsei, rst_flag := true, max_nsvcs := 1,
-							num_v4 := 1, num_v6 := omit)
-				));
+	if (mp_nsconfig.remote_proto == PCUIF_ADDR_TYPE_IPV4) {
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_SIZE(g_nsconfig[idx].nsei, rst_flag := true, max_nsvcs := 1,
+								num_v4 := 1, num_v6 := omit)
+					));
+	} else {
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_SIZE(g_nsconfig[idx].nsei, rst_flag := true, max_nsvcs := 1,
+								num_v4 := omit, num_v6 := 1)
+					));
+	}
 	/* expect one single SNS-SIZE with RESET flag; one remote v4 EP; no v6 EP */
 	rx := f_ns_exp(tr_SNS_SIZE_ACK(g_nsconfig[idx].nsei, cause), idx);
 }
@@ -49,9 +62,16 @@
 runs on RAW_NS_CT {
 	log("f_incoming_sns_config(idx=", idx, ")");
 	var PDU_NS rx;
-	var template IP4_Elements v4_elem := { tr_SNS_IPv4(mp_nsconfig.remote_ip,
-							   mp_nsconfig.remote_udp_port) };
-	rx := f_ns_exp(tr_SNS_CONFIG(g_nsconfig[idx].nsei, end_flag := true, v4 := v4_elem), idx);
+	if (mp_nsconfig.remote_proto == PCUIF_ADDR_TYPE_IPV4) {
+		var template IP4_Elements v4_elem := { tr_SNS_IPv4(mp_nsconfig.remote_ip,
+								   mp_nsconfig.remote_udp_port) };
+		rx := f_ns_exp(tr_SNS_CONFIG(g_nsconfig[idx].nsei, end_flag := true, v4 := v4_elem), idx);
+	} else {
+		var template IP6_Elements v6_elem := { tr_SNS_IPv6(mp_nsconfig.remote_ip,
+								   mp_nsconfig.remote_udp_port) };
+		rx := f_ns_exp(tr_SNS_CONFIG(g_nsconfig[idx].nsei, end_flag := true, v6 := v6_elem), idx);
+	}
+
 	NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG_ACK(g_nsconfig[idx].nsei, cause)));
 }
 
@@ -60,9 +80,15 @@
 runs on RAW_NS_CT {
 	log("f_outgoing_sns_config(idx=", idx, ")");
 	var PDU_NS rx;
-	var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx].local_ip,
-							     g_nsconfig[idx].local_udp_port) }
-	NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, v4)));
+	if (mp_nsconfig.remote_proto == PCUIF_ADDR_TYPE_IPV4) {
+		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx].local_ip,
+								     g_nsconfig[idx].local_udp_port) }
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, v4)));
+	} else {
+		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[idx].local_ip,
+								     g_nsconfig[idx].local_udp_port) }
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, omit, v6)));
+	}
 	rx := f_ns_exp(tr_SNS_CONFIG_ACK(g_nsconfig[idx].nsei, cause), idx);
 }
 
@@ -71,11 +97,19 @@
 runs on RAW_NS_CT {
 	log("f_outgoing_sns_config_1c1u(idx=", idx, ")");
 	var PDU_NS rx;
-	var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[0].local_ip,
-							     g_nsconfig[0].local_udp_port, 1, 0),
-						 ts_SNS_IPv4(g_nsconfig[1].local_ip,
-							     g_nsconfig[1].local_udp_port, 0, 1) };
-	NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, v4)));
+	if (mp_nsconfig.remote_proto == PCUIF_ADDR_TYPE_IPV4) {
+		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[0].local_ip,
+								     g_nsconfig[0].local_udp_port, 1, 0),
+							 ts_SNS_IPv4(g_nsconfig[1].local_ip,
+								     g_nsconfig[1].local_udp_port, 0, 1) };
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, v4)));
+	} else {
+		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[0].local_ip,
+								     g_nsconfig[0].local_udp_port, 1, 0),
+							 ts_SNS_IPv6(g_nsconfig[1].local_ip,
+								     g_nsconfig[1].local_udp_port, 0, 1) };
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, omit, v6)));
+	}
 	rx := f_ns_exp(tr_SNS_CONFIG_ACK(g_nsconfig[idx].nsei, cause), idx);
 }
 
@@ -84,11 +118,19 @@
 runs on RAW_NS_CT {
 	log("f_outgoing_sns_config_1c1u_separate(idx=", idx, ")");
 	var PDU_NS rx;
-	var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[1].local_ip,
-							     g_nsconfig[1].local_udp_port, 1, 0),
-						 ts_SNS_IPv4(g_nsconfig[2].local_ip,
-							     g_nsconfig[2].local_udp_port, 0, 1) };
-	NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, v4)));
+	if (mp_nsconfig.remote_proto == PCUIF_ADDR_TYPE_IPV4) {
+		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[1].local_ip,
+								     g_nsconfig[1].local_udp_port, 1, 0),
+							 ts_SNS_IPv4(g_nsconfig[2].local_ip,
+								     g_nsconfig[2].local_udp_port, 0, 1) };
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, v4)));
+	} else {
+		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[1].local_ip,
+								     g_nsconfig[1].local_udp_port, 1, 0),
+							 ts_SNS_IPv6(g_nsconfig[2].local_ip,
+								     g_nsconfig[2].local_udp_port, 0, 1) };
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, omit, v6)));
+	}
 	rx := f_ns_exp(tr_SNS_CONFIG_ACK(g_nsconfig[idx].nsei, cause), idx);
 }
 
@@ -96,33 +138,57 @@
 runs on RAW_NS_CT {
 	log("f_outgoing_sns_add(idx_add=", idx_add, ")");
 	var PDU_NS rx;
-	var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx_add].local_ip,
-							     g_nsconfig[idx_add].local_udp_port,
-							     w_sig, w_user) };
-	NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_ADD(g_nsconfig[idx].nsei, 23, v4)));
-	rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 23, omit, v4));
+	if (mp_nsconfig.remote_proto == PCUIF_ADDR_TYPE_IPV4) {
+		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx_add].local_ip,
+								     g_nsconfig[idx_add].local_udp_port,
+								     w_sig, w_user) };
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_ADD(g_nsconfig[idx].nsei, 23, v4)));
+		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 23, omit, v4));
+	} else {
+		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[idx_add].local_ip,
+								     g_nsconfig[idx_add].local_udp_port,
+								     w_sig, w_user) };
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_ADD(g_nsconfig[idx].nsei, 23, omit, v6)));
+		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 23, omit, omit, v6));
+	}
 }
 
 function f_outgoing_sns_del(integer idx_del, uint8_t w_sig := 1, uint8_t w_user := 1, integer idx := 0)
 runs on RAW_NS_CT {
 	log("f_outgoing_sns_del(idx_del=", idx_del, ")");
 	var PDU_NS rx;
-	var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx_del].local_ip,
-							     g_nsconfig[idx_del].local_udp_port,
-							     w_sig, w_user) };
-	NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_DEL(g_nsconfig[idx].nsei, 24, omit, v4)));
-	rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 24, omit, v4));
+	if (mp_nsconfig.remote_proto == PCUIF_ADDR_TYPE_IPV4) {
+		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx_del].local_ip,
+								     g_nsconfig[idx_del].local_udp_port,
+								     w_sig, w_user) };
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_DEL(g_nsconfig[idx].nsei, 24, omit, v4)));
+		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 24, omit, v4));
+	} else {
+		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[idx_del].local_ip,
+								     g_nsconfig[idx_del].local_udp_port,
+								     w_sig, w_user) };
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_DEL(g_nsconfig[idx].nsei, 24, omit, omit, v6)));
+		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 24, omit, omit, v6));
+	}
 }
 
 function f_outgoing_sns_chg_weight(integer idx_chg, uint8_t w_sig, uint8_t w_user, integer idx := 0)
 runs on RAW_NS_CT {
 	log("f_outgoing_sns_chg_weight(idx_chg=", idx_chg, ")");
 	var PDU_NS rx;
-	var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx_chg].local_ip,
-							     g_nsconfig[idx_chg].local_udp_port,
-							     w_sig, w_user) };
-	NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CHG_WEIGHT(g_nsconfig[idx].nsei, 25, v4)));
-	rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 25, omit, v4));
+	if (mp_nsconfig.remote_proto == PCUIF_ADDR_TYPE_IPV4) {
+		var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx_chg].local_ip,
+								     g_nsconfig[idx_chg].local_udp_port,
+								     w_sig, w_user) };
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CHG_WEIGHT(g_nsconfig[idx].nsei, 25, v4)));
+		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 25, omit, v4));
+	} else {
+		var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[idx_chg].local_ip,
+								     g_nsconfig[idx_chg].local_udp_port,
+								     w_sig, w_user) };
+		NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CHG_WEIGHT(g_nsconfig[idx].nsei, 25, omit, v6)));
+		rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 25, omit, omit, v6));
+	}
 }
 
 
diff --git a/pcu/PCU_Tests_SNSv6.cfg b/pcu/PCU_Tests_SNSv6.cfg
new file mode 100644
index 0000000..b50dacc
--- /dev/null
+++ b/pcu/PCU_Tests_SNSv6.cfg
@@ -0,0 +1,26 @@
+[ORDERED_INCLUDE]
+# Common configuration, shared between test suites
+"../Common.cfg"
+# testsuite specific configuration, not expected to change
+"./PCU_Tests.default"
+
+[LOGGING]
+
+[MODULE_PARAMETERS]
+SGSN_Components.mp_nsconfig := {
+	remote_proto == PCUIF_ADDR_TYPE_IPV6,
+	local_ip := "::1",
+	local_udp_port := 23000,
+	remote_ip := "::1",
+	remote_udp_port := 22000,
+	nsvci := 1234,
+	nsei := 1234
+}
+PCUIF_Types.mp_pcuif_version := 10
+
+[TESTPORT_PARAMETERS]
+
+[MAIN_CONTROLLER]
+
+[EXECUTE]
+PCU_Tests_SNS.control

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20003
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I43d64caca600fff78f3fbbb3e8179f447f235d46
Gerrit-Change-Number: 20003
Gerrit-PatchSet: 1
Gerrit-Owner: lynxis lazus <lynxis at fe80.eu>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200907/4f282a78/attachment.htm>


More information about the gerrit-log mailing list