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 ip 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 neighbor 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 ip addr pg0 {}".format(local_ip))
158 self.vppctl_exec("set ip neighbor pg0 {} {}".format(remote_ip, remote_mac))
159 self.vppctl_exec("set int state pg0 up")
161 def pg_create_interface4_name(self, ifname, local_ip, remote_ip, local_mac, remote_mac):
162 # remote_ip can't have subnet mask
165 self.vppctl_exec("create packet-generator interface {}".format(ifname))
166 self.vppctl_exec("set int mac address {} {}".format(ifname, local_mac))
167 self.vppctl_exec("set int ip addr {} {}".format(ifname, local_ip))
168 self.vppctl_exec("set ip neighbor {} {} {}".format(ifname, remote_ip, remote_mac))
169 self.vppctl_exec("set int state {} up".format(ifname))
171 def pg_create_interface6_name(self, ifname, local_ip, remote_ip, local_mac, remote_mac):
172 # remote_ip can't have subnet mask
175 self.vppctl_exec("create packet-generator interface {}".format(ifname))
176 self.vppctl_exec("set int mac address {} {}".format(ifname, local_mac))
177 self.vppctl_exec("set int ip addr {} {}".format(ifname, local_ip))
178 self.vppctl_exec("set ip neighbor {} {} {}".format(ifname, remote_ip, remote_mac))
179 self.vppctl_exec("set int state {} up".format(ifname))
182 # start packet generator
183 self.vppctl_exec("packet-generator enable")
185 def pg_create_stream(self, stream):
186 wrpcap(self.pg_input_file, stream)
188 "packet-generator new name pg-stream "
189 "node ethernet-input pcap {}".format(
190 self.pg_input_file_in))
192 def pg_start_capture(self):
193 if exists(self.pg_output_file):
194 remove(self.pg_output_file)
196 "packet-generator capture pg0 pcap {}".format(
197 self.pg_output_file_in))
199 def pg_start_capture_name(self, ifname):
200 if exists(self.pg_output_file):
201 remove(self.pg_output_file)
203 "packet-generator capture {} pcap {}".format(
204 ifname, self.pg_output_file_in))
206 def pg_read_packets(self):
207 return rdpcap(self.pg_output_file)
209 def set_ipv6_route(self, out_if_name, next_hop_ip, subnet):
211 "ip route add {} via host-{} {}".format(
212 subnet, out_if_name, next_hop_ip))
214 def set_ipv6_route2(self, out_if_name, next_hop_ip, subnet):
216 "ip route add {} via {} {}".format(
217 subnet, out_if_name, next_hop_ip))
219 def set_ip_pgroute(self, out_if_name, next_hop_ip, subnet):
220 self.vppctl_exec("ip route add {} via {} {}".format(
221 subnet, out_if_name, next_hop_ip))
223 def set_ipv6_pgroute(self, out_if_name, next_hop_ip, subnet):
224 self.vppctl_exec("ip route add {} via {} {}".format(
225 subnet, out_if_name, next_hop_ip))
227 def set_ipv6_default_route(self, out_if_name, next_hop_ip):
229 "ip route add ::/0 via host-{} {}".format(
230 out_if_name, next_hop_ip))
232 def enable_trace(self, count):
233 self.vppctl_exec("trace add af-packet-input {}".format(count))
236 class Containers(object):
238 def __init__(self, client, image):
242 def tmp_render(self, path, template, kwargs):
244 with open(path, "w") as fo:
245 fo.write(template.render(**kwargs))
247 register(lambda: remove(path))
249 def build(self, path, vpp_path):
250 env = Environment(loader=FileSystemLoader(path),
253 self.tmp_render(join(vpp_path, "Dockerfile"),
254 env.get_template("Dockerfile.j2"),
255 {'vpp_path': vpp_path})
257 self.tmp_render(join(vpp_path, "startup.conf"),
258 env.get_template("startup.conf.j2"),
259 {'vpp_path': vpp_path})
261 ref, _ = self.client.images.build(path=vpp_path,
262 tag=self.image, rm=True)
265 def release(self, path, vpp_path):
266 env = Environment(loader=FileSystemLoader(path),
269 self.tmp_render(join(vpp_path, "Dockerfile"),
270 env.get_template("Dockerfile.j2.release"),
271 {'vpp_path': vpp_path})
273 self.tmp_render(join(vpp_path, "startup.conf"),
274 env.get_template("startup.conf.j2"),
275 {'vpp_path': vpp_path})
277 ref, _ = self.client.images.build(path=vpp_path,
278 tag="srv6m-release-image", rm=True)
282 return Container.new(self.client, self.image, name)
285 return Container.get(self.client, name)
287 def vppctl(self, name, command=None):
288 container = self.get(name)
292 print(container.vppctl_exec(command).decode())
294 def bash(self, name):
295 container = self.get(name)
299 class Network(object):
301 def __init__(self, ref, name):
310 def new(cls, client, name):
311 ref = client.networks.create(name, driver="bridge",
312 check_duplicate=True)
313 return cls(ref, name)
316 def get(cls, client, name):
318 ref = client.networks.get(name)
322 return cls(ref, name)
327 def connect(self, c):
328 self._ref.connect(c.name)
331 class Networks(object):
333 def __init__(self, client):
337 return Network.new(self.client, name)
340 return Network.get(self.client, name)
343 class Program(object):
345 image = "srv6m-image"
349 # TODO: add description to these instances
350 # for exmaple what the vpp is supposed to be
351 # in our topoloty overview
353 instance_names = ["vpp-1",
358 network_names = ["net-1",
362 def __init__(self, image=None, prefix=None):
363 self.path = dirname(realpath(__file__))
367 if prefix is not None:
368 self.name_prefix = prefix
371 self.containers = Containers(client, self.image)
372 self.networks = Networks(client)
374 self.logger = getLogger(__name__)
378 return self.path.rsplit("/", 4)[0]
380 def get_name(self, name):
381 if not self.name_prefix:
383 return "{}-{}".format(self.name_prefix, name)
385 def stop_containers(self):
387 for name in self.instance_names:
388 instance = self.containers.get(self.get_name(name))
392 for name in self.network_names:
393 network = self.networks.get(self.get_name(name))
397 def start_containers(self):
399 self.stop_containers()
403 for name in self.network_names:
404 networks.append(self.networks.new(self.get_name(name)))
406 n1, n2, n3 = networks
410 for name in self.instance_names:
411 instances.append(self.containers.new(self.get_name(name)))
413 c1, c2, c3, c4 = instances
415 # setup packet generator interfaces
416 # c1.pg_create_interface(local_ip="C::1/120", remote_ip="C::2",
417 # local_mac="aa:bb:cc:dd:ee:01", remote_mac="aa:bb:cc:dd:ee:02")
419 # setup network between instances
430 c1.setup_host_interface("eth1", "A1::1/120")
431 c2.setup_host_interface("eth1", "A1::2/120")
434 c2.setup_host_interface("eth2", "A2::1/120")
435 c3.setup_host_interface("eth1", "A2::2/120")
438 c3.setup_host_interface("eth2", "A3::1/120")
439 c4.setup_host_interface("eth1", "A3::2/120")
441 # c1 > c2 default route
443 c1.set_ipv6_default_route("eth1", "A1::2")
444 # c2 > c3 default route
445 c2.set_ipv6_default_route("eth2", "A2::2")
446 # c3 > c2 default route
447 c3.set_ipv6_default_route("eth1", "A2::1")
448 # c4 > c3 default route
449 c4.set_ipv6_default_route("eth1", "A3::1")
451 # c3 > c4 static route for address B::1/128
452 c3.set_ipv6_route("eth2", "A3::2", "B::1/128")
453 c3.set_ipv6_route("eth2", "A3::2", "B::2/128")
457 # trace add af-packet-input 10
458 # pg interface on c1 172.20.0.1
459 # pg interface on c4 B::1/120
461 self.start_containers()
463 c1 = self.containers.get(self.get_name(self.instance_names[0]))
464 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
466 c1.pg_create_interface(
469 local_mac="aa:bb:cc:dd:ee:01",
470 remote_mac="aa:bb:cc:dd:ee:02")
471 c4.pg_create_interface(
474 local_mac="aa:bb:cc:dd:ee:11",
475 remote_mac="aa:bb:cc:dd:ee:22")
477 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
478 IPv6(src="C::2", dst="B::2") / ICMPv6EchoRequest())
480 print("Sending packet on {}:".format(c1.name))
486 c4.pg_start_capture()
488 c1.pg_create_stream(p)
491 # timeout (sleep) if needed
493 print("Receiving packet on {}:".format(c4.name))
494 for p in c4.pg_read_packets():
499 # trace add af-packet-input 10
500 # pg interface on c1 C::1/120
501 # pg interface on c4 B::1/120
503 self.start_containers()
508 c1 = self.containers.get(self.get_name(self.instance_names[0]))
509 c2 = self.containers.get(self.get_name(self.instance_names[1]))
510 c3 = self.containers.get(self.get_name(self.instance_names[2]))
511 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
513 c1.pg_create_interface(
516 local_mac="aa:bb:cc:dd:ee:01",
517 remote_mac="aa:bb:cc:dd:ee:02")
518 c4.pg_create_interface(
521 local_mac="aa:bb:cc:dd:ee:11",
522 remote_mac="aa:bb:cc:dd:ee:22")
524 c1.vppctl_exec("set sr encaps source addr D1::")
526 "sr policy add bsid D1::999:1 next D2:: next D3:: next D4::")
527 c1.vppctl_exec("sr steer l3 B::/120 via bsid D1::999:1")
529 c2.vppctl_exec("sr localsid address D2:: behavior end")
531 c3.vppctl_exec("sr localsid address D3:: behavior end")
533 c4.vppctl_exec("sr localsid address D4:: behavior end.dx6 pg0 B::2")
535 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
536 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
537 c3.set_ipv6_route("eth2", "A3::2", "D4::/128")
538 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
540 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
541 IPv6(src="C::2", dst="B::2") / ICMPv6EchoRequest())
543 print("Sending packet on {}:".format(c1.name))
551 c4.pg_start_capture()
553 c1.pg_create_stream(p)
556 # timeout (sleep) if needed
558 print("Receiving packet on {}:".format(c4.name))
559 for p in c4.pg_read_packets():
562 ''' T.Map is obsolete
565 # trace add af-packet-input 10
566 # pg interface on c1 172.20.0.1
567 # pg interface on c4 B::1/120
569 self.start_containers()
571 c1 = self.containers.get(self.get_name(self.instance_names[0]))
572 c2 = self.containers.get(self.get_name(self.instance_names[1]))
573 c3 = self.containers.get(self.get_name(self.instance_names[2]))
574 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
576 c1.pg_create_interface4(
577 local_ip="172.16.0.1/30",
578 remote_ip="172.16.0.2/30",
579 local_mac="aa:bb:cc:dd:ee:01",
580 remote_mac="aa:bb:cc:dd:ee:02")
581 c4.pg_create_interface4(
582 local_ip="1.0.0.2/30",
584 local_mac="aa:bb:cc:dd:ee:11",
585 remote_mac="aa:bb:cc:dd:ee:22")
587 c1.vppctl_exec("set sr encaps source addr A1::1")
589 "sr policy add bsid D1:: next D2:: next D3:: "
590 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
591 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
593 c2.vppctl_exec("sr localsid address D2:: behavior end")
595 c3.vppctl_exec("sr localsid address D3:: behavior end")
598 "sr localsid prefix D4::/32 "
599 "behavior end.m.gtp4.e v4src_position 64")
601 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
602 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
603 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
604 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
605 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
607 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
608 IP(src="172.20.0.2", dst="172.20.0.1") /
609 UDP(sport=2152, dport=2152) /
610 GTP_U_Header(gtp_type="g_pdu", teid=200) /
611 IP(src="172.99.0.1", dst="172.99.0.2") /
614 print("Sending packet on {}:".format(c1.name))
620 c4.pg_start_capture()
622 c1.pg_create_stream(p)
625 # timeout (sleep) if needed
629 print("Receiving packet on {}:".format(c4.name))
630 for p in c4.pg_read_packets():
633 def test_tmap_5g(self):
635 # trace add af-packet-input 10
636 # pg interface on c1 172.20.0.1
637 # pg interface on c4 B::1/120
639 self.start_containers()
641 c1 = self.containers.get(self.get_name(self.instance_names[0]))
642 c2 = self.containers.get(self.get_name(self.instance_names[1]))
643 c3 = self.containers.get(self.get_name(self.instance_names[2]))
644 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
646 c1.pg_create_interface4(
647 local_ip="172.16.0.1/30",
648 remote_ip="172.16.0.2/30",
649 local_mac="aa:bb:cc:dd:ee:01",
650 remote_mac="aa:bb:cc:dd:ee:02")
651 c4.pg_create_interface4(
652 local_ip="1.0.0.2/30",
654 local_mac="aa:bb:cc:dd:ee:11",
655 remote_mac="aa:bb:cc:dd:ee:22")
657 c1.vppctl_exec("set sr encaps source addr A1::1")
659 "sr policy add bsid D1:: next D2:: next D3:: "
660 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
661 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
663 c2.vppctl_exec("sr localsid address D2:: behavior end")
665 c3.vppctl_exec("sr localsid address D3:: behavior end")
668 "sr localsid prefix D4::/32 "
669 "behavior end.m.gtp4.e v4src_position 64")
671 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
672 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
673 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
674 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
675 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
677 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
678 IP(src="172.20.0.2", dst="172.20.0.1") /
679 UDP(sport=2152, dport=2152) /
680 GTP_U_Header(gtp_type="g_pdu", teid=200) /
681 GTPPDUSessionContainer(R=1, QFI=3) /
682 IP(src="172.99.0.1", dst="172.99.0.2") /
685 print("Sending packet on {}:".format(c1.name))
691 c4.pg_start_capture()
693 c1.pg_create_stream(p)
696 # timeout (sleep) if needed
700 print("Receiving packet on {}:".format(c4.name))
701 for p in c4.pg_read_packets():
704 def test_tmap_ipv6(self):
706 # trace add af-packet-input 10
707 # pg interface on c1 172.20.0.1
708 # pg interface on c4 B::1/120
710 self.start_containers()
712 c1 = self.containers.get(self.get_name(self.instance_names[0]))
713 c2 = self.containers.get(self.get_name(self.instance_names[1]))
714 c3 = self.containers.get(self.get_name(self.instance_names[2]))
715 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
717 c1.pg_create_interface4(
718 local_ip="172.16.0.1/30",
719 remote_ip="172.16.0.2/30",
720 local_mac="aa:bb:cc:dd:ee:01",
721 remote_mac="aa:bb:cc:dd:ee:02")
722 c4.pg_create_interface4(
723 local_ip="1.0.0.2/30",
725 local_mac="aa:bb:cc:dd:ee:11",
726 remote_mac="aa:bb:cc:dd:ee:22")
728 c1.vppctl_exec("set sr encaps source addr A1::1")
730 "sr policy add bsid D1:: next D2:: next D3:: "
731 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
732 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
734 c2.vppctl_exec("sr localsid address D2:: behavior end")
736 c3.vppctl_exec("sr localsid address D3:: behavior end")
739 "sr localsid prefix D4::/32 "
740 "behavior end.m.gtp4.e v4src_position 64")
742 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
743 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
744 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
745 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
746 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
748 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
749 IP(src="172.20.0.2", dst="172.20.0.1") /
750 UDP(sport=2152, dport=2152) /
751 GTP_U_Header(gtp_type="g_pdu", teid=200) /
752 IPv6(src="2001::1", dst="2002::1") /
755 print("Sending packet on {}:".format(c1.name))
761 c4.pg_start_capture()
763 c1.pg_create_stream(p)
766 # timeout (sleep) if needed
770 print("Receiving packet on {}:".format(c4.name))
771 for p in c4.pg_read_packets():
774 def test_tmap_ipv6_5g(self):
776 # trace add af-packet-input 10
777 # pg interface on c1 172.20.0.1
778 # pg interface on c4 B::1/120
780 self.start_containers()
782 c1 = self.containers.get(self.get_name(self.instance_names[0]))
783 c2 = self.containers.get(self.get_name(self.instance_names[1]))
784 c3 = self.containers.get(self.get_name(self.instance_names[2]))
785 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
787 c1.pg_create_interface4(
788 local_ip="172.16.0.1/30",
789 remote_ip="172.16.0.2/30",
790 local_mac="aa:bb:cc:dd:ee:01",
791 remote_mac="aa:bb:cc:dd:ee:02")
792 c4.pg_create_interface4(
793 local_ip="1.0.0.2/30",
795 local_mac="aa:bb:cc:dd:ee:11",
796 remote_mac="aa:bb:cc:dd:ee:22")
798 c1.vppctl_exec("set sr encaps source addr A1::1")
800 "sr policy add bsid D1:: next D2:: next D3:: "
801 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
802 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
804 c2.vppctl_exec("sr localsid address D2:: behavior end")
806 c3.vppctl_exec("sr localsid address D3:: behavior end")
809 "sr localsid prefix D4::/32 "
810 "behavior end.m.gtp4.e v4src_position 64")
812 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
813 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
814 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
815 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
816 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
818 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
819 IP(src="172.20.0.2", dst="172.20.0.1") /
820 UDP(sport=2152, dport=2152) /
821 GTP_U_Header(gtp_type="g_pdu", teid=200) /
822 GTPPDUSessionContainer(R=1, QFI=3) /
823 IPv6(src="2001::1", dst="2002::1") /
826 print("Sending packet on {}:".format(c1.name))
827 print("Sending packet on {}:".format(c1.name))
833 c4.pg_start_capture()
835 c1.pg_create_stream(p)
838 # timeout (sleep) if needed
842 print("Receiving packet on {}:".format(c4.name))
843 for p in c4.pg_read_packets():
849 # trace add af-packet-input 10
850 # pg interface on c1 172.20.0.1
851 # pg interface on c4 B::1/120
853 self.start_containers()
855 c1 = self.containers.get(self.get_name(self.instance_names[0]))
856 c2 = self.containers.get(self.get_name(self.instance_names[1]))
857 c3 = self.containers.get(self.get_name(self.instance_names[2]))
858 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
860 c1.pg_create_interface4(
861 local_ip="172.16.0.1/30",
862 remote_ip="172.16.0.2/30",
863 local_mac="aa:bb:cc:dd:ee:01",
864 remote_mac="aa:bb:cc:dd:ee:02")
865 c4.pg_create_interface4(
866 local_ip="1.0.0.2/30",
868 local_mac="aa:bb:cc:dd:ee:11",
869 remote_mac="aa:bb:cc:dd:ee:22")
871 c1.vppctl_exec("set sr encaps source addr A1::1")
872 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
873 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
874 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
876 c2.vppctl_exec("sr localsid address D2:: behavior end")
878 c3.vppctl_exec("sr localsid address D3:: behavior end")
881 "sr localsid prefix D4::/32 "
882 "behavior end.m.gtp4.e v4src_position 64")
884 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
885 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
886 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
887 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
888 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
890 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
891 IP(src="172.20.0.2", dst="172.20.0.1") /
892 UDP(sport=2152, dport=2152) /
893 GTP_U_Header(gtp_type="g_pdu", teid=200) /
894 IP(src="172.99.0.1", dst="172.99.0.2") /
897 print("Sending packet on {}:".format(c1.name))
904 c4.pg_start_capture()
906 c1.pg_create_stream(p)
909 # timeout (sleep) if needed
913 print("Receiving packet on {}:".format(c4.name))
914 for p in c4.pg_read_packets():
917 def test_gtp4_usid(self):
919 # trace add af-packet-input 10
920 # pg interface on c1 172.20.0.1
921 # pg interface on c4 B::1/120
923 self.start_containers()
925 c1 = self.containers.get(self.get_name(self.instance_names[0]))
926 c2 = self.containers.get(self.get_name(self.instance_names[1]))
927 c3 = self.containers.get(self.get_name(self.instance_names[2]))
928 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
930 c1.pg_create_interface4(
931 local_ip="172.16.0.1/30",
932 remote_ip="172.16.0.2/30",
933 local_mac="aa:bb:cc:dd:ee:01",
934 remote_mac="aa:bb:cc:dd:ee:02")
935 c4.pg_create_interface4(
936 local_ip="1.0.0.2/30",
938 local_mac="aa:bb:cc:dd:ee:11",
939 remote_mac="aa:bb:cc:dd:ee:22")
941 c1.vppctl_exec("set sr encaps source addr A1::1")
942 c1.vppctl_exec("sr policy add bsid D4:: next D2:1111:aaaa:bbbb::")
943 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
944 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
946 c2.vppctl_exec("sr localsid prefix D2:1111:aaaa::/48 behavior end usid 16")
948 c3.vppctl_exec("sr localsid prefix D2:1111:bbbb::/48 behavior end usid 16")
951 "sr localsid prefix D4::/32 "
952 "behavior end.m.gtp4.e v4src_position 64")
954 c2.set_ipv6_route("eth2", "A2::2", "D2:1111:bbbb::/48")
955 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
956 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
957 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
958 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
960 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
961 IP(src="172.20.0.2", dst="172.20.0.1") /
962 UDP(sport=2152, dport=2152) /
963 GTP_U_Header(gtp_type="g_pdu", teid=200) /
964 IP(src="172.99.0.1", dst="172.99.0.2") /
967 print("Sending packet on {}:".format(c1.name))
974 c4.pg_start_capture()
976 c1.pg_create_stream(p)
979 # timeout (sleep) if needed
983 print("Receiving packet on {}:".format(c4.name))
984 for p in c4.pg_read_packets():
987 def test_gtp4_5g(self):
989 # trace add af-packet-input 10
990 # pg interface on c1 172.20.0.1
991 # pg interface on c4 B::1/120
993 self.start_containers()
995 c1 = self.containers.get(self.get_name(self.instance_names[0]))
996 c2 = self.containers.get(self.get_name(self.instance_names[1]))
997 c3 = self.containers.get(self.get_name(self.instance_names[2]))
998 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1000 c1.pg_create_interface4(
1001 local_ip="172.16.0.1/30",
1002 remote_ip="172.16.0.2/30",
1003 local_mac="aa:bb:cc:dd:ee:01",
1004 remote_mac="aa:bb:cc:dd:ee:02")
1005 c4.pg_create_interface4(
1006 local_ip="1.0.0.2/30",
1007 remote_ip="1.0.0.1",
1008 local_mac="aa:bb:cc:dd:ee:11",
1009 remote_mac="aa:bb:cc:dd:ee:22")
1011 c1.vppctl_exec("set sr encaps source addr A1::1")
1012 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1013 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
1014 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1016 c2.vppctl_exec("sr localsid address D2:: behavior end")
1018 c3.vppctl_exec("sr localsid address D3:: behavior end")
1021 "sr localsid prefix D4::/32 "
1022 "behavior end.m.gtp4.e v4src_position 64")
1024 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1025 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1026 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1027 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1028 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1030 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1031 IP(src="172.20.0.2", dst="172.20.0.1") /
1032 UDP(sport=2152, dport=2152) /
1033 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1034 GTPPDUSessionContainer(type=1, R=1, QFI=3) /
1035 IP(src="172.99.0.1", dst="172.99.0.2") /
1038 print("Sending packet on {}:".format(c1.name))
1044 c4.pg_start_capture()
1046 c1.pg_create_stream(p)
1049 # timeout (sleep) if needed
1053 print("Receiving packet on {}:".format(c4.name))
1054 for p in c4.pg_read_packets():
1057 def test_gtp4_echo(self):
1059 # trace add af-packet-input 10
1060 # pg interface on c1 172.20.0.1
1061 # pg interface on c4 B::1/120
1063 self.start_containers()
1065 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1066 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1067 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1068 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1070 c1.pg_create_interface4(
1071 local_ip="172.16.0.1/30",
1072 remote_ip="172.16.0.2/30",
1073 local_mac="aa:bb:cc:dd:ee:01",
1074 remote_mac="aa:bb:cc:dd:ee:02")
1075 c4.pg_create_interface4(
1076 local_ip="1.0.0.2/30",
1077 remote_ip="1.0.0.1",
1078 local_mac="aa:bb:cc:dd:ee:11",
1079 remote_mac="aa:bb:cc:dd:ee:22")
1081 c1.vppctl_exec("set sr encaps source addr A1::1")
1082 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1083 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
1084 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1086 c2.vppctl_exec("sr localsid address D2:: behavior end")
1088 c3.vppctl_exec("sr localsid address D3:: behavior end")
1091 "sr localsid prefix D4::/32 "
1092 "behavior end.m.gtp4.e v4src_position 64")
1094 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1095 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1096 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1097 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1098 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1100 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1101 IP(src="172.20.0.2", dst="172.20.0.1") /
1102 UDP(sport=2152, dport=2152) /
1103 GTP_U_Header(gtp_type="echo_request", S=1, teid=200, seq=200))
1105 print("Sending packet on {}:".format(c1.name))
1111 c4.pg_start_capture()
1113 c1.pg_create_stream(p)
1116 # timeout (sleep) if needed
1120 print("Receiving packet on {}:".format(c4.name))
1121 for p in c4.pg_read_packets():
1124 def test_gtp4_reply(self):
1126 # trace add af-packet-input 10
1127 # pg interface on c1 172.20.0.1
1128 # pg interface on c4 B::1/120
1130 self.start_containers()
1132 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1133 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1134 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1135 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1137 c1.pg_create_interface4(
1138 local_ip="172.16.0.1/30",
1139 remote_ip="172.16.0.2/30",
1140 local_mac="aa:bb:cc:dd:ee:01",
1141 remote_mac="aa:bb:cc:dd:ee:02")
1142 c4.pg_create_interface4(
1143 local_ip="1.0.0.2/30",
1144 remote_ip="1.0.0.1",
1145 local_mac="aa:bb:cc:dd:ee:11",
1146 remote_mac="aa:bb:cc:dd:ee:22")
1148 c1.vppctl_exec("set sr encaps source addr A1::1")
1149 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1150 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
1151 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1153 c2.vppctl_exec("sr localsid address D2:: behavior end")
1155 c3.vppctl_exec("sr localsid address D3:: behavior end")
1158 "sr localsid prefix D4::/32 "
1159 "behavior end.m.gtp4.e v4src_position 64")
1161 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1162 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1163 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1164 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1165 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1167 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1168 IP(src="172.20.0.2", dst="172.20.0.1") /
1169 UDP(sport=2152, dport=2152) /
1170 GTP_U_Header(gtp_type="echo_response", S=1, teid=200, seq=200))
1172 print("Sending packet on {}:".format(c1.name))
1178 c4.pg_start_capture()
1180 c1.pg_create_stream(p)
1183 # timeout (sleep) if needed
1187 print("Receiving packet on {}:".format(c4.name))
1188 for p in c4.pg_read_packets():
1191 def test_gtp4_error(self):
1193 # trace add af-packet-input 10
1194 # pg interface on c1 172.20.0.1
1195 # pg interface on c4 B::1/120
1197 self.start_containers()
1199 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1200 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1201 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1202 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1204 c1.pg_create_interface4(
1205 local_ip="172.16.0.1/30",
1206 remote_ip="172.16.0.2/30",
1207 local_mac="aa:bb:cc:dd:ee:01",
1208 remote_mac="aa:bb:cc:dd:ee:02")
1209 c4.pg_create_interface4(
1210 local_ip="1.0.0.2/30",
1211 remote_ip="1.0.0.1",
1212 local_mac="aa:bb:cc:dd:ee:11",
1213 remote_mac="aa:bb:cc:dd:ee:22")
1215 c1.vppctl_exec("set sr encaps source addr A1::1")
1216 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1217 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
1218 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1220 c2.vppctl_exec("sr localsid address D2:: behavior end")
1222 c3.vppctl_exec("sr localsid address D3:: behavior end")
1225 "sr localsid prefix D4::/32 "
1226 "behavior end.m.gtp4.e v4src_position 64")
1228 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1229 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1230 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1231 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1232 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1234 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1235 IP(src="172.20.0.2", dst="172.20.0.1") /
1236 UDP(sport=2152, dport=2152) /
1237 GTP_U_Header(gtp_type="error_indication", S=1, teid=200, seq=200)/
1238 IE_TEIDI(TEIDI=65535)/IE_GSNAddress(address="1.1.1.1")/
1239 IE_PrivateExtension(extention_value="z"))
1241 print("Sending packet on {}:".format(c1.name))
1247 c4.pg_start_capture()
1249 c1.pg_create_stream(p)
1252 # timeout (sleep) if needed
1256 print("Receiving packet on {}:".format(c4.name))
1257 for p in c4.pg_read_packets():
1260 def test_gtp4_ipv6(self):
1262 # trace add af-packet-input 10
1263 # pg interface on c1 172.20.0.1
1264 # pg interface on c4 B::1/120
1266 self.start_containers()
1268 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1269 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1270 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1271 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1273 c1.pg_create_interface4(
1274 local_ip="172.16.0.1/30",
1275 remote_ip="172.16.0.2/30",
1276 local_mac="aa:bb:cc:dd:ee:01",
1277 remote_mac="aa:bb:cc:dd:ee:02")
1278 c4.pg_create_interface4(
1279 local_ip="1.0.0.2/30",
1280 remote_ip="1.0.0.1",
1281 local_mac="aa:bb:cc:dd:ee:11",
1282 remote_mac="aa:bb:cc:dd:ee:22")
1284 c1.vppctl_exec("set sr encaps source addr A1::1")
1285 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1286 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64")
1287 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1289 c2.vppctl_exec("sr localsid address D2:: behavior end")
1291 c3.vppctl_exec("sr localsid address D3:: behavior end")
1294 "sr localsid prefix D4::/32 "
1295 "behavior end.m.gtp4.e v4src_position 64")
1297 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1298 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1299 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1300 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1301 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1303 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1304 IP(src="172.20.0.2", dst="172.20.0.1") /
1305 UDP(sport=2152, dport=2152) /
1306 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1307 IPv6(src="2001::1", dst="2002::1") /
1308 ICMPv6EchoRequest())
1310 print("Sending packet on {}:".format(c1.name))
1316 c4.pg_start_capture()
1318 c1.pg_create_stream(p)
1321 # timeout (sleep) if needed
1325 print("Receiving packet on {}:".format(c4.name))
1326 for p in c4.pg_read_packets():
1329 def test_gtp4_ipv6_5g(self):
1331 # trace add af-packet-input 10
1332 # pg interface on c1 172.20.0.1
1333 # pg interface on c4 B::1/120
1335 self.start_containers()
1337 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1338 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1339 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1340 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1342 c1.pg_create_interface4(
1343 local_ip="172.16.0.1/30",
1344 remote_ip="172.16.0.2/30",
1345 local_mac="aa:bb:cc:dd:ee:01",
1346 remote_mac="aa:bb:cc:dd:ee:02")
1347 c4.pg_create_interface4(
1348 local_ip="1.0.0.2/30",
1349 remote_ip="1.0.0.1",
1350 local_mac="aa:bb:cc:dd:ee:11",
1351 remote_mac="aa:bb:cc:dd:ee:22")
1353 c1.vppctl_exec("set sr encaps source addr A1::1")
1354 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1355 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64")
1356 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1358 c2.vppctl_exec("sr localsid address D2:: behavior end")
1360 c3.vppctl_exec("sr localsid address D3:: behavior end")
1363 "sr localsid prefix D4::/32 "
1364 "behavior end.m.gtp4.e v4src_position 64")
1366 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1367 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1368 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1369 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1370 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1372 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1373 IP(src="172.20.0.2", dst="172.20.0.1") /
1374 UDP(sport=2152, dport=2152) /
1375 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1376 GTPPDUSessionContainer(R=1, QFI=3) /
1377 IPv6(src="2001::1", dst="2002::1") /
1378 ICMPv6EchoRequest())
1380 print("Sending packet on {}:".format(c1.name))
1386 c4.pg_start_capture()
1388 c1.pg_create_stream(p)
1391 # timeout (sleep) if needed
1395 print("Receiving packet on {}:".format(c4.name))
1396 for p in c4.pg_read_packets():
1399 def test_gtp6_drop_in(self):
1401 # trace add af-packet-input 10
1402 # pg interface on c1 172.20.0.1
1403 # pg interface on c4 B::1/120
1405 self.start_containers()
1407 print("Deleting the old containers...")
1409 print("Starting the new containers...")
1411 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1412 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1413 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1414 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1416 c1.pg_create_interface(
1417 local_ip="C::1/120",
1419 local_mac="aa:bb:cc:dd:ee:01",
1420 remote_mac="aa:bb:cc:dd:ee:02")
1421 c4.pg_create_interface(
1422 local_ip="B::1/120",
1424 local_mac="aa:bb:cc:dd:ee:11",
1425 remote_mac="aa:bb:cc:dd:ee:22")
1427 c1.vppctl_exec("set sr encaps source addr A1::1")
1428 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1431 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1433 c2.vppctl_exec("sr localsid address D2:: behavior end")
1435 c3.vppctl_exec("sr localsid address D3:: behavior end")
1437 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1439 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1440 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1441 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1442 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1443 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1448 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1449 IPv6(src="C::2", dst="D::2") /
1450 UDP(sport=2152, dport=2152) /
1451 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1452 IP(src="172.99.0.1", dst="172.99.0.2") /
1455 print("Sending packet on {}:".format(c1.name))
1461 c4.pg_start_capture()
1463 c1.pg_create_stream(p)
1466 # timeout (sleep) if needed
1470 print("Receiving packet on {}:".format(c4.name))
1471 for p in c4.pg_read_packets():
1474 def test_gtp6_drop_in_5g(self):
1476 # trace add af-packet-input 10
1477 # pg interface on c1 172.20.0.1
1478 # pg interface on c4 B::1/120
1480 self.start_containers()
1482 print("Deleting the old containers...")
1484 print("Starting the new containers...")
1486 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1487 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1488 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1489 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1491 c1.pg_create_interface(
1492 local_ip="C::1/120",
1494 local_mac="aa:bb:cc:dd:ee:01",
1495 remote_mac="aa:bb:cc:dd:ee:02")
1496 c4.pg_create_interface(
1497 local_ip="B::1/120",
1499 local_mac="aa:bb:cc:dd:ee:11",
1500 remote_mac="aa:bb:cc:dd:ee:22")
1502 c1.vppctl_exec("set sr encaps source addr A1::1")
1503 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1506 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1508 c2.vppctl_exec("sr localsid address D2:: behavior end")
1510 c3.vppctl_exec("sr localsid address D3:: behavior end")
1512 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1514 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1515 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1516 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1517 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1518 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1523 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1524 IPv6(src="C::2", dst="D::2") /
1525 UDP(sport=2152, dport=2152) /
1526 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1527 GTPPDUSessionContainer(type=1, R=1, QFI=3) /
1528 IP(src="172.99.0.1", dst="172.99.0.2") /
1531 print("Sending packet on {}:".format(c1.name))
1537 c4.pg_start_capture()
1539 c1.pg_create_stream(p)
1542 # timeout (sleep) if needed
1546 print("Receiving packet on {}:".format(c4.name))
1547 for p in c4.pg_read_packets():
1550 def test_gtp6_drop_in_echo(self):
1552 # trace add af-packet-input 10
1553 # pg interface on c1 172.20.0.1
1554 # pg interface on c4 B::1/120
1556 self.start_containers()
1558 print("Deleting the old containers...")
1560 print("Starting the new containers...")
1562 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1563 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1564 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1565 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1567 c1.pg_create_interface(
1568 local_ip="C::1/120",
1570 local_mac="aa:bb:cc:dd:ee:01",
1571 remote_mac="aa:bb:cc:dd:ee:02")
1572 c4.pg_create_interface(
1573 local_ip="B::1/120",
1575 local_mac="aa:bb:cc:dd:ee:11",
1576 remote_mac="aa:bb:cc:dd:ee:22")
1578 c1.vppctl_exec("set sr encaps source addr A1::1")
1579 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1582 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1584 c2.vppctl_exec("sr localsid address D2:: behavior end")
1586 c3.vppctl_exec("sr localsid address D3:: behavior end")
1588 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1590 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1591 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1592 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1593 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1594 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1599 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1600 IPv6(src="C::2", dst="D::2") /
1601 UDP(sport=2152, dport=2152) /
1602 GTP_U_Header(gtp_type="echo_request", S=1, teid=200, seq=300))
1604 print("Sending packet on {}:".format(c1.name))
1610 c4.pg_start_capture()
1612 c1.pg_create_stream(p)
1615 # timeout (sleep) if needed
1619 print("Receiving packet on {}:".format(c4.name))
1620 for p in c4.pg_read_packets():
1623 def test_gtp6_drop_in_reply(self):
1625 # trace add af-packet-input 10
1626 # pg interface on c1 172.20.0.1
1627 # pg interface on c4 B::1/120
1629 self.start_containers()
1631 print("Deleting the old containers...")
1633 print("Starting the new containers...")
1635 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1636 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1637 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1638 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1640 c1.pg_create_interface(
1641 local_ip="C::1/120",
1643 local_mac="aa:bb:cc:dd:ee:01",
1644 remote_mac="aa:bb:cc:dd:ee:02")
1645 c4.pg_create_interface(
1646 local_ip="B::1/120",
1648 local_mac="aa:bb:cc:dd:ee:11",
1649 remote_mac="aa:bb:cc:dd:ee:22")
1651 c1.vppctl_exec("set sr encaps source addr A1::1")
1652 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1655 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1657 c2.vppctl_exec("sr localsid address D2:: behavior end")
1659 c3.vppctl_exec("sr localsid address D3:: behavior end")
1661 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1663 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1664 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1665 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1666 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1667 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1672 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1673 IPv6(src="C::2", dst="D::2") /
1674 UDP(sport=2152, dport=2152) /
1675 GTP_U_Header(gtp_type="echo_response", S=1, teid=200, seq=300))
1677 print("Sending packet on {}:".format(c1.name))
1683 c4.pg_start_capture()
1685 c1.pg_create_stream(p)
1688 # timeout (sleep) if needed
1692 print("Receiving packet on {}:".format(c4.name))
1693 for p in c4.pg_read_packets():
1696 def test_gtp6_drop_in_error(self):
1698 # trace add af-packet-input 10
1699 # pg interface on c1 172.20.0.1
1700 # pg interface on c4 B::1/120
1702 self.start_containers()
1704 print("Deleting the old containers...")
1706 print("Starting the new containers...")
1708 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1709 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1710 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1711 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1713 c1.pg_create_interface(
1714 local_ip="C::1/120",
1716 local_mac="aa:bb:cc:dd:ee:01",
1717 remote_mac="aa:bb:cc:dd:ee:02")
1718 c4.pg_create_interface(
1719 local_ip="B::1/120",
1721 local_mac="aa:bb:cc:dd:ee:11",
1722 remote_mac="aa:bb:cc:dd:ee:22")
1724 c1.vppctl_exec("set sr encaps source addr A1::1")
1725 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1728 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1730 c2.vppctl_exec("sr localsid address D2:: behavior end")
1732 c3.vppctl_exec("sr localsid address D3:: behavior end")
1734 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1736 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1737 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1738 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1739 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1740 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1745 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1746 IPv6(src="C::2", dst="D::2") /
1747 UDP(sport=2152, dport=2152) /
1748 GTP_U_Header(gtp_type="error_indication", S=1, teid=200, seq=300)/
1749 IE_TEIDI(TEIDI=65535)/IE_GSNAddress(address="1.1.1.1")/
1750 IE_PrivateExtension(extention_value="z"))
1752 print("Sending packet on {}:".format(c1.name))
1758 c4.pg_start_capture()
1760 c1.pg_create_stream(p)
1763 # timeout (sleep) if needed
1767 print("Receiving packet on {}:".format(c4.name))
1768 for p in c4.pg_read_packets():
1771 def test_gtp6_drop_in_ipv6(self):
1773 # trace add af-packet-input 10
1774 # pg interface on c1 172.20.0.1
1775 # pg interface on c4 B::1/120
1777 self.start_containers()
1779 print("Deleting the old containers...")
1781 print("Starting the new containers...")
1783 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1784 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1785 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1786 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1788 c1.pg_create_interface(
1789 local_ip="C::1/120",
1791 local_mac="aa:bb:cc:dd:ee:01",
1792 remote_mac="aa:bb:cc:dd:ee:02")
1793 c4.pg_create_interface(
1794 local_ip="B::1/120",
1796 local_mac="aa:bb:cc:dd:ee:11",
1797 remote_mac="aa:bb:cc:dd:ee:22")
1799 c1.vppctl_exec("set sr encaps source addr A1::1")
1800 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1803 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1805 c2.vppctl_exec("sr localsid address D2:: behavior end")
1807 c3.vppctl_exec("sr localsid address D3:: behavior end")
1809 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1811 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1812 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1813 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1814 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1815 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1820 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1821 IPv6(src="C::2", dst="D::2") /
1822 UDP(sport=2152, dport=2152) /
1823 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1824 IPv6(src="2001::1", dst="2002::1") /
1825 ICMPv6EchoRequest())
1827 print("Sending packet on {}:".format(c1.name))
1833 c4.pg_start_capture()
1835 c1.pg_create_stream(p)
1838 # timeout (sleep) if needed
1842 print("Receiving packet on {}:".format(c4.name))
1843 for p in c4.pg_read_packets():
1846 def test_gtp6_drop_in_ipv6_5g(self):
1848 # trace add af-packet-input 10
1849 # pg interface on c1 172.20.0.1
1850 # pg interface on c4 B::1/120
1852 self.start_containers()
1854 print("Deleting the old containers...")
1856 print("Starting the new containers...")
1858 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1859 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1860 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1861 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1863 c1.pg_create_interface(
1864 local_ip="C::1/120",
1866 local_mac="aa:bb:cc:dd:ee:01",
1867 remote_mac="aa:bb:cc:dd:ee:02")
1868 c4.pg_create_interface(
1869 local_ip="B::1/120",
1871 local_mac="aa:bb:cc:dd:ee:11",
1872 remote_mac="aa:bb:cc:dd:ee:22")
1874 c1.vppctl_exec("set sr encaps source addr A1::1")
1875 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1878 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1880 c2.vppctl_exec("sr localsid address D2:: behavior end")
1882 c3.vppctl_exec("sr localsid address D3:: behavior end")
1884 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1886 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1887 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1888 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1889 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1890 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1895 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1896 IPv6(src="C::2", dst="D::2") /
1897 UDP(sport=2152, dport=2152) /
1898 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1899 GTPPDUSessionContainer(R=1, QFI=3) /
1900 IPv6(src="2001::1", dst="2002::1") /
1901 ICMPv6EchoRequest())
1903 print("Sending packet on {}:".format(c1.name))
1909 c4.pg_start_capture()
1911 c1.pg_create_stream(p)
1914 # timeout (sleep) if needed
1918 print("Receiving packet on {}:".format(c4.name))
1919 for p in c4.pg_read_packets():
1922 def test_gtp6(self):
1924 # trace add af-packet-input 10
1925 # pg interface on c1 172.20.0.1
1926 # pg interface on c4 B::1/120
1928 self.start_containers()
1930 print("Deleting the old containers...")
1932 print("Starting the new containers...")
1934 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1935 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1936 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1937 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1939 c1.pg_create_interface(
1940 local_ip="C::1/120",
1942 local_mac="aa:bb:cc:dd:ee:01",
1943 remote_mac="aa:bb:cc:dd:ee:02")
1944 c4.pg_create_interface4(
1945 local_ip="1.0.0.2/30",
1946 remote_ip="1.0.0.1",
1947 local_mac="aa:bb:cc:dd:ee:11",
1948 remote_mac="aa:bb:cc:dd:ee:22")
1950 c1.vppctl_exec("set sr encaps source addr A1::1")
1951 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1954 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1956 c2.vppctl_exec("sr localsid address D2:: behavior end")
1958 c3.vppctl_exec("sr localsid address D3:: behavior end")
1960 c4.vppctl_exec("set ip neighbor pg0 1.0.0.1 aa:bb:cc:dd:ee:22")
1961 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
1963 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1964 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1965 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1966 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1967 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
1972 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1973 IPv6(src="C::2", dst="D::2") /
1974 UDP(sport=2152, dport=2152) /
1975 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1976 IP(src="172.100.0.1", dst="172.200.0.1") /
1979 print("Sending packet on {}:".format(c1.name))
1985 c4.pg_start_capture()
1987 c1.pg_create_stream(p)
1990 # timeout (sleep) if needed
1994 print("Receiving packet on {}:".format(c4.name))
1995 for p in c4.pg_read_packets():
1998 def test_gtp6_5g(self):
2000 # trace add af-packet-input 10
2001 # pg interface on c1 172.20.0.1
2002 # pg interface on c4 B::1/120
2004 self.start_containers()
2006 print("Deleting the old containers...")
2008 print("Starting the new containers...")
2010 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2011 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2012 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2013 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2015 c1.pg_create_interface(
2016 local_ip="C::1/120",
2018 local_mac="aa:bb:cc:dd:ee:01",
2019 remote_mac="aa:bb:cc:dd:ee:02")
2020 c4.pg_create_interface4(
2021 local_ip="1.0.0.2/30",
2022 remote_ip="1.0.0.1",
2023 local_mac="aa:bb:cc:dd:ee:11",
2024 remote_mac="aa:bb:cc:dd:ee:22")
2026 c1.vppctl_exec("set sr encaps source addr A1::1")
2027 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2030 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2032 c2.vppctl_exec("sr localsid address D2:: behavior end")
2034 c3.vppctl_exec("sr localsid address D3:: behavior end")
2036 c4.vppctl_exec("set ip neighbor pg0 1.0.0.1 aa:bb:cc:dd:ee:22")
2037 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
2039 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2040 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2041 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2042 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2043 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
2048 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
2049 IPv6(src="C::2", dst="D::2") /
2050 UDP(sport=2152, dport=2152) /
2051 GTP_U_Header(gtp_type="g_pdu", teid=200) /
2052 GTPPDUSessionContainer(R=1, QFI=3) /
2053 IP(src="172.100.0.1", dst="172.200.0.1") /
2056 print("Sending packet on {}:".format(c1.name))
2062 c4.pg_start_capture()
2064 c1.pg_create_stream(p)
2067 # timeout (sleep) if needed
2071 print("Receiving packet on {}:".format(c4.name))
2072 for p in c4.pg_read_packets():
2075 def test_gtp6_ipv6(self):
2077 # trace add af-packet-input 10
2078 # pg interface on c1 172.20.0.1
2079 # pg interface on c4 B::1/120
2081 self.start_containers()
2083 print("Deleting the old containers...")
2085 print("Starting the new containers...")
2087 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2088 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2089 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2090 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2092 c1.pg_create_interface(
2093 local_ip="C::1/120",
2095 local_mac="aa:bb:cc:dd:ee:01",
2096 remote_mac="aa:bb:cc:dd:ee:02")
2097 c4.pg_create_interface(
2098 local_ip="B::1/120",
2100 local_mac="aa:bb:cc:dd:ee:11",
2101 remote_mac="aa:bb:cc:dd:ee:22")
2103 c1.vppctl_exec("set sr encaps source addr A1::1")
2104 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2107 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2109 c2.vppctl_exec("sr localsid address D2:: behavior end")
2111 c3.vppctl_exec("sr localsid address D3:: behavior end")
2113 c4.vppctl_exec("set ip neighbor pg0 B::2 aa:bb:cc:dd:ee:22")
2114 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
2116 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2117 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2118 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2119 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2120 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
2125 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
2126 IPv6(src="C::2", dst="D::2") /
2127 UDP(sport=2152, dport=2152) /
2128 GTP_U_Header(gtp_type="g_pdu", teid=200) /
2129 IPv6(src="2001::1", dst="2002::1") /
2130 ICMPv6EchoRequest())
2132 print("Sending packet on {}:".format(c1.name))
2138 c4.pg_start_capture()
2140 c1.pg_create_stream(p)
2143 # timeout (sleep) if needed
2147 print("Receiving packet on {}:".format(c4.name))
2148 for p in c4.pg_read_packets():
2151 def test_gtp6_ipv6_5g(self):
2153 # trace add af-packet-input 10
2154 # pg interface on c1 172.20.0.1
2155 # pg interface on c4 B::1/120
2157 self.start_containers()
2159 print("Deleting the old containers...")
2161 print("Starting the new containers...")
2163 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2164 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2165 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2166 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2168 c1.pg_create_interface(
2169 local_ip="C::1/120",
2171 local_mac="aa:bb:cc:dd:ee:01",
2172 remote_mac="aa:bb:cc:dd:ee:02")
2173 c4.pg_create_interface(
2174 local_ip="B::1/120",
2176 local_mac="aa:bb:cc:dd:ee:11",
2177 remote_mac="aa:bb:cc:dd:ee:22")
2179 c1.vppctl_exec("set sr encaps source addr A1::1")
2180 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2183 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2185 c2.vppctl_exec("sr localsid address D2:: behavior end")
2187 c3.vppctl_exec("sr localsid address D3:: behavior end")
2189 c4.vppctl_exec("set ip neighbor pg0 B::2 aa:bb:cc:dd:ee:22")
2190 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
2192 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2193 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2194 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2195 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2196 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
2201 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
2202 IPv6(src="C::2", dst="D::2") /
2203 UDP(sport=2152, dport=2152) /
2204 GTP_U_Header(gtp_type="g_pdu", teid=200) /
2205 GTPPDUSessionContainer(R=1, QFI=3) /
2206 IPv6(src="2001::1", dst="2002::1") /
2207 ICMPv6EchoRequest())
2209 print("Sending packet on {}:".format(c1.name))
2215 c4.pg_start_capture()
2217 c1.pg_create_stream(p)
2220 # timeout (sleep) if needed
2224 print("Receiving packet on {}:".format(c4.name))
2225 for p in c4.pg_read_packets():
2228 def test_gtp6_dt(self):
2230 # trace add af-packet-input 10
2231 # pg interface on c1 172.20.0.1
2232 # pg interface on c4 B::1/120
2234 self.start_containers()
2236 print("Deleting the old containers...")
2238 print("Starting the new containers...")
2240 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2242 c1.pg_create_interface6_name(
2244 local_ip="C::1/120",
2246 local_mac="aa:bb:cc:dd:ee:01",
2247 remote_mac="aa:bb:cc:dd:ee:02")
2249 c1.pg_create_interface4_name(
2251 local_ip="1.0.0.2/30",
2252 remote_ip="1.0.0.1",
2253 local_mac="aa:bb:cc:dd:ee:11",
2254 remote_mac="aa:bb:cc:dd:ee:22")
2256 c1.vppctl_exec("set sr encaps source addr A1::1")
2259 "sr localsid prefix D::/64 behavior end.m.gtp6.dt46 fib-table 0 local-fib-table 0")
2261 c1.vppctl_exec("set ip neighbor pg1 1.0.0.1 aa:bb:cc:dd:ee:22")
2262 c1.set_ip_pgroute("pg1", "1.0.0.1", "172.200.0.1/32")
2267 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
2268 IPv6(src="C::2", dst="D::2") /
2269 UDP(sport=2152, dport=2152) /
2270 GTP_U_Header(gtp_type="g_pdu", teid=200) /
2271 IP(src="172.100.0.1", dst="172.200.0.1") /
2274 print("Sending packet on {}:".format(c1.name))
2279 c1.pg_start_capture_name(ifname="pg1")
2281 c1.pg_create_stream(p)
2284 # timeout (sleep) if needed
2288 print("Receiving packet on {}:".format(c1.name))
2289 for p in c1.pg_read_packets():
2292 def test_gtp4_dt(self):
2294 # trace add af-packet-input 10
2295 # pg interface on c1 172.20.0.1
2296 # pg interface on c4 B::1/120
2298 self.start_containers()
2300 print("Deleting the old containers...")
2302 print("Starting the new containers...")
2304 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2306 c1.pg_create_interface4_name(
2308 local_ip="172.16.0.1/30",
2309 remote_ip="172.16.0.2",
2310 local_mac="aa:bb:cc:dd:ee:01",
2311 remote_mac="aa:bb:cc:dd:ee:02")
2313 c1.pg_create_interface4_name(
2315 local_ip="1.0.0.2/30",
2316 remote_ip="1.0.0.1",
2317 local_mac="aa:bb:cc:dd:ee:11",
2318 remote_mac="aa:bb:cc:dd:ee:22")
2320 c1.vppctl_exec("set sr encaps source addr A1::1")
2321 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.dt4 fib-table 0")
2322 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
2324 c1.vppctl_exec("set ip neighbor pg1 1.0.0.1 aa:bb:cc:dd:ee:22")
2325 c1.set_ip_pgroute("pg1", "1.0.0.1", "172.200.0.1/32")
2330 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
2331 IP(src="172.20.0.2", dst="172.20.0.1") /
2332 UDP(sport=2152, dport=2152) /
2333 GTP_U_Header(gtp_type="g_pdu", teid=200) /
2334 IP(src="172.100.0.1", dst="172.200.0.1") /
2337 print("Sending packet on {}:".format(c1.name))
2342 c1.pg_start_capture_name(ifname="pg1")
2344 c1.pg_create_stream(p)
2347 # timeout (sleep) if needed
2351 print("Receiving packet on {}:".format(c1.name))
2352 for p in c1.pg_read_packets():
2355 def status_containers(self):
2359 for i, name in enumerate(self.instance_names):
2360 name = self.get_name(name)
2361 print("\t[{}] {} - {}".format(
2363 "running" if self.containers.get(name) else "missing"))
2367 for i, name in enumerate(self.network_names):
2368 name = self.get_name(name)
2369 print("\t[{}] {} - {}".format(
2371 "running" if self.networks.get(name) else "missing"))
2373 def build_image(self):
2374 print("VPP Path (build): {}".format(self.vpp_path))
2375 self.containers.build(self.path, self.vpp_path)
2377 def release_image(self):
2378 print("VPP Path (release): {}".format(self.vpp_path))
2379 instance = self.containers.new("release-build")
2382 "docker cp release-build:{}/vpp-package.tgz {}/".format(
2383 self.vpp_path, self.vpp_path))
2387 self.containers.release(self.path, self.vpp_path)
2389 system("rm -rf {}/vpp-package.tgz".format(self.vpp_path))
2391 def vppctl(self, index, command=None):
2392 if index >= len(self.instance_names):
2394 name = self.get_name(self.instance_names[index])
2395 self.logger.error("connecting to: {}".format(name))
2396 self.containers.vppctl(name, command)
2398 def bash(self, index):
2399 if index >= len(self.instance_names):
2401 name = self.get_name(self.instance_names[index])
2402 self.logger.error("connecting to: {}".format(name))
2403 self.containers.bash(name)
2407 parser = ArgumentParser()
2409 parser.add_argument("--verbose", choices=['error', 'debug', 'info'])
2411 parser.add_argument('--image', choices=['debug', 'release'])
2413 subparsers = parser.add_subparsers()
2415 p1 = subparsers.add_parser(
2416 "infra", help="Infrastructure related commands.")
2428 p1.add_argument("--prefix")
2429 p1.add_argument("--image")
2431 p2 = subparsers.add_parser("cmd", help="Instance related commands.")
2433 p2.add_argument("op", choices=['vppctl', 'bash'])
2438 help="Container instance index. (./runner.py infra status)")
2441 "--command", help="Only vppctl supports this optional argument.")
2443 p3 = subparsers.add_parser("test", help="Test related commands.")
2464 "gtp6_drop_in_echo",
2465 "gtp6_drop_in_reply",
2466 "gtp6_drop_in_error",
2467 "gtp6_drop_in_ipv6",
2468 "gtp6_drop_in_ipv6_5g",
2476 args = parser.parse_args()
2477 if not hasattr(args, "op") or not args.op:
2478 parser.print_help(sys.stderr)
2484 def main(op=None, prefix=None, verbose=None,
2485 image=None, index=None, command=None):
2488 basicConfig(level=verbose_levels[verbose])
2490 if image == 'release':
2491 image = "srv6m-release-image"
2492 elif image == 'debug':
2493 image = "srv6m-image"
2495 image = "srv6m-image"
2497 print("Target image: {}".format(image))
2499 program = Program(image, prefix)
2503 program.build_image()
2504 elif op == 'release':
2505 program.release_image()
2507 program.stop_containers()
2509 program.start_containers()
2510 elif op == 'status':
2511 program.status_containers()
2512 elif op == 'vppctl':
2513 program.vppctl(index, command)
2520 # elif op == 'tmap':
2521 # program.test_tmap()
2522 # elif op == 'tmap_5g':
2523 # program.test_tmap_5g()
2524 # elif op == 'tmap_ipv6':
2525 # program.test_tmap_ipv6()
2526 # elif op == 'tmap_ipv6_5g':
2527 # program.test_tmap_ipv6_5g()
2530 elif op == 'gtp4_usid':
2531 program.test_gtp4_usid()
2532 elif op == 'gtp4_5g':
2533 program.test_gtp4_5g()
2534 elif op == 'gtp4_echo':
2535 program.test_gtp4_echo()
2536 elif op == 'gtp4_reply':
2537 program.test_gtp4_reply()
2538 elif op == 'gtp4_error':
2539 program.test_gtp4_error()
2540 elif op == 'gtp4_ipv6':
2541 program.test_gtp4_ipv6()
2542 elif op == 'gtp4_ipv6_5g':
2543 program.test_gtp4_ipv6_5g()
2544 elif op == 'gtp6_drop_in':
2545 program.test_gtp6_drop_in()
2546 elif op == 'gtp6_drop_in_5g':
2547 program.test_gtp6_drop_in_5g()
2548 elif op == 'gtp6_drop_in_echo':
2549 program.test_gtp6_drop_in_echo()
2550 elif op == 'gtp6_drop_in_reply':
2551 program.test_gtp6_drop_in_reply()
2552 elif op == 'gtp6_drop_in_error':
2553 program.test_gtp6_drop_in_error()
2554 elif op == 'gtp6_drop_in_ipv6':
2555 program.test_gtp6_drop_in_ipv6()
2556 elif op == 'gtp6_drop_in_ipv6_5g':
2557 program.test_gtp6_drop_in_ipv6_5g()
2560 elif op == 'gtp6_5g':
2561 program.test_gtp6_5g()
2562 elif op == 'gtp6_ipv6':
2563 program.test_gtp6_ipv6()
2564 elif op == 'gtp6_ipv6_5g':
2565 program.test_gtp6_ipv6_5g()
2566 elif op == 'gtp6_dt':
2567 program.test_gtp6_dt()
2568 elif op == 'gtp4_dt':
2569 program.test_gtp4_dt()
2572 program.logger.exception("")
2580 if __name__ == "__main__":
2581 sys.exit(main(**get_args()))