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))
872 c4.pg_start_capture()
874 c1.pg_create_stream(p)
877 # timeout (sleep) if needed
881 print("Receiving packet on {}:".format(c4.name))
882 for p in c4.pg_read_packets():
885 def test_gtp4_usid(self):
887 # trace add af-packet-input 10
888 # pg interface on c1 172.20.0.1
889 # pg interface on c4 B::1/120
891 self.start_containers()
893 c1 = self.containers.get(self.get_name(self.instance_names[0]))
894 c2 = self.containers.get(self.get_name(self.instance_names[1]))
895 c3 = self.containers.get(self.get_name(self.instance_names[2]))
896 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
898 c1.pg_create_interface4(
899 local_ip="172.16.0.1/30",
900 remote_ip="172.16.0.2/30",
901 local_mac="aa:bb:cc:dd:ee:01",
902 remote_mac="aa:bb:cc:dd:ee:02")
903 c4.pg_create_interface4(
904 local_ip="1.0.0.2/30",
906 local_mac="aa:bb:cc:dd:ee:11",
907 remote_mac="aa:bb:cc:dd:ee:22")
909 c1.vppctl_exec("set sr encaps source addr A1::1")
910 c1.vppctl_exec("sr policy add bsid D4:: next D2:1111:aaaa:bbbb::")
911 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
912 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
914 c2.vppctl_exec("sr localsid prefix D2:1111:aaaa::/48 behavior end usid 16")
916 c3.vppctl_exec("sr localsid prefix D2:1111:bbbb::/48 behavior end usid 16")
919 "sr localsid prefix D4::/32 "
920 "behavior end.m.gtp4.e v4src_position 64")
922 c2.set_ipv6_route("eth2", "A2::2", "D2:1111:bbbb::/48")
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 IP(src="172.99.0.1", dst="172.99.0.2") /
935 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_5g(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::")
981 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
982 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
984 c2.vppctl_exec("sr localsid address D2:: behavior end")
986 c3.vppctl_exec("sr localsid address D3:: behavior end")
989 "sr localsid prefix D4::/32 "
990 "behavior end.m.gtp4.e v4src_position 64")
992 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
993 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
994 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
995 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
996 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
998 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
999 IP(src="172.20.0.2", dst="172.20.0.1") /
1000 UDP(sport=2152, dport=2152) /
1001 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1002 GTPPDUSessionContainer(type=1, R=1, QFI=3) /
1003 IP(src="172.99.0.1", dst="172.99.0.2") /
1006 print("Sending packet on {}:".format(c1.name))
1012 c4.pg_start_capture()
1014 c1.pg_create_stream(p)
1017 # timeout (sleep) if needed
1021 print("Receiving packet on {}:".format(c4.name))
1022 for p in c4.pg_read_packets():
1025 def test_gtp4_echo(self):
1027 # trace add af-packet-input 10
1028 # pg interface on c1 172.20.0.1
1029 # pg interface on c4 B::1/120
1031 self.start_containers()
1033 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1034 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1035 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1036 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1038 c1.pg_create_interface4(
1039 local_ip="172.16.0.1/30",
1040 remote_ip="172.16.0.2/30",
1041 local_mac="aa:bb:cc:dd:ee:01",
1042 remote_mac="aa:bb:cc:dd:ee:02")
1043 c4.pg_create_interface4(
1044 local_ip="1.0.0.2/30",
1045 remote_ip="1.0.0.1",
1046 local_mac="aa:bb:cc:dd:ee:11",
1047 remote_mac="aa:bb:cc:dd:ee:22")
1049 c1.vppctl_exec("set sr encaps source addr A1::1")
1050 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1051 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
1052 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
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="echo_request", S=1, teid=200, seq=200))
1073 print("Sending packet on {}:".format(c1.name))
1079 c4.pg_start_capture()
1081 c1.pg_create_stream(p)
1084 # timeout (sleep) if needed
1088 print("Receiving packet on {}:".format(c4.name))
1089 for p in c4.pg_read_packets():
1092 def test_gtp4_ipv6(self):
1094 # trace add af-packet-input 10
1095 # pg interface on c1 172.20.0.1
1096 # pg interface on c4 B::1/120
1098 self.start_containers()
1100 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1101 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1102 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1103 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1105 c1.pg_create_interface4(
1106 local_ip="172.16.0.1/30",
1107 remote_ip="172.16.0.2/30",
1108 local_mac="aa:bb:cc:dd:ee:01",
1109 remote_mac="aa:bb:cc:dd:ee:02")
1110 c4.pg_create_interface4(
1111 local_ip="1.0.0.2/30",
1112 remote_ip="1.0.0.1",
1113 local_mac="aa:bb:cc:dd:ee:11",
1114 remote_mac="aa:bb:cc:dd:ee:22")
1116 c1.vppctl_exec("set sr encaps source addr A1::1")
1117 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1118 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64")
1119 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1121 c2.vppctl_exec("sr localsid address D2:: behavior end")
1123 c3.vppctl_exec("sr localsid address D3:: behavior end")
1126 "sr localsid prefix D4::/32 "
1127 "behavior end.m.gtp4.e v4src_position 64")
1129 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1130 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1131 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1132 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1133 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1135 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1136 IP(src="172.20.0.2", dst="172.20.0.1") /
1137 UDP(sport=2152, dport=2152) /
1138 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1139 IPv6(src="2001::1", dst="2002::1") /
1140 ICMPv6EchoRequest())
1142 print("Sending packet on {}:".format(c1.name))
1148 c4.pg_start_capture()
1150 c1.pg_create_stream(p)
1153 # timeout (sleep) if needed
1157 print("Receiving packet on {}:".format(c4.name))
1158 for p in c4.pg_read_packets():
1161 def test_gtp4_ipv6_5g(self):
1163 # trace add af-packet-input 10
1164 # pg interface on c1 172.20.0.1
1165 # pg interface on c4 B::1/120
1167 self.start_containers()
1169 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1170 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1171 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1172 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1174 c1.pg_create_interface4(
1175 local_ip="172.16.0.1/30",
1176 remote_ip="172.16.0.2/30",
1177 local_mac="aa:bb:cc:dd:ee:01",
1178 remote_mac="aa:bb:cc:dd:ee:02")
1179 c4.pg_create_interface4(
1180 local_ip="1.0.0.2/30",
1181 remote_ip="1.0.0.1",
1182 local_mac="aa:bb:cc:dd:ee:11",
1183 remote_mac="aa:bb:cc:dd:ee:22")
1185 c1.vppctl_exec("set sr encaps source addr A1::1")
1186 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1187 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64")
1188 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1190 c2.vppctl_exec("sr localsid address D2:: behavior end")
1192 c3.vppctl_exec("sr localsid address D3:: behavior end")
1195 "sr localsid prefix D4::/32 "
1196 "behavior end.m.gtp4.e v4src_position 64")
1198 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1199 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1200 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1201 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1202 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1204 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1205 IP(src="172.20.0.2", dst="172.20.0.1") /
1206 UDP(sport=2152, dport=2152) /
1207 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1208 GTPPDUSessionContainer(R=1, QFI=3) /
1209 IPv6(src="2001::1", dst="2002::1") /
1210 ICMPv6EchoRequest())
1212 print("Sending packet on {}:".format(c1.name))
1218 c4.pg_start_capture()
1220 c1.pg_create_stream(p)
1223 # timeout (sleep) if needed
1227 print("Receiving packet on {}:".format(c4.name))
1228 for p in c4.pg_read_packets():
1231 def test_gtp6_drop_in(self):
1233 # trace add af-packet-input 10
1234 # pg interface on c1 172.20.0.1
1235 # pg interface on c4 B::1/120
1237 self.start_containers()
1239 print("Deleting the old containers...")
1241 print("Starting the new containers...")
1243 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1244 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1245 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1246 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1248 c1.pg_create_interface(
1249 local_ip="C::1/120",
1251 local_mac="aa:bb:cc:dd:ee:01",
1252 remote_mac="aa:bb:cc:dd:ee:02")
1253 c4.pg_create_interface(
1254 local_ip="B::1/120",
1256 local_mac="aa:bb:cc:dd:ee:11",
1257 remote_mac="aa:bb:cc:dd:ee:22")
1259 c1.vppctl_exec("set sr encaps source addr A1::1")
1260 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1263 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1265 c2.vppctl_exec("sr localsid address D2:: behavior end")
1267 c3.vppctl_exec("sr localsid address D3:: behavior end")
1269 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1271 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1272 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1273 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1274 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1275 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1280 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1281 IPv6(src="C::2", dst="D::2") /
1282 UDP(sport=2152, dport=2152) /
1283 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1284 IP(src="172.99.0.1", dst="172.99.0.2") /
1287 print("Sending packet on {}:".format(c1.name))
1293 c4.pg_start_capture()
1295 c1.pg_create_stream(p)
1298 # timeout (sleep) if needed
1302 print("Receiving packet on {}:".format(c4.name))
1303 for p in c4.pg_read_packets():
1306 def test_gtp6_drop_in_5g(self):
1308 # trace add af-packet-input 10
1309 # pg interface on c1 172.20.0.1
1310 # pg interface on c4 B::1/120
1312 self.start_containers()
1314 print("Deleting the old containers...")
1316 print("Starting the new containers...")
1318 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1319 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1320 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1321 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1323 c1.pg_create_interface(
1324 local_ip="C::1/120",
1326 local_mac="aa:bb:cc:dd:ee:01",
1327 remote_mac="aa:bb:cc:dd:ee:02")
1328 c4.pg_create_interface(
1329 local_ip="B::1/120",
1331 local_mac="aa:bb:cc:dd:ee:11",
1332 remote_mac="aa:bb:cc:dd:ee:22")
1334 c1.vppctl_exec("set sr encaps source addr A1::1")
1335 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1338 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1340 c2.vppctl_exec("sr localsid address D2:: behavior end")
1342 c3.vppctl_exec("sr localsid address D3:: behavior end")
1344 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1346 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1347 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1348 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1349 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1350 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1355 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1356 IPv6(src="C::2", dst="D::2") /
1357 UDP(sport=2152, dport=2152) /
1358 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1359 GTPPDUSessionContainer(type=1, R=1, QFI=3) /
1360 IP(src="172.99.0.1", dst="172.99.0.2") /
1363 print("Sending packet on {}:".format(c1.name))
1369 c4.pg_start_capture()
1371 c1.pg_create_stream(p)
1374 # timeout (sleep) if needed
1378 print("Receiving packet on {}:".format(c4.name))
1379 for p in c4.pg_read_packets():
1382 def test_gtp6_drop_in_echo(self):
1384 # trace add af-packet-input 10
1385 # pg interface on c1 172.20.0.1
1386 # pg interface on c4 B::1/120
1388 self.start_containers()
1390 print("Deleting the old containers...")
1392 print("Starting the new containers...")
1394 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1395 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1396 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1397 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1399 c1.pg_create_interface(
1400 local_ip="C::1/120",
1402 local_mac="aa:bb:cc:dd:ee:01",
1403 remote_mac="aa:bb:cc:dd:ee:02")
1404 c4.pg_create_interface(
1405 local_ip="B::1/120",
1407 local_mac="aa:bb:cc:dd:ee:11",
1408 remote_mac="aa:bb:cc:dd:ee:22")
1410 c1.vppctl_exec("set sr encaps source addr A1::1")
1411 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1414 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1416 c2.vppctl_exec("sr localsid address D2:: behavior end")
1418 c3.vppctl_exec("sr localsid address D3:: behavior end")
1420 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1422 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1423 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1424 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1425 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1426 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1431 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1432 IPv6(src="C::2", dst="D::2") /
1433 UDP(sport=2152, dport=2152) /
1434 GTP_U_Header(gtp_type="echo_request", S=1, teid=200, seq=300))
1436 print("Sending packet on {}:".format(c1.name))
1442 c4.pg_start_capture()
1444 c1.pg_create_stream(p)
1447 # timeout (sleep) if needed
1451 print("Receiving packet on {}:".format(c4.name))
1452 for p in c4.pg_read_packets():
1455 def test_gtp6_drop_in_ipv6(self):
1457 # trace add af-packet-input 10
1458 # pg interface on c1 172.20.0.1
1459 # pg interface on c4 B::1/120
1461 self.start_containers()
1463 print("Deleting the old containers...")
1465 print("Starting the new containers...")
1467 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1468 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1469 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1470 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1472 c1.pg_create_interface(
1473 local_ip="C::1/120",
1475 local_mac="aa:bb:cc:dd:ee:01",
1476 remote_mac="aa:bb:cc:dd:ee:02")
1477 c4.pg_create_interface(
1478 local_ip="B::1/120",
1480 local_mac="aa:bb:cc:dd:ee:11",
1481 remote_mac="aa:bb:cc:dd:ee:22")
1483 c1.vppctl_exec("set sr encaps source addr A1::1")
1484 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1487 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1489 c2.vppctl_exec("sr localsid address D2:: behavior end")
1491 c3.vppctl_exec("sr localsid address D3:: behavior end")
1493 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1495 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1496 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1497 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1498 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1499 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1504 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1505 IPv6(src="C::2", dst="D::2") /
1506 UDP(sport=2152, dport=2152) /
1507 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1508 IPv6(src="2001::1", dst="2002::1") /
1509 ICMPv6EchoRequest())
1511 print("Sending packet on {}:".format(c1.name))
1517 c4.pg_start_capture()
1519 c1.pg_create_stream(p)
1522 # timeout (sleep) if needed
1526 print("Receiving packet on {}:".format(c4.name))
1527 for p in c4.pg_read_packets():
1530 def test_gtp6_drop_in_ipv6_5g(self):
1532 # trace add af-packet-input 10
1533 # pg interface on c1 172.20.0.1
1534 # pg interface on c4 B::1/120
1536 self.start_containers()
1538 print("Deleting the old containers...")
1540 print("Starting the new containers...")
1542 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1543 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1544 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1545 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1547 c1.pg_create_interface(
1548 local_ip="C::1/120",
1550 local_mac="aa:bb:cc:dd:ee:01",
1551 remote_mac="aa:bb:cc:dd:ee:02")
1552 c4.pg_create_interface(
1553 local_ip="B::1/120",
1555 local_mac="aa:bb:cc:dd:ee:11",
1556 remote_mac="aa:bb:cc:dd:ee:22")
1558 c1.vppctl_exec("set sr encaps source addr A1::1")
1559 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1562 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1564 c2.vppctl_exec("sr localsid address D2:: behavior end")
1566 c3.vppctl_exec("sr localsid address D3:: behavior end")
1568 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1570 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1571 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1572 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1573 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1574 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1579 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1580 IPv6(src="C::2", dst="D::2") /
1581 UDP(sport=2152, dport=2152) /
1582 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1583 GTPPDUSessionContainer(R=1, QFI=3) /
1584 IPv6(src="2001::1", dst="2002::1") /
1585 ICMPv6EchoRequest())
1587 print("Sending packet on {}:".format(c1.name))
1593 c4.pg_start_capture()
1595 c1.pg_create_stream(p)
1598 # timeout (sleep) if needed
1602 print("Receiving packet on {}:".format(c4.name))
1603 for p in c4.pg_read_packets():
1606 def test_gtp6(self):
1608 # trace add af-packet-input 10
1609 # pg interface on c1 172.20.0.1
1610 # pg interface on c4 B::1/120
1612 self.start_containers()
1614 print("Deleting the old containers...")
1616 print("Starting the new containers...")
1618 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1619 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1620 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1621 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1623 c1.pg_create_interface(
1624 local_ip="C::1/120",
1626 local_mac="aa:bb:cc:dd:ee:01",
1627 remote_mac="aa:bb:cc:dd:ee:02")
1628 c4.pg_create_interface4(
1629 local_ip="1.0.0.2/30",
1630 remote_ip="1.0.0.1",
1631 local_mac="aa:bb:cc:dd:ee:11",
1632 remote_mac="aa:bb:cc:dd:ee:22")
1634 c1.vppctl_exec("set sr encaps source addr A1::1")
1635 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1638 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1640 c2.vppctl_exec("sr localsid address D2:: behavior end")
1642 c3.vppctl_exec("sr localsid address D3:: behavior end")
1644 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
1646 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1647 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1648 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1649 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1650 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
1655 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1656 IPv6(src="C::2", dst="D::2") /
1657 UDP(sport=2152, dport=2152) /
1658 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1659 IP(src="172.100.0.1", dst="172.200.0.1") /
1662 print("Sending packet on {}:".format(c1.name))
1668 c4.pg_start_capture()
1670 c1.pg_create_stream(p)
1673 # timeout (sleep) if needed
1677 print("Receiving packet on {}:".format(c4.name))
1678 for p in c4.pg_read_packets():
1681 def test_gtp6_5g(self):
1683 # trace add af-packet-input 10
1684 # pg interface on c1 172.20.0.1
1685 # pg interface on c4 B::1/120
1687 self.start_containers()
1689 print("Deleting the old containers...")
1691 print("Starting the new containers...")
1693 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1694 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1695 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1696 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1698 c1.pg_create_interface(
1699 local_ip="C::1/120",
1701 local_mac="aa:bb:cc:dd:ee:01",
1702 remote_mac="aa:bb:cc:dd:ee:02")
1703 c4.pg_create_interface4(
1704 local_ip="1.0.0.2/30",
1705 remote_ip="1.0.0.1",
1706 local_mac="aa:bb:cc:dd:ee:11",
1707 remote_mac="aa:bb:cc:dd:ee:22")
1709 c1.vppctl_exec("set sr encaps source addr A1::1")
1710 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1713 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1715 c2.vppctl_exec("sr localsid address D2:: behavior end")
1717 c3.vppctl_exec("sr localsid address D3:: behavior end")
1719 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
1721 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1722 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1723 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1724 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1725 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
1730 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1731 IPv6(src="C::2", dst="D::2") /
1732 UDP(sport=2152, dport=2152) /
1733 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1734 GTPPDUSessionContainer(R=1, QFI=3) /
1735 IP(src="172.100.0.1", dst="172.200.0.1") /
1738 print("Sending packet on {}:".format(c1.name))
1744 c4.pg_start_capture()
1746 c1.pg_create_stream(p)
1749 # timeout (sleep) if needed
1753 print("Receiving packet on {}:".format(c4.name))
1754 for p in c4.pg_read_packets():
1757 def test_gtp6_ipv6(self):
1759 # trace add af-packet-input 10
1760 # pg interface on c1 172.20.0.1
1761 # pg interface on c4 B::1/120
1763 self.start_containers()
1765 print("Deleting the old containers...")
1767 print("Starting the new containers...")
1769 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1770 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1771 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1772 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1774 c1.pg_create_interface(
1775 local_ip="C::1/120",
1777 local_mac="aa:bb:cc:dd:ee:01",
1778 remote_mac="aa:bb:cc:dd:ee:02")
1779 c4.pg_create_interface(
1780 local_ip="B::1/120",
1782 local_mac="aa:bb:cc:dd:ee:11",
1783 remote_mac="aa:bb:cc:dd:ee:22")
1785 c1.vppctl_exec("set sr encaps source addr A1::1")
1786 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1789 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1791 c2.vppctl_exec("sr localsid address D2:: behavior end")
1793 c3.vppctl_exec("sr localsid address D3:: behavior end")
1795 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
1797 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1798 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1799 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1800 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1801 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
1806 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1807 IPv6(src="C::2", dst="D::2") /
1808 UDP(sport=2152, dport=2152) /
1809 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1810 IPv6(src="2001::1", dst="2002::1") /
1811 ICMPv6EchoRequest())
1813 print("Sending packet on {}:".format(c1.name))
1819 c4.pg_start_capture()
1821 c1.pg_create_stream(p)
1824 # timeout (sleep) if needed
1828 print("Receiving packet on {}:".format(c4.name))
1829 for p in c4.pg_read_packets():
1832 def test_gtp6_ipv6_5g(self):
1834 # trace add af-packet-input 10
1835 # pg interface on c1 172.20.0.1
1836 # pg interface on c4 B::1/120
1838 self.start_containers()
1840 print("Deleting the old containers...")
1842 print("Starting the new containers...")
1844 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1845 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1846 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1847 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1849 c1.pg_create_interface(
1850 local_ip="C::1/120",
1852 local_mac="aa:bb:cc:dd:ee:01",
1853 remote_mac="aa:bb:cc:dd:ee:02")
1854 c4.pg_create_interface(
1855 local_ip="B::1/120",
1857 local_mac="aa:bb:cc:dd:ee:11",
1858 remote_mac="aa:bb:cc:dd:ee:22")
1860 c1.vppctl_exec("set sr encaps source addr A1::1")
1861 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1864 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1866 c2.vppctl_exec("sr localsid address D2:: behavior end")
1868 c3.vppctl_exec("sr localsid address D3:: behavior end")
1870 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
1872 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1873 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1874 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1875 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1876 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
1881 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1882 IPv6(src="C::2", dst="D::2") /
1883 UDP(sport=2152, dport=2152) /
1884 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1885 GTPPDUSessionContainer(R=1, QFI=3) /
1886 IPv6(src="2001::1", dst="2002::1") /
1887 ICMPv6EchoRequest())
1889 print("Sending packet on {}:".format(c1.name))
1895 c4.pg_start_capture()
1897 c1.pg_create_stream(p)
1900 # timeout (sleep) if needed
1904 print("Receiving packet on {}:".format(c4.name))
1905 for p in c4.pg_read_packets():
1908 def status_containers(self):
1912 for i, name in enumerate(self.instance_names):
1913 name = self.get_name(name)
1914 print("\t[{}] {} - {}".format(
1916 "running" if self.containers.get(name) else "missing"))
1920 for i, name in enumerate(self.network_names):
1921 name = self.get_name(name)
1922 print("\t[{}] {} - {}".format(
1924 "running" if self.networks.get(name) else "missing"))
1926 def build_image(self):
1927 print("VPP Path (build): {}".format(self.vpp_path))
1928 self.containers.build(self.path, self.vpp_path)
1930 def release_image(self):
1931 print("VPP Path (release): {}".format(self.vpp_path))
1932 instance = self.containers.new("release-build")
1935 "docker cp release-build:{}/vpp-package.tgz {}/".format(
1936 self.vpp_path, self.vpp_path))
1940 self.containers.release(self.path, self.vpp_path)
1942 system("rm -rf {}/vpp-package.tgz".format(self.vpp_path))
1944 def vppctl(self, index, command=None):
1945 if index >= len(self.instance_names):
1947 name = self.get_name(self.instance_names[index])
1948 self.logger.error("connecting to: {}".format(name))
1949 self.containers.vppctl(name, command)
1951 def bash(self, index):
1952 if index >= len(self.instance_names):
1954 name = self.get_name(self.instance_names[index])
1955 self.logger.error("connecting to: {}".format(name))
1956 self.containers.bash(name)
1960 parser = ArgumentParser()
1962 parser.add_argument("--verbose", choices=['error', 'debug', 'info'])
1964 parser.add_argument('--image', choices=['debug', 'release'])
1966 subparsers = parser.add_subparsers()
1968 p1 = subparsers.add_parser(
1969 "infra", help="Infrastructure related commands.")
1981 p1.add_argument("--prefix")
1982 p1.add_argument("--image")
1984 p2 = subparsers.add_parser("cmd", help="Instance related commands.")
1986 p2.add_argument("op", choices=['vppctl', 'bash'])
1991 help="Container instance index. (./runner.py infra status)")
1994 "--command", help="Only vppctl supports this optional argument.")
1996 p3 = subparsers.add_parser("test", help="Test related commands.")
2015 "gtp6_drop_in_echo",
2016 "gtp6_drop_in_ipv6",
2017 "gtp6_drop_in_ipv6_5g",
2023 args = parser.parse_args()
2024 if not hasattr(args, "op") or not args.op:
2025 parser.print_help(sys.stderr)
2031 def main(op=None, prefix=None, verbose=None,
2032 image=None, index=None, command=None):
2035 basicConfig(level=verbose_levels[verbose])
2037 if image == 'release':
2038 image = "srv6m-release-image"
2039 elif image == 'debug':
2040 image = "srv6m-image"
2042 image = "srv6m-image"
2044 print("Target image: {}".format(image))
2046 program = Program(image, prefix)
2050 program.build_image()
2051 elif op == 'release':
2052 program.release_image()
2054 program.stop_containers()
2056 program.start_containers()
2057 elif op == 'status':
2058 program.status_containers()
2059 elif op == 'vppctl':
2060 program.vppctl(index, command)
2067 # elif op == 'tmap':
2068 # program.test_tmap()
2069 # elif op == 'tmap_5g':
2070 # program.test_tmap_5g()
2071 # elif op == 'tmap_ipv6':
2072 # program.test_tmap_ipv6()
2073 # elif op == 'tmap_ipv6_5g':
2074 # program.test_tmap_ipv6_5g()
2077 elif op == 'gtp4_usid':
2078 program.test_gtp4_usid()
2079 elif op == 'gtp4_5g':
2080 program.test_gtp4_5g()
2081 elif op == 'gtp4_echo':
2082 program.test_gtp4_echo()
2083 elif op == 'gtp4_ipv6':
2084 program.test_gtp4_ipv6()
2085 elif op == 'gtp4_ipv6_5g':
2086 program.test_gtp4_ipv6_5g()
2087 elif op == 'gtp6_drop_in':
2088 program.test_gtp6_drop_in()
2089 elif op == 'gtp6_drop_in_5g':
2090 program.test_gtp6_drop_in_5g()
2091 elif op == 'gtp6_drop_in_echo':
2092 program.test_gtp6_drop_in_echo()
2093 elif op == 'gtp6_drop_in_ipv6':
2094 program.test_gtp6_drop_in_ipv6()
2095 elif op == 'gtp6_drop_in_ipv6_5g':
2096 program.test_gtp6_drop_in_ipv6_5g()
2099 elif op == 'gtp6_5g':
2100 program.test_gtp6_5g()
2101 elif op == 'gtp6_ipv6':
2102 program.test_gtp6_ipv6()
2103 elif op == 'gtp6_ipv6_5g':
2104 program.test_gtp6_ipv6_5g()
2107 program.logger.exception("")
2115 if __name__ == "__main__":
2116 sys.exit(main(**get_args()))