WIP: GGSN_Tests.ttcn: test IP4v6
Change-Id: I3bab7df5caddc5c8b973c81544f954d5473ac234
This commit is contained in:
parent
c0b520d578
commit
62cd07948a
|
@ -257,6 +257,10 @@ module GGSN_Tests {
|
|||
not match(cpr.endUserAddress, tr_EuaIPv6(?))) {
|
||||
setverdict(fail);
|
||||
}
|
||||
if (match(ctx.eua, t_EuaIPv4v6(?, ?)) and
|
||||
not match(cpr.endUserAddress, tr_EuaIPv4v6(?, ?))) {
|
||||
setverdict(fail);
|
||||
}
|
||||
/* Check if PCO response corresponds to request */
|
||||
if (ispresent(ctx.pco_req)) {
|
||||
if (match(ctx.pco_req, ts_PCO_IPv4_DNS_CONT) and
|
||||
|
@ -1028,6 +1032,110 @@ module GGSN_Tests {
|
|||
f_pdp_ctx_del(ctx, '1'B);
|
||||
}
|
||||
|
||||
/* Test IPv4v6 context activation for dynamic IPv4v6 EUA without DNS request */
|
||||
testcase TC_pdp46_act_deact() runs on GT_CT {
|
||||
f_init();
|
||||
var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));
|
||||
f_pdp_ctx_act(ctx);
|
||||
f_pdp_ctx_del(ctx, '1'B);
|
||||
}
|
||||
|
||||
/* Test PDP context activation for dynamic IPv4v6 EUA with IPv4 DNS in IPCP */
|
||||
testcase TC_pdp46_act_deact_ipcp() runs on GT_CT {
|
||||
f_init();
|
||||
var OCT4 ggsn_ip4_dns1 := f_inet_addr(m_ggsn_ip4_dns1);
|
||||
var OCT4 ggsn_ip4_dns2 := f_inet_addr(m_ggsn_ip4_dns2);
|
||||
var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));
|
||||
ctx.pco_req := valueof(ts_PCO_IPv4_DNS_IPCP);
|
||||
f_pdp_ctx_act(ctx);
|
||||
/* verify IPCP is at all contained */
|
||||
if (not match(ctx.pco_neg, tr_PCO_Contains('8021'O))) {
|
||||
setverdict(fail, "IPCP not found in PCO");
|
||||
}
|
||||
/* verify IPCP contains both primary and secondary IPv4 DNS */
|
||||
var IpcpPacket ipcp := dec_IpcpPacket(f_PCO_extract_proto(ctx.pco_neg, '8021'O));
|
||||
if (not match(ipcp, tr_IPCP_Ack_DNS(0, ggsn_ip4_dns1, ggsn_ip4_dns2))) {
|
||||
if (not match(ipcp, tr_IPCP_Ack_DNS(0))) {
|
||||
setverdict(fail, "Primary/Secondary DNS PCO IPCP option not found");
|
||||
} else {
|
||||
setverdict(fail, "Primary/Secondary DNS PCO IPCP option found but not matching expected values");
|
||||
}
|
||||
}
|
||||
f_pdp_ctx_del(ctx, '1'B);
|
||||
}
|
||||
|
||||
/* Test IPv4v6 context activation for dynamic IPv4v6 EUA with request of IPv4 DNS in PCO */
|
||||
testcase TC_pdp46_act_deact_pcodns4() runs on GT_CT {
|
||||
f_init();
|
||||
|
||||
var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));
|
||||
ctx.pco_req := valueof(ts_PCO_IPv4_DNS_CONT);
|
||||
f_pdp_ctx_act(ctx);
|
||||
|
||||
/* verify PCO contains both primary and secondary IPv4 DNS */
|
||||
var OCT4 ggsn_ip4_dns1 := f_inet_addr(m_ggsn_ip4_dns1);
|
||||
if (not match(f_PCO_extract_proto(ctx.pco_neg, '000d'O, 1), ggsn_ip4_dns1)) {
|
||||
setverdict(fail, "Primary DNS IPv4 PCO option not found");
|
||||
}
|
||||
|
||||
var OCT4 ggsn_ip4_dns2 := f_inet_addr(m_ggsn_ip4_dns2);
|
||||
if (not match(f_PCO_extract_proto(ctx.pco_neg, '000d'O, 2), ggsn_ip4_dns2)) {
|
||||
setverdict(fail, "Secondary DNS IPv4 PCO option not found");
|
||||
}
|
||||
|
||||
f_pdp_ctx_del(ctx, '1'B);
|
||||
}
|
||||
|
||||
/* Test IPv4v6 context activation for dynamic IPv4v6 EUA with request of IPv6 DNS in PCO */
|
||||
testcase TC_pdp46_act_deact_pcodns6() runs on GT_CT {
|
||||
f_init();
|
||||
|
||||
var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));
|
||||
ctx.pco_req := valueof(ts_PCO_IPv6_DNS);
|
||||
f_pdp_ctx_act(ctx);
|
||||
|
||||
/* verify PCO contains both primary and secondary IPv6 DNS */
|
||||
var OCT4 ggsn_ip6_dns1 := f_inet6_addr(m_ggsn_ip6_dns1);
|
||||
if (not match(f_PCO_extract_proto(ctx.pco_neg, '0003'O, 1), ggsn_ip6_dns1)) {
|
||||
setverdict(fail, "Primary DNS IPv6 PCO option not found");
|
||||
}
|
||||
|
||||
var OCT4 ggsn_ip6_dns2 := f_inet6_addr(m_ggsn_ip6_dns2);
|
||||
if (not match(f_PCO_extract_proto(ctx.pco_neg, '0003'O, 2), ggsn_ip6_dns2)) {
|
||||
setverdict(fail, "Secondary DNS IPv6 PCO option not found");
|
||||
}
|
||||
|
||||
f_pdp_ctx_del(ctx, '1'B);
|
||||
}
|
||||
|
||||
/* Test PDP context activation for dynamic IPv4v6 EUA.
|
||||
Test we can send ICMPv6 ping over GTPU to DNS server. */
|
||||
testcase TC_pdp46_act_deact_gtpu_access() runs on GT_CT {
|
||||
f_init();
|
||||
var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));
|
||||
ctx.pco_req := valueof(ts_PCO_IPv4_DNS_CONT);
|
||||
f_pdp_ctx_act(ctx);
|
||||
|
||||
var OCT4 dns1_addr := f_PCO_extract_proto(ctx.pco_neg, '000d'O);
|
||||
|
||||
/* Check if we can use valid global src addr, should work */
|
||||
var OCT4 saddr := ctx.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv4_address;
|
||||
f_send_gtpu(ctx, f_gen_icmpv4_echo(saddr, dns1_addr));
|
||||
f_wait_icmp4_echo_reply(ctx);
|
||||
|
||||
/* Assert that packets with wrong global src addr are dropped by GGSN */
|
||||
var OCT4 saddr_wrong := substr(saddr, 0, 3) & (saddr[3] xor4b '11'O);
|
||||
f_send_gtpu(ctx, f_gen_icmpv4_echo(saddr_wrong, dns1_addr));
|
||||
f_wait_gtpu_fail(ctx);
|
||||
|
||||
/* Send an IPv6 RA to APN4, should fail (packet dropped) */
|
||||
var OCT16 saddr_v6 := f_inet6_addr("fde4:8dba:82e1:2000:1:2:3:4");
|
||||
f_send_gtpu(ctx, f_gen_icmpv6_router_solicitation(saddr_v6));
|
||||
f_wait_gtpu_fail(ctx);
|
||||
f_pdp_ctx_del(ctx, '1'B);
|
||||
}
|
||||
|
||||
|
||||
control {
|
||||
execute(TC_pdp4_act_deact());
|
||||
execute(TC_pdp4_act_deact_ipcp());
|
||||
|
@ -1044,6 +1152,12 @@ module GGSN_Tests {
|
|||
execute(TC_pdp6_act_deact_gtpu_access());
|
||||
execute(TC_pdp6_clients_interact());
|
||||
|
||||
execute(TC_pdp46_act_deact());
|
||||
execute(TC_pdp46_act_deact_ipcp());
|
||||
execute(TC_pdp46_act_deact_pcodns4());
|
||||
execute(TC_pdp46_act_deact_pcodns6());
|
||||
execute(TC_pdp46_act_deact_gtpu_access());
|
||||
|
||||
execute(TC_echo_req_resp());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -161,6 +161,32 @@ module GTP_Templates {
|
|||
}
|
||||
}
|
||||
|
||||
/* TS 29.060 Figure 37A: End User Address Information Element for IPv4v6 (both static) */
|
||||
template EndUserAddress t_EuaIPv4v6(template OCT4 ip_addr4, template OCT16 ip_addr6) := {
|
||||
type_gtpc := '80'O,
|
||||
endUserAddress := {
|
||||
endUserAddressIPv4andIPv6 := {
|
||||
lengthf := 2,
|
||||
pdp_typeorg := '0001'B,
|
||||
spare := '1111'B,
|
||||
pdp_typenum := '8D'O,
|
||||
ipv4_address := ip_addr4,
|
||||
ipv6_address := ip_addr6
|
||||
}
|
||||
}
|
||||
}
|
||||
/* All static and dynamic combinations (TS 29.060 7.2.27) */
|
||||
/* template EndUserAddress t_EuaIPv4Dynv6Sta := t_EuaIPv4v6(omit, ip_addr6); */
|
||||
/* template EndUserAddress t_EuaIPv4Stav6Dyn := t_EuaIPv4v6(ip_addr4, omit); */
|
||||
template EndUserAddress t_EuaIPv4Dynv6Dyn := t_EuaIPv4v6(omit, omit);
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template AccessPointName ts_APN(octetstring apn) := {
|
||||
type_gtpc := '83'O,
|
||||
lengthf := lengthof(apn),
|
||||
|
|
Loading…
Reference in New Issue