3 from os.path import dirname, realpath, split,\
5 from os import remove, system, mkdir
6 from logging import getLogger, basicConfig,\
8 from argparse import ArgumentParser
9 from atexit import register
10 from shutil import rmtree
12 from jinja2 import Environment, FileSystemLoader
14 from docker.errors import NotFound, APIError
15 from docker import from_env
17 from scapy.contrib.gtp import *
18 from scapy.all import *
27 class ContainerStartupError(Exception):
31 class Container(object):
34 cmd = "vppctl -s 0:5002"
35 cmd_bash = "/bin/bash"
37 def __init__(self, ref, name):
47 return join(self.tmp, self.name)
50 def pg_input_file(self):
51 return join(self.temp, "pgi.pcap")
54 def pg_output_file(self):
55 return join(self.temp, "pgo.pcap")
58 def pg_input_file_in(self):
59 return join("/mnt", "pgi.pcap")
62 def pg_output_file_in(self):
63 return join("/mnt", "pgo.pcap")
65 def disconnect_all(self):
67 for net in self._ref.client.networks.list():
69 net.disconnect(self._ref)
76 def new(cls, client, image, name):
78 temp = join(cls.tmp, name)
83 ref = client.containers.run(
95 obj = cls.get(client, name)
97 raise ContainerStartupError()
103 def get(cls, client, name):
105 ref = client.containers.get(name)
109 return cls(ref, name)
115 system("docker exec -it {} {}".format(self.name, self.cmd))
118 system("docker exec -it {} {}".format(self.name, self.cmd_bash))
120 def vppctl_exec(self, cmd):
121 ec, resp = self._ref.exec_run(cmd="{} {}".format(self.cmd, cmd))
125 def setup_host_interface(self, name, ip):
126 self.vppctl_exec("create host-interface name {}".format(name))
127 self.vppctl_exec("set int ip addr host-{} {}".format(name, ip))
128 self.vppctl_exec("set int state host-{} up".format(name))
130 def pg_create_interface(self, local_ip, remote_ip, local_mac, remote_mac):
131 # remote_ip can't have subnet mask
134 self.vppctl_exec("create packet-generator interface pg0")
135 self.vppctl_exec("set int mac address pg0 {}".format(local_mac))
136 self.vppctl_exec("set int ip addr pg0 {}".format(local_ip))
138 "set ip6 neighbor pg0 {} {}".format(remote_ip, remote_mac))
139 self.vppctl_exec("set int state pg0 up")
141 def pg_create_interface4(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 arp pg0 {} {}".format(remote_ip, remote_mac))
149 self.vppctl_exec("set int state pg0 up")
151 def pg_create_interface6(self, local_ip, remote_ip, local_mac, remote_mac):
152 # remote_ip can't have subnet mask
155 self.vppctl_exec("create packet-generator interface pg0")
156 self.vppctl_exec("set int mac address pg0 {}".format(local_mac))
157 self.vppctl_exec("set int ip6 addr pg0 {}".format(local_ip))
158 self.vppctl_exec("set ip6 arp pg0 {} {}".format(remote_ip, remote_mac))
159 self.vppctl_exec("set int state pg0 up")
162 # start packet generator
163 self.vppctl_exec("packet-generator enable")
165 def pg_create_stream(self, stream):
166 wrpcap(self.pg_input_file, stream)
168 "packet-generator new name pg-stream "
169 "node ethernet-input pcap {}".format(
170 self.pg_input_file_in))
172 def pg_start_capture(self):
173 if exists(self.pg_output_file):
174 remove(self.pg_output_file)
176 "packet-generator capture pg0 pcap {}".format(
177 self.pg_output_file_in))
179 def pg_read_packets(self):
180 return rdpcap(self.pg_output_file)
182 def set_ipv6_route(self, out_if_name, next_hop_ip, subnet):
184 "ip route add {} via host-{} {}".format(
185 subnet, out_if_name, next_hop_ip))
187 def set_ip_pgroute(self, out_if_name, next_hop_ip, subnet):
188 self.vppctl_exec("ip route add {} via {} {}".format(
189 subnet, out_if_name, next_hop_ip))
191 def set_ipv6_pgroute(self, out_if_name, next_hop_ip, subnet):
192 self.vppctl_exec("ip route add {} via {} {}".format(
193 subnet, out_if_name, next_hop_ip))
195 def set_ipv6_default_route(self, out_if_name, next_hop_ip):
197 "ip route add ::/0 via host-{} {}".format(
198 out_if_name, next_hop_ip))
200 def enable_trace(self, count):
201 self.vppctl_exec("trace add af-packet-input {}".format(count))
204 class Containers(object):
206 def __init__(self, client, image):
210 def tmp_render(self, path, template, kwargs):
212 with open(path, "w") as fo:
213 fo.write(template.render(**kwargs))
215 register(lambda: remove(path))
217 def build(self, path, vpp_path):
218 env = Environment(loader=FileSystemLoader(path),
221 self.tmp_render(join(vpp_path, "Dockerfile"),
222 env.get_template("Dockerfile.j2"),
223 {'vpp_path': vpp_path})
225 self.tmp_render(join(vpp_path, "startup.conf"),
226 env.get_template("startup.conf.j2"),
227 {'vpp_path': vpp_path})
229 ref, _ = self.client.images.build(path=vpp_path,
230 tag=self.image, rm=True)
233 def release(self, path, vpp_path):
234 env = Environment(loader=FileSystemLoader(path),
237 self.tmp_render(join(vpp_path, "Dockerfile"),
238 env.get_template("Dockerfile.j2.release"),
239 {'vpp_path': vpp_path})
241 self.tmp_render(join(vpp_path, "startup.conf"),
242 env.get_template("startup.conf.j2"),
243 {'vpp_path': vpp_path})
245 ref, _ = self.client.images.build(path=vpp_path,
246 tag="srv6m-release-image", rm=True)
250 return Container.new(self.client, self.image, name)
253 return Container.get(self.client, name)
255 def vppctl(self, name, command=None):
256 container = self.get(name)
260 print(container.vppctl_exec(command).decode())
262 def bash(self, name):
263 container = self.get(name)
267 class Network(object):
269 def __init__(self, ref, name):
278 def new(cls, client, name):
279 ref = client.networks.create(name, driver="bridge",
280 check_duplicate=True)
281 return cls(ref, name)
284 def get(cls, client, name):
286 ref = client.networks.get(name)
290 return cls(ref, name)
295 def connect(self, c):
296 self._ref.connect(c.name)
299 class Networks(object):
301 def __init__(self, client):
305 return Network.new(self.client, name)
308 return Network.get(self.client, name)
311 class Program(object):
313 image = "srv6m-image"
317 # TODO: add description to these instances
318 # for exmaple what the vpp is supposed to be
319 # in our topoloty overview
321 instance_names = ["vpp-1",
326 network_names = ["net-1",
330 def __init__(self, image=None, prefix=None):
331 self.path = dirname(realpath(__file__))
335 if prefix is not None:
336 self.name_prefix = prefix
339 self.containers = Containers(client, self.image)
340 self.networks = Networks(client)
342 self.logger = getLogger(__name__)
346 return self.path.rsplit("/", 4)[0]
348 def get_name(self, name):
349 if not self.name_prefix:
351 return "{}-{}".format(self.name_prefix, name)
353 def stop_containers(self):
355 for name in self.instance_names:
356 instance = self.containers.get(self.get_name(name))
360 for name in self.network_names:
361 network = self.networks.get(self.get_name(name))
365 def start_containers(self):
367 self.stop_containers()
371 for name in self.network_names:
372 networks.append(self.networks.new(self.get_name(name)))
374 n1, n2, n3 = networks
378 for name in self.instance_names:
379 instances.append(self.containers.new(self.get_name(name)))
381 c1, c2, c3, c4 = instances
383 # setup packet generator interfaces
384 # c1.pg_create_interface(local_ip="C::1/120", remote_ip="C::2",
385 # local_mac="aa:bb:cc:dd:ee:01", remote_mac="aa:bb:cc:dd:ee:02")
387 # setup network between instances
398 c1.setup_host_interface("eth1", "A1::1/120")
399 c2.setup_host_interface("eth1", "A1::2/120")
402 c2.setup_host_interface("eth2", "A2::1/120")
403 c3.setup_host_interface("eth1", "A2::2/120")
406 c3.setup_host_interface("eth2", "A3::1/120")
407 c4.setup_host_interface("eth1", "A3::2/120")
409 # c1 > c2 default route
411 c1.set_ipv6_default_route("eth1", "A1::2")
412 # c2 > c3 default route
413 c2.set_ipv6_default_route("eth2", "A2::2")
414 # c3 > c2 default route
415 c3.set_ipv6_default_route("eth1", "A2::1")
416 # c4 > c3 default route
417 c4.set_ipv6_default_route("eth1", "A3::1")
419 # c3 > c4 static route for address B::1/128
420 c3.set_ipv6_route("eth2", "A3::2", "B::1/128")
421 c3.set_ipv6_route("eth2", "A3::2", "B::2/128")
425 # trace add af-packet-input 10
426 # pg interface on c1 172.20.0.1
427 # pg interface on c4 B::1/120
429 self.start_containers()
431 c1 = self.containers.get(self.get_name(self.instance_names[0]))
432 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
434 c1.pg_create_interface(
437 local_mac="aa:bb:cc:dd:ee:01",
438 remote_mac="aa:bb:cc:dd:ee:02")
439 c4.pg_create_interface(
442 local_mac="aa:bb:cc:dd:ee:11",
443 remote_mac="aa:bb:cc:dd:ee:22")
445 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
446 IPv6(src="C::2", dst="B::2") / ICMPv6EchoRequest())
448 print("Sending packet on {}:".format(c1.name))
454 c4.pg_start_capture()
456 c1.pg_create_stream(p)
459 # timeout (sleep) if needed
461 print("Receiving packet on {}:".format(c4.name))
462 for p in c4.pg_read_packets():
467 # trace add af-packet-input 10
468 # pg interface on c1 C::1/120
469 # pg interface on c4 B::1/120
471 self.start_containers()
476 c1 = self.containers.get(self.get_name(self.instance_names[0]))
477 c2 = self.containers.get(self.get_name(self.instance_names[1]))
478 c3 = self.containers.get(self.get_name(self.instance_names[2]))
479 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
481 c1.pg_create_interface(
484 local_mac="aa:bb:cc:dd:ee:01",
485 remote_mac="aa:bb:cc:dd:ee:02")
486 c4.pg_create_interface(
489 local_mac="aa:bb:cc:dd:ee:11",
490 remote_mac="aa:bb:cc:dd:ee:22")
492 c1.vppctl_exec("set sr encaps source addr D1::")
494 "sr policy add bsid D1::999:1 next D2:: next D3:: next D4::")
495 c1.vppctl_exec("sr steer l3 B::/120 via bsid D1::999:1")
497 c2.vppctl_exec("sr localsid address D2:: behavior end")
499 c3.vppctl_exec("sr localsid address D3:: behavior end")
501 c4.vppctl_exec("sr localsid address D4:: behavior end.dx6 pg0 B::2")
503 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
504 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
505 c3.set_ipv6_route("eth2", "A3::2", "D4::/128")
506 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
508 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
509 IPv6(src="C::2", dst="B::2") / ICMPv6EchoRequest())
511 print("Sending packet on {}:".format(c1.name))
519 c4.pg_start_capture()
521 c1.pg_create_stream(p)
524 # timeout (sleep) if needed
526 print("Receiving packet on {}:".format(c4.name))
527 for p in c4.pg_read_packets():
530 ''' T.Map is obsolete
533 # trace add af-packet-input 10
534 # pg interface on c1 172.20.0.1
535 # pg interface on c4 B::1/120
537 self.start_containers()
539 c1 = self.containers.get(self.get_name(self.instance_names[0]))
540 c2 = self.containers.get(self.get_name(self.instance_names[1]))
541 c3 = self.containers.get(self.get_name(self.instance_names[2]))
542 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
544 c1.pg_create_interface4(
545 local_ip="172.16.0.1/30",
546 remote_ip="172.16.0.2/30",
547 local_mac="aa:bb:cc:dd:ee:01",
548 remote_mac="aa:bb:cc:dd:ee:02")
549 c4.pg_create_interface4(
550 local_ip="1.0.0.2/30",
552 local_mac="aa:bb:cc:dd:ee:11",
553 remote_mac="aa:bb:cc:dd:ee:22")
555 c1.vppctl_exec("set sr encaps source addr A1::1")
557 "sr policy add bsid D1:: next D2:: next D3:: "
558 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
559 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
561 c2.vppctl_exec("sr localsid address D2:: behavior end")
563 c3.vppctl_exec("sr localsid address D3:: behavior end")
566 "sr localsid prefix D4::/32 "
567 "behavior end.m.gtp4.e v4src_position 64")
569 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
570 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
571 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
572 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
573 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
575 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
576 IP(src="172.20.0.2", dst="172.20.0.1") /
577 UDP(sport=2152, dport=2152) /
578 GTP_U_Header(gtp_type="g_pdu", teid=200) /
579 IP(src="172.99.0.1", dst="172.99.0.2") /
582 print("Sending packet on {}:".format(c1.name))
588 c4.pg_start_capture()
590 c1.pg_create_stream(p)
593 # timeout (sleep) if needed
597 print("Receiving packet on {}:".format(c4.name))
598 for p in c4.pg_read_packets():
601 def test_tmap_5g(self):
603 # trace add af-packet-input 10
604 # pg interface on c1 172.20.0.1
605 # pg interface on c4 B::1/120
607 self.start_containers()
609 c1 = self.containers.get(self.get_name(self.instance_names[0]))
610 c2 = self.containers.get(self.get_name(self.instance_names[1]))
611 c3 = self.containers.get(self.get_name(self.instance_names[2]))
612 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
614 c1.pg_create_interface4(
615 local_ip="172.16.0.1/30",
616 remote_ip="172.16.0.2/30",
617 local_mac="aa:bb:cc:dd:ee:01",
618 remote_mac="aa:bb:cc:dd:ee:02")
619 c4.pg_create_interface4(
620 local_ip="1.0.0.2/30",
622 local_mac="aa:bb:cc:dd:ee:11",
623 remote_mac="aa:bb:cc:dd:ee:22")
625 c1.vppctl_exec("set sr encaps source addr A1::1")
627 "sr policy add bsid D1:: next D2:: next D3:: "
628 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
629 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
631 c2.vppctl_exec("sr localsid address D2:: behavior end")
633 c3.vppctl_exec("sr localsid address D3:: behavior end")
636 "sr localsid prefix D4::/32 "
637 "behavior end.m.gtp4.e v4src_position 64")
639 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
640 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
641 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
642 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
643 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
645 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
646 IP(src="172.20.0.2", dst="172.20.0.1") /
647 UDP(sport=2152, dport=2152) /
648 GTP_U_Header(gtp_type="g_pdu", teid=200) /
649 GTPPDUSessionContainer(R=1, QFI=3) /
650 IP(src="172.99.0.1", dst="172.99.0.2") /
653 print("Sending packet on {}:".format(c1.name))
659 c4.pg_start_capture()
661 c1.pg_create_stream(p)
664 # timeout (sleep) if needed
668 print("Receiving packet on {}:".format(c4.name))
669 for p in c4.pg_read_packets():
672 def test_tmap_ipv6(self):
674 # trace add af-packet-input 10
675 # pg interface on c1 172.20.0.1
676 # pg interface on c4 B::1/120
678 self.start_containers()
680 c1 = self.containers.get(self.get_name(self.instance_names[0]))
681 c2 = self.containers.get(self.get_name(self.instance_names[1]))
682 c3 = self.containers.get(self.get_name(self.instance_names[2]))
683 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
685 c1.pg_create_interface4(
686 local_ip="172.16.0.1/30",
687 remote_ip="172.16.0.2/30",
688 local_mac="aa:bb:cc:dd:ee:01",
689 remote_mac="aa:bb:cc:dd:ee:02")
690 c4.pg_create_interface4(
691 local_ip="1.0.0.2/30",
693 local_mac="aa:bb:cc:dd:ee:11",
694 remote_mac="aa:bb:cc:dd:ee:22")
696 c1.vppctl_exec("set sr encaps source addr A1::1")
698 "sr policy add bsid D1:: next D2:: next D3:: "
699 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
700 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
702 c2.vppctl_exec("sr localsid address D2:: behavior end")
704 c3.vppctl_exec("sr localsid address D3:: behavior end")
707 "sr localsid prefix D4::/32 "
708 "behavior end.m.gtp4.e v4src_position 64")
710 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
711 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
712 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
713 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
714 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
716 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
717 IP(src="172.20.0.2", dst="172.20.0.1") /
718 UDP(sport=2152, dport=2152) /
719 GTP_U_Header(gtp_type="g_pdu", teid=200) /
720 IPv6(src="2001::1", dst="2002::1") /
723 print("Sending packet on {}:".format(c1.name))
729 c4.pg_start_capture()
731 c1.pg_create_stream(p)
734 # timeout (sleep) if needed
738 print("Receiving packet on {}:".format(c4.name))
739 for p in c4.pg_read_packets():
742 def test_tmap_ipv6_5g(self):
744 # trace add af-packet-input 10
745 # pg interface on c1 172.20.0.1
746 # pg interface on c4 B::1/120
748 self.start_containers()
750 c1 = self.containers.get(self.get_name(self.instance_names[0]))
751 c2 = self.containers.get(self.get_name(self.instance_names[1]))
752 c3 = self.containers.get(self.get_name(self.instance_names[2]))
753 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
755 c1.pg_create_interface4(
756 local_ip="172.16.0.1/30",
757 remote_ip="172.16.0.2/30",
758 local_mac="aa:bb:cc:dd:ee:01",
759 remote_mac="aa:bb:cc:dd:ee:02")
760 c4.pg_create_interface4(
761 local_ip="1.0.0.2/30",
763 local_mac="aa:bb:cc:dd:ee:11",
764 remote_mac="aa:bb:cc:dd:ee:22")
766 c1.vppctl_exec("set sr encaps source addr A1::1")
768 "sr policy add bsid D1:: next D2:: next D3:: "
769 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
770 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
772 c2.vppctl_exec("sr localsid address D2:: behavior end")
774 c3.vppctl_exec("sr localsid address D3:: behavior end")
777 "sr localsid prefix D4::/32 "
778 "behavior end.m.gtp4.e v4src_position 64")
780 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
781 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
782 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
783 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
784 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
786 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
787 IP(src="172.20.0.2", dst="172.20.0.1") /
788 UDP(sport=2152, dport=2152) /
789 GTP_U_Header(gtp_type="g_pdu", teid=200) /
790 GTPPDUSessionContainer(R=1, QFI=3) /
791 IPv6(src="2001::1", dst="2002::1") /
794 print("Sending packet on {}:".format(c1.name))
795 print("Sending packet on {}:".format(c1.name))
801 c4.pg_start_capture()
803 c1.pg_create_stream(p)
806 # timeout (sleep) if needed
810 print("Receiving packet on {}:".format(c4.name))
811 for p in c4.pg_read_packets():
817 # trace add af-packet-input 10
818 # pg interface on c1 172.20.0.1
819 # pg interface on c4 B::1/120
821 self.start_containers()
823 c1 = self.containers.get(self.get_name(self.instance_names[0]))
824 c2 = self.containers.get(self.get_name(self.instance_names[1]))
825 c3 = self.containers.get(self.get_name(self.instance_names[2]))
826 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
828 c1.pg_create_interface4(
829 local_ip="172.16.0.1/30",
830 remote_ip="172.16.0.2/30",
831 local_mac="aa:bb:cc:dd:ee:01",
832 remote_mac="aa:bb:cc:dd:ee:02")
833 c4.pg_create_interface4(
834 local_ip="1.0.0.2/30",
836 local_mac="aa:bb:cc:dd:ee:11",
837 remote_mac="aa:bb:cc:dd:ee:22")
839 c1.vppctl_exec("set sr encaps source addr A1::1")
840 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
841 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
842 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
844 c2.vppctl_exec("sr localsid address D2:: behavior end")
846 c3.vppctl_exec("sr localsid address D3:: behavior end")
849 "sr localsid prefix D4::/32 "
850 "behavior end.m.gtp4.e v4src_position 64")
852 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
853 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
854 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
855 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
856 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
858 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
859 IP(src="172.20.0.2", dst="172.20.0.1") /
860 UDP(sport=2152, dport=2152) /
861 GTP_U_Header(gtp_type="g_pdu", teid=200) /
862 IP(src="172.99.0.1", dst="172.99.0.2") /
865 print("Sending packet on {}:".format(c1.name))
871 c4.pg_start_capture()
873 c1.pg_create_stream(p)
876 # timeout (sleep) if needed
880 print("Receiving packet on {}:".format(c4.name))
881 for p in c4.pg_read_packets():
884 def test_gtp4_5g(self):
886 # trace add af-packet-input 10
887 # pg interface on c1 172.20.0.1
888 # pg interface on c4 B::1/120
890 self.start_containers()
892 c1 = self.containers.get(self.get_name(self.instance_names[0]))
893 c2 = self.containers.get(self.get_name(self.instance_names[1]))
894 c3 = self.containers.get(self.get_name(self.instance_names[2]))
895 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
897 c1.pg_create_interface4(
898 local_ip="172.16.0.1/30",
899 remote_ip="172.16.0.2/30",
900 local_mac="aa:bb:cc:dd:ee:01",
901 remote_mac="aa:bb:cc:dd:ee:02")
902 c4.pg_create_interface4(
903 local_ip="1.0.0.2/30",
905 local_mac="aa:bb:cc:dd:ee:11",
906 remote_mac="aa:bb:cc:dd:ee:22")
908 c1.vppctl_exec("set sr encaps source addr A1::1")
909 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
910 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
911 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
913 c2.vppctl_exec("sr localsid address D2:: behavior end")
915 c3.vppctl_exec("sr localsid address D3:: behavior end")
918 "sr localsid prefix D4::/32 "
919 "behavior end.m.gtp4.e v4src_position 64")
921 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
922 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
923 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
924 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
925 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
927 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
928 IP(src="172.20.0.2", dst="172.20.0.1") /
929 UDP(sport=2152, dport=2152) /
930 GTP_U_Header(gtp_type="g_pdu", teid=200) /
931 GTPPDUSessionContainer(type=1, R=1, QFI=3) /
932 IP(src="172.99.0.1", dst="172.99.0.2") /
935 print("Sending packet on {}:".format(c1.name))
941 c4.pg_start_capture()
943 c1.pg_create_stream(p)
946 # timeout (sleep) if needed
950 print("Receiving packet on {}:".format(c4.name))
951 for p in c4.pg_read_packets():
954 def test_gtp4_echo(self):
956 # trace add af-packet-input 10
957 # pg interface on c1 172.20.0.1
958 # pg interface on c4 B::1/120
960 self.start_containers()
962 c1 = self.containers.get(self.get_name(self.instance_names[0]))
963 c2 = self.containers.get(self.get_name(self.instance_names[1]))
964 c3 = self.containers.get(self.get_name(self.instance_names[2]))
965 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
967 c1.pg_create_interface4(
968 local_ip="172.16.0.1/30",
969 remote_ip="172.16.0.2/30",
970 local_mac="aa:bb:cc:dd:ee:01",
971 remote_mac="aa:bb:cc:dd:ee:02")
972 c4.pg_create_interface4(
973 local_ip="1.0.0.2/30",
975 local_mac="aa:bb:cc:dd:ee:11",
976 remote_mac="aa:bb:cc:dd:ee:22")
978 c1.vppctl_exec("set sr encaps source addr A1::1")
979 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
980 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
981 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
983 c2.vppctl_exec("sr localsid address D2:: behavior end")
985 c3.vppctl_exec("sr localsid address D3:: behavior end")
988 "sr localsid prefix D4::/32 "
989 "behavior end.m.gtp4.e v4src_position 64")
991 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
992 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
993 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
994 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
995 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
997 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
998 IP(src="172.20.0.2", dst="172.20.0.1") /
999 UDP(sport=2152, dport=2152) /
1000 GTP_U_Header(gtp_type="echo_request", teid=200))
1002 print("Sending packet on {}:".format(c1.name))
1008 c4.pg_start_capture()
1010 c1.pg_create_stream(p)
1013 # timeout (sleep) if needed
1017 print("Receiving packet on {}:".format(c4.name))
1018 for p in c4.pg_read_packets():
1021 def test_gtp4_ipv6(self):
1023 # trace add af-packet-input 10
1024 # pg interface on c1 172.20.0.1
1025 # pg interface on c4 B::1/120
1027 self.start_containers()
1029 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1030 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1031 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1032 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1034 c1.pg_create_interface4(
1035 local_ip="172.16.0.1/30",
1036 remote_ip="172.16.0.2/30",
1037 local_mac="aa:bb:cc:dd:ee:01",
1038 remote_mac="aa:bb:cc:dd:ee:02")
1039 c4.pg_create_interface4(
1040 local_ip="1.0.0.2/30",
1041 remote_ip="1.0.0.1",
1042 local_mac="aa:bb:cc:dd:ee:11",
1043 remote_mac="aa:bb:cc:dd:ee:22")
1045 c1.vppctl_exec("set sr encaps source addr A1::1")
1046 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1047 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64")
1048 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1050 c2.vppctl_exec("sr localsid address D2:: behavior end")
1052 c3.vppctl_exec("sr localsid address D3:: behavior end")
1055 "sr localsid prefix D4::/32 "
1056 "behavior end.m.gtp4.e v4src_position 64")
1058 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1059 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1060 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1061 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1062 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1064 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1065 IP(src="172.20.0.2", dst="172.20.0.1") /
1066 UDP(sport=2152, dport=2152) /
1067 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1068 IPv6(src="2001::1", dst="2002::1") /
1069 ICMPv6EchoRequest())
1071 print("Sending packet on {}:".format(c1.name))
1077 c4.pg_start_capture()
1079 c1.pg_create_stream(p)
1082 # timeout (sleep) if needed
1086 print("Receiving packet on {}:".format(c4.name))
1087 for p in c4.pg_read_packets():
1090 def test_gtp4_ipv6_5g(self):
1092 # trace add af-packet-input 10
1093 # pg interface on c1 172.20.0.1
1094 # pg interface on c4 B::1/120
1096 self.start_containers()
1098 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1099 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1100 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1101 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1103 c1.pg_create_interface4(
1104 local_ip="172.16.0.1/30",
1105 remote_ip="172.16.0.2/30",
1106 local_mac="aa:bb:cc:dd:ee:01",
1107 remote_mac="aa:bb:cc:dd:ee:02")
1108 c4.pg_create_interface4(
1109 local_ip="1.0.0.2/30",
1110 remote_ip="1.0.0.1",
1111 local_mac="aa:bb:cc:dd:ee:11",
1112 remote_mac="aa:bb:cc:dd:ee:22")
1114 c1.vppctl_exec("set sr encaps source addr A1::1")
1115 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1116 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64")
1117 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1119 c2.vppctl_exec("sr localsid address D2:: behavior end")
1121 c3.vppctl_exec("sr localsid address D3:: behavior end")
1124 "sr localsid prefix D4::/32 "
1125 "behavior end.m.gtp4.e v4src_position 64")
1127 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1128 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1129 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1130 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1131 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1133 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1134 IP(src="172.20.0.2", dst="172.20.0.1") /
1135 UDP(sport=2152, dport=2152) /
1136 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1137 GTPPDUSessionContainer(R=1, QFI=3) /
1138 IPv6(src="2001::1", dst="2002::1") /
1139 ICMPv6EchoRequest())
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_gtp6_drop_in(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 print("Deleting the old containers...")
1170 print("Starting the new containers...")
1172 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1173 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1174 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1175 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1177 c1.pg_create_interface(
1178 local_ip="C::1/120",
1180 local_mac="aa:bb:cc:dd:ee:01",
1181 remote_mac="aa:bb:cc:dd:ee:02")
1182 c4.pg_create_interface(
1183 local_ip="B::1/120",
1185 local_mac="aa:bb:cc:dd:ee:11",
1186 remote_mac="aa:bb:cc:dd:ee:22")
1188 c1.vppctl_exec("set sr encaps source addr A1::1")
1189 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1192 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1194 c2.vppctl_exec("sr localsid address D2:: behavior end")
1196 c3.vppctl_exec("sr localsid address D3:: behavior end")
1198 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1200 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1201 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1202 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1203 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1204 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1209 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1210 IPv6(src="C::2", dst="D::2") /
1211 UDP(sport=2152, dport=2152) /
1212 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1213 IP(src="172.99.0.1", dst="172.99.0.2") /
1216 print("Sending packet on {}:".format(c1.name))
1222 c4.pg_start_capture()
1224 c1.pg_create_stream(p)
1227 # timeout (sleep) if needed
1231 print("Receiving packet on {}:".format(c4.name))
1232 for p in c4.pg_read_packets():
1235 def test_gtp6_drop_in_5g(self):
1237 # trace add af-packet-input 10
1238 # pg interface on c1 172.20.0.1
1239 # pg interface on c4 B::1/120
1241 self.start_containers()
1243 print("Deleting the old containers...")
1245 print("Starting the new containers...")
1247 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1248 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1249 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1250 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1252 c1.pg_create_interface(
1253 local_ip="C::1/120",
1255 local_mac="aa:bb:cc:dd:ee:01",
1256 remote_mac="aa:bb:cc:dd:ee:02")
1257 c4.pg_create_interface(
1258 local_ip="B::1/120",
1260 local_mac="aa:bb:cc:dd:ee:11",
1261 remote_mac="aa:bb:cc:dd:ee:22")
1263 c1.vppctl_exec("set sr encaps source addr A1::1")
1264 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1267 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1269 c2.vppctl_exec("sr localsid address D2:: behavior end")
1271 c3.vppctl_exec("sr localsid address D3:: behavior end")
1273 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1275 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1276 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1277 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1278 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1279 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1284 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1285 IPv6(src="C::2", dst="D::2") /
1286 UDP(sport=2152, dport=2152) /
1287 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1288 GTPPDUSessionContainer(type=1, R=1, QFI=3) /
1289 IP(src="172.99.0.1", dst="172.99.0.2") /
1292 print("Sending packet on {}:".format(c1.name))
1298 c4.pg_start_capture()
1300 c1.pg_create_stream(p)
1303 # timeout (sleep) if needed
1307 print("Receiving packet on {}:".format(c4.name))
1308 for p in c4.pg_read_packets():
1311 def test_gtp6_drop_in_echo(self):
1313 # trace add af-packet-input 10
1314 # pg interface on c1 172.20.0.1
1315 # pg interface on c4 B::1/120
1317 self.start_containers()
1319 print("Deleting the old containers...")
1321 print("Starting the new containers...")
1323 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1324 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1325 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1326 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1328 c1.pg_create_interface(
1329 local_ip="C::1/120",
1331 local_mac="aa:bb:cc:dd:ee:01",
1332 remote_mac="aa:bb:cc:dd:ee:02")
1333 c4.pg_create_interface(
1334 local_ip="B::1/120",
1336 local_mac="aa:bb:cc:dd:ee:11",
1337 remote_mac="aa:bb:cc:dd:ee:22")
1339 c1.vppctl_exec("set sr encaps source addr A1::1")
1340 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1343 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1345 c2.vppctl_exec("sr localsid address D2:: behavior end")
1347 c3.vppctl_exec("sr localsid address D3:: behavior end")
1349 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1351 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1352 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1353 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1354 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1355 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1360 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1361 IPv6(src="C::2", dst="D::2") /
1362 UDP(sport=2152, dport=2152) /
1363 GTP_U_Header(gtp_type="echo_request", teid=200))
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_gtp6_drop_in_ipv6(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 print("Deleting the old containers...")
1394 print("Starting the new containers...")
1396 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1397 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1398 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1399 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1401 c1.pg_create_interface(
1402 local_ip="C::1/120",
1404 local_mac="aa:bb:cc:dd:ee:01",
1405 remote_mac="aa:bb:cc:dd:ee:02")
1406 c4.pg_create_interface(
1407 local_ip="B::1/120",
1409 local_mac="aa:bb:cc:dd:ee:11",
1410 remote_mac="aa:bb:cc:dd:ee:22")
1412 c1.vppctl_exec("set sr encaps source addr A1::1")
1413 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1416 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1418 c2.vppctl_exec("sr localsid address D2:: behavior end")
1420 c3.vppctl_exec("sr localsid address D3:: behavior end")
1422 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1424 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1425 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1426 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1427 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1428 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1433 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1434 IPv6(src="C::2", dst="D::2") /
1435 UDP(sport=2152, dport=2152) /
1436 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1437 IPv6(src="2001::1", dst="2002::1") /
1438 ICMPv6EchoRequest())
1440 print("Sending packet on {}:".format(c1.name))
1446 c4.pg_start_capture()
1448 c1.pg_create_stream(p)
1451 # timeout (sleep) if needed
1455 print("Receiving packet on {}:".format(c4.name))
1456 for p in c4.pg_read_packets():
1459 def test_gtp6_drop_in_ipv6_5g(self):
1461 # trace add af-packet-input 10
1462 # pg interface on c1 172.20.0.1
1463 # pg interface on c4 B::1/120
1465 self.start_containers()
1467 print("Deleting the old containers...")
1469 print("Starting the new containers...")
1471 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1472 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1473 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1474 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1476 c1.pg_create_interface(
1477 local_ip="C::1/120",
1479 local_mac="aa:bb:cc:dd:ee:01",
1480 remote_mac="aa:bb:cc:dd:ee:02")
1481 c4.pg_create_interface(
1482 local_ip="B::1/120",
1484 local_mac="aa:bb:cc:dd:ee:11",
1485 remote_mac="aa:bb:cc:dd:ee:22")
1487 c1.vppctl_exec("set sr encaps source addr A1::1")
1488 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1491 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1493 c2.vppctl_exec("sr localsid address D2:: behavior end")
1495 c3.vppctl_exec("sr localsid address D3:: behavior end")
1497 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1499 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1500 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1501 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1502 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1503 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1508 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1509 IPv6(src="C::2", dst="D::2") /
1510 UDP(sport=2152, dport=2152) /
1511 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1512 GTPPDUSessionContainer(R=1, QFI=3) /
1513 IPv6(src="2001::1", dst="2002::1") /
1514 ICMPv6EchoRequest())
1516 print("Sending packet on {}:".format(c1.name))
1522 c4.pg_start_capture()
1524 c1.pg_create_stream(p)
1527 # timeout (sleep) if needed
1531 print("Receiving packet on {}:".format(c4.name))
1532 for p in c4.pg_read_packets():
1535 def test_gtp6(self):
1537 # trace add af-packet-input 10
1538 # pg interface on c1 172.20.0.1
1539 # pg interface on c4 B::1/120
1541 self.start_containers()
1543 print("Deleting the old containers...")
1545 print("Starting the new containers...")
1547 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1548 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1549 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1550 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1552 c1.pg_create_interface(
1553 local_ip="C::1/120",
1555 local_mac="aa:bb:cc:dd:ee:01",
1556 remote_mac="aa:bb:cc:dd:ee:02")
1557 c4.pg_create_interface4(
1558 local_ip="1.0.0.2/30",
1559 remote_ip="1.0.0.1",
1560 local_mac="aa:bb:cc:dd:ee:11",
1561 remote_mac="aa:bb:cc:dd:ee:22")
1563 c1.vppctl_exec("set sr encaps source addr A1::1")
1564 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1567 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1569 c2.vppctl_exec("sr localsid address D2:: behavior end")
1571 c3.vppctl_exec("sr localsid address D3:: behavior end")
1573 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
1575 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1576 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1577 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1578 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1579 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
1584 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1585 IPv6(src="C::2", dst="D::2") /
1586 UDP(sport=2152, dport=2152) /
1587 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1588 IP(src="172.100.0.1", dst="172.200.0.1") /
1591 print("Sending packet on {}:".format(c1.name))
1597 c4.pg_start_capture()
1599 c1.pg_create_stream(p)
1602 # timeout (sleep) if needed
1606 print("Receiving packet on {}:".format(c4.name))
1607 for p in c4.pg_read_packets():
1610 def test_gtp6_5g(self):
1612 # trace add af-packet-input 10
1613 # pg interface on c1 172.20.0.1
1614 # pg interface on c4 B::1/120
1616 self.start_containers()
1618 print("Deleting the old containers...")
1620 print("Starting the new containers...")
1622 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1623 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1624 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1625 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1627 c1.pg_create_interface(
1628 local_ip="C::1/120",
1630 local_mac="aa:bb:cc:dd:ee:01",
1631 remote_mac="aa:bb:cc:dd:ee:02")
1632 c4.pg_create_interface4(
1633 local_ip="1.0.0.2/30",
1634 remote_ip="1.0.0.1",
1635 local_mac="aa:bb:cc:dd:ee:11",
1636 remote_mac="aa:bb:cc:dd:ee:22")
1638 c1.vppctl_exec("set sr encaps source addr A1::1")
1639 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1642 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1644 c2.vppctl_exec("sr localsid address D2:: behavior end")
1646 c3.vppctl_exec("sr localsid address D3:: behavior end")
1648 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
1650 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1651 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1652 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1653 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1654 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
1659 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1660 IPv6(src="C::2", dst="D::2") /
1661 UDP(sport=2152, dport=2152) /
1662 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1663 GTPPDUSessionContainer(R=1, QFI=3) /
1664 IP(src="172.100.0.1", dst="172.200.0.1") /
1667 print("Sending packet on {}:".format(c1.name))
1673 c4.pg_start_capture()
1675 c1.pg_create_stream(p)
1678 # timeout (sleep) if needed
1682 print("Receiving packet on {}:".format(c4.name))
1683 for p in c4.pg_read_packets():
1686 def test_gtp6_ipv6(self):
1688 # trace add af-packet-input 10
1689 # pg interface on c1 172.20.0.1
1690 # pg interface on c4 B::1/120
1692 self.start_containers()
1694 print("Deleting the old containers...")
1696 print("Starting the new containers...")
1698 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1699 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1700 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1701 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1703 c1.pg_create_interface(
1704 local_ip="C::1/120",
1706 local_mac="aa:bb:cc:dd:ee:01",
1707 remote_mac="aa:bb:cc:dd:ee:02")
1708 c4.pg_create_interface(
1709 local_ip="B::1/120",
1711 local_mac="aa:bb:cc:dd:ee:11",
1712 remote_mac="aa:bb:cc:dd:ee:22")
1714 c1.vppctl_exec("set sr encaps source addr A1::1")
1715 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1718 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1720 c2.vppctl_exec("sr localsid address D2:: behavior end")
1722 c3.vppctl_exec("sr localsid address D3:: behavior end")
1724 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
1726 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1727 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1728 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1729 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1730 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
1735 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1736 IPv6(src="C::2", dst="D::2") /
1737 UDP(sport=2152, dport=2152) /
1738 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1739 IPv6(src="2001::1", dst="2002::1") /
1740 ICMPv6EchoRequest())
1742 print("Sending packet on {}:".format(c1.name))
1748 c4.pg_start_capture()
1750 c1.pg_create_stream(p)
1753 # timeout (sleep) if needed
1757 print("Receiving packet on {}:".format(c4.name))
1758 for p in c4.pg_read_packets():
1761 def test_gtp6_ipv6_5g(self):
1763 # trace add af-packet-input 10
1764 # pg interface on c1 172.20.0.1
1765 # pg interface on c4 B::1/120
1767 self.start_containers()
1769 print("Deleting the old containers...")
1771 print("Starting the new containers...")
1773 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1774 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1775 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1776 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1778 c1.pg_create_interface(
1779 local_ip="C::1/120",
1781 local_mac="aa:bb:cc:dd:ee:01",
1782 remote_mac="aa:bb:cc:dd:ee:02")
1783 c4.pg_create_interface(
1784 local_ip="B::1/120",
1786 local_mac="aa:bb:cc:dd:ee:11",
1787 remote_mac="aa:bb:cc:dd:ee:22")
1789 c1.vppctl_exec("set sr encaps source addr A1::1")
1790 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1793 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1795 c2.vppctl_exec("sr localsid address D2:: behavior end")
1797 c3.vppctl_exec("sr localsid address D3:: behavior end")
1799 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
1801 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1802 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1803 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1804 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1805 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
1810 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1811 IPv6(src="C::2", dst="D::2") /
1812 UDP(sport=2152, dport=2152) /
1813 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1814 GTPPDUSessionContainer(R=1, QFI=3) /
1815 IPv6(src="2001::1", dst="2002::1") /
1816 ICMPv6EchoRequest())
1818 print("Sending packet on {}:".format(c1.name))
1824 c4.pg_start_capture()
1826 c1.pg_create_stream(p)
1829 # timeout (sleep) if needed
1833 print("Receiving packet on {}:".format(c4.name))
1834 for p in c4.pg_read_packets():
1837 def status_containers(self):
1841 for i, name in enumerate(self.instance_names):
1842 name = self.get_name(name)
1843 print("\t[{}] {} - {}".format(
1845 "running" if self.containers.get(name) else "missing"))
1849 for i, name in enumerate(self.network_names):
1850 name = self.get_name(name)
1851 print("\t[{}] {} - {}".format(
1853 "running" if self.networks.get(name) else "missing"))
1855 def build_image(self):
1856 # TODO: optimize build process for speed and image size
1857 print("VPP Path (build): {}".format(self.vpp_path))
1858 self.containers.build(self.path, self.vpp_path)
1860 def release_image(self):
1861 print("VPP Path (release): {}".format(self.vpp_path))
1862 instance = self.containers.new("release-build")
1865 "docker cp release-build:{}/vpp-package.tgz {}/".format(
1866 self.vpp_path, self.vpp_path))
1870 self.containers.release(self.path, self.vpp_path)
1872 system("rm -rf {}/vpp-package.tgz".format(self.vpp_path))
1874 def vppctl(self, index, command=None):
1875 if index >= len(self.instance_names):
1877 name = self.get_name(self.instance_names[index])
1878 self.logger.error("connecting to: {}".format(name))
1879 self.containers.vppctl(name, command)
1881 def bash(self, index):
1882 if index >= len(self.instance_names):
1884 name = self.get_name(self.instance_names[index])
1885 self.logger.error("connecting to: {}".format(name))
1886 self.containers.bash(name)
1890 parser = ArgumentParser()
1892 parser.add_argument("--verbose", choices=['error', 'debug', 'info'])
1894 parser.add_argument('--image', choices=['debug', 'release'])
1896 subparsers = parser.add_subparsers()
1898 p1 = subparsers.add_parser(
1899 "infra", help="Infrastructure related commands.")
1911 p1.add_argument("--prefix")
1912 p1.add_argument("--image")
1914 p2 = subparsers.add_parser("cmd", help="Instance related commands.")
1916 p2.add_argument("op", choices=['vppctl', 'bash'])
1921 help="Container instance index. (./runner.py infra status)")
1924 "--command", help="Only vppctl supports this optional argument.")
1926 p3 = subparsers.add_parser("test", help="Test related commands.")
1944 "gtp6_drop_in_echo",
1945 "gtp6_drop_in_ipv6",
1946 "gtp6_drop_in_ipv6_5g",
1952 args = parser.parse_args()
1953 if not hasattr(args, "op") or not args.op:
1954 parser.print_help(sys.stderr)
1960 def main(op=None, prefix=None, verbose=None,
1961 image=None, index=None, command=None):
1964 basicConfig(level=verbose_levels[verbose])
1966 if image == 'release':
1967 image = "srv6m-release-image"
1968 elif image == 'debug':
1969 image = "srv6m-image"
1971 print("Verified image: {}".format(image))
1973 program = Program(image, prefix)
1977 program.build_image()
1978 elif op == 'release':
1979 program.release_image()
1981 program.stop_containers()
1983 program.start_containers()
1984 elif op == 'status':
1985 program.status_containers()
1986 elif op == 'vppctl':
1987 program.vppctl(index, command)
1994 # elif op == 'tmap':
1995 # program.test_tmap()
1996 # elif op == 'tmap_5g':
1997 # program.test_tmap_5g()
1998 # elif op == 'tmap_ipv6':
1999 # program.test_tmap_ipv6()
2000 # elif op == 'tmap_ipv6_5g':
2001 # program.test_tmap_ipv6_5g()
2004 elif op == 'gtp4_5g':
2005 program.test_gtp4_5g()
2006 elif op == 'gtp4_echo':
2007 program.test_gtp4_echo()
2008 elif op == 'gtp4_ipv6':
2009 program.test_gtp4_ipv6()
2010 elif op == 'gtp4_ipv6_5g':
2011 program.test_gtp4_ipv6_5g()
2012 elif op == 'gtp6_drop_in':
2013 program.test_gtp6_drop_in()
2014 elif op == 'gtp6_drop_in_5g':
2015 program.test_gtp6_drop_in_5g()
2016 elif op == 'gtp6_drop_in_echo':
2017 program.test_gtp6_drop_in_echo()
2018 elif op == 'gtp6_drop_in_ipv6':
2019 program.test_gtp6_drop_in_ipv6()
2020 elif op == 'gtp6_drop_in_ipv6_5g':
2021 program.test_gtp6_drop_in_ipv6_5g()
2024 elif op == 'gtp6_5g':
2025 program.test_gtp6_5g()
2026 elif op == 'gtp6_ipv6':
2027 program.test_gtp6_ipv6()
2028 elif op == 'gtp6_ipv6_5g':
2029 program.test_gtp6_ipv6_5g()
2032 program.logger.exception("")
2040 if __name__ == "__main__":
2041 sys.exit(main(**get_args()))