diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn index 053939b24..259e650ff 100644 --- a/ggsn_tests/GGSN_Tests.ttcn +++ b/ggsn_tests/GGSN_Tests.ttcn @@ -701,6 +701,25 @@ module GGSN_Tests { f_wait_icmp6(ctx, (tr_ICMPv6_ERP,tr_ICMPv6_DU)); } +/* new block */ + + /* create ICMPv6 router solicitation deriving link-id from PDP Context EUA */ + function f_icmpv6_rs_for_pdp46(in PdpContext ctx) return octetstring { + var OCT16 interface_id := ctx.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address; + return f_gen_icmpv6_router_solicitation(interface_id); + } + + /* generate and encode ICMPv6 neighbor solicitation for PDP Context */ + function f_gen_icmpv6_neigh_solicit_for_pdp46(in PdpContext ctx) return octetstring { + var OCT16 interface_id := ctx.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address; + var OCT16 link_local := f_ipv6_link_local(interface_id); + var OCT16 daddr := f_ipv6_sol_node_mcast(link_local); + + return f_gen_icmpv6_neigh_solicit(link_local, daddr, link_local); + } + +/* new block end */ + /* Assert we don't receive a ICMPv4/6 echo reply (or unreachable) from GTP */ function f_wait_gtpu_fail(PdpContext ctx) runs on GT_CT { T_default.start; @@ -1135,6 +1154,36 @@ module GGSN_Tests { f_pdp_ctx_del(ctx, '1'B); } + /* Validate if different clients (pdp ctx) can reach one another through GGSN. */ + testcase TC_pdp46_clients_interact() runs on GT_CT { + f_init(); + var PdpContext ctxA := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn))); + var PdpContext ctxB := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn))); + f_pdp_ctx_act(ctxA); + f_send_gtpu(ctxA, f_icmpv6_rs_for_pdp46(ctxA)); + f_wait_rtr_adv(ctxA); + f_send_gtpu(ctxA, f_gen_icmpv6_neigh_solicit_for_pdp46(ctxA)); + + f_pdp_ctx_act(ctxB); + f_send_gtpu(ctxB, f_icmpv6_rs_for_pdp46(ctxB)); + f_wait_rtr_adv(ctxB); + f_send_gtpu(ctxB, f_gen_icmpv6_neigh_solicit_for_pdp46(ctxB)); + + var OCT16 addrA_ll := f_ipv6_link_local(ctxA.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address); + var OCT16 addrB_ll := f_ipv6_link_local(ctxB.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address); + var OCT16 addrA_glob := f_ipv6_global(ctxA.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address); + var OCT16 addrB_glob := f_ipv6_global(ctxB.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address); + + /* Validate if clients can interact using ll addr. */ + f_send_gtpu(ctxA, f_gen_icmpv6_echo(addrA_ll, addrB_ll)); + f_wait_gtpu_fail(ctxB); + + /* Validate if clients can interact using global addr. */ + f_send_gtpu(ctxA, f_gen_icmpv6_echo(addrA_glob, addrB_glob)); + f_wait_gtpu_fail(ctxB); + + f_pdp_ctx_del(ctxA, '1'B); + } control { execute(TC_pdp4_act_deact()); @@ -1157,6 +1206,7 @@ module GGSN_Tests { execute(TC_pdp46_act_deact_pcodns4()); execute(TC_pdp46_act_deact_pcodns6()); execute(TC_pdp46_act_deact_gtpu_access()); + execute(TC_pdp46_clients_interact()); execute(TC_echo_req_resp()); }