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):
29 cmd = "vppctl -s 0:5002"
30 cmd_bash = "/bin/bash"
32 def __init__(self, ref, name):
42 return join(self.tmp, self.name)
45 def pg_input_file(self):
46 return join(self.temp, "pgi.pcap")
49 def pg_output_file(self):
50 return join(self.temp, "pgo.pcap")
53 def pg_input_file_in(self):
54 return join("/mnt", "pgi.pcap")
57 def pg_output_file_in(self):
58 return join("/mnt", "pgo.pcap")
60 def disconnect_all(self):
62 for net in self._ref.client.networks.list():
64 net.disconnect(self._ref)
71 def new(cls, client, image, name):
73 temp = join(cls.tmp, name)
78 ref = client.containers.run(
85 volumes={temp: {"bind": "/mnt", "mode": "rw"}},
88 obj = cls.get(client, name)
90 raise ContainerStartupError()
96 def get(cls, client, name):
98 ref = client.containers.get(name)
102 return cls(ref, name)
108 system("docker exec -it {} {}".format(self.name, self.cmd))
111 system("docker exec -it {} {}".format(self.name, self.cmd_bash))
113 def vppctl_exec(self, cmd):
114 ec, resp = self._ref.exec_run(cmd="{} {}".format(self.cmd, cmd))
118 def setup_host_interface(self, name, ip):
119 self.vppctl_exec("create host-interface name {}".format(name))
120 self.vppctl_exec("set int ip addr host-{} {}".format(name, ip))
121 self.vppctl_exec("set int state host-{} up".format(name))
123 def pg_create_interface(self, local_ip, remote_ip, local_mac, remote_mac):
124 # remote_ip can't have subnet mask
127 self.vppctl_exec("create packet-generator interface pg0")
128 self.vppctl_exec("set int mac address pg0 {}".format(local_mac))
129 self.vppctl_exec("set int ip addr pg0 {}".format(local_ip))
130 self.vppctl_exec("set ip neighbor pg0 {} {}".format(remote_ip, remote_mac))
131 self.vppctl_exec("set int state pg0 up")
133 def pg_create_interface4(self, local_ip, remote_ip, local_mac, remote_mac):
134 # remote_ip can't have subnet mask
137 self.vppctl_exec("create packet-generator interface pg0")
138 self.vppctl_exec("set int mac address pg0 {}".format(local_mac))
139 self.vppctl_exec("set int ip addr pg0 {}".format(local_ip))
140 self.vppctl_exec("set ip neighbor pg0 {} {}".format(remote_ip, remote_mac))
141 self.vppctl_exec("set int state pg0 up")
143 def pg_create_interface6(self, local_ip, remote_ip, local_mac, remote_mac):
144 # remote_ip can't have subnet mask
147 self.vppctl_exec("create packet-generator interface pg0")
148 self.vppctl_exec("set int mac address pg0 {}".format(local_mac))
149 self.vppctl_exec("set int ip addr pg0 {}".format(local_ip))
150 self.vppctl_exec("set ip neighbor pg0 {} {}".format(remote_ip, remote_mac))
151 self.vppctl_exec("set int state pg0 up")
153 def pg_create_interface4_name(
154 self, ifname, local_ip, remote_ip, local_mac, remote_mac
156 # remote_ip can't have subnet mask
159 self.vppctl_exec("create packet-generator interface {}".format(ifname))
160 self.vppctl_exec("set int mac address {} {}".format(ifname, local_mac))
161 self.vppctl_exec("set int ip addr {} {}".format(ifname, local_ip))
163 "set ip neighbor {} {} {}".format(ifname, remote_ip, remote_mac)
165 self.vppctl_exec("set int state {} up".format(ifname))
167 def pg_create_interface6_name(
168 self, ifname, local_ip, remote_ip, local_mac, remote_mac
170 # remote_ip can't have subnet mask
173 self.vppctl_exec("create packet-generator interface {}".format(ifname))
174 self.vppctl_exec("set int mac address {} {}".format(ifname, local_mac))
175 self.vppctl_exec("set int ip addr {} {}".format(ifname, local_ip))
177 "set ip neighbor {} {} {}".format(ifname, remote_ip, remote_mac)
179 self.vppctl_exec("set int state {} up".format(ifname))
182 # start packet generator
183 self.vppctl_exec("packet-generator enable")
185 def pg_create_stream(self, stream):
186 wrpcap(self.pg_input_file, stream)
188 "packet-generator new name pg-stream "
189 "node ethernet-input pcap {}".format(self.pg_input_file_in)
192 def pg_start_capture(self):
193 if exists(self.pg_output_file):
194 remove(self.pg_output_file)
196 "packet-generator capture pg0 pcap {}".format(self.pg_output_file_in)
199 def pg_start_capture_name(self, ifname):
200 if exists(self.pg_output_file):
201 remove(self.pg_output_file)
203 "packet-generator capture {} pcap {}".format(ifname, self.pg_output_file_in)
206 def pg_read_packets(self):
207 return rdpcap(self.pg_output_file)
209 def set_ipv6_route(self, out_if_name, next_hop_ip, subnet):
211 "ip route add {} via host-{} {}".format(subnet, out_if_name, next_hop_ip)
214 def set_ipv6_route2(self, out_if_name, next_hop_ip, subnet):
216 "ip route add {} via {} {}".format(subnet, out_if_name, next_hop_ip)
219 def set_ip_pgroute(self, out_if_name, next_hop_ip, subnet):
221 "ip route add {} via {} {}".format(subnet, out_if_name, next_hop_ip)
224 def set_ipv6_pgroute(self, out_if_name, next_hop_ip, subnet):
226 "ip route add {} via {} {}".format(subnet, out_if_name, next_hop_ip)
229 def set_ipv6_default_route(self, out_if_name, next_hop_ip):
231 "ip route add ::/0 via host-{} {}".format(out_if_name, next_hop_ip)
234 def enable_trace(self, count):
235 self.vppctl_exec("trace add af-packet-input {}".format(count))
238 class Containers(object):
239 def __init__(self, client, image):
243 def tmp_render(self, path, template, kwargs):
245 with open(path, "w") as fo:
246 fo.write(template.render(**kwargs))
248 register(lambda: remove(path))
250 def build(self, path, vpp_path):
252 loader=FileSystemLoader(path), autoescape=True, trim_blocks=True
256 join(vpp_path, "Dockerfile"),
257 env.get_template("Dockerfile.j2"),
258 {"vpp_path": vpp_path},
262 join(vpp_path, "startup.conf"),
263 env.get_template("startup.conf.j2"),
264 {"vpp_path": vpp_path},
267 ref, _ = self.client.images.build(path=vpp_path, tag=self.image, rm=True)
270 def release(self, path, vpp_path):
272 loader=FileSystemLoader(path), autoescape=True, trim_blocks=True
276 join(vpp_path, "Dockerfile"),
277 env.get_template("Dockerfile.j2.release"),
278 {"vpp_path": vpp_path},
282 join(vpp_path, "startup.conf"),
283 env.get_template("startup.conf.j2"),
284 {"vpp_path": vpp_path},
287 ref, _ = self.client.images.build(
288 path=vpp_path, tag="srv6m-release-image", rm=True
293 return Container.new(self.client, self.image, name)
296 return Container.get(self.client, name)
298 def vppctl(self, name, command=None):
299 container = self.get(name)
303 print(container.vppctl_exec(command).decode())
305 def bash(self, name):
306 container = self.get(name)
310 class Network(object):
311 def __init__(self, ref, name):
320 def new(cls, client, name):
321 ref = client.networks.create(name, driver="bridge", check_duplicate=True)
322 return cls(ref, name)
325 def get(cls, client, name):
327 ref = client.networks.get(name)
331 return cls(ref, name)
336 def connect(self, c):
337 self._ref.connect(c.name)
340 class Networks(object):
341 def __init__(self, client):
345 return Network.new(self.client, name)
348 return Network.get(self.client, name)
351 class Program(object):
353 image = "srv6m-image"
357 # TODO: add description to these instances
358 # for exmaple what the vpp is supposed to be
359 # in our topoloty overview
361 instance_names = ["vpp-1", "vpp-2", "vpp-3", "vpp-4"]
363 network_names = ["net-1", "net-2", "net-3"]
365 def __init__(self, image=None, prefix=None):
366 self.path = dirname(realpath(__file__))
370 if prefix is not None:
371 self.name_prefix = prefix
374 self.containers = Containers(client, self.image)
375 self.networks = Networks(client)
377 self.logger = getLogger(__name__)
381 return self.path.rsplit("/", 4)[0]
383 def get_name(self, name):
384 if not self.name_prefix:
386 return "{}-{}".format(self.name_prefix, name)
388 def stop_containers(self):
390 for name in self.instance_names:
391 instance = self.containers.get(self.get_name(name))
395 for name in self.network_names:
396 network = self.networks.get(self.get_name(name))
400 def start_containers(self):
402 self.stop_containers()
406 for name in self.network_names:
407 networks.append(self.networks.new(self.get_name(name)))
409 n1, n2, n3 = networks
413 for name in self.instance_names:
414 instances.append(self.containers.new(self.get_name(name)))
416 c1, c2, c3, c4 = instances
418 # setup packet generator interfaces
419 # c1.pg_create_interface(local_ip="C::1/120", remote_ip="C::2",
420 # local_mac="aa:bb:cc:dd:ee:01", remote_mac="aa:bb:cc:dd:ee:02")
422 # setup network between instances
433 c1.setup_host_interface("eth1", "A1::1/120")
434 c2.setup_host_interface("eth1", "A1::2/120")
437 c2.setup_host_interface("eth2", "A2::1/120")
438 c3.setup_host_interface("eth1", "A2::2/120")
441 c3.setup_host_interface("eth2", "A3::1/120")
442 c4.setup_host_interface("eth1", "A3::2/120")
444 # c1 > c2 default route
446 c1.set_ipv6_default_route("eth1", "A1::2")
447 # c2 > c3 default route
448 c2.set_ipv6_default_route("eth2", "A2::2")
449 # c3 > c2 default route
450 c3.set_ipv6_default_route("eth1", "A2::1")
451 # c4 > c3 default route
452 c4.set_ipv6_default_route("eth1", "A3::1")
454 # c3 > c4 static route for address B::1/128
455 c3.set_ipv6_route("eth2", "A3::2", "B::1/128")
456 c3.set_ipv6_route("eth2", "A3::2", "B::2/128")
460 # trace add af-packet-input 10
461 # pg interface on c1 172.20.0.1
462 # pg interface on c4 B::1/120
464 self.start_containers()
466 c1 = self.containers.get(self.get_name(self.instance_names[0]))
467 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
469 c1.pg_create_interface(
472 local_mac="aa:bb:cc:dd:ee:01",
473 remote_mac="aa:bb:cc:dd:ee:02",
475 c4.pg_create_interface(
478 local_mac="aa:bb:cc:dd:ee:11",
479 remote_mac="aa:bb:cc:dd:ee:22",
483 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
484 / IPv6(src="C::2", dst="B::2")
485 / ICMPv6EchoRequest()
488 print("Sending packet on {}:".format(c1.name))
494 c4.pg_start_capture()
496 c1.pg_create_stream(p)
499 # timeout (sleep) if needed
501 print("Receiving packet on {}:".format(c4.name))
502 for p in c4.pg_read_packets():
507 # trace add af-packet-input 10
508 # pg interface on c1 C::1/120
509 # pg interface on c4 B::1/120
511 self.start_containers()
516 c1 = self.containers.get(self.get_name(self.instance_names[0]))
517 c2 = self.containers.get(self.get_name(self.instance_names[1]))
518 c3 = self.containers.get(self.get_name(self.instance_names[2]))
519 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
521 c1.pg_create_interface(
524 local_mac="aa:bb:cc:dd:ee:01",
525 remote_mac="aa:bb:cc:dd:ee:02",
527 c4.pg_create_interface(
530 local_mac="aa:bb:cc:dd:ee:11",
531 remote_mac="aa:bb:cc:dd:ee:22",
534 c1.vppctl_exec("set sr encaps source addr D1::")
535 c1.vppctl_exec("sr policy add bsid D1::999:1 next D2:: next D3:: next D4::")
536 c1.vppctl_exec("sr steer l3 B::/120 via bsid D1::999:1")
538 c2.vppctl_exec("sr localsid address D2:: behavior end")
540 c3.vppctl_exec("sr localsid address D3:: behavior end")
542 c4.vppctl_exec("sr localsid address D4:: behavior end.dx6 pg0 B::2")
544 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
545 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
546 c3.set_ipv6_route("eth2", "A3::2", "D4::/128")
547 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
550 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
551 / IPv6(src="C::2", dst="B::2")
552 / ICMPv6EchoRequest()
555 print("Sending packet on {}:".format(c1.name))
563 c4.pg_start_capture()
565 c1.pg_create_stream(p)
568 # timeout (sleep) if needed
570 print("Receiving packet on {}:".format(c4.name))
571 for p in c4.pg_read_packets():
574 """ T.Map is obsolete
577 # trace add af-packet-input 10
578 # pg interface on c1 172.20.0.1
579 # pg interface on c4 B::1/120
581 self.start_containers()
583 c1 = self.containers.get(self.get_name(self.instance_names[0]))
584 c2 = self.containers.get(self.get_name(self.instance_names[1]))
585 c3 = self.containers.get(self.get_name(self.instance_names[2]))
586 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
588 c1.pg_create_interface4(
589 local_ip="172.16.0.1/30",
590 remote_ip="172.16.0.2/30",
591 local_mac="aa:bb:cc:dd:ee:01",
592 remote_mac="aa:bb:cc:dd:ee:02")
593 c4.pg_create_interface4(
594 local_ip="1.0.0.2/30",
596 local_mac="aa:bb:cc:dd:ee:11",
597 remote_mac="aa:bb:cc:dd:ee:22")
599 c1.vppctl_exec("set sr encaps source addr A1::1")
601 "sr policy add bsid D1:: next D2:: next D3:: "
602 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
603 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
605 c2.vppctl_exec("sr localsid address D2:: behavior end")
607 c3.vppctl_exec("sr localsid address D3:: behavior end")
610 "sr localsid prefix D4::/32 "
611 "behavior end.m.gtp4.e v4src_position 64")
613 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
614 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
615 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
616 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
617 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
619 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
620 IP(src="172.20.0.2", dst="172.20.0.1") /
621 UDP(sport=2152, dport=2152) /
622 GTP_U_Header(gtp_type="g_pdu", teid=200) /
623 IP(src="172.99.0.1", dst="172.99.0.2") /
626 print("Sending packet on {}:".format(c1.name))
632 c4.pg_start_capture()
634 c1.pg_create_stream(p)
637 # timeout (sleep) if needed
641 print("Receiving packet on {}:".format(c4.name))
642 for p in c4.pg_read_packets():
645 def test_tmap_5g(self):
647 # trace add af-packet-input 10
648 # pg interface on c1 172.20.0.1
649 # pg interface on c4 B::1/120
651 self.start_containers()
653 c1 = self.containers.get(self.get_name(self.instance_names[0]))
654 c2 = self.containers.get(self.get_name(self.instance_names[1]))
655 c3 = self.containers.get(self.get_name(self.instance_names[2]))
656 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
658 c1.pg_create_interface4(
659 local_ip="172.16.0.1/30",
660 remote_ip="172.16.0.2/30",
661 local_mac="aa:bb:cc:dd:ee:01",
662 remote_mac="aa:bb:cc:dd:ee:02")
663 c4.pg_create_interface4(
664 local_ip="1.0.0.2/30",
666 local_mac="aa:bb:cc:dd:ee:11",
667 remote_mac="aa:bb:cc:dd:ee:22")
669 c1.vppctl_exec("set sr encaps source addr A1::1")
671 "sr policy add bsid D1:: next D2:: next D3:: "
672 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
673 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
675 c2.vppctl_exec("sr localsid address D2:: behavior end")
677 c3.vppctl_exec("sr localsid address D3:: behavior end")
680 "sr localsid prefix D4::/32 "
681 "behavior end.m.gtp4.e v4src_position 64")
683 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
684 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
685 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
686 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
687 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
689 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
690 IP(src="172.20.0.2", dst="172.20.0.1") /
691 UDP(sport=2152, dport=2152) /
692 GTP_U_Header(gtp_type="g_pdu", teid=200) /
693 GTPPDUSessionContainer(R=1, QFI=3) /
694 IP(src="172.99.0.1", dst="172.99.0.2") /
697 print("Sending packet on {}:".format(c1.name))
703 c4.pg_start_capture()
705 c1.pg_create_stream(p)
708 # timeout (sleep) if needed
712 print("Receiving packet on {}:".format(c4.name))
713 for p in c4.pg_read_packets():
716 def test_tmap_ipv6(self):
718 # trace add af-packet-input 10
719 # pg interface on c1 172.20.0.1
720 # pg interface on c4 B::1/120
722 self.start_containers()
724 c1 = self.containers.get(self.get_name(self.instance_names[0]))
725 c2 = self.containers.get(self.get_name(self.instance_names[1]))
726 c3 = self.containers.get(self.get_name(self.instance_names[2]))
727 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
729 c1.pg_create_interface4(
730 local_ip="172.16.0.1/30",
731 remote_ip="172.16.0.2/30",
732 local_mac="aa:bb:cc:dd:ee:01",
733 remote_mac="aa:bb:cc:dd:ee:02")
734 c4.pg_create_interface4(
735 local_ip="1.0.0.2/30",
737 local_mac="aa:bb:cc:dd:ee:11",
738 remote_mac="aa:bb:cc:dd:ee:22")
740 c1.vppctl_exec("set sr encaps source addr A1::1")
742 "sr policy add bsid D1:: next D2:: next D3:: "
743 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
744 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
746 c2.vppctl_exec("sr localsid address D2:: behavior end")
748 c3.vppctl_exec("sr localsid address D3:: behavior end")
751 "sr localsid prefix D4::/32 "
752 "behavior end.m.gtp4.e v4src_position 64")
754 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
755 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
756 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
757 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
758 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
760 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
761 IP(src="172.20.0.2", dst="172.20.0.1") /
762 UDP(sport=2152, dport=2152) /
763 GTP_U_Header(gtp_type="g_pdu", teid=200) /
764 IPv6(src="2001::1", dst="2002::1") /
767 print("Sending packet on {}:".format(c1.name))
773 c4.pg_start_capture()
775 c1.pg_create_stream(p)
778 # timeout (sleep) if needed
782 print("Receiving packet on {}:".format(c4.name))
783 for p in c4.pg_read_packets():
786 def test_tmap_ipv6_5g(self):
788 # trace add af-packet-input 10
789 # pg interface on c1 172.20.0.1
790 # pg interface on c4 B::1/120
792 self.start_containers()
794 c1 = self.containers.get(self.get_name(self.instance_names[0]))
795 c2 = self.containers.get(self.get_name(self.instance_names[1]))
796 c3 = self.containers.get(self.get_name(self.instance_names[2]))
797 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
799 c1.pg_create_interface4(
800 local_ip="172.16.0.1/30",
801 remote_ip="172.16.0.2/30",
802 local_mac="aa:bb:cc:dd:ee:01",
803 remote_mac="aa:bb:cc:dd:ee:02")
804 c4.pg_create_interface4(
805 local_ip="1.0.0.2/30",
807 local_mac="aa:bb:cc:dd:ee:11",
808 remote_mac="aa:bb:cc:dd:ee:22")
810 c1.vppctl_exec("set sr encaps source addr A1::1")
812 "sr policy add bsid D1:: next D2:: next D3:: "
813 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
814 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
816 c2.vppctl_exec("sr localsid address D2:: behavior end")
818 c3.vppctl_exec("sr localsid address D3:: behavior end")
821 "sr localsid prefix D4::/32 "
822 "behavior end.m.gtp4.e v4src_position 64")
824 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
825 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
826 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
827 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
828 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
830 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
831 IP(src="172.20.0.2", dst="172.20.0.1") /
832 UDP(sport=2152, dport=2152) /
833 GTP_U_Header(gtp_type="g_pdu", teid=200) /
834 GTPPDUSessionContainer(R=1, QFI=3) /
835 IPv6(src="2001::1", dst="2002::1") /
838 print("Sending packet on {}:".format(c1.name))
839 print("Sending packet on {}:".format(c1.name))
845 c4.pg_start_capture()
847 c1.pg_create_stream(p)
850 # timeout (sleep) if needed
854 print("Receiving packet on {}:".format(c4.name))
855 for p in c4.pg_read_packets():
861 # trace add af-packet-input 10
862 # pg interface on c1 172.20.0.1
863 # pg interface on c4 B::1/120
865 self.start_containers()
867 c1 = self.containers.get(self.get_name(self.instance_names[0]))
868 c2 = self.containers.get(self.get_name(self.instance_names[1]))
869 c3 = self.containers.get(self.get_name(self.instance_names[2]))
870 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
872 c1.pg_create_interface4(
873 local_ip="172.16.0.1/30",
874 remote_ip="172.16.0.2/30",
875 local_mac="aa:bb:cc:dd:ee:01",
876 remote_mac="aa:bb:cc:dd:ee:02",
878 c4.pg_create_interface4(
879 local_ip="1.0.0.2/30",
881 local_mac="aa:bb:cc:dd:ee:11",
882 remote_mac="aa:bb:cc:dd:ee:22",
885 c1.vppctl_exec("set sr encaps source addr A1::1")
886 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
888 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
890 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
892 c2.vppctl_exec("sr localsid address D2:: behavior end")
894 c3.vppctl_exec("sr localsid address D3:: behavior end")
897 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
900 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
901 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
902 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
903 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
904 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
907 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
908 / IP(src="172.20.0.2", dst="172.20.0.1")
909 / UDP(sport=2152, dport=2152)
910 / GTP_U_Header(gtp_type="g_pdu", teid=200)
911 / IP(src="172.99.0.1", dst="172.99.0.2")
915 print("Sending packet on {}:".format(c1.name))
922 c4.pg_start_capture()
924 c1.pg_create_stream(p)
927 # timeout (sleep) if needed
931 print("Receiving packet on {}:".format(c4.name))
932 for p in c4.pg_read_packets():
935 def test_gtp4_usid(self):
937 # trace add af-packet-input 10
938 # pg interface on c1 172.20.0.1
939 # pg interface on c4 B::1/120
941 self.start_containers()
943 c1 = self.containers.get(self.get_name(self.instance_names[0]))
944 c2 = self.containers.get(self.get_name(self.instance_names[1]))
945 c3 = self.containers.get(self.get_name(self.instance_names[2]))
946 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
948 c1.pg_create_interface4(
949 local_ip="172.16.0.1/30",
950 remote_ip="172.16.0.2/30",
951 local_mac="aa:bb:cc:dd:ee:01",
952 remote_mac="aa:bb:cc:dd:ee:02",
954 c4.pg_create_interface4(
955 local_ip="1.0.0.2/30",
957 local_mac="aa:bb:cc:dd:ee:11",
958 remote_mac="aa:bb:cc:dd:ee:22",
961 c1.vppctl_exec("set sr encaps source addr A1::1")
962 c1.vppctl_exec("sr policy add bsid D4:: next D2:1111:aaaa:bbbb::")
964 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
966 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
968 c2.vppctl_exec("sr localsid prefix D2:1111:aaaa::/48 behavior end usid 16")
970 c3.vppctl_exec("sr localsid prefix D2:1111:bbbb::/48 behavior end usid 16")
973 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
976 c2.set_ipv6_route("eth2", "A2::2", "D2:1111:bbbb::/48")
977 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
978 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
979 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
980 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
983 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
984 / IP(src="172.20.0.2", dst="172.20.0.1")
985 / UDP(sport=2152, dport=2152)
986 / GTP_U_Header(gtp_type="g_pdu", teid=200)
987 / IP(src="172.99.0.1", dst="172.99.0.2")
991 print("Sending packet on {}:".format(c1.name))
998 c4.pg_start_capture()
1000 c1.pg_create_stream(p)
1003 # timeout (sleep) if needed
1007 print("Receiving packet on {}:".format(c4.name))
1008 for p in c4.pg_read_packets():
1011 def test_gtp4_5g(self):
1013 # trace add af-packet-input 10
1014 # pg interface on c1 172.20.0.1
1015 # pg interface on c4 B::1/120
1017 self.start_containers()
1019 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1020 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1021 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1022 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1024 c1.pg_create_interface4(
1025 local_ip="172.16.0.1/30",
1026 remote_ip="172.16.0.2/30",
1027 local_mac="aa:bb:cc:dd:ee:01",
1028 remote_mac="aa:bb:cc:dd:ee:02",
1030 c4.pg_create_interface4(
1031 local_ip="1.0.0.2/30",
1032 remote_ip="1.0.0.1",
1033 local_mac="aa:bb:cc:dd:ee:11",
1034 remote_mac="aa:bb:cc:dd:ee:22",
1037 c1.vppctl_exec("set sr encaps source addr A1::1")
1038 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1040 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
1042 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1044 c2.vppctl_exec("sr localsid address D2:: behavior end")
1046 c3.vppctl_exec("sr localsid address D3:: behavior end")
1049 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1052 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1053 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1054 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1055 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1056 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1059 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1060 / IP(src="172.20.0.2", dst="172.20.0.1")
1061 / UDP(sport=2152, dport=2152)
1062 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1063 / GTPPDUSessionContainer(type=1, R=1, QFI=3)
1064 / IP(src="172.99.0.1", dst="172.99.0.2")
1068 print("Sending packet on {}:".format(c1.name))
1074 c4.pg_start_capture()
1076 c1.pg_create_stream(p)
1079 # timeout (sleep) if needed
1083 print("Receiving packet on {}:".format(c4.name))
1084 for p in c4.pg_read_packets():
1087 def test_gtp4_echo(self):
1089 # trace add af-packet-input 10
1090 # pg interface on c1 172.20.0.1
1091 # pg interface on c4 B::1/120
1093 self.start_containers()
1095 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1096 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1097 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1098 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1100 c1.pg_create_interface4(
1101 local_ip="172.16.0.1/30",
1102 remote_ip="172.16.0.2/30",
1103 local_mac="aa:bb:cc:dd:ee:01",
1104 remote_mac="aa:bb:cc:dd:ee:02",
1106 c4.pg_create_interface4(
1107 local_ip="1.0.0.2/30",
1108 remote_ip="1.0.0.1",
1109 local_mac="aa:bb:cc:dd:ee:11",
1110 remote_mac="aa:bb:cc:dd:ee:22",
1113 c1.vppctl_exec("set sr encaps source addr A1::1")
1114 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1116 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
1118 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1120 c2.vppctl_exec("sr localsid address D2:: behavior end")
1122 c3.vppctl_exec("sr localsid address D3:: behavior end")
1125 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1128 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1129 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1130 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1131 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1132 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1135 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1136 / IP(src="172.20.0.2", dst="172.20.0.1")
1137 / UDP(sport=2152, dport=2152)
1138 / GTP_U_Header(gtp_type="echo_request", S=1, teid=200, seq=200)
1141 print("Sending packet on {}:".format(c1.name))
1147 c4.pg_start_capture()
1149 c1.pg_create_stream(p)
1152 # timeout (sleep) if needed
1156 print("Receiving packet on {}:".format(c4.name))
1157 for p in c4.pg_read_packets():
1160 def test_gtp4_reply(self):
1162 # trace add af-packet-input 10
1163 # pg interface on c1 172.20.0.1
1164 # pg interface on c4 B::1/120
1166 self.start_containers()
1168 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1169 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1170 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1171 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1173 c1.pg_create_interface4(
1174 local_ip="172.16.0.1/30",
1175 remote_ip="172.16.0.2/30",
1176 local_mac="aa:bb:cc:dd:ee:01",
1177 remote_mac="aa:bb:cc:dd:ee:02",
1179 c4.pg_create_interface4(
1180 local_ip="1.0.0.2/30",
1181 remote_ip="1.0.0.1",
1182 local_mac="aa:bb:cc:dd:ee:11",
1183 remote_mac="aa:bb:cc:dd:ee:22",
1186 c1.vppctl_exec("set sr encaps source addr A1::1")
1187 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1189 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
1191 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1193 c2.vppctl_exec("sr localsid address D2:: behavior end")
1195 c3.vppctl_exec("sr localsid address D3:: behavior end")
1198 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1201 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1202 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1203 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1204 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1205 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1208 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1209 / IP(src="172.20.0.2", dst="172.20.0.1")
1210 / UDP(sport=2152, dport=2152)
1211 / GTP_U_Header(gtp_type="echo_response", S=1, teid=200, seq=200)
1214 print("Sending packet on {}:".format(c1.name))
1220 c4.pg_start_capture()
1222 c1.pg_create_stream(p)
1225 # timeout (sleep) if needed
1229 print("Receiving packet on {}:".format(c4.name))
1230 for p in c4.pg_read_packets():
1233 def test_gtp4_error(self):
1235 # trace add af-packet-input 10
1236 # pg interface on c1 172.20.0.1
1237 # pg interface on c4 B::1/120
1239 self.start_containers()
1241 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1242 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1243 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1244 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1246 c1.pg_create_interface4(
1247 local_ip="172.16.0.1/30",
1248 remote_ip="172.16.0.2/30",
1249 local_mac="aa:bb:cc:dd:ee:01",
1250 remote_mac="aa:bb:cc:dd:ee:02",
1252 c4.pg_create_interface4(
1253 local_ip="1.0.0.2/30",
1254 remote_ip="1.0.0.1",
1255 local_mac="aa:bb:cc:dd:ee:11",
1256 remote_mac="aa:bb:cc:dd:ee:22",
1259 c1.vppctl_exec("set sr encaps source addr A1::1")
1260 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1262 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4"
1264 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1266 c2.vppctl_exec("sr localsid address D2:: behavior end")
1268 c3.vppctl_exec("sr localsid address D3:: behavior end")
1271 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1274 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1275 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1276 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1277 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1278 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1281 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1282 / IP(src="172.20.0.2", dst="172.20.0.1")
1283 / UDP(sport=2152, dport=2152)
1284 / GTP_U_Header(gtp_type="error_indication", S=1, teid=200, seq=200)
1285 / IE_TEIDI(TEIDI=65535)
1286 / IE_GSNAddress(address="1.1.1.1")
1287 / IE_PrivateExtension(extention_value="z")
1290 print("Sending packet on {}:".format(c1.name))
1296 c4.pg_start_capture()
1298 c1.pg_create_stream(p)
1301 # timeout (sleep) if needed
1305 print("Receiving packet on {}:".format(c4.name))
1306 for p in c4.pg_read_packets():
1309 def test_gtp4_ipv6(self):
1311 # trace add af-packet-input 10
1312 # pg interface on c1 172.20.0.1
1313 # pg interface on c4 B::1/120
1315 self.start_containers()
1317 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1318 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1319 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1320 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1322 c1.pg_create_interface4(
1323 local_ip="172.16.0.1/30",
1324 remote_ip="172.16.0.2/30",
1325 local_mac="aa:bb:cc:dd:ee:01",
1326 remote_mac="aa:bb:cc:dd:ee:02",
1328 c4.pg_create_interface4(
1329 local_ip="1.0.0.2/30",
1330 remote_ip="1.0.0.1",
1331 local_mac="aa:bb:cc:dd:ee:11",
1332 remote_mac="aa:bb:cc:dd:ee:22",
1335 c1.vppctl_exec("set sr encaps source addr A1::1")
1336 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1338 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64"
1340 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1342 c2.vppctl_exec("sr localsid address D2:: behavior end")
1344 c3.vppctl_exec("sr localsid address D3:: behavior end")
1347 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1350 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1351 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1352 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1353 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1354 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1357 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1358 / IP(src="172.20.0.2", dst="172.20.0.1")
1359 / UDP(sport=2152, dport=2152)
1360 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1361 / IPv6(src="2001::1", dst="2002::1")
1362 / ICMPv6EchoRequest()
1365 print("Sending packet on {}:".format(c1.name))
1371 c4.pg_start_capture()
1373 c1.pg_create_stream(p)
1376 # timeout (sleep) if needed
1380 print("Receiving packet on {}:".format(c4.name))
1381 for p in c4.pg_read_packets():
1384 def test_gtp4_ipv6_5g(self):
1386 # trace add af-packet-input 10
1387 # pg interface on c1 172.20.0.1
1388 # pg interface on c4 B::1/120
1390 self.start_containers()
1392 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1393 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1394 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1395 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1397 c1.pg_create_interface4(
1398 local_ip="172.16.0.1/30",
1399 remote_ip="172.16.0.2/30",
1400 local_mac="aa:bb:cc:dd:ee:01",
1401 remote_mac="aa:bb:cc:dd:ee:02",
1403 c4.pg_create_interface4(
1404 local_ip="1.0.0.2/30",
1405 remote_ip="1.0.0.1",
1406 local_mac="aa:bb:cc:dd:ee:11",
1407 remote_mac="aa:bb:cc:dd:ee:22",
1410 c1.vppctl_exec("set sr encaps source addr A1::1")
1411 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1413 "sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64"
1415 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1417 c2.vppctl_exec("sr localsid address D2:: behavior end")
1419 c3.vppctl_exec("sr localsid address D3:: behavior end")
1422 "sr localsid prefix D4::/32 " "behavior end.m.gtp4.e v4src_position 64"
1425 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1426 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1427 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1428 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1429 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1432 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1433 / IP(src="172.20.0.2", dst="172.20.0.1")
1434 / UDP(sport=2152, dport=2152)
1435 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1436 / GTPPDUSessionContainer(R=1, QFI=3)
1437 / IPv6(src="2001::1", dst="2002::1")
1438 / ICMPv6EchoRequest()
1441 print("Sending packet on {}:".format(c1.name))
1447 c4.pg_start_capture()
1449 c1.pg_create_stream(p)
1452 # timeout (sleep) if needed
1456 print("Receiving packet on {}:".format(c4.name))
1457 for p in c4.pg_read_packets():
1460 def test_gtp6_drop_in(self):
1462 # trace add af-packet-input 10
1463 # pg interface on c1 172.20.0.1
1464 # pg interface on c4 B::1/120
1466 self.start_containers()
1468 print("Deleting the old containers...")
1470 print("Starting the new containers...")
1472 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1473 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1474 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1475 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1477 c1.pg_create_interface(
1478 local_ip="C::1/120",
1480 local_mac="aa:bb:cc:dd:ee:01",
1481 remote_mac="aa:bb:cc:dd:ee:02",
1483 c4.pg_create_interface(
1484 local_ip="B::1/120",
1486 local_mac="aa:bb:cc:dd:ee:11",
1487 remote_mac="aa:bb:cc:dd:ee:22",
1490 c1.vppctl_exec("set sr encaps source addr A1::1")
1491 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1493 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1495 c2.vppctl_exec("sr localsid address D2:: behavior end")
1497 c3.vppctl_exec("sr localsid address D3:: behavior end")
1499 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1501 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1502 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1503 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1504 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1505 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1511 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1512 / IPv6(src="C::2", dst="D::2")
1513 / UDP(sport=2152, dport=2152)
1514 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1515 / IP(src="172.99.0.1", dst="172.99.0.2")
1519 print("Sending packet on {}:".format(c1.name))
1525 c4.pg_start_capture()
1527 c1.pg_create_stream(p)
1530 # timeout (sleep) if needed
1534 print("Receiving packet on {}:".format(c4.name))
1535 for p in c4.pg_read_packets():
1538 def test_gtp6_drop_in_5g(self):
1540 # trace add af-packet-input 10
1541 # pg interface on c1 172.20.0.1
1542 # pg interface on c4 B::1/120
1544 self.start_containers()
1546 print("Deleting the old containers...")
1548 print("Starting the new containers...")
1550 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1551 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1552 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1553 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1555 c1.pg_create_interface(
1556 local_ip="C::1/120",
1558 local_mac="aa:bb:cc:dd:ee:01",
1559 remote_mac="aa:bb:cc:dd:ee:02",
1561 c4.pg_create_interface(
1562 local_ip="B::1/120",
1564 local_mac="aa:bb:cc:dd:ee:11",
1565 remote_mac="aa:bb:cc:dd:ee:22",
1568 c1.vppctl_exec("set sr encaps source addr A1::1")
1569 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1571 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1573 c2.vppctl_exec("sr localsid address D2:: behavior end")
1575 c3.vppctl_exec("sr localsid address D3:: behavior end")
1577 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1579 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1580 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1581 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1582 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1583 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1589 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1590 / IPv6(src="C::2", dst="D::2")
1591 / UDP(sport=2152, dport=2152)
1592 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1593 / GTPPDUSessionContainer(type=1, R=1, QFI=3)
1594 / IP(src="172.99.0.1", dst="172.99.0.2")
1598 print("Sending packet on {}:".format(c1.name))
1604 c4.pg_start_capture()
1606 c1.pg_create_stream(p)
1609 # timeout (sleep) if needed
1613 print("Receiving packet on {}:".format(c4.name))
1614 for p in c4.pg_read_packets():
1617 def test_gtp6_drop_in_echo(self):
1619 # trace add af-packet-input 10
1620 # pg interface on c1 172.20.0.1
1621 # pg interface on c4 B::1/120
1623 self.start_containers()
1625 print("Deleting the old containers...")
1627 print("Starting the new containers...")
1629 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1630 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1631 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1632 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1634 c1.pg_create_interface(
1635 local_ip="C::1/120",
1637 local_mac="aa:bb:cc:dd:ee:01",
1638 remote_mac="aa:bb:cc:dd:ee:02",
1640 c4.pg_create_interface(
1641 local_ip="B::1/120",
1643 local_mac="aa:bb:cc:dd:ee:11",
1644 remote_mac="aa:bb:cc:dd:ee:22",
1647 c1.vppctl_exec("set sr encaps source addr A1::1")
1648 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1650 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1652 c2.vppctl_exec("sr localsid address D2:: behavior end")
1654 c3.vppctl_exec("sr localsid address D3:: behavior end")
1656 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1658 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1659 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1660 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1661 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1662 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1668 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1669 / IPv6(src="C::2", dst="D::2")
1670 / UDP(sport=2152, dport=2152)
1671 / GTP_U_Header(gtp_type="echo_request", S=1, teid=200, seq=300)
1674 print("Sending packet on {}:".format(c1.name))
1680 c4.pg_start_capture()
1682 c1.pg_create_stream(p)
1685 # timeout (sleep) if needed
1689 print("Receiving packet on {}:".format(c4.name))
1690 for p in c4.pg_read_packets():
1693 def test_gtp6_drop_in_reply(self):
1695 # trace add af-packet-input 10
1696 # pg interface on c1 172.20.0.1
1697 # pg interface on c4 B::1/120
1699 self.start_containers()
1701 print("Deleting the old containers...")
1703 print("Starting the new containers...")
1705 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1706 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1707 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1708 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1710 c1.pg_create_interface(
1711 local_ip="C::1/120",
1713 local_mac="aa:bb:cc:dd:ee:01",
1714 remote_mac="aa:bb:cc:dd:ee:02",
1716 c4.pg_create_interface(
1717 local_ip="B::1/120",
1719 local_mac="aa:bb:cc:dd:ee:11",
1720 remote_mac="aa:bb:cc:dd:ee:22",
1723 c1.vppctl_exec("set sr encaps source addr A1::1")
1724 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1726 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1728 c2.vppctl_exec("sr localsid address D2:: behavior end")
1730 c3.vppctl_exec("sr localsid address D3:: behavior end")
1732 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1734 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1735 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1736 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1737 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1738 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1744 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1745 / IPv6(src="C::2", dst="D::2")
1746 / UDP(sport=2152, dport=2152)
1747 / GTP_U_Header(gtp_type="echo_response", S=1, teid=200, seq=300)
1750 print("Sending packet on {}:".format(c1.name))
1756 c4.pg_start_capture()
1758 c1.pg_create_stream(p)
1761 # timeout (sleep) if needed
1765 print("Receiving packet on {}:".format(c4.name))
1766 for p in c4.pg_read_packets():
1769 def test_gtp6_drop_in_error(self):
1771 # trace add af-packet-input 10
1772 # pg interface on c1 172.20.0.1
1773 # pg interface on c4 B::1/120
1775 self.start_containers()
1777 print("Deleting the old containers...")
1779 print("Starting the new containers...")
1781 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1782 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1783 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1784 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1786 c1.pg_create_interface(
1787 local_ip="C::1/120",
1789 local_mac="aa:bb:cc:dd:ee:01",
1790 remote_mac="aa:bb:cc:dd:ee:02",
1792 c4.pg_create_interface(
1793 local_ip="B::1/120",
1795 local_mac="aa:bb:cc:dd:ee:11",
1796 remote_mac="aa:bb:cc:dd:ee:22",
1799 c1.vppctl_exec("set sr encaps source addr A1::1")
1800 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1802 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1804 c2.vppctl_exec("sr localsid address D2:: behavior end")
1806 c3.vppctl_exec("sr localsid address D3:: behavior end")
1808 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1810 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1811 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1812 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1813 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1814 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1820 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1821 / IPv6(src="C::2", dst="D::2")
1822 / UDP(sport=2152, dport=2152)
1823 / GTP_U_Header(gtp_type="error_indication", S=1, teid=200, seq=300)
1824 / IE_TEIDI(TEIDI=65535)
1825 / IE_GSNAddress(address="1.1.1.1")
1826 / IE_PrivateExtension(extention_value="z")
1829 print("Sending packet on {}:".format(c1.name))
1835 c4.pg_start_capture()
1837 c1.pg_create_stream(p)
1840 # timeout (sleep) if needed
1844 print("Receiving packet on {}:".format(c4.name))
1845 for p in c4.pg_read_packets():
1848 def test_gtp6_drop_in_ipv6(self):
1850 # trace add af-packet-input 10
1851 # pg interface on c1 172.20.0.1
1852 # pg interface on c4 B::1/120
1854 self.start_containers()
1856 print("Deleting the old containers...")
1858 print("Starting the new containers...")
1860 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1861 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1862 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1863 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1865 c1.pg_create_interface(
1866 local_ip="C::1/120",
1868 local_mac="aa:bb:cc:dd:ee:01",
1869 remote_mac="aa:bb:cc:dd:ee:02",
1871 c4.pg_create_interface(
1872 local_ip="B::1/120",
1874 local_mac="aa:bb:cc:dd:ee:11",
1875 remote_mac="aa:bb:cc:dd:ee:22",
1878 c1.vppctl_exec("set sr encaps source addr A1::1")
1879 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1881 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1883 c2.vppctl_exec("sr localsid address D2:: behavior end")
1885 c3.vppctl_exec("sr localsid address D3:: behavior end")
1887 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1889 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1890 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1891 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1892 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1893 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1899 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1900 / IPv6(src="C::2", dst="D::2")
1901 / UDP(sport=2152, dport=2152)
1902 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1903 / IPv6(src="2001::1", dst="2002::1")
1904 / ICMPv6EchoRequest()
1907 print("Sending packet on {}:".format(c1.name))
1913 c4.pg_start_capture()
1915 c1.pg_create_stream(p)
1918 # timeout (sleep) if needed
1922 print("Receiving packet on {}:".format(c4.name))
1923 for p in c4.pg_read_packets():
1926 def test_gtp6_drop_in_ipv6_5g(self):
1928 # trace add af-packet-input 10
1929 # pg interface on c1 172.20.0.1
1930 # pg interface on c4 B::1/120
1932 self.start_containers()
1934 print("Deleting the old containers...")
1936 print("Starting the new containers...")
1938 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1939 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1940 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1941 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1943 c1.pg_create_interface(
1944 local_ip="C::1/120",
1946 local_mac="aa:bb:cc:dd:ee:01",
1947 remote_mac="aa:bb:cc:dd:ee:02",
1949 c4.pg_create_interface(
1950 local_ip="B::1/120",
1952 local_mac="aa:bb:cc:dd:ee:11",
1953 remote_mac="aa:bb:cc:dd:ee:22",
1956 c1.vppctl_exec("set sr encaps source addr A1::1")
1957 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1959 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1961 c2.vppctl_exec("sr localsid address D2:: behavior end")
1963 c3.vppctl_exec("sr localsid address D3:: behavior end")
1965 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1967 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1968 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1969 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1970 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1971 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1977 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
1978 / IPv6(src="C::2", dst="D::2")
1979 / UDP(sport=2152, dport=2152)
1980 / GTP_U_Header(gtp_type="g_pdu", teid=200)
1981 / GTPPDUSessionContainer(R=1, QFI=3)
1982 / IPv6(src="2001::1", dst="2002::1")
1983 / ICMPv6EchoRequest()
1986 print("Sending packet on {}:".format(c1.name))
1992 c4.pg_start_capture()
1994 c1.pg_create_stream(p)
1997 # timeout (sleep) if needed
2001 print("Receiving packet on {}:".format(c4.name))
2002 for p in c4.pg_read_packets():
2005 def test_gtp6(self):
2007 # trace add af-packet-input 10
2008 # pg interface on c1 172.20.0.1
2009 # pg interface on c4 B::1/120
2011 self.start_containers()
2013 print("Deleting the old containers...")
2015 print("Starting the new containers...")
2017 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2018 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2019 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2020 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2022 c1.pg_create_interface(
2023 local_ip="C::1/120",
2025 local_mac="aa:bb:cc:dd:ee:01",
2026 remote_mac="aa:bb:cc:dd:ee:02",
2028 c4.pg_create_interface4(
2029 local_ip="1.0.0.2/30",
2030 remote_ip="1.0.0.1",
2031 local_mac="aa:bb:cc:dd:ee:11",
2032 remote_mac="aa:bb:cc:dd:ee:22",
2035 c1.vppctl_exec("set sr encaps source addr A1::1")
2036 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2038 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2040 c2.vppctl_exec("sr localsid address D2:: behavior end")
2042 c3.vppctl_exec("sr localsid address D3:: behavior end")
2044 c4.vppctl_exec("set ip neighbor pg0 1.0.0.1 aa:bb:cc:dd:ee:22")
2045 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
2047 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2048 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2049 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2050 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2051 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
2057 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2058 / IPv6(src="C::2", dst="D::2")
2059 / UDP(sport=2152, dport=2152)
2060 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2061 / IP(src="172.100.0.1", dst="172.200.0.1")
2065 print("Sending packet on {}:".format(c1.name))
2071 c4.pg_start_capture()
2073 c1.pg_create_stream(p)
2076 # timeout (sleep) if needed
2080 print("Receiving packet on {}:".format(c4.name))
2081 for p in c4.pg_read_packets():
2084 def test_gtp6_5g(self):
2086 # trace add af-packet-input 10
2087 # pg interface on c1 172.20.0.1
2088 # pg interface on c4 B::1/120
2090 self.start_containers()
2092 print("Deleting the old containers...")
2094 print("Starting the new containers...")
2096 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2097 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2098 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2099 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2101 c1.pg_create_interface(
2102 local_ip="C::1/120",
2104 local_mac="aa:bb:cc:dd:ee:01",
2105 remote_mac="aa:bb:cc:dd:ee:02",
2107 c4.pg_create_interface4(
2108 local_ip="1.0.0.2/30",
2109 remote_ip="1.0.0.1",
2110 local_mac="aa:bb:cc:dd:ee:11",
2111 remote_mac="aa:bb:cc:dd:ee:22",
2114 c1.vppctl_exec("set sr encaps source addr A1::1")
2115 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2117 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2119 c2.vppctl_exec("sr localsid address D2:: behavior end")
2121 c3.vppctl_exec("sr localsid address D3:: behavior end")
2123 c4.vppctl_exec("set ip neighbor pg0 1.0.0.1 aa:bb:cc:dd:ee:22")
2124 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
2126 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2127 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2128 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2129 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2130 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
2136 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2137 / IPv6(src="C::2", dst="D::2")
2138 / UDP(sport=2152, dport=2152)
2139 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2140 / GTPPDUSessionContainer(R=1, QFI=3)
2141 / IP(src="172.100.0.1", dst="172.200.0.1")
2145 print("Sending packet on {}:".format(c1.name))
2151 c4.pg_start_capture()
2153 c1.pg_create_stream(p)
2156 # timeout (sleep) if needed
2160 print("Receiving packet on {}:".format(c4.name))
2161 for p in c4.pg_read_packets():
2164 def test_gtp6_ipv6(self):
2166 # trace add af-packet-input 10
2167 # pg interface on c1 172.20.0.1
2168 # pg interface on c4 B::1/120
2170 self.start_containers()
2172 print("Deleting the old containers...")
2174 print("Starting the new containers...")
2176 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2177 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2178 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2179 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2181 c1.pg_create_interface(
2182 local_ip="C::1/120",
2184 local_mac="aa:bb:cc:dd:ee:01",
2185 remote_mac="aa:bb:cc:dd:ee:02",
2187 c4.pg_create_interface(
2188 local_ip="B::1/120",
2190 local_mac="aa:bb:cc:dd:ee:11",
2191 remote_mac="aa:bb:cc:dd:ee:22",
2194 c1.vppctl_exec("set sr encaps source addr A1::1")
2195 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2197 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2199 c2.vppctl_exec("sr localsid address D2:: behavior end")
2201 c3.vppctl_exec("sr localsid address D3:: behavior end")
2203 c4.vppctl_exec("set ip neighbor pg0 B::2 aa:bb:cc:dd:ee:22")
2204 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
2206 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2207 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2208 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2209 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2210 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
2216 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2217 / IPv6(src="C::2", dst="D::2")
2218 / UDP(sport=2152, dport=2152)
2219 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2220 / IPv6(src="2001::1", dst="2002::1")
2221 / ICMPv6EchoRequest()
2224 print("Sending packet on {}:".format(c1.name))
2230 c4.pg_start_capture()
2232 c1.pg_create_stream(p)
2235 # timeout (sleep) if needed
2239 print("Receiving packet on {}:".format(c4.name))
2240 for p in c4.pg_read_packets():
2243 def test_gtp6_ipv6_5g(self):
2245 # trace add af-packet-input 10
2246 # pg interface on c1 172.20.0.1
2247 # pg interface on c4 B::1/120
2249 self.start_containers()
2251 print("Deleting the old containers...")
2253 print("Starting the new containers...")
2255 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2256 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2257 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2258 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2260 c1.pg_create_interface(
2261 local_ip="C::1/120",
2263 local_mac="aa:bb:cc:dd:ee:01",
2264 remote_mac="aa:bb:cc:dd:ee:02",
2266 c4.pg_create_interface(
2267 local_ip="B::1/120",
2269 local_mac="aa:bb:cc:dd:ee:11",
2270 remote_mac="aa:bb:cc:dd:ee:22",
2273 c1.vppctl_exec("set sr encaps source addr A1::1")
2274 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2276 c1.vppctl_exec("sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2278 c2.vppctl_exec("sr localsid address D2:: behavior end")
2280 c3.vppctl_exec("sr localsid address D3:: behavior end")
2282 c4.vppctl_exec("set ip neighbor pg0 B::2 aa:bb:cc:dd:ee:22")
2283 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
2285 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2286 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2287 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2288 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2289 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
2295 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2296 / IPv6(src="C::2", dst="D::2")
2297 / UDP(sport=2152, dport=2152)
2298 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2299 / GTPPDUSessionContainer(R=1, QFI=3)
2300 / IPv6(src="2001::1", dst="2002::1")
2301 / ICMPv6EchoRequest()
2304 print("Sending packet on {}:".format(c1.name))
2310 c4.pg_start_capture()
2312 c1.pg_create_stream(p)
2315 # timeout (sleep) if needed
2319 print("Receiving packet on {}:".format(c4.name))
2320 for p in c4.pg_read_packets():
2323 def test_gtp6_dt(self):
2325 # trace add af-packet-input 10
2326 # pg interface on c1 172.20.0.1
2327 # pg interface on c4 B::1/120
2329 self.start_containers()
2331 print("Deleting the old containers...")
2333 print("Starting the new containers...")
2335 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2337 c1.pg_create_interface6_name(
2339 local_ip="C::1/120",
2341 local_mac="aa:bb:cc:dd:ee:01",
2342 remote_mac="aa:bb:cc:dd:ee:02",
2345 c1.pg_create_interface4_name(
2347 local_ip="1.0.0.2/30",
2348 remote_ip="1.0.0.1",
2349 local_mac="aa:bb:cc:dd:ee:11",
2350 remote_mac="aa:bb:cc:dd:ee:22",
2353 c1.vppctl_exec("set sr encaps source addr A1::1")
2356 "sr localsid prefix D::/64 behavior end.m.gtp6.dt46 fib-table 0 local-fib-table 0"
2359 c1.vppctl_exec("set ip neighbor pg1 1.0.0.1 aa:bb:cc:dd:ee:22")
2360 c1.set_ip_pgroute("pg1", "1.0.0.1", "172.200.0.1/32")
2366 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2367 / IPv6(src="C::2", dst="D::2")
2368 / UDP(sport=2152, dport=2152)
2369 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2370 / IP(src="172.100.0.1", dst="172.200.0.1")
2374 print("Sending packet on {}:".format(c1.name))
2379 c1.pg_start_capture_name(ifname="pg1")
2381 c1.pg_create_stream(p)
2384 # timeout (sleep) if needed
2388 print("Receiving packet on {}:".format(c1.name))
2389 for p in c1.pg_read_packets():
2392 def test_gtp4_dt(self):
2394 # trace add af-packet-input 10
2395 # pg interface on c1 172.20.0.1
2396 # pg interface on c4 B::1/120
2398 self.start_containers()
2400 print("Deleting the old containers...")
2402 print("Starting the new containers...")
2404 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2406 c1.pg_create_interface4_name(
2408 local_ip="172.16.0.1/30",
2409 remote_ip="172.16.0.2",
2410 local_mac="aa:bb:cc:dd:ee:01",
2411 remote_mac="aa:bb:cc:dd:ee:02",
2414 c1.pg_create_interface4_name(
2416 local_ip="1.0.0.2/30",
2417 remote_ip="1.0.0.1",
2418 local_mac="aa:bb:cc:dd:ee:11",
2419 remote_mac="aa:bb:cc:dd:ee:22",
2422 c1.vppctl_exec("set sr encaps source addr A1::1")
2423 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.dt4 fib-table 0")
2424 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
2426 c1.vppctl_exec("set ip neighbor pg1 1.0.0.1 aa:bb:cc:dd:ee:22")
2427 c1.set_ip_pgroute("pg1", "1.0.0.1", "172.200.0.1/32")
2433 Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01")
2434 / IP(src="172.20.0.2", dst="172.20.0.1")
2435 / UDP(sport=2152, dport=2152)
2436 / GTP_U_Header(gtp_type="g_pdu", teid=200)
2437 / IP(src="172.100.0.1", dst="172.200.0.1")
2441 print("Sending packet on {}:".format(c1.name))
2446 c1.pg_start_capture_name(ifname="pg1")
2448 c1.pg_create_stream(p)
2451 # timeout (sleep) if needed
2455 print("Receiving packet on {}:".format(c1.name))
2456 for p in c1.pg_read_packets():
2459 def status_containers(self):
2463 for i, name in enumerate(self.instance_names):
2464 name = self.get_name(name)
2466 "\t[{}] {} - {}".format(
2467 i, name, "running" if self.containers.get(name) else "missing"
2473 for i, name in enumerate(self.network_names):
2474 name = self.get_name(name)
2476 "\t[{}] {} - {}".format(
2477 i, name, "running" if self.networks.get(name) else "missing"
2481 def build_image(self):
2482 print("VPP Path (build): {}".format(self.vpp_path))
2483 self.containers.build(self.path, self.vpp_path)
2485 def release_image(self):
2486 print("VPP Path (release): {}".format(self.vpp_path))
2487 instance = self.containers.new("release-build")
2490 "docker cp release-build:{}/vpp-package.tgz {}/".format(
2491 self.vpp_path, self.vpp_path
2497 self.containers.release(self.path, self.vpp_path)
2499 system("rm -rf {}/vpp-package.tgz".format(self.vpp_path))
2501 def vppctl(self, index, command=None):
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.vppctl(name, command)
2508 def bash(self, index):
2509 if index >= len(self.instance_names):
2511 name = self.get_name(self.instance_names[index])
2512 self.logger.error("connecting to: {}".format(name))
2513 self.containers.bash(name)
2517 parser = ArgumentParser()
2519 parser.add_argument("--verbose", choices=["error", "debug", "info"])
2521 parser.add_argument("--image", choices=["debug", "release"])
2523 subparsers = parser.add_subparsers()
2525 p1 = subparsers.add_parser("infra", help="Infrastructure related commands.")
2528 "op", choices=["stop", "start", "status", "restart", "build", "release"]
2531 p1.add_argument("--prefix")
2532 p1.add_argument("--image")
2534 p2 = subparsers.add_parser("cmd", help="Instance related commands.")
2536 p2.add_argument("op", choices=["vppctl", "bash"])
2539 "index", type=int, help="Container instance index. (./runner.py infra status)"
2542 p2.add_argument("--command", help="Only vppctl supports this optional argument.")
2544 p3 = subparsers.add_parser("test", help="Test related commands.")
2565 "gtp6_drop_in_echo",
2566 "gtp6_drop_in_reply",
2567 "gtp6_drop_in_error",
2568 "gtp6_drop_in_ipv6",
2569 "gtp6_drop_in_ipv6_5g",
2579 args = parser.parse_args()
2580 if not hasattr(args, "op") or not args.op:
2581 parser.print_help(sys.stderr)
2587 def main(op=None, prefix=None, verbose=None, image=None, index=None, command=None):
2590 basicConfig(level=verbose_levels[verbose])
2592 if image == "release":
2593 image = "srv6m-release-image"
2594 elif image == "debug":
2595 image = "srv6m-image"
2597 image = "srv6m-image"
2599 print("Target image: {}".format(image))
2601 program = Program(image, prefix)
2605 program.build_image()
2606 elif op == "release":
2607 program.release_image()
2609 program.stop_containers()
2611 program.start_containers()
2612 elif op == "status":
2613 program.status_containers()
2614 elif op == "vppctl":
2615 program.vppctl(index, command)
2622 # elif op == 'tmap':
2623 # program.test_tmap()
2624 # elif op == 'tmap_5g':
2625 # program.test_tmap_5g()
2626 # elif op == 'tmap_ipv6':
2627 # program.test_tmap_ipv6()
2628 # elif op == 'tmap_ipv6_5g':
2629 # program.test_tmap_ipv6_5g()
2632 elif op == "gtp4_usid":
2633 program.test_gtp4_usid()
2634 elif op == "gtp4_5g":
2635 program.test_gtp4_5g()
2636 elif op == "gtp4_echo":
2637 program.test_gtp4_echo()
2638 elif op == "gtp4_reply":
2639 program.test_gtp4_reply()
2640 elif op == "gtp4_error":
2641 program.test_gtp4_error()
2642 elif op == "gtp4_ipv6":
2643 program.test_gtp4_ipv6()
2644 elif op == "gtp4_ipv6_5g":
2645 program.test_gtp4_ipv6_5g()
2646 elif op == "gtp6_drop_in":
2647 program.test_gtp6_drop_in()
2648 elif op == "gtp6_drop_in_5g":
2649 program.test_gtp6_drop_in_5g()
2650 elif op == "gtp6_drop_in_echo":
2651 program.test_gtp6_drop_in_echo()
2652 elif op == "gtp6_drop_in_reply":
2653 program.test_gtp6_drop_in_reply()
2654 elif op == "gtp6_drop_in_error":
2655 program.test_gtp6_drop_in_error()
2656 elif op == "gtp6_drop_in_ipv6":
2657 program.test_gtp6_drop_in_ipv6()
2658 elif op == "gtp6_drop_in_ipv6_5g":
2659 program.test_gtp6_drop_in_ipv6_5g()
2662 elif op == "gtp6_5g":
2663 program.test_gtp6_5g()
2664 elif op == "gtp6_ipv6":
2665 program.test_gtp6_ipv6()
2666 elif op == "gtp6_ipv6_5g":
2667 program.test_gtp6_ipv6_5g()
2668 elif op == "gtp6_dt":
2669 program.test_gtp6_dt()
2670 elif op == "gtp4_dt":
2671 program.test_gtp4_dt()
2674 program.logger.exception("")
2682 if __name__ == "__main__":
2683 sys.exit(main(**get_args()))