3 from os.path import dirname, realpath, split, join, isdir, exists
4 from os import remove, system, mkdir
5 from logging import getLogger, basicConfig, DEBUG, INFO, ERROR
6 from argparse import ArgumentParser
7 from atexit import register
8 from shutil import rmtree
10 from jinja2 import Environment, FileSystemLoader
12 from docker.errors import NotFound, APIError
13 from docker import from_env
15 from scapy.contrib.gtp import *
16 from scapy.all import *
19 verbose_levels = {"error": ERROR, "debug": DEBUG, "info": INFO}
22 class ContainerStartupError(Exception):
26 class Container(object):
28 cmd = "vppctl -s 0:5002"
29 cmd_bash = "/bin/bash"
31 def __init__(self, ref, name):
41 return join(self.tmp, self.name)
44 def pg_input_file(self):
45 return join(self.temp, "pgi.pcap")
48 def pg_output_file(self):
49 return join(self.temp, "pgo.pcap")
52 def pg_input_file_in(self):
53 return join("/mnt", "pgi.pcap")
56 def pg_output_file_in(self):
57 return join("/mnt", "pgo.pcap")
59 def disconnect_all(self):
61 for net in self._ref.client.networks.list():
63 net.disconnect(self._ref)
70 def new(cls, client, image, name):
71 temp = join(cls.tmp, name)
76 ref = client.containers.run(
83 volumes={temp: {"bind": "/mnt", "mode": "rw"}},
86 obj = cls.get(client, name)
88 raise ContainerStartupError()
94 def get(cls, client, name):
96 ref = client.containers.get(name)
100 return cls(ref, name)
106 system("docker exec -it {} {}".format(self.name, self.cmd))
109 system("docker exec -it {} {}".format(self.name, self.cmd_bash))
111 def vppctl_exec(self, cmd):
112 ec, resp = self._ref.exec_run(cmd="{} {}".format(self.cmd, cmd))
116 def setup_host_interface(self, name, ip):
117 self.vppctl_exec("create host-interface name {}".format(name))
118 self.vppctl_exec("set int ip addr host-{} {}".format(name, ip))
119 self.vppctl_exec("set int state host-{} up".format(name))
121 def pg_create_interface(self, local_ip, remote_ip, local_mac, remote_mac):
122 # remote_ip can't have subnet mask
125 self.vppctl_exec("create packet-generator interface pg0")
126 self.vppctl_exec("set int mac address pg0 {}".format(local_mac))
127 self.vppctl_exec("set int ip addr pg0 {}".format(local_ip))
128 self.vppctl_exec("set ip neighbor pg0 {} {}".format(remote_ip, remote_mac))
129 self.vppctl_exec("set int state pg0 up")
131 def pg_create_interface4(self, local_ip, remote_ip, local_mac, remote_mac):
132 # remote_ip can't have subnet mask
135 self.vppctl_exec("create packet-generator interface pg0")
136 self.vppctl_exec("set int mac address pg0 {}".format(local_mac))
137 self.vppctl_exec("set int ip addr pg0 {}".format(local_ip))
138 self.vppctl_exec("set ip neighbor pg0 {} {}".format(remote_ip, remote_mac))
139 self.vppctl_exec("set int state pg0 up")
141 def pg_create_interface6(self, local_ip, remote_ip, local_mac, remote_mac):
142 # remote_ip can't have subnet mask
145 self.vppctl_exec("create packet-generator interface pg0")
146 self.vppctl_exec("set int mac address pg0 {}".format(local_mac))
147 self.vppctl_exec("set int ip addr pg0 {}".format(local_ip))
148 self.vppctl_exec("set ip neighbor pg0 {} {}".format(remote_ip, remote_mac))
149 self.vppctl_exec("set int state pg0 up")
151 def pg_create_interface4_name(
152 self, ifname, local_ip, remote_ip, local_mac, remote_mac
154 # remote_ip can't have subnet mask
157 self.vppctl_exec("create packet-generator interface {}".format(ifname))
158 self.vppctl_exec("set int mac address {} {}".format(ifname, local_mac))
159 self.vppctl_exec("set int ip addr {} {}".format(ifname, local_ip))
161 "set ip neighbor {} {} {}".format(ifname, remote_ip, remote_mac)
163 self.vppctl_exec("set int state {} up".format(ifname))
165 def pg_create_interface6_name(
166 self, ifname, local_ip, remote_ip, local_mac, remote_mac
168 # remote_ip can't have subnet mask
171 self.vppctl_exec("create packet-generator interface {}".format(ifname))
172 self.vppctl_exec("set int mac address {} {}".format(ifname, local_mac))
173 self.vppctl_exec("set int ip addr {} {}".format(ifname, local_ip))
175 "set ip neighbor {} {} {}".format(ifname, remote_ip, remote_mac)
177 self.vppctl_exec("set int state {} up".format(ifname))
180 # start packet generator
181 self.vppctl_exec("packet-generator enable")
183 def pg_create_stream(self, stream):
184 wrpcap(self.pg_input_file, stream)
186 "packet-generator new name pg-stream "
187 "node ethernet-input pcap {}".format(self.pg_input_file_in)
190 def pg_start_capture(self):
191 if exists(self.pg_output_file):
192 remove(self.pg_output_file)
194 "packet-generator capture pg0 pcap {}".format(self.pg_output_file_in)
197 def pg_start_capture_name(self, ifname):
198 if exists(self.pg_output_file):
199 remove(self.pg_output_file)
201 "packet-generator capture {} pcap {}".format(ifname, self.pg_output_file_in)
204 def pg_read_packets(self):
205 return rdpcap(self.pg_output_file)
207 def set_ipv6_route(self, out_if_name, next_hop_ip, subnet):
209 "ip route add {} via host-{} {}".format(subnet, out_if_name, next_hop_ip)
212 def set_ipv6_route2(self, out_if_name, next_hop_ip, subnet):
214 "ip route add {} via {} {}".format(subnet, out_if_name, next_hop_ip)
217 def set_ip_pgroute(self, out_if_name, next_hop_ip, subnet):
219 "ip route add {} via {} {}".format(subnet, out_if_name, next_hop_ip)
222 def set_ipv6_pgroute(self, out_if_name, next_hop_ip, subnet):
224 "ip route add {} via {} {}".format(subnet, out_if_name, next_hop_ip)
227 def set_ipv6_default_route(self, out_if_name, next_hop_ip):
229 "ip route add ::/0 via host-{} {}".format(out_if_name, next_hop_ip)
232 def enable_trace(self, count):
233 self.vppctl_exec("trace add af-packet-input {}".format(count))
236 class Containers(object):
237 def __init__(self, client, image):
241 def tmp_render(self, path, template, kwargs):
242 with open(path, "w") as fo:
243 fo.write(template.render(**kwargs))
245 register(lambda: remove(path))
247 def build(self, path, vpp_path):
249 loader=FileSystemLoader(path), autoescape=True, trim_blocks=True
253 join(vpp_path, "Dockerfile"),
254 env.get_template("Dockerfile.j2"),
255 {"vpp_path": vpp_path},
259 join(vpp_path, "startup.conf"),
260 env.get_template("startup.conf.j2"),
261 {"vpp_path": vpp_path},
264 ref, _ = self.client.images.build(path=vpp_path, tag=self.image, rm=True)
267 def release(self, path, vpp_path):
269 loader=FileSystemLoader(path), autoescape=True, trim_blocks=True
273 join(vpp_path, "Dockerfile"),
274 env.get_template("Dockerfile.j2.release"),
275 {"vpp_path": vpp_path},
279 join(vpp_path, "startup.conf"),
280 env.get_template("startup.conf.j2"),
281 {"vpp_path": vpp_path},
284 ref, _ = self.client.images.build(
285 path=vpp_path, tag="srv6m-release-image", rm=True
290 return Container.new(self.client, self.image, name)
293 return Container.get(self.client, name)
295 def vppctl(self, name, command=None):
296 container = self.get(name)
300 print(container.vppctl_exec(command).decode())
302 def bash(self, name):
303 container = self.get(name)
307 class Network(object):
308 def __init__(self, ref, name):
317 def new(cls, client, name):
318 ref = client.networks.create(name, driver="bridge", check_duplicate=True)
319 return cls(ref, name)
322 def get(cls, client, name):
324 ref = client.networks.get(name)
328 return cls(ref, name)
333 def connect(self, c):
334 self._ref.connect(c.name)
337 class Networks(object):
338 def __init__(self, client):
342 return Network.new(self.client, name)
345 return Network.get(self.client, name)
348 class Program(object):
349 image = "srv6m-image"
353 # TODO: add description to these instances
354 # for exmaple what the vpp is supposed to be
355 # in our topoloty overview
357 instance_names = ["vpp-1", "vpp-2", "vpp-3", "vpp-4"]
359 network_names = ["net-1", "net-2", "net-3"]
361 def __init__(self, image=None, prefix=None):
362 self.path = dirname(realpath(__file__))
366 if prefix is not None:
367 self.name_prefix = prefix
370 self.containers = Containers(client, self.image)
371 self.networks = Networks(client)
373 self.logger = getLogger(__name__)
377 return self.path.rsplit("/", 4)[0]
379 def get_name(self, name):
380 if not self.name_prefix:
382 return "{}-{}".format(self.name_prefix, name)
384 def stop_containers(self):
385 for name in self.instance_names:
386 instance = self.containers.get(self.get_name(name))
390 for name in self.network_names:
391 network = self.networks.get(self.get_name(name))
395 def start_containers(self):
396 self.stop_containers()
400 for name in self.network_names:
401 networks.append(self.networks.new(self.get_name(name)))
403 n1, n2, n3 = networks
407 for name in self.instance_names:
408 instances.append(self.containers.new(self.get_name(name)))
410 c1, c2, c3, c4 = instances
412 # setup packet generator interfaces
413 # c1.pg_create_interface(local_ip="C::1/120", remote_ip="C::2",
414 # local_mac="aa:bb:cc:dd:ee:01", remote_mac="aa:bb:cc:dd:ee:02")
416 # setup network between instances
427 c1.setup_host_interface("eth1", "A1::1/120")
428 c2.setup_host_interface("eth1", "A1::2/120")
431 c2.setup_host_interface("eth2", "A2::1/120")
432 c3.setup_host_interface("eth1", "A2::2/120")
435 c3.setup_host_interface("eth2", "A3::1/120")
436 c4.setup_host_interface("eth1", "A3::2/120")
438 # c1 > c2 default route
440 c1.set_ipv6_default_route("eth1", "A1::2")
441 # c2 > c3 default route
442 c2.set_ipv6_default_route("eth2", "A2::2")
443 # c3 > c2 default route
444 c3.set_ipv6_default_route("eth1", "A2::1")
445 # c4 > c3 default route
446 c4.set_ipv6_default_route("eth1", "A3::1")
448 # c3 > c4 static route for address B::1/128
449 c3.set_ipv6_route("eth2", "A3::2", "B::1/128")
450 c3.set_ipv6_route("eth2", "A3::2", "B::2/128")
454 # trace add af-packet-input 10
455 # pg interface on c1 172.20.0.1
456 # pg interface on c4 B::1/120
458 self.start_containers()
460 c1 = self.containers.get(self.get_name(self.instance_names[0]))
461 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
463 c1.pg_create_interface(
466 local_mac="aa:bb:cc:dd:ee:01",
467 remote_mac="aa:bb:cc:dd:ee:02",
469 c4.pg_create_interface(
472 local_mac="aa:bb:cc:dd:ee:11",
473 remote_mac="aa:bb:cc:dd:ee:22",
477 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
478 / IPv6(src="C::2", dst="B::2")
479 / ICMPv6EchoRequest()
482 print("Sending packet on {}:".format(c1.name))
488 c4.pg_start_capture()
490 c1.pg_create_stream(p)
493 # timeout (sleep) if needed
495 print("Receiving packet on {}:".format(c4.name))
496 for p in c4.pg_read_packets():
501 # trace add af-packet-input 10
502 # pg interface on c1 C::1/120
503 # pg interface on c4 B::1/120
505 self.start_containers()
510 c1 = self.containers.get(self.get_name(self.instance_names[0]))
511 c2 = self.containers.get(self.get_name(self.instance_names[1]))
512 c3 = self.containers.get(self.get_name(self.instance_names[2]))
513 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
515 c1.pg_create_interface(
518 local_mac="aa:bb:cc:dd:ee:01",
519 remote_mac="aa:bb:cc:dd:ee:02",
521 c4.pg_create_interface(
524 local_mac="aa:bb:cc:dd:ee:11",
525 remote_mac="aa:bb:cc:dd:ee:22",
528 c1.vppctl_exec("set sr encaps source addr D1::")
529 c1.vppctl_exec("sr policy add bsid D1::999:1 next D2:: next D3:: next D4::")
530 c1.vppctl_exec("sr steer l3 B::/120 via bsid D1::999:1")
532 c2.vppctl_exec("sr localsid address D2:: behavior end")
534 c3.vppctl_exec("sr localsid address D3:: behavior end")
536 c4.vppctl_exec("sr localsid address D4:: behavior end.dx6 pg0 B::2")
538 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
539 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
540 c3.set_ipv6_route("eth2", "A3::2", "D4::/128")
541 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
544 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
545 / IPv6(src="C::2", dst="B::2")
546 / ICMPv6EchoRequest()
549 print("Sending packet on {}:".format(c1.name))
557 c4.pg_start_capture()
559 c1.pg_create_stream(p)
562 # timeout (sleep) if needed
564 print("Receiving packet on {}:".format(c4.name))
565 for p in c4.pg_read_packets():
568 """ T.Map is obsolete
571 # trace add af-packet-input 10
572 # pg interface on c1 172.20.0.1
573 # pg interface on c4 B::1/120
575 self.start_containers()
577 c1 = self.containers.get(self.get_name(self.instance_names[0]))
578 c2 = self.containers.get(self.get_name(self.instance_names[1]))
579 c3 = self.containers.get(self.get_name(self.instance_names[2]))
580 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
582 c1.pg_create_interface4(
583 local_ip="172.16.0.1/30",
584 remote_ip="172.16.0.2/30",
585 local_mac="aa:bb:cc:dd:ee:01",
586 remote_mac="aa:bb:cc:dd:ee:02")
587 c4.pg_create_interface4(
588 local_ip="1.0.0.2/30",
590 local_mac="aa:bb:cc:dd:ee:11",
591 remote_mac="aa:bb:cc:dd:ee:22")
593 c1.vppctl_exec("set sr encaps source addr A1::1")
595 "sr policy add bsid D1:: next D2:: next D3:: "
596 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
597 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
599 c2.vppctl_exec("sr localsid address D2:: behavior end")
601 c3.vppctl_exec("sr localsid address D3:: behavior end")
604 "sr localsid prefix D4::/32 "
605 "behavior end.m.gtp4.e v4src_position 64")
607 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
608 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
609 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
610 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
611 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
613 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
614 IP(src="172.20.0.2", dst="172.20.0.1") /
615 UDP(sport=2152, dport=2152) /
616 GTP_U_Header(gtp_type="g_pdu", teid=200) /
617 IP(src="172.99.0.1", dst="172.99.0.2") /
620 print("Sending packet on {}:".format(c1.name))
626 c4.pg_start_capture()
628 c1.pg_create_stream(p)
631 # timeout (sleep) if needed
635 print("Receiving packet on {}:".format(c4.name))
636 for p in c4.pg_read_packets():
639 def test_tmap_5g(self):
641 # trace add af-packet-input 10
642 # pg interface on c1 172.20.0.1
643 # pg interface on c4 B::1/120
645 self.start_containers()
647 c1 = self.containers.get(self.get_name(self.instance_names[0]))
648 c2 = self.containers.get(self.get_name(self.instance_names[1]))
649 c3 = self.containers.get(self.get_name(self.instance_names[2]))
650 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
652 c1.pg_create_interface4(
653 local_ip="172.16.0.1/30",
654 remote_ip="172.16.0.2/30",
655 local_mac="aa:bb:cc:dd:ee:01",
656 remote_mac="aa:bb:cc:dd:ee:02")
657 c4.pg_create_interface4(
658 local_ip="1.0.0.2/30",
660 local_mac="aa:bb:cc:dd:ee:11",
661 remote_mac="aa:bb:cc:dd:ee:22")
663 c1.vppctl_exec("set sr encaps source addr A1::1")
665 "sr policy add bsid D1:: next D2:: next D3:: "
666 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
667 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
669 c2.vppctl_exec("sr localsid address D2:: behavior end")
671 c3.vppctl_exec("sr localsid address D3:: behavior end")
674 "sr localsid prefix D4::/32 "
675 "behavior end.m.gtp4.e v4src_position 64")
677 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
678 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
679 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
680 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
681 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
683 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
684 IP(src="172.20.0.2", dst="172.20.0.1") /
685 UDP(sport=2152, dport=2152) /
686 GTP_U_Header(gtp_type="g_pdu", teid=200) /
687 GTPPDUSessionContainer(R=1, QFI=3) /
688 IP(src="172.99.0.1", dst="172.99.0.2") /
691 print("Sending packet on {}:".format(c1.name))
697 c4.pg_start_capture()
699 c1.pg_create_stream(p)
702 # timeout (sleep) if needed
706 print("Receiving packet on {}:".format(c4.name))
707 for p in c4.pg_read_packets():
710 def test_tmap_ipv6(self):
712 # trace add af-packet-input 10
713 # pg interface on c1 172.20.0.1
714 # pg interface on c4 B::1/120
716 self.start_containers()
718 c1 = self.containers.get(self.get_name(self.instance_names[0]))
719 c2 = self.containers.get(self.get_name(self.instance_names[1]))
720 c3 = self.containers.get(self.get_name(self.instance_names[2]))
721 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
723 c1.pg_create_interface4(
724 local_ip="172.16.0.1/30",
725 remote_ip="172.16.0.2/30",
726 local_mac="aa:bb:cc:dd:ee:01",
727 remote_mac="aa:bb:cc:dd:ee:02")
728 c4.pg_create_interface4(
729 local_ip="1.0.0.2/30",
731 local_mac="aa:bb:cc:dd:ee:11",
732 remote_mac="aa:bb:cc:dd:ee:22")
734 c1.vppctl_exec("set sr encaps source addr A1::1")
736 "sr policy add bsid D1:: next D2:: next D3:: "
737 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
738 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
740 c2.vppctl_exec("sr localsid address D2:: behavior end")
742 c3.vppctl_exec("sr localsid address D3:: behavior end")
745 "sr localsid prefix D4::/32 "
746 "behavior end.m.gtp4.e v4src_position 64")
748 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
749 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
750 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
751 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
752 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
754 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
755 IP(src="172.20.0.2", dst="172.20.0.1") /
756 UDP(sport=2152, dport=2152) /
757 GTP_U_Header(gtp_type="g_pdu", teid=200) /
758 IPv6(src="2001::1", dst="2002::1") /
761 print("Sending packet on {}:".format(c1.name))
767 c4.pg_start_capture()
769 c1.pg_create_stream(p)
772 # timeout (sleep) if needed
776 print("Receiving packet on {}:".format(c4.name))
777 for p in c4.pg_read_packets():
780 def test_tmap_ipv6_5g(self):
782 # trace add af-packet-input 10
783 # pg interface on c1 172.20.0.1
784 # pg interface on c4 B::1/120
786 self.start_containers()
788 c1 = self.containers.get(self.get_name(self.instance_names[0]))
789 c2 = self.containers.get(self.get_name(self.instance_names[1]))
790 c3 = self.containers.get(self.get_name(self.instance_names[2]))
791 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
793 c1.pg_create_interface4(
794 local_ip="172.16.0.1/30",
795 remote_ip="172.16.0.2/30",
796 local_mac="aa:bb:cc:dd:ee:01",
797 remote_mac="aa:bb:cc:dd:ee:02")
798 c4.pg_create_interface4(
799 local_ip="1.0.0.2/30",
801 local_mac="aa:bb:cc:dd:ee:11",
802 remote_mac="aa:bb:cc:dd:ee:22")
804 c1.vppctl_exec("set sr encaps source addr A1::1")
806 "sr policy add bsid D1:: next D2:: next D3:: "
807 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
808 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
810 c2.vppctl_exec("sr localsid address D2:: behavior end")
812 c3.vppctl_exec("sr localsid address D3:: behavior end")
815 "sr localsid prefix D4::/32 "
816 "behavior end.m.gtp4.e v4src_position 64")
818 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
819 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
820 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
821 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
822 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
824 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
825 IP(src="172.20.0.2", dst="172.20.0.1") /
826 UDP(sport=2152, dport=2152) /
827 GTP_U_Header(gtp_type="g_pdu", teid=200) /
828 GTPPDUSessionContainer(R=1, QFI=3) /
829 IPv6(src="2001::1", dst="2002::1") /
832 print("Sending packet on {}:".format(c1.name))
833 print("Sending packet on {}:".format(c1.name))
839 c4.pg_start_capture()
841 c1.pg_create_stream(p)
844 # timeout (sleep) if needed
848 print("Receiving packet on {}:".format(c4.name))
849 for p in c4.pg_read_packets():
855 # trace add af-packet-input 10
856 # pg interface on c1 172.20.0.1
857 # pg interface on c4 B::1/120
859 self.start_containers()
861 c1 = self.containers.get(self.get_name(self.instance_names[0]))
862 c2 = self.containers.get(self.get_name(self.instance_names[1]))
863 c3 = self.containers.get(self.get_name(self.instance_names[2]))
864 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
866 c1.pg_create_interface4(
867 local_ip="172.16.0.1/30",
868 remote_ip="172.16.0.2/30",
869 local_mac="aa:bb:cc:dd:ee:01",
870 remote_mac="aa:bb:cc:dd:ee:02",
872 c4.pg_create_interface4(
873 local_ip="1.0.0.2/30",
875 local_mac="aa:bb:cc:dd:ee:11",
876 remote_mac="aa:bb:cc:dd:ee:22",
879 c1.vppctl_exec("set sr encaps source addr A1::1")
880 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
882 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
884 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
886 c2.vppctl_exec("sr localsid address D2:: behavior end")
888 c3.vppctl_exec("sr localsid address D3:: behavior end")
891 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
894 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
895 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
896 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
897 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
898 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
901 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
902 / IP(src="172.20.0.2", dst="172.20.0.1")
903 / UDP(sport=2152, dport=2152)
904 / GTP_U_Header(gtp_type="g_pdu", teid=200)
905 / IP(src="172.99.0.1", dst="172.99.0.2")
909 print("Sending packet on {}:".format(c1.name))
916 c4.pg_start_capture()
918 c1.pg_create_stream(p)
921 # timeout (sleep) if needed
925 print("Receiving packet on {}:".format(c4.name))
926 for p in c4.pg_read_packets():
929 def test_gtp4_usid(self):
931 # trace add af-packet-input 10
932 # pg interface on c1 172.20.0.1
933 # pg interface on c4 B::1/120
935 self.start_containers()
937 c1 = self.containers.get(self.get_name(self.instance_names[0]))
938 c2 = self.containers.get(self.get_name(self.instance_names[1]))
939 c3 = self.containers.get(self.get_name(self.instance_names[2]))
940 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
942 c1.pg_create_interface4(
943 local_ip="172.16.0.1/30",
944 remote_ip="172.16.0.2/30",
945 local_mac="aa:bb:cc:dd:ee:01",
946 remote_mac="aa:bb:cc:dd:ee:02",
948 c4.pg_create_interface4(
949 local_ip="1.0.0.2/30",
951 local_mac="aa:bb:cc:dd:ee:11",
952 remote_mac="aa:bb:cc:dd:ee:22",
955 c1.vppctl_exec("set sr encaps source addr A1::1")
956 c1.vppctl_exec("sr policy add bsid D4:: next D2:1111:aaaa:bbbb::")
958 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
960 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
962 c2.vppctl_exec("sr localsid prefix D2:1111:aaaa::/48 behavior end usid 16")
964 c3.vppctl_exec("sr localsid prefix D2:1111:bbbb::/48 behavior end usid 16")
967 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
970 c2.set_ipv6_route("eth2", "A2::2", "D2:1111:bbbb::/48")
971 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
972 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
973 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
974 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
977 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
978 / IP(src="172.20.0.2", dst="172.20.0.1")
979 / UDP(sport=2152, dport=2152)
980 / GTP_U_Header(gtp_type="g_pdu", teid=200)
981 / IP(src="172.99.0.1", dst="172.99.0.2")
985 print("Sending packet on {}:".format(c1.name))
992 c4.pg_start_capture()
994 c1.pg_create_stream(p)
997 # timeout (sleep) if needed
1001 print("Receiving packet on {}:".format(c4.name))
1002 for p in c4.pg_read_packets():
1005 def test_gtp4_5g(self):
1007 # trace add af-packet-input 10
1008 # pg interface on c1 172.20.0.1
1009 # pg interface on c4 B::1/120
1011 self.start_containers()
1013 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1014 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1015 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1016 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1018 c1.pg_create_interface4(
1019 local_ip="172.16.0.1/30",
1020 remote_ip="172.16.0.2/30",
1021 local_mac="aa:bb:cc:dd:ee:01",
1022 remote_mac="aa:bb:cc:dd:ee:02",
1024 c4.pg_create_interface4(
1025 local_ip="1.0.0.2/30",
1026 remote_ip="1.0.0.1",
1027 local_mac="aa:bb:cc:dd:ee:11",
1028 remote_mac="aa:bb:cc:dd:ee:22",
1031 c1.vppctl_exec("set sr encaps source addr A1::1")
1032 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1034 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
1036 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1038 c2.vppctl_exec("sr localsid address D2:: behavior end")
1040 c3.vppctl_exec("sr localsid address D3:: behavior end")
1043 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1046 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1047 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1048 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1049 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1050 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1053 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1054 / IP(src="172.20.0.2", dst="172.20.0.1")
1055 / UDP(sport=2152, dport=2152)
1056 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1057 / GTPPDUSessionContainer(type=1, R=1, QFI=3)
1058 / IP(src="172.99.0.1", dst="172.99.0.2")
1062 print("Sending packet on {}:".format(c1.name))
1068 c4.pg_start_capture()
1070 c1.pg_create_stream(p)
1073 # timeout (sleep) if needed
1077 print("Receiving packet on {}:".format(c4.name))
1078 for p in c4.pg_read_packets():
1081 def test_gtp4_echo(self):
1083 # trace add af-packet-input 10
1084 # pg interface on c1 172.20.0.1
1085 # pg interface on c4 B::1/120
1087 self.start_containers()
1089 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1090 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1091 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1092 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1094 c1.pg_create_interface4(
1095 local_ip="172.16.0.1/30",
1096 remote_ip="172.16.0.2/30",
1097 local_mac="aa:bb:cc:dd:ee:01",
1098 remote_mac="aa:bb:cc:dd:ee:02",
1100 c4.pg_create_interface4(
1101 local_ip="1.0.0.2/30",
1102 remote_ip="1.0.0.1",
1103 local_mac="aa:bb:cc:dd:ee:11",
1104 remote_mac="aa:bb:cc:dd:ee:22",
1107 c1.vppctl_exec("set sr encaps source addr A1::1")
1108 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1110 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
1112 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1114 c2.vppctl_exec("sr localsid address D2:: behavior end")
1116 c3.vppctl_exec("sr localsid address D3:: behavior end")
1119 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1122 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1123 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1124 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1125 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1126 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1129 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1130 / IP(src="172.20.0.2", dst="172.20.0.1")
1131 / UDP(sport=2152, dport=2152)
1132 / GTP_U_Header(gtp_type="echo_request", S=1, teid=200, seq=200)
1135 print("Sending packet on {}:".format(c1.name))
1141 c4.pg_start_capture()
1143 c1.pg_create_stream(p)
1146 # timeout (sleep) if needed
1150 print("Receiving packet on {}:".format(c4.name))
1151 for p in c4.pg_read_packets():
1154 def test_gtp4_reply(self):
1156 # trace add af-packet-input 10
1157 # pg interface on c1 172.20.0.1
1158 # pg interface on c4 B::1/120
1160 self.start_containers()
1162 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1163 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1164 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1165 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1167 c1.pg_create_interface4(
1168 local_ip="172.16.0.1/30",
1169 remote_ip="172.16.0.2/30",
1170 local_mac="aa:bb:cc:dd:ee:01",
1171 remote_mac="aa:bb:cc:dd:ee:02",
1173 c4.pg_create_interface4(
1174 local_ip="1.0.0.2/30",
1175 remote_ip="1.0.0.1",
1176 local_mac="aa:bb:cc:dd:ee:11",
1177 remote_mac="aa:bb:cc:dd:ee:22",
1180 c1.vppctl_exec("set sr encaps source addr A1::1")
1181 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1183 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
1185 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1187 c2.vppctl_exec("sr localsid address D2:: behavior end")
1189 c3.vppctl_exec("sr localsid address D3:: behavior end")
1192 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1195 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1196 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1197 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1198 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1199 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1202 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1203 / IP(src="172.20.0.2", dst="172.20.0.1")
1204 / UDP(sport=2152, dport=2152)
1205 / GTP_U_Header(gtp_type="echo_response", S=1, teid=200, seq=200)
1208 print("Sending packet on {}:".format(c1.name))
1214 c4.pg_start_capture()
1216 c1.pg_create_stream(p)
1219 # timeout (sleep) if needed
1223 print("Receiving packet on {}:".format(c4.name))
1224 for p in c4.pg_read_packets():
1227 def test_gtp4_error(self):
1229 # trace add af-packet-input 10
1230 # pg interface on c1 172.20.0.1
1231 # pg interface on c4 B::1/120
1233 self.start_containers()
1235 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1236 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1237 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1238 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1240 c1.pg_create_interface4(
1241 local_ip="172.16.0.1/30",
1242 remote_ip="172.16.0.2/30",
1243 local_mac="aa:bb:cc:dd:ee:01",
1244 remote_mac="aa:bb:cc:dd:ee:02",
1246 c4.pg_create_interface4(
1247 local_ip="1.0.0.2/30",
1248 remote_ip="1.0.0.1",
1249 local_mac="aa:bb:cc:dd:ee:11",
1250 remote_mac="aa:bb:cc:dd:ee:22",
1253 c1.vppctl_exec("set sr encaps source addr A1::1")
1254 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1256 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
1258 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1260 c2.vppctl_exec("sr localsid address D2:: behavior end")
1262 c3.vppctl_exec("sr localsid address D3:: behavior end")
1265 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1268 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1269 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1270 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1271 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1272 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1275 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1276 / IP(src="172.20.0.2", dst="172.20.0.1")
1277 / UDP(sport=2152, dport=2152)
1278 / GTP_U_Header(gtp_type="error_indication", S=1, teid=200, seq=200)
1279 / IE_TEIDI(TEIDI=65535)
1280 / IE_GSNAddress(address="1.1.1.1")
1281 / IE_PrivateExtension(extention_value="z")
1284 print("Sending packet on {}:".format(c1.name))
1290 c4.pg_start_capture()
1292 c1.pg_create_stream(p)
1295 # timeout (sleep) if needed
1299 print("Receiving packet on {}:".format(c4.name))
1300 for p in c4.pg_read_packets():
1303 def test_gtp4_ipv6(self):
1305 # trace add af-packet-input 10
1306 # pg interface on c1 172.20.0.1
1307 # pg interface on c4 B::1/120
1309 self.start_containers()
1311 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1312 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1313 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1314 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1316 c1.pg_create_interface4(
1317 local_ip="172.16.0.1/30",
1318 remote_ip="172.16.0.2/30",
1319 local_mac="aa:bb:cc:dd:ee:01",
1320 remote_mac="aa:bb:cc:dd:ee:02",
1322 c4.pg_create_interface4(
1323 local_ip="1.0.0.2/30",
1324 remote_ip="1.0.0.1",
1325 local_mac="aa:bb:cc:dd:ee:11",
1326 remote_mac="aa:bb:cc:dd:ee:22",
1329 c1.vppctl_exec("set sr encaps source addr A1::1")
1330 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1332 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64"
1334 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1336 c2.vppctl_exec("sr localsid address D2:: behavior end")
1338 c3.vppctl_exec("sr localsid address D3:: behavior end")
1341 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1344 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1345 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1346 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1347 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1348 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1351 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1352 / IP(src="172.20.0.2", dst="172.20.0.1")
1353 / UDP(sport=2152, dport=2152)
1354 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1355 / IPv6(src="2001::1", dst="2002::1")
1356 / ICMPv6EchoRequest()
1359 print("Sending packet on {}:".format(c1.name))
1365 c4.pg_start_capture()
1367 c1.pg_create_stream(p)
1370 # timeout (sleep) if needed
1374 print("Receiving packet on {}:".format(c4.name))
1375 for p in c4.pg_read_packets():
1378 def test_gtp4_ipv6_5g(self):
1380 # trace add af-packet-input 10
1381 # pg interface on c1 172.20.0.1
1382 # pg interface on c4 B::1/120
1384 self.start_containers()
1386 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1387 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1388 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1389 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1391 c1.pg_create_interface4(
1392 local_ip="172.16.0.1/30",
1393 remote_ip="172.16.0.2/30",
1394 local_mac="aa:bb:cc:dd:ee:01",
1395 remote_mac="aa:bb:cc:dd:ee:02",
1397 c4.pg_create_interface4(
1398 local_ip="1.0.0.2/30",
1399 remote_ip="1.0.0.1",
1400 local_mac="aa:bb:cc:dd:ee:11",
1401 remote_mac="aa:bb:cc:dd:ee:22",
1404 c1.vppctl_exec("set sr encaps source addr A1::1")
1405 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1407 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64"
1409 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1411 c2.vppctl_exec("sr localsid address D2:: behavior end")
1413 c3.vppctl_exec("sr localsid address D3:: behavior end")
1416 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1419 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1420 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1421 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1422 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1423 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1426 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1427 / IP(src="172.20.0.2", dst="172.20.0.1")
1428 / UDP(sport=2152, dport=2152)
1429 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1430 / GTPPDUSessionContainer(R=1, QFI=3)
1431 / IPv6(src="2001::1", dst="2002::1")
1432 / ICMPv6EchoRequest()
1435 print("Sending packet on {}:".format(c1.name))
1441 c4.pg_start_capture()
1443 c1.pg_create_stream(p)
1446 # timeout (sleep) if needed
1450 print("Receiving packet on {}:".format(c4.name))
1451 for p in c4.pg_read_packets():
1454 def test_gtp6_drop_in(self):
1456 # trace add af-packet-input 10
1457 # pg interface on c1 172.20.0.1
1458 # pg interface on c4 B::1/120
1460 self.start_containers()
1462 print("Deleting the old containers...")
1464 print("Starting the new containers...")
1466 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1467 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1468 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1469 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1471 c1.pg_create_interface(
1472 local_ip="C::1/120",
1474 local_mac="aa:bb:cc:dd:ee:01",
1475 remote_mac="aa:bb:cc:dd:ee:02",
1477 c4.pg_create_interface(
1478 local_ip="B::1/120",
1480 local_mac="aa:bb:cc:dd:ee:11",
1481 remote_mac="aa:bb:cc:dd:ee:22",
1484 c1.vppctl_exec("set sr encaps source addr A1::1")
1485 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1487 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1489 c2.vppctl_exec("sr localsid address D2:: behavior end")
1491 c3.vppctl_exec("sr localsid address D3:: behavior end")
1493 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1495 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1496 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1497 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1498 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1499 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1505 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1506 / IPv6(src="C::2", dst="D::2")
1507 / UDP(sport=2152, dport=2152)
1508 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1509 / IP(src="172.99.0.1", dst="172.99.0.2")
1513 print("Sending packet on {}:".format(c1.name))
1519 c4.pg_start_capture()
1521 c1.pg_create_stream(p)
1524 # timeout (sleep) if needed
1528 print("Receiving packet on {}:".format(c4.name))
1529 for p in c4.pg_read_packets():
1532 def test_gtp6_drop_in_5g(self):
1534 # trace add af-packet-input 10
1535 # pg interface on c1 172.20.0.1
1536 # pg interface on c4 B::1/120
1538 self.start_containers()
1540 print("Deleting the old containers...")
1542 print("Starting the new containers...")
1544 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1545 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1546 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1547 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1549 c1.pg_create_interface(
1550 local_ip="C::1/120",
1552 local_mac="aa:bb:cc:dd:ee:01",
1553 remote_mac="aa:bb:cc:dd:ee:02",
1555 c4.pg_create_interface(
1556 local_ip="B::1/120",
1558 local_mac="aa:bb:cc:dd:ee:11",
1559 remote_mac="aa:bb:cc:dd:ee:22",
1562 c1.vppctl_exec("set sr encaps source addr A1::1")
1563 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1565 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1567 c2.vppctl_exec("sr localsid address D2:: behavior end")
1569 c3.vppctl_exec("sr localsid address D3:: behavior end")
1571 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1573 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1574 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1575 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1576 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1577 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1583 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1584 / IPv6(src="C::2", dst="D::2")
1585 / UDP(sport=2152, dport=2152)
1586 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1587 / GTPPDUSessionContainer(type=1, R=1, QFI=3)
1588 / IP(src="172.99.0.1", dst="172.99.0.2")
1592 print("Sending packet on {}:".format(c1.name))
1598 c4.pg_start_capture()
1600 c1.pg_create_stream(p)
1603 # timeout (sleep) if needed
1607 print("Receiving packet on {}:".format(c4.name))
1608 for p in c4.pg_read_packets():
1611 def test_gtp6_drop_in_echo(self):
1613 # trace add af-packet-input 10
1614 # pg interface on c1 172.20.0.1
1615 # pg interface on c4 B::1/120
1617 self.start_containers()
1619 print("Deleting the old containers...")
1621 print("Starting the new containers...")
1623 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1624 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1625 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1626 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1628 c1.pg_create_interface(
1629 local_ip="C::1/120",
1631 local_mac="aa:bb:cc:dd:ee:01",
1632 remote_mac="aa:bb:cc:dd:ee:02",
1634 c4.pg_create_interface(
1635 local_ip="B::1/120",
1637 local_mac="aa:bb:cc:dd:ee:11",
1638 remote_mac="aa:bb:cc:dd:ee:22",
1641 c1.vppctl_exec("set sr encaps source addr A1::1")
1642 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1644 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1646 c2.vppctl_exec("sr localsid address D2:: behavior end")
1648 c3.vppctl_exec("sr localsid address D3:: behavior end")
1650 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1652 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1653 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1654 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1655 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1656 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1662 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1663 / IPv6(src="C::2", dst="D::2")
1664 / UDP(sport=2152, dport=2152)
1665 / GTP_U_Header(gtp_type="echo_request", S=1, teid=200, seq=300)
1668 print("Sending packet on {}:".format(c1.name))
1674 c4.pg_start_capture()
1676 c1.pg_create_stream(p)
1679 # timeout (sleep) if needed
1683 print("Receiving packet on {}:".format(c4.name))
1684 for p in c4.pg_read_packets():
1687 def test_gtp6_drop_in_reply(self):
1689 # trace add af-packet-input 10
1690 # pg interface on c1 172.20.0.1
1691 # pg interface on c4 B::1/120
1693 self.start_containers()
1695 print("Deleting the old containers...")
1697 print("Starting the new containers...")
1699 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1700 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1701 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1702 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1704 c1.pg_create_interface(
1705 local_ip="C::1/120",
1707 local_mac="aa:bb:cc:dd:ee:01",
1708 remote_mac="aa:bb:cc:dd:ee:02",
1710 c4.pg_create_interface(
1711 local_ip="B::1/120",
1713 local_mac="aa:bb:cc:dd:ee:11",
1714 remote_mac="aa:bb:cc:dd:ee:22",
1717 c1.vppctl_exec("set sr encaps source addr A1::1")
1718 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1720 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1722 c2.vppctl_exec("sr localsid address D2:: behavior end")
1724 c3.vppctl_exec("sr localsid address D3:: behavior end")
1726 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1728 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1729 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1730 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1731 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1732 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1738 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1739 / IPv6(src="C::2", dst="D::2")
1740 / UDP(sport=2152, dport=2152)
1741 / GTP_U_Header(gtp_type="echo_response", S=1, teid=200, seq=300)
1744 print("Sending packet on {}:".format(c1.name))
1750 c4.pg_start_capture()
1752 c1.pg_create_stream(p)
1755 # timeout (sleep) if needed
1759 print("Receiving packet on {}:".format(c4.name))
1760 for p in c4.pg_read_packets():
1763 def test_gtp6_drop_in_error(self):
1765 # trace add af-packet-input 10
1766 # pg interface on c1 172.20.0.1
1767 # pg interface on c4 B::1/120
1769 self.start_containers()
1771 print("Deleting the old containers...")
1773 print("Starting the new containers...")
1775 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1776 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1777 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1778 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1780 c1.pg_create_interface(
1781 local_ip="C::1/120",
1783 local_mac="aa:bb:cc:dd:ee:01",
1784 remote_mac="aa:bb:cc:dd:ee:02",
1786 c4.pg_create_interface(
1787 local_ip="B::1/120",
1789 local_mac="aa:bb:cc:dd:ee:11",
1790 remote_mac="aa:bb:cc:dd:ee:22",
1793 c1.vppctl_exec("set sr encaps source addr A1::1")
1794 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1796 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1798 c2.vppctl_exec("sr localsid address D2:: behavior end")
1800 c3.vppctl_exec("sr localsid address D3:: behavior end")
1802 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1804 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1805 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1806 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1807 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1808 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1814 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1815 / IPv6(src="C::2", dst="D::2")
1816 / UDP(sport=2152, dport=2152)
1817 / GTP_U_Header(gtp_type="error_indication", S=1, teid=200, seq=300)
1818 / IE_TEIDI(TEIDI=65535)
1819 / IE_GSNAddress(address="1.1.1.1")
1820 / IE_PrivateExtension(extention_value="z")
1823 print("Sending packet on {}:".format(c1.name))
1829 c4.pg_start_capture()
1831 c1.pg_create_stream(p)
1834 # timeout (sleep) if needed
1838 print("Receiving packet on {}:".format(c4.name))
1839 for p in c4.pg_read_packets():
1842 def test_gtp6_drop_in_ipv6(self):
1844 # trace add af-packet-input 10
1845 # pg interface on c1 172.20.0.1
1846 # pg interface on c4 B::1/120
1848 self.start_containers()
1850 print("Deleting the old containers...")
1852 print("Starting the new containers...")
1854 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1855 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1856 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1857 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1859 c1.pg_create_interface(
1860 local_ip="C::1/120",
1862 local_mac="aa:bb:cc:dd:ee:01",
1863 remote_mac="aa:bb:cc:dd:ee:02",
1865 c4.pg_create_interface(
1866 local_ip="B::1/120",
1868 local_mac="aa:bb:cc:dd:ee:11",
1869 remote_mac="aa:bb:cc:dd:ee:22",
1872 c1.vppctl_exec("set sr encaps source addr A1::1")
1873 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1875 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1877 c2.vppctl_exec("sr localsid address D2:: behavior end")
1879 c3.vppctl_exec("sr localsid address D3:: behavior end")
1881 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1883 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1884 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1885 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1886 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1887 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1893 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1894 / IPv6(src="C::2", dst="D::2")
1895 / UDP(sport=2152, dport=2152)
1896 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1897 / IPv6(src="2001::1", dst="2002::1")
1898 / ICMPv6EchoRequest()
1901 print("Sending packet on {}:".format(c1.name))
1907 c4.pg_start_capture()
1909 c1.pg_create_stream(p)
1912 # timeout (sleep) if needed
1916 print("Receiving packet on {}:".format(c4.name))
1917 for p in c4.pg_read_packets():
1920 def test_gtp6_drop_in_ipv6_5g(self):
1922 # trace add af-packet-input 10
1923 # pg interface on c1 172.20.0.1
1924 # pg interface on c4 B::1/120
1926 self.start_containers()
1928 print("Deleting the old containers...")
1930 print("Starting the new containers...")
1932 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1933 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1934 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1935 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1937 c1.pg_create_interface(
1938 local_ip="C::1/120",
1940 local_mac="aa:bb:cc:dd:ee:01",
1941 remote_mac="aa:bb:cc:dd:ee:02",
1943 c4.pg_create_interface(
1944 local_ip="B::1/120",
1946 local_mac="aa:bb:cc:dd:ee:11",
1947 remote_mac="aa:bb:cc:dd:ee:22",
1950 c1.vppctl_exec("set sr encaps source addr A1::1")
1951 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1953 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1955 c2.vppctl_exec("sr localsid address D2:: behavior end")
1957 c3.vppctl_exec("sr localsid address D3:: behavior end")
1959 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1961 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1962 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1963 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1964 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1965 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1971 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1972 / IPv6(src="C::2", dst="D::2")
1973 / UDP(sport=2152, dport=2152)
1974 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1975 / GTPPDUSessionContainer(R=1, QFI=3)
1976 / IPv6(src="2001::1", dst="2002::1")
1977 / ICMPv6EchoRequest()
1980 print("Sending packet on {}:".format(c1.name))
1986 c4.pg_start_capture()
1988 c1.pg_create_stream(p)
1991 # timeout (sleep) if needed
1995 print("Receiving packet on {}:".format(c4.name))
1996 for p in c4.pg_read_packets():
1999 def test_gtp6(self):
2001 # trace add af-packet-input 10
2002 # pg interface on c1 172.20.0.1
2003 # pg interface on c4 B::1/120
2005 self.start_containers()
2007 print("Deleting the old containers...")
2009 print("Starting the new containers...")
2011 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2012 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2013 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2014 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2016 c1.pg_create_interface(
2017 local_ip="C::1/120",
2019 local_mac="aa:bb:cc:dd:ee:01",
2020 remote_mac="aa:bb:cc:dd:ee:02",
2022 c4.pg_create_interface4(
2023 local_ip="1.0.0.2/30",
2024 remote_ip="1.0.0.1",
2025 local_mac="aa:bb:cc:dd:ee:11",
2026 remote_mac="aa:bb:cc:dd:ee:22",
2029 c1.vppctl_exec("set sr encaps source addr A1::1")
2030 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2032 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2034 c2.vppctl_exec("sr localsid address D2:: behavior end")
2036 c3.vppctl_exec("sr localsid address D3:: behavior end")
2038 c4.vppctl_exec("set ip neighbor pg0 1.0.0.1 aa:bb:cc:dd:ee:22")
2039 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
2041 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2042 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2043 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2044 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2045 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
2051 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2052 / IPv6(src="C::2", dst="D::2")
2053 / UDP(sport=2152, dport=2152)
2054 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2055 / IP(src="172.100.0.1", dst="172.200.0.1")
2059 print("Sending packet on {}:".format(c1.name))
2065 c4.pg_start_capture()
2067 c1.pg_create_stream(p)
2070 # timeout (sleep) if needed
2074 print("Receiving packet on {}:".format(c4.name))
2075 for p in c4.pg_read_packets():
2078 def test_gtp6_5g(self):
2080 # trace add af-packet-input 10
2081 # pg interface on c1 172.20.0.1
2082 # pg interface on c4 B::1/120
2084 self.start_containers()
2086 print("Deleting the old containers...")
2088 print("Starting the new containers...")
2090 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2091 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2092 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2093 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2095 c1.pg_create_interface(
2096 local_ip="C::1/120",
2098 local_mac="aa:bb:cc:dd:ee:01",
2099 remote_mac="aa:bb:cc:dd:ee:02",
2101 c4.pg_create_interface4(
2102 local_ip="1.0.0.2/30",
2103 remote_ip="1.0.0.1",
2104 local_mac="aa:bb:cc:dd:ee:11",
2105 remote_mac="aa:bb:cc:dd:ee:22",
2108 c1.vppctl_exec("set sr encaps source addr A1::1")
2109 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2111 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2113 c2.vppctl_exec("sr localsid address D2:: behavior end")
2115 c3.vppctl_exec("sr localsid address D3:: behavior end")
2117 c4.vppctl_exec("set ip neighbor pg0 1.0.0.1 aa:bb:cc:dd:ee:22")
2118 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
2120 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2121 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2122 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2123 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2124 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
2130 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2131 / IPv6(src="C::2", dst="D::2")
2132 / UDP(sport=2152, dport=2152)
2133 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2134 / GTPPDUSessionContainer(R=1, QFI=3)
2135 / IP(src="172.100.0.1", dst="172.200.0.1")
2139 print("Sending packet on {}:".format(c1.name))
2145 c4.pg_start_capture()
2147 c1.pg_create_stream(p)
2150 # timeout (sleep) if needed
2154 print("Receiving packet on {}:".format(c4.name))
2155 for p in c4.pg_read_packets():
2158 def test_gtp6_ipv6(self):
2160 # trace add af-packet-input 10
2161 # pg interface on c1 172.20.0.1
2162 # pg interface on c4 B::1/120
2164 self.start_containers()
2166 print("Deleting the old containers...")
2168 print("Starting the new containers...")
2170 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2171 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2172 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2173 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2175 c1.pg_create_interface(
2176 local_ip="C::1/120",
2178 local_mac="aa:bb:cc:dd:ee:01",
2179 remote_mac="aa:bb:cc:dd:ee:02",
2181 c4.pg_create_interface(
2182 local_ip="B::1/120",
2184 local_mac="aa:bb:cc:dd:ee:11",
2185 remote_mac="aa:bb:cc:dd:ee:22",
2188 c1.vppctl_exec("set sr encaps source addr A1::1")
2189 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2191 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2193 c2.vppctl_exec("sr localsid address D2:: behavior end")
2195 c3.vppctl_exec("sr localsid address D3:: behavior end")
2197 c4.vppctl_exec("set ip neighbor pg0 B::2 aa:bb:cc:dd:ee:22")
2198 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
2200 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2201 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2202 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2203 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2204 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
2210 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2211 / IPv6(src="C::2", dst="D::2")
2212 / UDP(sport=2152, dport=2152)
2213 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2214 / IPv6(src="2001::1", dst="2002::1")
2215 / ICMPv6EchoRequest()
2218 print("Sending packet on {}:".format(c1.name))
2224 c4.pg_start_capture()
2226 c1.pg_create_stream(p)
2229 # timeout (sleep) if needed
2233 print("Receiving packet on {}:".format(c4.name))
2234 for p in c4.pg_read_packets():
2237 def test_gtp6_ipv6_5g(self):
2239 # trace add af-packet-input 10
2240 # pg interface on c1 172.20.0.1
2241 # pg interface on c4 B::1/120
2243 self.start_containers()
2245 print("Deleting the old containers...")
2247 print("Starting the new containers...")
2249 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2250 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2251 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2252 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2254 c1.pg_create_interface(
2255 local_ip="C::1/120",
2257 local_mac="aa:bb:cc:dd:ee:01",
2258 remote_mac="aa:bb:cc:dd:ee:02",
2260 c4.pg_create_interface(
2261 local_ip="B::1/120",
2263 local_mac="aa:bb:cc:dd:ee:11",
2264 remote_mac="aa:bb:cc:dd:ee:22",
2267 c1.vppctl_exec("set sr encaps source addr A1::1")
2268 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2270 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2272 c2.vppctl_exec("sr localsid address D2:: behavior end")
2274 c3.vppctl_exec("sr localsid address D3:: behavior end")
2276 c4.vppctl_exec("set ip neighbor pg0 B::2 aa:bb:cc:dd:ee:22")
2277 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
2279 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2280 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2281 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2282 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2283 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
2289 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2290 / IPv6(src="C::2", dst="D::2")
2291 / UDP(sport=2152, dport=2152)
2292 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2293 / GTPPDUSessionContainer(R=1, QFI=3)
2294 / IPv6(src="2001::1", dst="2002::1")
2295 / ICMPv6EchoRequest()
2298 print("Sending packet on {}:".format(c1.name))
2304 c4.pg_start_capture()
2306 c1.pg_create_stream(p)
2309 # timeout (sleep) if needed
2313 print("Receiving packet on {}:".format(c4.name))
2314 for p in c4.pg_read_packets():
2317 def test_gtp6_dt(self):
2319 # trace add af-packet-input 10
2320 # pg interface on c1 172.20.0.1
2321 # pg interface on c4 B::1/120
2323 self.start_containers()
2325 print("Deleting the old containers...")
2327 print("Starting the new containers...")
2329 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2331 c1.pg_create_interface6_name(
2333 local_ip="C::1/120",
2335 local_mac="aa:bb:cc:dd:ee:01",
2336 remote_mac="aa:bb:cc:dd:ee:02",
2339 c1.pg_create_interface4_name(
2341 local_ip="1.0.0.2/30",
2342 remote_ip="1.0.0.1",
2343 local_mac="aa:bb:cc:dd:ee:11",
2344 remote_mac="aa:bb:cc:dd:ee:22",
2347 c1.vppctl_exec("set sr encaps source addr A1::1")
2350 "sr localsid prefix D::/64 behavior end.m.gtp6.dt46 fib-table 0 local-fib-table 0"
2353 c1.vppctl_exec("set ip neighbor pg1 1.0.0.1 aa:bb:cc:dd:ee:22")
2354 c1.set_ip_pgroute("pg1", "1.0.0.1", "172.200.0.1/32")
2360 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2361 / IPv6(src="C::2", dst="D::2")
2362 / UDP(sport=2152, dport=2152)
2363 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2364 / IP(src="172.100.0.1", dst="172.200.0.1")
2368 print("Sending packet on {}:".format(c1.name))
2373 c1.pg_start_capture_name(ifname="pg1")
2375 c1.pg_create_stream(p)
2378 # timeout (sleep) if needed
2382 print("Receiving packet on {}:".format(c1.name))
2383 for p in c1.pg_read_packets():
2386 def test_gtp4_dt(self):
2388 # trace add af-packet-input 10
2389 # pg interface on c1 172.20.0.1
2390 # pg interface on c4 B::1/120
2392 self.start_containers()
2394 print("Deleting the old containers...")
2396 print("Starting the new containers...")
2398 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2400 c1.pg_create_interface4_name(
2402 local_ip="172.16.0.1/30",
2403 remote_ip="172.16.0.2",
2404 local_mac="aa:bb:cc:dd:ee:01",
2405 remote_mac="aa:bb:cc:dd:ee:02",
2408 c1.pg_create_interface4_name(
2410 local_ip="1.0.0.2/30",
2411 remote_ip="1.0.0.1",
2412 local_mac="aa:bb:cc:dd:ee:11",
2413 remote_mac="aa:bb:cc:dd:ee:22",
2416 c1.vppctl_exec("set sr encaps source addr A1::1")
2417 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.dt4 fib-table 0")
2418 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
2420 c1.vppctl_exec("set ip neighbor pg1 1.0.0.1 aa:bb:cc:dd:ee:22")
2421 c1.set_ip_pgroute("pg1", "1.0.0.1", "172.200.0.1/32")
2427 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2428 / IP(src="172.20.0.2", dst="172.20.0.1")
2429 / UDP(sport=2152, dport=2152)
2430 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2431 / IP(src="172.100.0.1", dst="172.200.0.1")
2435 print("Sending packet on {}:".format(c1.name))
2440 c1.pg_start_capture_name(ifname="pg1")
2442 c1.pg_create_stream(p)
2445 # timeout (sleep) if needed
2449 print("Receiving packet on {}:".format(c1.name))
2450 for p in c1.pg_read_packets():
2453 def status_containers(self):
2456 for i, name in enumerate(self.instance_names):
2457 name = self.get_name(name)
2459 "\t[{}] {} - {}".format(
2460 i, name, "running" if self.containers.get(name) else "missing"
2466 for i, name in enumerate(self.network_names):
2467 name = self.get_name(name)
2469 "\t[{}] {} - {}".format(
2470 i, name, "running" if self.networks.get(name) else "missing"
2474 def build_image(self):
2475 print("VPP Path (build): {}".format(self.vpp_path))
2476 self.containers.build(self.path, self.vpp_path)
2478 def release_image(self):
2479 print("VPP Path (release): {}".format(self.vpp_path))
2480 instance = self.containers.new("release-build")
2483 "docker cp release-build:{}/vpp-package.tgz {}/".format(
2484 self.vpp_path, self.vpp_path
2490 self.containers.release(self.path, self.vpp_path)
2492 system("rm -rf {}/vpp-package.tgz".format(self.vpp_path))
2494 def vppctl(self, index, command=None):
2495 if index >= len(self.instance_names):
2497 name = self.get_name(self.instance_names[index])
2498 self.logger.error("connecting to: {}".format(name))
2499 self.containers.vppctl(name, command)
2501 def bash(self, index):
2502 if index >= len(self.instance_names):
2504 name = self.get_name(self.instance_names[index])
2505 self.logger.error("connecting to: {}".format(name))
2506 self.containers.bash(name)
2510 parser = ArgumentParser()
2512 parser.add_argument("--verbose", choices=["error", "debug", "info"])
2514 parser.add_argument("--image", choices=["debug", "release"])
2516 subparsers = parser.add_subparsers()
2518 p1 = subparsers.add_parser("infra", help="Infrastructure related commands.")
2521 "op", choices=["stop", "start", "status", "restart", "build", "release"]
2524 p1.add_argument("--prefix")
2525 p1.add_argument("--image")
2527 p2 = subparsers.add_parser("cmd", help="Instance related commands.")
2529 p2.add_argument("op", choices=["vppctl", "bash"])
2532 "index", type=int, help="Container instance index. (./runner.py infra status)"
2535 p2.add_argument("--command", help="Only vppctl supports this optional argument.")
2537 p3 = subparsers.add_parser("test", help="Test related commands.")
2558 "gtp6_drop_in_echo",
2559 "gtp6_drop_in_reply",
2560 "gtp6_drop_in_error",
2561 "gtp6_drop_in_ipv6",
2562 "gtp6_drop_in_ipv6_5g",
2572 args = parser.parse_args()
2573 if not hasattr(args, "op") or not args.op:
2574 parser.print_help(sys.stderr)
2580 def main(op=None, prefix=None, verbose=None, image=None, index=None, command=None):
2582 basicConfig(level=verbose_levels[verbose])
2584 if image == "release":
2585 image = "srv6m-release-image"
2586 elif image == "debug":
2587 image = "srv6m-image"
2589 image = "srv6m-image"
2591 print("Target image: {}".format(image))
2593 program = Program(image, prefix)
2597 program.build_image()
2598 elif op == "release":
2599 program.release_image()
2601 program.stop_containers()
2603 program.start_containers()
2604 elif op == "status":
2605 program.status_containers()
2606 elif op == "vppctl":
2607 program.vppctl(index, command)
2614 # elif op == 'tmap':
2615 # program.test_tmap()
2616 # elif op == 'tmap_5g':
2617 # program.test_tmap_5g()
2618 # elif op == 'tmap_ipv6':
2619 # program.test_tmap_ipv6()
2620 # elif op == 'tmap_ipv6_5g':
2621 # program.test_tmap_ipv6_5g()
2624 elif op == "gtp4_usid":
2625 program.test_gtp4_usid()
2626 elif op == "gtp4_5g":
2627 program.test_gtp4_5g()
2628 elif op == "gtp4_echo":
2629 program.test_gtp4_echo()
2630 elif op == "gtp4_reply":
2631 program.test_gtp4_reply()
2632 elif op == "gtp4_error":
2633 program.test_gtp4_error()
2634 elif op == "gtp4_ipv6":
2635 program.test_gtp4_ipv6()
2636 elif op == "gtp4_ipv6_5g":
2637 program.test_gtp4_ipv6_5g()
2638 elif op == "gtp6_drop_in":
2639 program.test_gtp6_drop_in()
2640 elif op == "gtp6_drop_in_5g":
2641 program.test_gtp6_drop_in_5g()
2642 elif op == "gtp6_drop_in_echo":
2643 program.test_gtp6_drop_in_echo()
2644 elif op == "gtp6_drop_in_reply":
2645 program.test_gtp6_drop_in_reply()
2646 elif op == "gtp6_drop_in_error":
2647 program.test_gtp6_drop_in_error()
2648 elif op == "gtp6_drop_in_ipv6":
2649 program.test_gtp6_drop_in_ipv6()
2650 elif op == "gtp6_drop_in_ipv6_5g":
2651 program.test_gtp6_drop_in_ipv6_5g()
2654 elif op == "gtp6_5g":
2655 program.test_gtp6_5g()
2656 elif op == "gtp6_ipv6":
2657 program.test_gtp6_ipv6()
2658 elif op == "gtp6_ipv6_5g":
2659 program.test_gtp6_ipv6_5g()
2660 elif op == "gtp6_dt":
2661 program.test_gtp6_dt()
2662 elif op == "gtp4_dt":
2663 program.test_gtp4_dt()
2666 program.logger.exception("")
2674 if __name__ == "__main__":
2675 sys.exit(main(**get_args()))