GTP_Templates: Fix runtime error in tr_EuaIPv*() templates

Doing this when receiving an IPv4 EUA thwos an error:
"if (not match(cpr.endUserAddress, tr_EuaIPv4(?)) and not match(cpr.endUserAddress, tr_EuaIPv6(?)))"

Dynamic test case error: Performing lengthof() operation on an octetstring template with no exact length.

This happens if for instance received spare bits are set to '0000'.

Change-Id: I70ad3c10e2ecfed8f733ff906272a9597b2ab9bd
diff --git a/library/GTP_Templates.ttcn b/library/GTP_Templates.ttcn
index 73d0bf0..049614a 100644
--- a/library/GTP_Templates.ttcn
+++ b/library/GTP_Templates.ttcn
@@ -163,6 +163,43 @@
 		gtpc := ts_GTP1C_PDU(echoRequest, '00000000'O, valueof(ts_EchoReqPDU), seq)
 	}
 
+	private function f_eua_ipv4_len(template OCT4 ip_addr) return template integer {
+		if (istemplatekind(ip_addr, "omit")) {
+			return 2;
+		} else if (istemplatekind(ip_addr, "*")) {
+			return ?;
+		} else if (istemplatekind(ip_addr, "?")) {
+			return 6;
+		}
+		return 6;
+	}
+
+	private function f_eua_ipv6_len(template OCT16 ip_addr) return template integer {
+		if (istemplatekind(ip_addr, "omit")) {
+			return 2;
+		} else if (istemplatekind(ip_addr, "*")) {
+			return ?;
+		} else if (istemplatekind(ip_addr, "?")) {
+			return 18;
+		}
+		return 18;
+	}
+
+	private function f_eua_ipv4v6_len(template OCT4 ip_addr4, template OCT16 ip_addr6) return template integer {
+		var integer len := 2;
+		if (istemplatekind(ip_addr4, "*") or
+		    istemplatekind(ip_addr6, "*")) {
+			return ?;
+		}
+		if (not istemplatekind(ip_addr4, "omit")) {
+			len := len + 4;
+		}
+		if (not istemplatekind(ip_addr6, "omit")) {
+			len := len + 16;
+		}
+		return len;
+	}
+
 	template EndUserAddress t_EuaIPv4(template OCT4 ip_addr) := {
 		type_gtpc := '80'O,
 		endUserAddress := {
@@ -179,7 +216,7 @@
 	template EndUserAddress tr_EuaIPv4(template OCT4 ip_addr) modifies t_EuaIPv4 := {
 		endUserAddress := {
 			endUserAddressIPv4 := {
-				lengthf := 2+lengthof(ip_addr)
+				lengthf := f_eua_ipv4_len(ip_addr)
 			}
 		}
 	}
@@ -200,7 +237,7 @@
 	template EndUserAddress tr_EuaIPv6(template OCT16 ip_addr) modifies t_EuaIPv6 := {
 		endUserAddress := {
 			endUserAddressIPv6 := {
-				lengthf := 2+lengthof(ip_addr)
+				lengthf := f_eua_ipv6_len(ip_addr)
 			}
 		}
 	}
@@ -223,7 +260,7 @@
 	template EndUserAddress tr_EuaIPv4v6(template OCT4 ip_addr4, template OCT16 ip_addr6) modifies t_EuaIPv4v6 := {
 		endUserAddress := {
 			endUserAddressIPv4andIPv6 := {
-				lengthf := 2+lengthof(ip_addr4)+lengthof(ip_addr6)
+				lengthf := f_eua_ipv4v6_len(ip_addr4, ip_addr6)
 			}
 		}
 	}