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():
532 # trace add af-packet-input 10
533 # pg interface on c1 172.20.0.1
534 # pg interface on c4 B::1/120
536 self.start_containers()
538 c1 = self.containers.get(self.get_name(self.instance_names[0]))
539 c2 = self.containers.get(self.get_name(self.instance_names[1]))
540 c3 = self.containers.get(self.get_name(self.instance_names[2]))
541 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
543 c1.pg_create_interface4(
544 local_ip="172.16.0.1/30",
545 remote_ip="172.16.0.2/30",
546 local_mac="aa:bb:cc:dd:ee:01",
547 remote_mac="aa:bb:cc:dd:ee:02")
548 c4.pg_create_interface4(
549 local_ip="1.0.0.2/30",
551 local_mac="aa:bb:cc:dd:ee:11",
552 remote_mac="aa:bb:cc:dd:ee:22")
554 c1.vppctl_exec("set sr encaps source addr A1::1")
556 "sr policy add bsid D1:: next D2:: next D3:: "
557 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
558 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
560 c2.vppctl_exec("sr localsid address D2:: behavior end")
562 c3.vppctl_exec("sr localsid address D3:: behavior end")
565 "sr localsid prefix D4::/32 "
566 "behavior end.m.gtp4.e v4src_position 64")
568 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
569 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
570 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
571 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
572 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
574 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
575 IP(src="172.20.0.2", dst="172.20.0.1") /
576 UDP(sport=2152, dport=2152) /
577 GTP_U_Header(gtp_type="g_pdu", teid=200) /
578 IP(src="172.99.0.1", dst="172.99.0.2") /
581 print("Sending packet on {}:".format(c1.name))
587 c4.pg_start_capture()
589 c1.pg_create_stream(p)
592 # timeout (sleep) if needed
596 print("Receiving packet on {}:".format(c4.name))
597 for p in c4.pg_read_packets():
600 def test_tmap_5g(self):
602 # trace add af-packet-input 10
603 # pg interface on c1 172.20.0.1
604 # pg interface on c4 B::1/120
606 self.start_containers()
608 c1 = self.containers.get(self.get_name(self.instance_names[0]))
609 c2 = self.containers.get(self.get_name(self.instance_names[1]))
610 c3 = self.containers.get(self.get_name(self.instance_names[2]))
611 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
613 c1.pg_create_interface4(
614 local_ip="172.16.0.1/30",
615 remote_ip="172.16.0.2/30",
616 local_mac="aa:bb:cc:dd:ee:01",
617 remote_mac="aa:bb:cc:dd:ee:02")
618 c4.pg_create_interface4(
619 local_ip="1.0.0.2/30",
621 local_mac="aa:bb:cc:dd:ee:11",
622 remote_mac="aa:bb:cc:dd:ee:22")
624 c1.vppctl_exec("set sr encaps source addr A1::1")
626 "sr policy add bsid D1:: next D2:: next D3:: "
627 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
628 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
630 c2.vppctl_exec("sr localsid address D2:: behavior end")
632 c3.vppctl_exec("sr localsid address D3:: behavior end")
635 "sr localsid prefix D4::/32 "
636 "behavior end.m.gtp4.e v4src_position 64")
638 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
639 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
640 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
641 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
642 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
644 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
645 IP(src="172.20.0.2", dst="172.20.0.1") /
646 UDP(sport=2152, dport=2152) /
647 GTP_U_Header(gtp_type="g_pdu", teid=200) /
648 GTPPDUSessionContainer(R=1, QFI=3) /
649 IP(src="172.99.0.1", dst="172.99.0.2") /
652 print("Sending packet on {}:".format(c1.name))
658 c4.pg_start_capture()
660 c1.pg_create_stream(p)
663 # timeout (sleep) if needed
667 print("Receiving packet on {}:".format(c4.name))
668 for p in c4.pg_read_packets():
671 def test_tmap_ipv6(self):
673 # trace add af-packet-input 10
674 # pg interface on c1 172.20.0.1
675 # pg interface on c4 B::1/120
677 self.start_containers()
679 c1 = self.containers.get(self.get_name(self.instance_names[0]))
680 c2 = self.containers.get(self.get_name(self.instance_names[1]))
681 c3 = self.containers.get(self.get_name(self.instance_names[2]))
682 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
684 c1.pg_create_interface4(
685 local_ip="172.16.0.1/30",
686 remote_ip="172.16.0.2/30",
687 local_mac="aa:bb:cc:dd:ee:01",
688 remote_mac="aa:bb:cc:dd:ee:02")
689 c4.pg_create_interface4(
690 local_ip="1.0.0.2/30",
692 local_mac="aa:bb:cc:dd:ee:11",
693 remote_mac="aa:bb:cc:dd:ee:22")
695 c1.vppctl_exec("set sr encaps source addr A1::1")
697 "sr policy add bsid D1:: next D2:: next D3:: "
698 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
699 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
701 c2.vppctl_exec("sr localsid address D2:: behavior end")
703 c3.vppctl_exec("sr localsid address D3:: behavior end")
706 "sr localsid prefix D4::/32 "
707 "behavior end.m.gtp4.e v4src_position 64")
709 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
710 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
711 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
712 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
713 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
715 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
716 IP(src="172.20.0.2", dst="172.20.0.1") /
717 UDP(sport=2152, dport=2152) /
718 GTP_U_Header(gtp_type="g_pdu", teid=200) /
719 IPv6(src="2001::1", dst="2002::1") /
722 print("Sending packet on {}:".format(c1.name))
728 c4.pg_start_capture()
730 c1.pg_create_stream(p)
733 # timeout (sleep) if needed
737 print("Receiving packet on {}:".format(c4.name))
738 for p in c4.pg_read_packets():
741 def test_tmap_ipv6_5g(self):
743 # trace add af-packet-input 10
744 # pg interface on c1 172.20.0.1
745 # pg interface on c4 B::1/120
747 self.start_containers()
749 c1 = self.containers.get(self.get_name(self.instance_names[0]))
750 c2 = self.containers.get(self.get_name(self.instance_names[1]))
751 c3 = self.containers.get(self.get_name(self.instance_names[2]))
752 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
754 c1.pg_create_interface4(
755 local_ip="172.16.0.1/30",
756 remote_ip="172.16.0.2/30",
757 local_mac="aa:bb:cc:dd:ee:01",
758 remote_mac="aa:bb:cc:dd:ee:02")
759 c4.pg_create_interface4(
760 local_ip="1.0.0.2/30",
762 local_mac="aa:bb:cc:dd:ee:11",
763 remote_mac="aa:bb:cc:dd:ee:22")
765 c1.vppctl_exec("set sr encaps source addr A1::1")
767 "sr policy add bsid D1:: next D2:: next D3:: "
768 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
769 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
771 c2.vppctl_exec("sr localsid address D2:: behavior end")
773 c3.vppctl_exec("sr localsid address D3:: behavior end")
776 "sr localsid prefix D4::/32 "
777 "behavior end.m.gtp4.e v4src_position 64")
779 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
780 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
781 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
782 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
783 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
785 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
786 IP(src="172.20.0.2", dst="172.20.0.1") /
787 UDP(sport=2152, dport=2152) /
788 GTP_U_Header(gtp_type="g_pdu", teid=200) /
789 GTPPDUSessionContainer(R=1, QFI=3) /
790 IPv6(src="2001::1", dst="2002::1") /
793 print("Sending packet on {}:".format(c1.name))
794 print("Sending packet on {}:".format(c1.name))
800 c4.pg_start_capture()
802 c1.pg_create_stream(p)
805 # timeout (sleep) if needed
809 print("Receiving packet on {}:".format(c4.name))
810 for p in c4.pg_read_packets():
815 # trace add af-packet-input 10
816 # pg interface on c1 172.20.0.1
817 # pg interface on c4 B::1/120
819 self.start_containers()
821 c1 = self.containers.get(self.get_name(self.instance_names[0]))
822 c2 = self.containers.get(self.get_name(self.instance_names[1]))
823 c3 = self.containers.get(self.get_name(self.instance_names[2]))
824 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
826 c1.pg_create_interface4(
827 local_ip="172.16.0.1/30",
828 remote_ip="172.16.0.2/30",
829 local_mac="aa:bb:cc:dd:ee:01",
830 remote_mac="aa:bb:cc:dd:ee:02")
831 c4.pg_create_interface4(
832 local_ip="1.0.0.2/30",
834 local_mac="aa:bb:cc:dd:ee:11",
835 remote_mac="aa:bb:cc:dd:ee:22")
837 c1.vppctl_exec("set sr encaps source addr A1::1")
838 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
840 "sr localsid prefix 172.20.0.1/32 "
841 "behavior end.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
843 c2.vppctl_exec("sr localsid address D2:: behavior end")
845 c3.vppctl_exec("sr localsid address D3:: behavior end")
848 "sr localsid prefix D4::/32 "
849 "behavior end.m.gtp4.e v4src_position 64")
851 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
852 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
853 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
854 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
855 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
857 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
858 IP(src="172.20.0.2", dst="172.20.0.1") /
859 UDP(sport=2152, dport=2152) /
860 GTP_U_Header(gtp_type="g_pdu", teid=200) /
861 IP(src="172.99.0.1", dst="172.99.0.2") /
864 print("Sending packet on {}:".format(c1.name))
870 c4.pg_start_capture()
872 c1.pg_create_stream(p)
875 # timeout (sleep) if needed
879 print("Receiving packet on {}:".format(c4.name))
880 for p in c4.pg_read_packets():
883 def test_gtp4_5g(self):
885 # trace add af-packet-input 10
886 # pg interface on c1 172.20.0.1
887 # pg interface on c4 B::1/120
889 self.start_containers()
891 c1 = self.containers.get(self.get_name(self.instance_names[0]))
892 c2 = self.containers.get(self.get_name(self.instance_names[1]))
893 c3 = self.containers.get(self.get_name(self.instance_names[2]))
894 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
896 c1.pg_create_interface4(
897 local_ip="172.16.0.1/30",
898 remote_ip="172.16.0.2/30",
899 local_mac="aa:bb:cc:dd:ee:01",
900 remote_mac="aa:bb:cc:dd:ee:02")
901 c4.pg_create_interface4(
902 local_ip="1.0.0.2/30",
904 local_mac="aa:bb:cc:dd:ee:11",
905 remote_mac="aa:bb:cc:dd:ee:22")
907 c1.vppctl_exec("set sr encaps source addr A1::1")
908 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
910 "sr localsid prefix ::ffff:ac14:0001/128 "
911 "behavior end.m.gtp4.d D4::/32 v6src_prefix C1::/64 "
914 c2.vppctl_exec("sr localsid address D2:: behavior end")
916 c3.vppctl_exec("sr localsid address D3:: behavior end")
919 "sr localsid prefix D4::/32 "
920 "behavior end.m.gtp4.e v4src_position 64")
922 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
923 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
924 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
925 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
926 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
928 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
929 IP(src="172.20.0.2", dst="172.20.0.1") /
930 UDP(sport=2152, dport=2152) /
931 GTP_U_Header(gtp_type="g_pdu", teid=200) /
932 GTPPDUSessionContainer(type=1, R=1, QFI=3) /
933 IP(src="172.99.0.1", dst="172.99.0.2") /
936 print("Sending packet on {}:".format(c1.name))
942 c4.pg_start_capture()
944 c1.pg_create_stream(p)
947 # timeout (sleep) if needed
951 print("Receiving packet on {}:".format(c4.name))
952 for p in c4.pg_read_packets():
955 def test_gtp4_echo(self):
957 # trace add af-packet-input 10
958 # pg interface on c1 172.20.0.1
959 # pg interface on c4 B::1/120
961 self.start_containers()
963 c1 = self.containers.get(self.get_name(self.instance_names[0]))
964 c2 = self.containers.get(self.get_name(self.instance_names[1]))
965 c3 = self.containers.get(self.get_name(self.instance_names[2]))
966 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
968 c1.pg_create_interface4(
969 local_ip="172.16.0.1/30",
970 remote_ip="172.16.0.2/30",
971 local_mac="aa:bb:cc:dd:ee:01",
972 remote_mac="aa:bb:cc:dd:ee:02")
973 c4.pg_create_interface4(
974 local_ip="1.0.0.2/30",
976 local_mac="aa:bb:cc:dd:ee:11",
977 remote_mac="aa:bb:cc:dd:ee:22")
979 c1.vppctl_exec("set sr encaps source addr A1::1")
980 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
982 "sr localsid prefix 172.20.0.1/32 "
983 "behavior end.m.gtp4.d D4::/32 v6src_prefix C1::/64 "
986 c2.vppctl_exec("sr localsid address D2:: behavior end")
988 c3.vppctl_exec("sr localsid address D3:: behavior end")
991 "sr localsid prefix D4::/32 "
992 "behavior end.m.gtp4.e v4src_position 64")
994 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
995 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
996 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
997 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
998 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1000 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1001 IP(src="172.20.0.2", dst="172.20.0.1") /
1002 UDP(sport=2152, dport=2152) /
1003 GTP_U_Header(gtp_type="echo_request", teid=200))
1005 print("Sending packet on {}:".format(c1.name))
1011 c4.pg_start_capture()
1013 c1.pg_create_stream(p)
1016 # timeout (sleep) if needed
1020 print("Receiving packet on {}:".format(c4.name))
1021 for p in c4.pg_read_packets():
1024 def test_gtp4_ipv6(self):
1026 # trace add af-packet-input 10
1027 # pg interface on c1 172.20.0.1
1028 # pg interface on c4 B::1/120
1030 self.start_containers()
1032 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1033 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1034 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1035 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1037 c1.pg_create_interface4(
1038 local_ip="172.16.0.1/30",
1039 remote_ip="172.16.0.2/30",
1040 local_mac="aa:bb:cc:dd:ee:01",
1041 remote_mac="aa:bb:cc:dd:ee:02")
1042 c4.pg_create_interface4(
1043 local_ip="1.0.0.2/30",
1044 remote_ip="1.0.0.1",
1045 local_mac="aa:bb:cc:dd:ee:11",
1046 remote_mac="aa:bb:cc:dd:ee:22")
1048 c1.vppctl_exec("set sr encaps source addr A1::1")
1049 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1051 "sr localsid prefix ::ffff:ac14:0001/128 "
1052 "behavior end.m.gtp4.d D4::/32 v6src_prefix C1::/64")
1054 c2.vppctl_exec("sr localsid address D2:: behavior end")
1056 c3.vppctl_exec("sr localsid address D3:: behavior end")
1059 "sr localsid prefix D4::/32 "
1060 "behavior end.m.gtp4.e v4src_position 64")
1062 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1063 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1064 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1065 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1066 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1068 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1069 IP(src="172.20.0.2", dst="172.20.0.1") /
1070 UDP(sport=2152, dport=2152) /
1071 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1072 IPv6(src="2001::1", dst="2002::1") /
1073 ICMPv6EchoRequest())
1075 print("Sending packet on {}:".format(c1.name))
1081 c4.pg_start_capture()
1083 c1.pg_create_stream(p)
1086 # timeout (sleep) if needed
1090 print("Receiving packet on {}:".format(c4.name))
1091 for p in c4.pg_read_packets():
1094 def test_gtp4_ipv6_5g(self):
1096 # trace add af-packet-input 10
1097 # pg interface on c1 172.20.0.1
1098 # pg interface on c4 B::1/120
1100 self.start_containers()
1102 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1103 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1104 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1105 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1107 c1.pg_create_interface4(
1108 local_ip="172.16.0.1/30",
1109 remote_ip="172.16.0.2/30",
1110 local_mac="aa:bb:cc:dd:ee:01",
1111 remote_mac="aa:bb:cc:dd:ee:02")
1112 c4.pg_create_interface4(
1113 local_ip="1.0.0.2/30",
1114 remote_ip="1.0.0.1",
1115 local_mac="aa:bb:cc:dd:ee:11",
1116 remote_mac="aa:bb:cc:dd:ee:22")
1118 c1.vppctl_exec("set sr encaps source addr A1::1")
1119 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1121 "sr localsid prefix ::ffff:ac14:0001/128 "
1122 "behavior end.m.gtp4.d D4::/32 v6src_prefix C1::/64")
1124 c2.vppctl_exec("sr localsid address D2:: behavior end")
1126 c3.vppctl_exec("sr localsid address D3:: behavior end")
1129 "sr localsid prefix D4::/32 "
1130 "behavior end.m.gtp4.e v4src_position 64")
1132 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1133 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1134 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1135 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1136 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1138 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1139 IP(src="172.20.0.2", dst="172.20.0.1") /
1140 UDP(sport=2152, dport=2152) /
1141 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1142 GTPPDUSessionContainer(R=1, QFI=3) /
1143 IPv6(src="2001::1", dst="2002::1") /
1144 ICMPv6EchoRequest())
1146 print("Sending packet on {}:".format(c1.name))
1152 c4.pg_start_capture()
1154 c1.pg_create_stream(p)
1157 # timeout (sleep) if needed
1161 print("Receiving packet on {}:".format(c4.name))
1162 for p in c4.pg_read_packets():
1165 def test_gtp6_drop_in(self):
1167 # trace add af-packet-input 10
1168 # pg interface on c1 172.20.0.1
1169 # pg interface on c4 B::1/120
1171 self.start_containers()
1173 print("Deleting the old containers...")
1175 print("Starting the new containers...")
1177 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1178 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1179 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1180 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1182 c1.pg_create_interface(
1183 local_ip="C::1/120",
1185 local_mac="aa:bb:cc:dd:ee:01",
1186 remote_mac="aa:bb:cc:dd:ee:02")
1187 c4.pg_create_interface(
1188 local_ip="B::1/120",
1190 local_mac="aa:bb:cc:dd:ee:11",
1191 remote_mac="aa:bb:cc:dd:ee:22")
1193 c1.vppctl_exec("set sr encaps source addr A1::1")
1194 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1197 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1199 c2.vppctl_exec("sr localsid address D2:: behavior end")
1201 c3.vppctl_exec("sr localsid address D3:: behavior end")
1203 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1205 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1206 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1207 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1208 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1209 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1214 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1215 IPv6(src="C::2", dst="D::2") /
1216 UDP(sport=2152, dport=2152) /
1217 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1218 IP(src="172.99.0.1", dst="172.99.0.2") /
1221 print("Sending packet on {}:".format(c1.name))
1227 c4.pg_start_capture()
1229 c1.pg_create_stream(p)
1232 # timeout (sleep) if needed
1236 print("Receiving packet on {}:".format(c4.name))
1237 for p in c4.pg_read_packets():
1240 def test_gtp6_drop_in_5g(self):
1242 # trace add af-packet-input 10
1243 # pg interface on c1 172.20.0.1
1244 # pg interface on c4 B::1/120
1246 self.start_containers()
1248 print("Deleting the old containers...")
1250 print("Starting the new containers...")
1252 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1253 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1254 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1255 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1257 c1.pg_create_interface(
1258 local_ip="C::1/120",
1260 local_mac="aa:bb:cc:dd:ee:01",
1261 remote_mac="aa:bb:cc:dd:ee:02")
1262 c4.pg_create_interface(
1263 local_ip="B::1/120",
1265 local_mac="aa:bb:cc:dd:ee:11",
1266 remote_mac="aa:bb:cc:dd:ee:22")
1268 c1.vppctl_exec("set sr encaps source addr A1::1")
1269 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1272 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1274 c2.vppctl_exec("sr localsid address D2:: behavior end")
1276 c3.vppctl_exec("sr localsid address D3:: behavior end")
1278 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1280 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1281 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1282 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1283 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1284 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1289 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1290 IPv6(src="C::2", dst="D::2") /
1291 UDP(sport=2152, dport=2152) /
1292 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1293 GTPPDUSessionContainer(type=1, R=1, QFI=3) /
1294 IP(src="172.99.0.1", dst="172.99.0.2") /
1297 print("Sending packet on {}:".format(c1.name))
1303 c4.pg_start_capture()
1305 c1.pg_create_stream(p)
1308 # timeout (sleep) if needed
1312 print("Receiving packet on {}:".format(c4.name))
1313 for p in c4.pg_read_packets():
1316 def test_gtp6_drop_in_echo(self):
1318 # trace add af-packet-input 10
1319 # pg interface on c1 172.20.0.1
1320 # pg interface on c4 B::1/120
1322 self.start_containers()
1324 print("Deleting the old containers...")
1326 print("Starting the new containers...")
1328 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1329 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1330 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1331 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1333 c1.pg_create_interface(
1334 local_ip="C::1/120",
1336 local_mac="aa:bb:cc:dd:ee:01",
1337 remote_mac="aa:bb:cc:dd:ee:02")
1338 c4.pg_create_interface(
1339 local_ip="B::1/120",
1341 local_mac="aa:bb:cc:dd:ee:11",
1342 remote_mac="aa:bb:cc:dd:ee:22")
1344 c1.vppctl_exec("set sr encaps source addr A1::1")
1345 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1348 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1350 c2.vppctl_exec("sr localsid address D2:: behavior end")
1352 c3.vppctl_exec("sr localsid address D3:: behavior end")
1354 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1356 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1357 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1358 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1359 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1360 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1365 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1366 IPv6(src="C::2", dst="D::2") /
1367 UDP(sport=2152, dport=2152) /
1368 GTP_U_Header(gtp_type="echo_request", teid=200))
1370 print("Sending packet on {}:".format(c1.name))
1376 c4.pg_start_capture()
1378 c1.pg_create_stream(p)
1381 # timeout (sleep) if needed
1385 print("Receiving packet on {}:".format(c4.name))
1386 for p in c4.pg_read_packets():
1389 def test_gtp6_drop_in_ipv6(self):
1391 # trace add af-packet-input 10
1392 # pg interface on c1 172.20.0.1
1393 # pg interface on c4 B::1/120
1395 self.start_containers()
1397 print("Deleting the old containers...")
1399 print("Starting the new containers...")
1401 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1402 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1403 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1404 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1406 c1.pg_create_interface(
1407 local_ip="C::1/120",
1409 local_mac="aa:bb:cc:dd:ee:01",
1410 remote_mac="aa:bb:cc:dd:ee:02")
1411 c4.pg_create_interface(
1412 local_ip="B::1/120",
1414 local_mac="aa:bb:cc:dd:ee:11",
1415 remote_mac="aa:bb:cc:dd:ee:22")
1417 c1.vppctl_exec("set sr encaps source addr A1::1")
1418 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1421 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1423 c2.vppctl_exec("sr localsid address D2:: behavior end")
1425 c3.vppctl_exec("sr localsid address D3:: behavior end")
1427 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1429 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1430 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1431 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1432 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1433 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1438 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1439 IPv6(src="C::2", dst="D::2") /
1440 UDP(sport=2152, dport=2152) /
1441 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1442 IPv6(src="2001::1", dst="2002::1") /
1443 ICMPv6EchoRequest())
1445 print("Sending packet on {}:".format(c1.name))
1451 c4.pg_start_capture()
1453 c1.pg_create_stream(p)
1456 # timeout (sleep) if needed
1460 print("Receiving packet on {}:".format(c4.name))
1461 for p in c4.pg_read_packets():
1464 def test_gtp6_drop_in_ipv6_5g(self):
1466 # trace add af-packet-input 10
1467 # pg interface on c1 172.20.0.1
1468 # pg interface on c4 B::1/120
1470 self.start_containers()
1472 print("Deleting the old containers...")
1474 print("Starting the new containers...")
1476 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1477 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1478 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1479 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1481 c1.pg_create_interface(
1482 local_ip="C::1/120",
1484 local_mac="aa:bb:cc:dd:ee:01",
1485 remote_mac="aa:bb:cc:dd:ee:02")
1486 c4.pg_create_interface(
1487 local_ip="B::1/120",
1489 local_mac="aa:bb:cc:dd:ee:11",
1490 remote_mac="aa:bb:cc:dd:ee:22")
1492 c1.vppctl_exec("set sr encaps source addr A1::1")
1493 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1496 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1498 c2.vppctl_exec("sr localsid address D2:: behavior end")
1500 c3.vppctl_exec("sr localsid address D3:: behavior end")
1502 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1504 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1505 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1506 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1507 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1508 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1513 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1514 IPv6(src="C::2", dst="D::2") /
1515 UDP(sport=2152, dport=2152) /
1516 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1517 GTPPDUSessionContainer(R=1, QFI=3) /
1518 IPv6(src="2001::1", dst="2002::1") /
1519 ICMPv6EchoRequest())
1521 print("Sending packet on {}:".format(c1.name))
1527 c4.pg_start_capture()
1529 c1.pg_create_stream(p)
1532 # timeout (sleep) if needed
1536 print("Receiving packet on {}:".format(c4.name))
1537 for p in c4.pg_read_packets():
1540 def test_gtp6(self):
1542 # trace add af-packet-input 10
1543 # pg interface on c1 172.20.0.1
1544 # pg interface on c4 B::1/120
1546 self.start_containers()
1548 print("Deleting the old containers...")
1550 print("Starting the new containers...")
1552 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1553 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1554 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1555 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1557 c1.pg_create_interface(
1558 local_ip="C::1/120",
1560 local_mac="aa:bb:cc:dd:ee:01",
1561 remote_mac="aa:bb:cc:dd:ee:02")
1562 c4.pg_create_interface4(
1563 local_ip="1.0.0.2/30",
1564 remote_ip="1.0.0.1",
1565 local_mac="aa:bb:cc:dd:ee:11",
1566 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::")
1572 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1574 c2.vppctl_exec("sr localsid address D2:: behavior end")
1576 c3.vppctl_exec("sr localsid address D3:: behavior end")
1578 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
1580 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1581 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1582 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1583 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1584 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
1589 p = (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 IP(src="172.100.0.1", dst="172.200.0.1") /
1596 print("Sending packet on {}:".format(c1.name))
1602 c4.pg_start_capture()
1604 c1.pg_create_stream(p)
1607 # timeout (sleep) if needed
1611 print("Receiving packet on {}:".format(c4.name))
1612 for p in c4.pg_read_packets():
1615 def test_gtp6_5g(self):
1617 # trace add af-packet-input 10
1618 # pg interface on c1 172.20.0.1
1619 # pg interface on c4 B::1/120
1621 self.start_containers()
1623 print("Deleting the old containers...")
1625 print("Starting the new containers...")
1627 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1628 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1629 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1630 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1632 c1.pg_create_interface(
1633 local_ip="C::1/120",
1635 local_mac="aa:bb:cc:dd:ee:01",
1636 remote_mac="aa:bb:cc:dd:ee:02")
1637 c4.pg_create_interface4(
1638 local_ip="1.0.0.2/30",
1639 remote_ip="1.0.0.1",
1640 local_mac="aa:bb:cc:dd:ee:11",
1641 remote_mac="aa:bb:cc:dd:ee:22")
1643 c1.vppctl_exec("set sr encaps source addr A1::1")
1644 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1647 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1649 c2.vppctl_exec("sr localsid address D2:: behavior end")
1651 c3.vppctl_exec("sr localsid address D3:: behavior end")
1653 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
1655 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1656 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1657 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1658 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1659 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
1664 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1665 IPv6(src="C::2", dst="D::2") /
1666 UDP(sport=2152, dport=2152) /
1667 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1668 GTPPDUSessionContainer(R=1, QFI=3) /
1669 IP(src="172.100.0.1", dst="172.200.0.1") /
1672 print("Sending packet on {}:".format(c1.name))
1678 c4.pg_start_capture()
1680 c1.pg_create_stream(p)
1683 # timeout (sleep) if needed
1687 print("Receiving packet on {}:".format(c4.name))
1688 for p in c4.pg_read_packets():
1691 def test_gtp6_ipv6(self):
1693 # trace add af-packet-input 10
1694 # pg interface on c1 172.20.0.1
1695 # pg interface on c4 B::1/120
1697 self.start_containers()
1699 print("Deleting the old containers...")
1701 print("Starting the new containers...")
1703 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1704 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1705 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1706 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1708 c1.pg_create_interface(
1709 local_ip="C::1/120",
1711 local_mac="aa:bb:cc:dd:ee:01",
1712 remote_mac="aa:bb:cc:dd:ee:02")
1713 c4.pg_create_interface(
1714 local_ip="B::1/120",
1716 local_mac="aa:bb:cc:dd:ee:11",
1717 remote_mac="aa:bb:cc:dd:ee:22")
1719 c1.vppctl_exec("set sr encaps source addr A1::1")
1720 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1723 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1725 c2.vppctl_exec("sr localsid address D2:: behavior end")
1727 c3.vppctl_exec("sr localsid address D3:: behavior end")
1729 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
1731 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1732 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1733 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1734 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1735 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
1740 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1741 IPv6(src="C::2", dst="D::2") /
1742 UDP(sport=2152, dport=2152) /
1743 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1744 IPv6(src="2001::1", dst="2002::1") /
1745 ICMPv6EchoRequest())
1747 print("Sending packet on {}:".format(c1.name))
1753 c4.pg_start_capture()
1755 c1.pg_create_stream(p)
1758 # timeout (sleep) if needed
1762 print("Receiving packet on {}:".format(c4.name))
1763 for p in c4.pg_read_packets():
1766 def test_gtp6_ipv6_5g(self):
1768 # trace add af-packet-input 10
1769 # pg interface on c1 172.20.0.1
1770 # pg interface on c4 B::1/120
1772 self.start_containers()
1774 print("Deleting the old containers...")
1776 print("Starting the new containers...")
1778 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1779 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1780 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1781 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1783 c1.pg_create_interface(
1784 local_ip="C::1/120",
1786 local_mac="aa:bb:cc:dd:ee:01",
1787 remote_mac="aa:bb:cc:dd:ee:02")
1788 c4.pg_create_interface(
1789 local_ip="B::1/120",
1791 local_mac="aa:bb:cc:dd:ee:11",
1792 remote_mac="aa:bb:cc:dd:ee:22")
1794 c1.vppctl_exec("set sr encaps source addr A1::1")
1795 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1798 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1800 c2.vppctl_exec("sr localsid address D2:: behavior end")
1802 c3.vppctl_exec("sr localsid address D3:: behavior end")
1804 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
1806 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1807 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1808 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1809 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1810 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
1815 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1816 IPv6(src="C::2", dst="D::2") /
1817 UDP(sport=2152, dport=2152) /
1818 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1819 GTPPDUSessionContainer(R=1, QFI=3) /
1820 IPv6(src="2001::1", dst="2002::1") /
1821 ICMPv6EchoRequest())
1823 print("Sending packet on {}:".format(c1.name))
1829 c4.pg_start_capture()
1831 c1.pg_create_stream(p)
1834 # timeout (sleep) if needed
1838 print("Receiving packet on {}:".format(c4.name))
1839 for p in c4.pg_read_packets():
1842 def status_containers(self):
1846 for i, name in enumerate(self.instance_names):
1847 name = self.get_name(name)
1848 print("\t[{}] {} - {}".format(
1850 "running" if self.containers.get(name) else "missing"))
1854 for i, name in enumerate(self.network_names):
1855 name = self.get_name(name)
1856 print("\t[{}] {} - {}".format(
1858 "running" if self.networks.get(name) else "missing"))
1860 def build_image(self):
1861 # TODO: optimize build process for speed and image size
1862 print("VPP Path (build): {}".format(self.vpp_path))
1863 self.containers.build(self.path, self.vpp_path)
1865 def release_image(self):
1866 print("VPP Path (release): {}".format(self.vpp_path))
1867 instance = self.containers.new("release-build")
1870 "docker cp release-build:{}/vpp-package.tgz {}/".format(
1871 self.vpp_path, self.vpp_path))
1875 self.containers.release(self.path, self.vpp_path)
1877 system("rm -rf {}/vpp-package.tgz".format(self.vpp_path))
1879 def vppctl(self, index, command=None):
1880 if index >= len(self.instance_names):
1882 name = self.get_name(self.instance_names[index])
1883 self.logger.error("connecting to: {}".format(name))
1884 self.containers.vppctl(name, command)
1886 def bash(self, index):
1887 if index >= len(self.instance_names):
1889 name = self.get_name(self.instance_names[index])
1890 self.logger.error("connecting to: {}".format(name))
1891 self.containers.bash(name)
1895 parser = ArgumentParser()
1897 parser.add_argument("--verbose", choices=['error', 'debug', 'info'])
1899 parser.add_argument('--image', choices=['debug', 'release'])
1901 subparsers = parser.add_subparsers()
1903 p1 = subparsers.add_parser(
1904 "infra", help="Infrastructure related commands.")
1916 p1.add_argument("--prefix")
1917 p1.add_argument("--image")
1919 p2 = subparsers.add_parser("cmd", help="Instance related commands.")
1921 p2.add_argument("op", choices=['vppctl', 'bash'])
1926 help="Container instance index. (./runner.py infra status)")
1929 "--command", help="Only vppctl supports this optional argument.")
1931 p3 = subparsers.add_parser("test", help="Test related commands.")
1949 "gtp6_drop_in_echo",
1950 "gtp6_drop_in_ipv6",
1951 "gtp6_drop_in_ipv6_5g",
1957 args = parser.parse_args()
1958 if not hasattr(args, "op") or not args.op:
1959 parser.print_help(sys.stderr)
1965 def main(op=None, prefix=None, verbose=None,
1966 image=None, index=None, command=None):
1969 basicConfig(level=verbose_levels[verbose])
1971 if image == 'release':
1972 image = "srv6m-release-image"
1973 elif image == 'debug':
1974 image = "srv6m-image"
1976 print("Verified image: {}".format(image))
1978 program = Program(image, prefix)
1982 program.build_image()
1983 elif op == 'release':
1984 program.release_image()
1986 program.stop_containers()
1988 program.start_containers()
1989 elif op == 'status':
1990 program.status_containers()
1991 elif op == 'vppctl':
1992 program.vppctl(index, command)
2001 elif op == 'tmap_5g':
2002 program.test_tmap_5g()
2003 elif op == 'tmap_ipv6':
2004 program.test_tmap_ipv6()
2005 elif op == 'tmap_ipv6_5g':
2006 program.test_tmap_ipv6_5g()
2009 elif op == 'gtp4_5g':
2010 program.test_gtp4_5g()
2011 elif op == 'gtp4_echo':
2012 program.test_gtp4_echo()
2013 elif op == 'gtp4_ipv6':
2014 program.test_gtp4_ipv6()
2015 elif op == 'gtp4_ipv6_5g':
2016 program.test_gtp4_ipv6_5g()
2017 elif op == 'gtp6_drop_in':
2018 program.test_gtp6_drop_in()
2019 elif op == 'gtp6_drop_in_5g':
2020 program.test_gtp6_drop_in_5g()
2021 elif op == 'gtp6_drop_in_echo':
2022 program.test_gtp6_drop_in_echo()
2023 elif op == 'gtp6_drop_in_ipv6':
2024 program.test_gtp6_drop_in_ipv6()
2025 elif op == 'gtp6_drop_in_ipv6_5g':
2026 program.test_gtp6_drop_in_ipv6_5g()
2029 elif op == 'gtp6_5g':
2030 program.test_gtp6_5g()
2031 elif op == 'gtp6_ipv6':
2032 program.test_gtp6_ipv6()
2033 elif op == 'gtp6_ipv6_5g':
2034 program.test_gtp6_ipv6_5g()
2037 program.logger.exception("")
2045 if __name__ == "__main__":
2046 sys.exit(main(**get_args()))