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),
254 self.tmp_render(join(vpp_path, "Dockerfile"),
255 env.get_template("Dockerfile.j2"),
256 {'vpp_path': vpp_path})
258 self.tmp_render(join(vpp_path, "startup.conf"),
259 env.get_template("startup.conf.j2"),
260 {'vpp_path': vpp_path})
262 ref, _ = self.client.images.build(path=vpp_path,
263 tag=self.image, rm=True)
266 def release(self, path, vpp_path):
267 env = Environment(loader=FileSystemLoader(path),
271 self.tmp_render(join(vpp_path, "Dockerfile"),
272 env.get_template("Dockerfile.j2.release"),
273 {'vpp_path': vpp_path})
275 self.tmp_render(join(vpp_path, "startup.conf"),
276 env.get_template("startup.conf.j2"),
277 {'vpp_path': vpp_path})
279 ref, _ = self.client.images.build(path=vpp_path,
280 tag="srv6m-release-image", rm=True)
284 return Container.new(self.client, self.image, name)
287 return Container.get(self.client, name)
289 def vppctl(self, name, command=None):
290 container = self.get(name)
294 print(container.vppctl_exec(command).decode())
296 def bash(self, name):
297 container = self.get(name)
301 class Network(object):
303 def __init__(self, ref, name):
312 def new(cls, client, name):
313 ref = client.networks.create(name, driver="bridge",
314 check_duplicate=True)
315 return cls(ref, name)
318 def get(cls, client, name):
320 ref = client.networks.get(name)
324 return cls(ref, name)
329 def connect(self, c):
330 self._ref.connect(c.name)
333 class Networks(object):
335 def __init__(self, client):
339 return Network.new(self.client, name)
342 return Network.get(self.client, name)
345 class Program(object):
347 image = "srv6m-image"
351 # TODO: add description to these instances
352 # for exmaple what the vpp is supposed to be
353 # in our topoloty overview
355 instance_names = ["vpp-1",
360 network_names = ["net-1",
364 def __init__(self, image=None, prefix=None):
365 self.path = dirname(realpath(__file__))
369 if prefix is not None:
370 self.name_prefix = prefix
373 self.containers = Containers(client, self.image)
374 self.networks = Networks(client)
376 self.logger = getLogger(__name__)
380 return self.path.rsplit("/", 4)[0]
382 def get_name(self, name):
383 if not self.name_prefix:
385 return "{}-{}".format(self.name_prefix, name)
387 def stop_containers(self):
389 for name in self.instance_names:
390 instance = self.containers.get(self.get_name(name))
394 for name in self.network_names:
395 network = self.networks.get(self.get_name(name))
399 def start_containers(self):
401 self.stop_containers()
405 for name in self.network_names:
406 networks.append(self.networks.new(self.get_name(name)))
408 n1, n2, n3 = networks
412 for name in self.instance_names:
413 instances.append(self.containers.new(self.get_name(name)))
415 c1, c2, c3, c4 = instances
417 # setup packet generator interfaces
418 # c1.pg_create_interface(local_ip="C::1/120", remote_ip="C::2",
419 # local_mac="aa:bb:cc:dd:ee:01", remote_mac="aa:bb:cc:dd:ee:02")
421 # setup network between instances
432 c1.setup_host_interface("eth1", "A1::1/120")
433 c2.setup_host_interface("eth1", "A1::2/120")
436 c2.setup_host_interface("eth2", "A2::1/120")
437 c3.setup_host_interface("eth1", "A2::2/120")
440 c3.setup_host_interface("eth2", "A3::1/120")
441 c4.setup_host_interface("eth1", "A3::2/120")
443 # c1 > c2 default route
445 c1.set_ipv6_default_route("eth1", "A1::2")
446 # c2 > c3 default route
447 c2.set_ipv6_default_route("eth2", "A2::2")
448 # c3 > c2 default route
449 c3.set_ipv6_default_route("eth1", "A2::1")
450 # c4 > c3 default route
451 c4.set_ipv6_default_route("eth1", "A3::1")
453 # c3 > c4 static route for address B::1/128
454 c3.set_ipv6_route("eth2", "A3::2", "B::1/128")
455 c3.set_ipv6_route("eth2", "A3::2", "B::2/128")
459 # trace add af-packet-input 10
460 # pg interface on c1 172.20.0.1
461 # pg interface on c4 B::1/120
463 self.start_containers()
465 c1 = self.containers.get(self.get_name(self.instance_names[0]))
466 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
468 c1.pg_create_interface(
471 local_mac="aa:bb:cc:dd:ee:01",
472 remote_mac="aa:bb:cc:dd:ee:02")
473 c4.pg_create_interface(
476 local_mac="aa:bb:cc:dd:ee:11",
477 remote_mac="aa:bb:cc:dd:ee:22")
479 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
480 IPv6(src="C::2", dst="B::2") / ICMPv6EchoRequest())
482 print("Sending packet on {}:".format(c1.name))
488 c4.pg_start_capture()
490 c1.pg_create_stream(p)
493 # timeout (sleep) if needed
495 print("Receiving packet on {}:".format(c4.name))
496 for p in c4.pg_read_packets():
501 # trace add af-packet-input 10
502 # pg interface on c1 C::1/120
503 # pg interface on c4 B::1/120
505 self.start_containers()
510 c1 = self.containers.get(self.get_name(self.instance_names[0]))
511 c2 = self.containers.get(self.get_name(self.instance_names[1]))
512 c3 = self.containers.get(self.get_name(self.instance_names[2]))
513 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
515 c1.pg_create_interface(
518 local_mac="aa:bb:cc:dd:ee:01",
519 remote_mac="aa:bb:cc:dd:ee:02")
520 c4.pg_create_interface(
523 local_mac="aa:bb:cc:dd:ee:11",
524 remote_mac="aa:bb:cc:dd:ee:22")
526 c1.vppctl_exec("set sr encaps source addr D1::")
528 "sr policy add bsid D1::999:1 next D2:: next D3:: next D4::")
529 c1.vppctl_exec("sr steer l3 B::/120 via bsid D1::999:1")
531 c2.vppctl_exec("sr localsid address D2:: behavior end")
533 c3.vppctl_exec("sr localsid address D3:: behavior end")
535 c4.vppctl_exec("sr localsid address D4:: behavior end.dx6 pg0 B::2")
537 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
538 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
539 c3.set_ipv6_route("eth2", "A3::2", "D4::/128")
540 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
542 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
543 IPv6(src="C::2", dst="B::2") / ICMPv6EchoRequest())
545 print("Sending packet on {}:".format(c1.name))
553 c4.pg_start_capture()
555 c1.pg_create_stream(p)
558 # timeout (sleep) if needed
560 print("Receiving packet on {}:".format(c4.name))
561 for p in c4.pg_read_packets():
564 ''' T.Map is obsolete
567 # trace add af-packet-input 10
568 # pg interface on c1 172.20.0.1
569 # pg interface on c4 B::1/120
571 self.start_containers()
573 c1 = self.containers.get(self.get_name(self.instance_names[0]))
574 c2 = self.containers.get(self.get_name(self.instance_names[1]))
575 c3 = self.containers.get(self.get_name(self.instance_names[2]))
576 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
578 c1.pg_create_interface4(
579 local_ip="172.16.0.1/30",
580 remote_ip="172.16.0.2/30",
581 local_mac="aa:bb:cc:dd:ee:01",
582 remote_mac="aa:bb:cc:dd:ee:02")
583 c4.pg_create_interface4(
584 local_ip="1.0.0.2/30",
586 local_mac="aa:bb:cc:dd:ee:11",
587 remote_mac="aa:bb:cc:dd:ee:22")
589 c1.vppctl_exec("set sr encaps source addr A1::1")
591 "sr policy add bsid D1:: next D2:: next D3:: "
592 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
593 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
595 c2.vppctl_exec("sr localsid address D2:: behavior end")
597 c3.vppctl_exec("sr localsid address D3:: behavior end")
600 "sr localsid prefix D4::/32 "
601 "behavior end.m.gtp4.e v4src_position 64")
603 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
604 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
605 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
606 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
607 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
609 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
610 IP(src="172.20.0.2", dst="172.20.0.1") /
611 UDP(sport=2152, dport=2152) /
612 GTP_U_Header(gtp_type="g_pdu", teid=200) /
613 IP(src="172.99.0.1", dst="172.99.0.2") /
616 print("Sending packet on {}:".format(c1.name))
622 c4.pg_start_capture()
624 c1.pg_create_stream(p)
627 # timeout (sleep) if needed
631 print("Receiving packet on {}:".format(c4.name))
632 for p in c4.pg_read_packets():
635 def test_tmap_5g(self):
637 # trace add af-packet-input 10
638 # pg interface on c1 172.20.0.1
639 # pg interface on c4 B::1/120
641 self.start_containers()
643 c1 = self.containers.get(self.get_name(self.instance_names[0]))
644 c2 = self.containers.get(self.get_name(self.instance_names[1]))
645 c3 = self.containers.get(self.get_name(self.instance_names[2]))
646 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
648 c1.pg_create_interface4(
649 local_ip="172.16.0.1/30",
650 remote_ip="172.16.0.2/30",
651 local_mac="aa:bb:cc:dd:ee:01",
652 remote_mac="aa:bb:cc:dd:ee:02")
653 c4.pg_create_interface4(
654 local_ip="1.0.0.2/30",
656 local_mac="aa:bb:cc:dd:ee:11",
657 remote_mac="aa:bb:cc:dd:ee:22")
659 c1.vppctl_exec("set sr encaps source addr A1::1")
661 "sr policy add bsid D1:: next D2:: next D3:: "
662 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
663 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
665 c2.vppctl_exec("sr localsid address D2:: behavior end")
667 c3.vppctl_exec("sr localsid address D3:: behavior end")
670 "sr localsid prefix D4::/32 "
671 "behavior end.m.gtp4.e v4src_position 64")
673 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
674 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
675 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
676 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
677 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
679 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
680 IP(src="172.20.0.2", dst="172.20.0.1") /
681 UDP(sport=2152, dport=2152) /
682 GTP_U_Header(gtp_type="g_pdu", teid=200) /
683 GTPPDUSessionContainer(R=1, QFI=3) /
684 IP(src="172.99.0.1", dst="172.99.0.2") /
687 print("Sending packet on {}:".format(c1.name))
693 c4.pg_start_capture()
695 c1.pg_create_stream(p)
698 # timeout (sleep) if needed
702 print("Receiving packet on {}:".format(c4.name))
703 for p in c4.pg_read_packets():
706 def test_tmap_ipv6(self):
708 # trace add af-packet-input 10
709 # pg interface on c1 172.20.0.1
710 # pg interface on c4 B::1/120
712 self.start_containers()
714 c1 = self.containers.get(self.get_name(self.instance_names[0]))
715 c2 = self.containers.get(self.get_name(self.instance_names[1]))
716 c3 = self.containers.get(self.get_name(self.instance_names[2]))
717 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
719 c1.pg_create_interface4(
720 local_ip="172.16.0.1/30",
721 remote_ip="172.16.0.2/30",
722 local_mac="aa:bb:cc:dd:ee:01",
723 remote_mac="aa:bb:cc:dd:ee:02")
724 c4.pg_create_interface4(
725 local_ip="1.0.0.2/30",
727 local_mac="aa:bb:cc:dd:ee:11",
728 remote_mac="aa:bb:cc:dd:ee:22")
730 c1.vppctl_exec("set sr encaps source addr A1::1")
732 "sr policy add bsid D1:: next D2:: next D3:: "
733 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
734 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
736 c2.vppctl_exec("sr localsid address D2:: behavior end")
738 c3.vppctl_exec("sr localsid address D3:: behavior end")
741 "sr localsid prefix D4::/32 "
742 "behavior end.m.gtp4.e v4src_position 64")
744 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
745 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
746 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
747 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
748 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
750 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
751 IP(src="172.20.0.2", dst="172.20.0.1") /
752 UDP(sport=2152, dport=2152) /
753 GTP_U_Header(gtp_type="g_pdu", teid=200) /
754 IPv6(src="2001::1", dst="2002::1") /
757 print("Sending packet on {}:".format(c1.name))
763 c4.pg_start_capture()
765 c1.pg_create_stream(p)
768 # timeout (sleep) if needed
772 print("Receiving packet on {}:".format(c4.name))
773 for p in c4.pg_read_packets():
776 def test_tmap_ipv6_5g(self):
778 # trace add af-packet-input 10
779 # pg interface on c1 172.20.0.1
780 # pg interface on c4 B::1/120
782 self.start_containers()
784 c1 = self.containers.get(self.get_name(self.instance_names[0]))
785 c2 = self.containers.get(self.get_name(self.instance_names[1]))
786 c3 = self.containers.get(self.get_name(self.instance_names[2]))
787 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
789 c1.pg_create_interface4(
790 local_ip="172.16.0.1/30",
791 remote_ip="172.16.0.2/30",
792 local_mac="aa:bb:cc:dd:ee:01",
793 remote_mac="aa:bb:cc:dd:ee:02")
794 c4.pg_create_interface4(
795 local_ip="1.0.0.2/30",
797 local_mac="aa:bb:cc:dd:ee:11",
798 remote_mac="aa:bb:cc:dd:ee:22")
800 c1.vppctl_exec("set sr encaps source addr A1::1")
802 "sr policy add bsid D1:: next D2:: next D3:: "
803 "gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64")
804 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D1::")
806 c2.vppctl_exec("sr localsid address D2:: behavior end")
808 c3.vppctl_exec("sr localsid address D3:: behavior end")
811 "sr localsid prefix D4::/32 "
812 "behavior end.m.gtp4.e v4src_position 64")
814 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
815 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
816 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
817 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
818 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
820 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
821 IP(src="172.20.0.2", dst="172.20.0.1") /
822 UDP(sport=2152, dport=2152) /
823 GTP_U_Header(gtp_type="g_pdu", teid=200) /
824 GTPPDUSessionContainer(R=1, QFI=3) /
825 IPv6(src="2001::1", dst="2002::1") /
828 print("Sending packet on {}:".format(c1.name))
829 print("Sending packet on {}:".format(c1.name))
835 c4.pg_start_capture()
837 c1.pg_create_stream(p)
840 # timeout (sleep) if needed
844 print("Receiving packet on {}:".format(c4.name))
845 for p in c4.pg_read_packets():
851 # trace add af-packet-input 10
852 # pg interface on c1 172.20.0.1
853 # pg interface on c4 B::1/120
855 self.start_containers()
857 c1 = self.containers.get(self.get_name(self.instance_names[0]))
858 c2 = self.containers.get(self.get_name(self.instance_names[1]))
859 c3 = self.containers.get(self.get_name(self.instance_names[2]))
860 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
862 c1.pg_create_interface4(
863 local_ip="172.16.0.1/30",
864 remote_ip="172.16.0.2/30",
865 local_mac="aa:bb:cc:dd:ee:01",
866 remote_mac="aa:bb:cc:dd:ee:02")
867 c4.pg_create_interface4(
868 local_ip="1.0.0.2/30",
870 local_mac="aa:bb:cc:dd:ee:11",
871 remote_mac="aa:bb:cc:dd:ee:22")
873 c1.vppctl_exec("set sr encaps source addr A1::1")
874 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
875 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
876 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
878 c2.vppctl_exec("sr localsid address D2:: behavior end")
880 c3.vppctl_exec("sr localsid address D3:: behavior end")
883 "sr localsid prefix D4::/32 "
884 "behavior end.m.gtp4.e v4src_position 64")
886 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
887 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
888 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
889 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
890 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
892 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
893 IP(src="172.20.0.2", dst="172.20.0.1") /
894 UDP(sport=2152, dport=2152) /
895 GTP_U_Header(gtp_type="g_pdu", teid=200) /
896 IP(src="172.99.0.1", dst="172.99.0.2") /
899 print("Sending packet on {}:".format(c1.name))
906 c4.pg_start_capture()
908 c1.pg_create_stream(p)
911 # timeout (sleep) if needed
915 print("Receiving packet on {}:".format(c4.name))
916 for p in c4.pg_read_packets():
919 def test_gtp4_usid(self):
921 # trace add af-packet-input 10
922 # pg interface on c1 172.20.0.1
923 # pg interface on c4 B::1/120
925 self.start_containers()
927 c1 = self.containers.get(self.get_name(self.instance_names[0]))
928 c2 = self.containers.get(self.get_name(self.instance_names[1]))
929 c3 = self.containers.get(self.get_name(self.instance_names[2]))
930 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
932 c1.pg_create_interface4(
933 local_ip="172.16.0.1/30",
934 remote_ip="172.16.0.2/30",
935 local_mac="aa:bb:cc:dd:ee:01",
936 remote_mac="aa:bb:cc:dd:ee:02")
937 c4.pg_create_interface4(
938 local_ip="1.0.0.2/30",
940 local_mac="aa:bb:cc:dd:ee:11",
941 remote_mac="aa:bb:cc:dd:ee:22")
943 c1.vppctl_exec("set sr encaps source addr A1::1")
944 c1.vppctl_exec("sr policy add bsid D4:: next D2:1111:aaaa:bbbb::")
945 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
946 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
948 c2.vppctl_exec("sr localsid prefix D2:1111:aaaa::/48 behavior end usid 16")
950 c3.vppctl_exec("sr localsid prefix D2:1111:bbbb::/48 behavior end usid 16")
953 "sr localsid prefix D4::/32 "
954 "behavior end.m.gtp4.e v4src_position 64")
956 c2.set_ipv6_route("eth2", "A2::2", "D2:1111:bbbb::/48")
957 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
958 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
959 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
960 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
962 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
963 IP(src="172.20.0.2", dst="172.20.0.1") /
964 UDP(sport=2152, dport=2152) /
965 GTP_U_Header(gtp_type="g_pdu", teid=200) /
966 IP(src="172.99.0.1", dst="172.99.0.2") /
969 print("Sending packet on {}:".format(c1.name))
976 c4.pg_start_capture()
978 c1.pg_create_stream(p)
981 # timeout (sleep) if needed
985 print("Receiving packet on {}:".format(c4.name))
986 for p in c4.pg_read_packets():
989 def test_gtp4_5g(self):
991 # trace add af-packet-input 10
992 # pg interface on c1 172.20.0.1
993 # pg interface on c4 B::1/120
995 self.start_containers()
997 c1 = self.containers.get(self.get_name(self.instance_names[0]))
998 c2 = self.containers.get(self.get_name(self.instance_names[1]))
999 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1000 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1002 c1.pg_create_interface4(
1003 local_ip="172.16.0.1/30",
1004 remote_ip="172.16.0.2/30",
1005 local_mac="aa:bb:cc:dd:ee:01",
1006 remote_mac="aa:bb:cc:dd:ee:02")
1007 c4.pg_create_interface4(
1008 local_ip="1.0.0.2/30",
1009 remote_ip="1.0.0.1",
1010 local_mac="aa:bb:cc:dd:ee:11",
1011 remote_mac="aa:bb:cc:dd:ee:22")
1013 c1.vppctl_exec("set sr encaps source addr A1::1")
1014 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1015 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
1016 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1018 c2.vppctl_exec("sr localsid address D2:: behavior end")
1020 c3.vppctl_exec("sr localsid address D3:: behavior end")
1023 "sr localsid prefix D4::/32 "
1024 "behavior end.m.gtp4.e v4src_position 64")
1026 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1027 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1028 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1029 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1030 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1032 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1033 IP(src="172.20.0.2", dst="172.20.0.1") /
1034 UDP(sport=2152, dport=2152) /
1035 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1036 GTPPDUSessionContainer(type=1, R=1, QFI=3) /
1037 IP(src="172.99.0.1", dst="172.99.0.2") /
1040 print("Sending packet on {}:".format(c1.name))
1046 c4.pg_start_capture()
1048 c1.pg_create_stream(p)
1051 # timeout (sleep) if needed
1055 print("Receiving packet on {}:".format(c4.name))
1056 for p in c4.pg_read_packets():
1059 def test_gtp4_echo(self):
1061 # trace add af-packet-input 10
1062 # pg interface on c1 172.20.0.1
1063 # pg interface on c4 B::1/120
1065 self.start_containers()
1067 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1068 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1069 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1070 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1072 c1.pg_create_interface4(
1073 local_ip="172.16.0.1/30",
1074 remote_ip="172.16.0.2/30",
1075 local_mac="aa:bb:cc:dd:ee:01",
1076 remote_mac="aa:bb:cc:dd:ee:02")
1077 c4.pg_create_interface4(
1078 local_ip="1.0.0.2/30",
1079 remote_ip="1.0.0.1",
1080 local_mac="aa:bb:cc:dd:ee:11",
1081 remote_mac="aa:bb:cc:dd:ee:22")
1083 c1.vppctl_exec("set sr encaps source addr A1::1")
1084 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1085 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
1086 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1088 c2.vppctl_exec("sr localsid address D2:: behavior end")
1090 c3.vppctl_exec("sr localsid address D3:: behavior end")
1093 "sr localsid prefix D4::/32 "
1094 "behavior end.m.gtp4.e v4src_position 64")
1096 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1097 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1098 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1099 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1100 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1102 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1103 IP(src="172.20.0.2", dst="172.20.0.1") /
1104 UDP(sport=2152, dport=2152) /
1105 GTP_U_Header(gtp_type="echo_request", S=1, teid=200, seq=200))
1107 print("Sending packet on {}:".format(c1.name))
1113 c4.pg_start_capture()
1115 c1.pg_create_stream(p)
1118 # timeout (sleep) if needed
1122 print("Receiving packet on {}:".format(c4.name))
1123 for p in c4.pg_read_packets():
1126 def test_gtp4_reply(self):
1128 # trace add af-packet-input 10
1129 # pg interface on c1 172.20.0.1
1130 # pg interface on c4 B::1/120
1132 self.start_containers()
1134 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1135 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1136 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1137 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1139 c1.pg_create_interface4(
1140 local_ip="172.16.0.1/30",
1141 remote_ip="172.16.0.2/30",
1142 local_mac="aa:bb:cc:dd:ee:01",
1143 remote_mac="aa:bb:cc:dd:ee:02")
1144 c4.pg_create_interface4(
1145 local_ip="1.0.0.2/30",
1146 remote_ip="1.0.0.1",
1147 local_mac="aa:bb:cc:dd:ee:11",
1148 remote_mac="aa:bb:cc:dd:ee:22")
1150 c1.vppctl_exec("set sr encaps source addr A1::1")
1151 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1152 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
1153 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1155 c2.vppctl_exec("sr localsid address D2:: behavior end")
1157 c3.vppctl_exec("sr localsid address D3:: behavior end")
1160 "sr localsid prefix D4::/32 "
1161 "behavior end.m.gtp4.e v4src_position 64")
1163 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1164 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1165 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1166 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1167 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1169 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1170 IP(src="172.20.0.2", dst="172.20.0.1") /
1171 UDP(sport=2152, dport=2152) /
1172 GTP_U_Header(gtp_type="echo_response", S=1, teid=200, seq=200))
1174 print("Sending packet on {}:".format(c1.name))
1180 c4.pg_start_capture()
1182 c1.pg_create_stream(p)
1185 # timeout (sleep) if needed
1189 print("Receiving packet on {}:".format(c4.name))
1190 for p in c4.pg_read_packets():
1193 def test_gtp4_error(self):
1195 # trace add af-packet-input 10
1196 # pg interface on c1 172.20.0.1
1197 # pg interface on c4 B::1/120
1199 self.start_containers()
1201 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1202 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1203 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1204 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1206 c1.pg_create_interface4(
1207 local_ip="172.16.0.1/30",
1208 remote_ip="172.16.0.2/30",
1209 local_mac="aa:bb:cc:dd:ee:01",
1210 remote_mac="aa:bb:cc:dd:ee:02")
1211 c4.pg_create_interface4(
1212 local_ip="1.0.0.2/30",
1213 remote_ip="1.0.0.1",
1214 local_mac="aa:bb:cc:dd:ee:11",
1215 remote_mac="aa:bb:cc:dd:ee:22")
1217 c1.vppctl_exec("set sr encaps source addr A1::1")
1218 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1219 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4")
1220 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1222 c2.vppctl_exec("sr localsid address D2:: behavior end")
1224 c3.vppctl_exec("sr localsid address D3:: behavior end")
1227 "sr localsid prefix D4::/32 "
1228 "behavior end.m.gtp4.e v4src_position 64")
1230 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1231 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1232 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1233 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1234 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1236 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1237 IP(src="172.20.0.2", dst="172.20.0.1") /
1238 UDP(sport=2152, dport=2152) /
1239 GTP_U_Header(gtp_type="error_indication", S=1, teid=200, seq=200)/
1240 IE_TEIDI(TEIDI=65535)/IE_GSNAddress(address="1.1.1.1")/
1241 IE_PrivateExtension(extention_value="z"))
1243 print("Sending packet on {}:".format(c1.name))
1249 c4.pg_start_capture()
1251 c1.pg_create_stream(p)
1254 # timeout (sleep) if needed
1258 print("Receiving packet on {}:".format(c4.name))
1259 for p in c4.pg_read_packets():
1262 def test_gtp4_ipv6(self):
1264 # trace add af-packet-input 10
1265 # pg interface on c1 172.20.0.1
1266 # pg interface on c4 B::1/120
1268 self.start_containers()
1270 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1271 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1272 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1273 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1275 c1.pg_create_interface4(
1276 local_ip="172.16.0.1/30",
1277 remote_ip="172.16.0.2/30",
1278 local_mac="aa:bb:cc:dd:ee:01",
1279 remote_mac="aa:bb:cc:dd:ee:02")
1280 c4.pg_create_interface4(
1281 local_ip="1.0.0.2/30",
1282 remote_ip="1.0.0.1",
1283 local_mac="aa:bb:cc:dd:ee:11",
1284 remote_mac="aa:bb:cc:dd:ee:22")
1286 c1.vppctl_exec("set sr encaps source addr A1::1")
1287 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1288 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64")
1289 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1291 c2.vppctl_exec("sr localsid address D2:: behavior end")
1293 c3.vppctl_exec("sr localsid address D3:: behavior end")
1296 "sr localsid prefix D4::/32 "
1297 "behavior end.m.gtp4.e v4src_position 64")
1299 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1300 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1301 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1302 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1303 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1305 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1306 IP(src="172.20.0.2", dst="172.20.0.1") /
1307 UDP(sport=2152, dport=2152) /
1308 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1309 IPv6(src="2001::1", dst="2002::1") /
1310 ICMPv6EchoRequest())
1312 print("Sending packet on {}:".format(c1.name))
1318 c4.pg_start_capture()
1320 c1.pg_create_stream(p)
1323 # timeout (sleep) if needed
1327 print("Receiving packet on {}:".format(c4.name))
1328 for p in c4.pg_read_packets():
1331 def test_gtp4_ipv6_5g(self):
1333 # trace add af-packet-input 10
1334 # pg interface on c1 172.20.0.1
1335 # pg interface on c4 B::1/120
1337 self.start_containers()
1339 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1340 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1341 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1342 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1344 c1.pg_create_interface4(
1345 local_ip="172.16.0.1/30",
1346 remote_ip="172.16.0.2/30",
1347 local_mac="aa:bb:cc:dd:ee:01",
1348 remote_mac="aa:bb:cc:dd:ee:02")
1349 c4.pg_create_interface4(
1350 local_ip="1.0.0.2/30",
1351 remote_ip="1.0.0.1",
1352 local_mac="aa:bb:cc:dd:ee:11",
1353 remote_mac="aa:bb:cc:dd:ee:22")
1355 c1.vppctl_exec("set sr encaps source addr A1::1")
1356 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1357 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64")
1358 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
1360 c2.vppctl_exec("sr localsid address D2:: behavior end")
1362 c3.vppctl_exec("sr localsid address D3:: behavior end")
1365 "sr localsid prefix D4::/32 "
1366 "behavior end.m.gtp4.e v4src_position 64")
1368 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1369 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1370 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1371 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1372 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32")
1374 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1375 IP(src="172.20.0.2", dst="172.20.0.1") /
1376 UDP(sport=2152, dport=2152) /
1377 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1378 GTPPDUSessionContainer(R=1, QFI=3) /
1379 IPv6(src="2001::1", dst="2002::1") /
1380 ICMPv6EchoRequest())
1382 print("Sending packet on {}:".format(c1.name))
1388 c4.pg_start_capture()
1390 c1.pg_create_stream(p)
1393 # timeout (sleep) if needed
1397 print("Receiving packet on {}:".format(c4.name))
1398 for p in c4.pg_read_packets():
1401 def test_gtp6_drop_in(self):
1403 # trace add af-packet-input 10
1404 # pg interface on c1 172.20.0.1
1405 # pg interface on c4 B::1/120
1407 self.start_containers()
1409 print("Deleting the old containers...")
1411 print("Starting the new containers...")
1413 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1414 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1415 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1416 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1418 c1.pg_create_interface(
1419 local_ip="C::1/120",
1421 local_mac="aa:bb:cc:dd:ee:01",
1422 remote_mac="aa:bb:cc:dd:ee:02")
1423 c4.pg_create_interface(
1424 local_ip="B::1/120",
1426 local_mac="aa:bb:cc:dd:ee:11",
1427 remote_mac="aa:bb:cc:dd:ee:22")
1429 c1.vppctl_exec("set sr encaps source addr A1::1")
1430 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1433 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1435 c2.vppctl_exec("sr localsid address D2:: behavior end")
1437 c3.vppctl_exec("sr localsid address D3:: behavior end")
1439 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1441 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1442 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1443 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1444 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1445 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1450 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1451 IPv6(src="C::2", dst="D::2") /
1452 UDP(sport=2152, dport=2152) /
1453 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1454 IP(src="172.99.0.1", dst="172.99.0.2") /
1457 print("Sending packet on {}:".format(c1.name))
1463 c4.pg_start_capture()
1465 c1.pg_create_stream(p)
1468 # timeout (sleep) if needed
1472 print("Receiving packet on {}:".format(c4.name))
1473 for p in c4.pg_read_packets():
1476 def test_gtp6_drop_in_5g(self):
1478 # trace add af-packet-input 10
1479 # pg interface on c1 172.20.0.1
1480 # pg interface on c4 B::1/120
1482 self.start_containers()
1484 print("Deleting the old containers...")
1486 print("Starting the new containers...")
1488 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1489 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1490 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1491 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1493 c1.pg_create_interface(
1494 local_ip="C::1/120",
1496 local_mac="aa:bb:cc:dd:ee:01",
1497 remote_mac="aa:bb:cc:dd:ee:02")
1498 c4.pg_create_interface(
1499 local_ip="B::1/120",
1501 local_mac="aa:bb:cc:dd:ee:11",
1502 remote_mac="aa:bb:cc:dd:ee:22")
1504 c1.vppctl_exec("set sr encaps source addr A1::1")
1505 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1508 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1510 c2.vppctl_exec("sr localsid address D2:: behavior end")
1512 c3.vppctl_exec("sr localsid address D3:: behavior end")
1514 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1516 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1517 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1518 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1519 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1520 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1525 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1526 IPv6(src="C::2", dst="D::2") /
1527 UDP(sport=2152, dport=2152) /
1528 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1529 GTPPDUSessionContainer(type=1, R=1, QFI=3) /
1530 IP(src="172.99.0.1", dst="172.99.0.2") /
1533 print("Sending packet on {}:".format(c1.name))
1539 c4.pg_start_capture()
1541 c1.pg_create_stream(p)
1544 # timeout (sleep) if needed
1548 print("Receiving packet on {}:".format(c4.name))
1549 for p in c4.pg_read_packets():
1552 def test_gtp6_drop_in_echo(self):
1554 # trace add af-packet-input 10
1555 # pg interface on c1 172.20.0.1
1556 # pg interface on c4 B::1/120
1558 self.start_containers()
1560 print("Deleting the old containers...")
1562 print("Starting the new containers...")
1564 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1565 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1566 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1567 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1569 c1.pg_create_interface(
1570 local_ip="C::1/120",
1572 local_mac="aa:bb:cc:dd:ee:01",
1573 remote_mac="aa:bb:cc:dd:ee:02")
1574 c4.pg_create_interface(
1575 local_ip="B::1/120",
1577 local_mac="aa:bb:cc:dd:ee:11",
1578 remote_mac="aa:bb:cc:dd:ee:22")
1580 c1.vppctl_exec("set sr encaps source addr A1::1")
1581 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1584 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1586 c2.vppctl_exec("sr localsid address D2:: behavior end")
1588 c3.vppctl_exec("sr localsid address D3:: behavior end")
1590 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1592 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1593 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1594 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1595 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1596 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1601 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1602 IPv6(src="C::2", dst="D::2") /
1603 UDP(sport=2152, dport=2152) /
1604 GTP_U_Header(gtp_type="echo_request", S=1, teid=200, seq=300))
1606 print("Sending packet on {}:".format(c1.name))
1612 c4.pg_start_capture()
1614 c1.pg_create_stream(p)
1617 # timeout (sleep) if needed
1621 print("Receiving packet on {}:".format(c4.name))
1622 for p in c4.pg_read_packets():
1625 def test_gtp6_drop_in_reply(self):
1627 # trace add af-packet-input 10
1628 # pg interface on c1 172.20.0.1
1629 # pg interface on c4 B::1/120
1631 self.start_containers()
1633 print("Deleting the old containers...")
1635 print("Starting the new containers...")
1637 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1638 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1639 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1640 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1642 c1.pg_create_interface(
1643 local_ip="C::1/120",
1645 local_mac="aa:bb:cc:dd:ee:01",
1646 remote_mac="aa:bb:cc:dd:ee:02")
1647 c4.pg_create_interface(
1648 local_ip="B::1/120",
1650 local_mac="aa:bb:cc:dd:ee:11",
1651 remote_mac="aa:bb:cc:dd:ee:22")
1653 c1.vppctl_exec("set sr encaps source addr A1::1")
1654 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1657 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1659 c2.vppctl_exec("sr localsid address D2:: behavior end")
1661 c3.vppctl_exec("sr localsid address D3:: behavior end")
1663 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1665 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1666 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1667 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1668 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1669 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1674 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1675 IPv6(src="C::2", dst="D::2") /
1676 UDP(sport=2152, dport=2152) /
1677 GTP_U_Header(gtp_type="echo_response", S=1, teid=200, seq=300))
1679 print("Sending packet on {}:".format(c1.name))
1685 c4.pg_start_capture()
1687 c1.pg_create_stream(p)
1690 # timeout (sleep) if needed
1694 print("Receiving packet on {}:".format(c4.name))
1695 for p in c4.pg_read_packets():
1698 def test_gtp6_drop_in_error(self):
1700 # trace add af-packet-input 10
1701 # pg interface on c1 172.20.0.1
1702 # pg interface on c4 B::1/120
1704 self.start_containers()
1706 print("Deleting the old containers...")
1708 print("Starting the new containers...")
1710 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1711 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1712 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1713 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1715 c1.pg_create_interface(
1716 local_ip="C::1/120",
1718 local_mac="aa:bb:cc:dd:ee:01",
1719 remote_mac="aa:bb:cc:dd:ee:02")
1720 c4.pg_create_interface(
1721 local_ip="B::1/120",
1723 local_mac="aa:bb:cc:dd:ee:11",
1724 remote_mac="aa:bb:cc:dd:ee:22")
1726 c1.vppctl_exec("set sr encaps source addr A1::1")
1727 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1730 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1732 c2.vppctl_exec("sr localsid address D2:: behavior end")
1734 c3.vppctl_exec("sr localsid address D3:: behavior end")
1736 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1738 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1739 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1740 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1741 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1742 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1747 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1748 IPv6(src="C::2", dst="D::2") /
1749 UDP(sport=2152, dport=2152) /
1750 GTP_U_Header(gtp_type="error_indication", S=1, teid=200, seq=300)/
1751 IE_TEIDI(TEIDI=65535)/IE_GSNAddress(address="1.1.1.1")/
1752 IE_PrivateExtension(extention_value="z"))
1754 print("Sending packet on {}:".format(c1.name))
1760 c4.pg_start_capture()
1762 c1.pg_create_stream(p)
1765 # timeout (sleep) if needed
1769 print("Receiving packet on {}:".format(c4.name))
1770 for p in c4.pg_read_packets():
1773 def test_gtp6_drop_in_ipv6(self):
1775 # trace add af-packet-input 10
1776 # pg interface on c1 172.20.0.1
1777 # pg interface on c4 B::1/120
1779 self.start_containers()
1781 print("Deleting the old containers...")
1783 print("Starting the new containers...")
1785 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1786 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1787 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1788 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1790 c1.pg_create_interface(
1791 local_ip="C::1/120",
1793 local_mac="aa:bb:cc:dd:ee:01",
1794 remote_mac="aa:bb:cc:dd:ee:02")
1795 c4.pg_create_interface(
1796 local_ip="B::1/120",
1798 local_mac="aa:bb:cc:dd:ee:11",
1799 remote_mac="aa:bb:cc:dd:ee:22")
1801 c1.vppctl_exec("set sr encaps source addr A1::1")
1802 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1805 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1807 c2.vppctl_exec("sr localsid address D2:: behavior end")
1809 c3.vppctl_exec("sr localsid address D3:: behavior end")
1811 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1813 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1814 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1815 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1816 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1817 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1822 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1823 IPv6(src="C::2", dst="D::2") /
1824 UDP(sport=2152, dport=2152) /
1825 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1826 IPv6(src="2001::1", dst="2002::1") /
1827 ICMPv6EchoRequest())
1829 print("Sending packet on {}:".format(c1.name))
1835 c4.pg_start_capture()
1837 c1.pg_create_stream(p)
1840 # timeout (sleep) if needed
1844 print("Receiving packet on {}:".format(c4.name))
1845 for p in c4.pg_read_packets():
1848 def test_gtp6_drop_in_ipv6_5g(self):
1850 # trace add af-packet-input 10
1851 # pg interface on c1 172.20.0.1
1852 # pg interface on c4 B::1/120
1854 self.start_containers()
1856 print("Deleting the old containers...")
1858 print("Starting the new containers...")
1860 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1861 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1862 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1863 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1865 c1.pg_create_interface(
1866 local_ip="C::1/120",
1868 local_mac="aa:bb:cc:dd:ee:01",
1869 remote_mac="aa:bb:cc:dd:ee:02")
1870 c4.pg_create_interface(
1871 local_ip="B::1/120",
1873 local_mac="aa:bb:cc:dd:ee:11",
1874 remote_mac="aa:bb:cc:dd:ee:22")
1876 c1.vppctl_exec("set sr encaps source addr A1::1")
1877 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1880 "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64")
1882 c2.vppctl_exec("sr localsid address D2:: behavior end")
1884 c3.vppctl_exec("sr localsid address D3:: behavior end")
1886 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e")
1888 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1889 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1890 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1891 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1892 c4.set_ip_pgroute("pg0", "B::2", "D::2/128")
1897 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1898 IPv6(src="C::2", dst="D::2") /
1899 UDP(sport=2152, dport=2152) /
1900 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1901 GTPPDUSessionContainer(R=1, QFI=3) /
1902 IPv6(src="2001::1", dst="2002::1") /
1903 ICMPv6EchoRequest())
1905 print("Sending packet on {}:".format(c1.name))
1911 c4.pg_start_capture()
1913 c1.pg_create_stream(p)
1916 # timeout (sleep) if needed
1920 print("Receiving packet on {}:".format(c4.name))
1921 for p in c4.pg_read_packets():
1924 def test_gtp6(self):
1926 # trace add af-packet-input 10
1927 # pg interface on c1 172.20.0.1
1928 # pg interface on c4 B::1/120
1930 self.start_containers()
1932 print("Deleting the old containers...")
1934 print("Starting the new containers...")
1936 c1 = self.containers.get(self.get_name(self.instance_names[0]))
1937 c2 = self.containers.get(self.get_name(self.instance_names[1]))
1938 c3 = self.containers.get(self.get_name(self.instance_names[2]))
1939 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
1941 c1.pg_create_interface(
1942 local_ip="C::1/120",
1944 local_mac="aa:bb:cc:dd:ee:01",
1945 remote_mac="aa:bb:cc:dd:ee:02")
1946 c4.pg_create_interface4(
1947 local_ip="1.0.0.2/30",
1948 remote_ip="1.0.0.1",
1949 local_mac="aa:bb:cc:dd:ee:11",
1950 remote_mac="aa:bb:cc:dd:ee:22")
1952 c1.vppctl_exec("set sr encaps source addr A1::1")
1953 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
1956 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
1958 c2.vppctl_exec("sr localsid address D2:: behavior end")
1960 c3.vppctl_exec("sr localsid address D3:: behavior end")
1962 c4.vppctl_exec("set ip neighbor pg0 1.0.0.1 aa:bb:cc:dd:ee:22")
1963 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
1965 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
1966 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
1967 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
1968 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
1969 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
1974 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
1975 IPv6(src="C::2", dst="D::2") /
1976 UDP(sport=2152, dport=2152) /
1977 GTP_U_Header(gtp_type="g_pdu", teid=200) /
1978 IP(src="172.100.0.1", dst="172.200.0.1") /
1981 print("Sending packet on {}:".format(c1.name))
1987 c4.pg_start_capture()
1989 c1.pg_create_stream(p)
1992 # timeout (sleep) if needed
1996 print("Receiving packet on {}:".format(c4.name))
1997 for p in c4.pg_read_packets():
2000 def test_gtp6_5g(self):
2002 # trace add af-packet-input 10
2003 # pg interface on c1 172.20.0.1
2004 # pg interface on c4 B::1/120
2006 self.start_containers()
2008 print("Deleting the old containers...")
2010 print("Starting the new containers...")
2012 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2013 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2014 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2015 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2017 c1.pg_create_interface(
2018 local_ip="C::1/120",
2020 local_mac="aa:bb:cc:dd:ee:01",
2021 remote_mac="aa:bb:cc:dd:ee:02")
2022 c4.pg_create_interface4(
2023 local_ip="1.0.0.2/30",
2024 remote_ip="1.0.0.1",
2025 local_mac="aa:bb:cc:dd:ee:11",
2026 remote_mac="aa:bb:cc:dd:ee:22")
2028 c1.vppctl_exec("set sr encaps source addr A1::1")
2029 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2032 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2034 c2.vppctl_exec("sr localsid address D2:: behavior end")
2036 c3.vppctl_exec("sr localsid address D3:: behavior end")
2038 c4.vppctl_exec("set ip neighbor pg0 1.0.0.1 aa:bb:cc:dd:ee:22")
2039 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2")
2041 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2042 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2043 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2044 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2045 c4.set_ip_pgroute("pg0", "1.0.0.1", "172.200.0.1/32")
2050 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
2051 IPv6(src="C::2", dst="D::2") /
2052 UDP(sport=2152, dport=2152) /
2053 GTP_U_Header(gtp_type="g_pdu", teid=200) /
2054 GTPPDUSessionContainer(R=1, QFI=3) /
2055 IP(src="172.100.0.1", dst="172.200.0.1") /
2058 print("Sending packet on {}:".format(c1.name))
2064 c4.pg_start_capture()
2066 c1.pg_create_stream(p)
2069 # timeout (sleep) if needed
2073 print("Receiving packet on {}:".format(c4.name))
2074 for p in c4.pg_read_packets():
2077 def test_gtp6_ipv6(self):
2079 # trace add af-packet-input 10
2080 # pg interface on c1 172.20.0.1
2081 # pg interface on c4 B::1/120
2083 self.start_containers()
2085 print("Deleting the old containers...")
2087 print("Starting the new containers...")
2089 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2090 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2091 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2092 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2094 c1.pg_create_interface(
2095 local_ip="C::1/120",
2097 local_mac="aa:bb:cc:dd:ee:01",
2098 remote_mac="aa:bb:cc:dd:ee:02")
2099 c4.pg_create_interface(
2100 local_ip="B::1/120",
2102 local_mac="aa:bb:cc:dd:ee:11",
2103 remote_mac="aa:bb:cc:dd:ee:22")
2105 c1.vppctl_exec("set sr encaps source addr A1::1")
2106 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2109 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2111 c2.vppctl_exec("sr localsid address D2:: behavior end")
2113 c3.vppctl_exec("sr localsid address D3:: behavior end")
2115 c4.vppctl_exec("set ip neighbor pg0 B::2 aa:bb:cc:dd:ee:22")
2116 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
2118 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2119 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2120 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2121 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2122 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
2127 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
2128 IPv6(src="C::2", dst="D::2") /
2129 UDP(sport=2152, dport=2152) /
2130 GTP_U_Header(gtp_type="g_pdu", teid=200) /
2131 IPv6(src="2001::1", dst="2002::1") /
2132 ICMPv6EchoRequest())
2134 print("Sending packet on {}:".format(c1.name))
2140 c4.pg_start_capture()
2142 c1.pg_create_stream(p)
2145 # timeout (sleep) if needed
2149 print("Receiving packet on {}:".format(c4.name))
2150 for p in c4.pg_read_packets():
2153 def test_gtp6_ipv6_5g(self):
2155 # trace add af-packet-input 10
2156 # pg interface on c1 172.20.0.1
2157 # pg interface on c4 B::1/120
2159 self.start_containers()
2161 print("Deleting the old containers...")
2163 print("Starting the new containers...")
2165 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2166 c2 = self.containers.get(self.get_name(self.instance_names[1]))
2167 c3 = self.containers.get(self.get_name(self.instance_names[2]))
2168 c4 = self.containers.get(self.get_name(self.instance_names[-1]))
2170 c1.pg_create_interface(
2171 local_ip="C::1/120",
2173 local_mac="aa:bb:cc:dd:ee:01",
2174 remote_mac="aa:bb:cc:dd:ee:02")
2175 c4.pg_create_interface(
2176 local_ip="B::1/120",
2178 local_mac="aa:bb:cc:dd:ee:11",
2179 remote_mac="aa:bb:cc:dd:ee:22")
2181 c1.vppctl_exec("set sr encaps source addr A1::1")
2182 c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::")
2185 "sr localsid prefix D::/64 behavior end.m.gtp6.d D4::/64")
2187 c2.vppctl_exec("sr localsid address D2:: behavior end")
2189 c3.vppctl_exec("sr localsid address D3:: behavior end")
2191 c4.vppctl_exec("set ip neighbor pg0 B::2 aa:bb:cc:dd:ee:22")
2192 c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2")
2194 c2.set_ipv6_route("eth2", "A2::2", "D3::/128")
2195 c2.set_ipv6_route("eth1", "A1::1", "C::/120")
2196 c3.set_ipv6_route("eth2", "A3::2", "D4::/32")
2197 c3.set_ipv6_route("eth1", "A2::1", "C::/120")
2198 c4.set_ipv6_pgroute("pg0", "B::2", "2002::1/128")
2203 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
2204 IPv6(src="C::2", dst="D::2") /
2205 UDP(sport=2152, dport=2152) /
2206 GTP_U_Header(gtp_type="g_pdu", teid=200) /
2207 GTPPDUSessionContainer(R=1, QFI=3) /
2208 IPv6(src="2001::1", dst="2002::1") /
2209 ICMPv6EchoRequest())
2211 print("Sending packet on {}:".format(c1.name))
2217 c4.pg_start_capture()
2219 c1.pg_create_stream(p)
2222 # timeout (sleep) if needed
2226 print("Receiving packet on {}:".format(c4.name))
2227 for p in c4.pg_read_packets():
2230 def test_gtp6_dt(self):
2232 # trace add af-packet-input 10
2233 # pg interface on c1 172.20.0.1
2234 # pg interface on c4 B::1/120
2236 self.start_containers()
2238 print("Deleting the old containers...")
2240 print("Starting the new containers...")
2242 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2244 c1.pg_create_interface6_name(
2246 local_ip="C::1/120",
2248 local_mac="aa:bb:cc:dd:ee:01",
2249 remote_mac="aa:bb:cc:dd:ee:02")
2251 c1.pg_create_interface4_name(
2253 local_ip="1.0.0.2/30",
2254 remote_ip="1.0.0.1",
2255 local_mac="aa:bb:cc:dd:ee:11",
2256 remote_mac="aa:bb:cc:dd:ee:22")
2258 c1.vppctl_exec("set sr encaps source addr A1::1")
2261 "sr localsid prefix D::/64 behavior end.m.gtp6.dt46 fib-table 0 local-fib-table 0")
2263 c1.vppctl_exec("set ip neighbor pg1 1.0.0.1 aa:bb:cc:dd:ee:22")
2264 c1.set_ip_pgroute("pg1", "1.0.0.1", "172.200.0.1/32")
2269 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
2270 IPv6(src="C::2", dst="D::2") /
2271 UDP(sport=2152, dport=2152) /
2272 GTP_U_Header(gtp_type="g_pdu", teid=200) /
2273 IP(src="172.100.0.1", dst="172.200.0.1") /
2276 print("Sending packet on {}:".format(c1.name))
2281 c1.pg_start_capture_name(ifname="pg1")
2283 c1.pg_create_stream(p)
2286 # timeout (sleep) if needed
2290 print("Receiving packet on {}:".format(c1.name))
2291 for p in c1.pg_read_packets():
2294 def test_gtp4_dt(self):
2296 # trace add af-packet-input 10
2297 # pg interface on c1 172.20.0.1
2298 # pg interface on c4 B::1/120
2300 self.start_containers()
2302 print("Deleting the old containers...")
2304 print("Starting the new containers...")
2306 c1 = self.containers.get(self.get_name(self.instance_names[0]))
2308 c1.pg_create_interface4_name(
2310 local_ip="172.16.0.1/30",
2311 remote_ip="172.16.0.2",
2312 local_mac="aa:bb:cc:dd:ee:01",
2313 remote_mac="aa:bb:cc:dd:ee:02")
2315 c1.pg_create_interface4_name(
2317 local_ip="1.0.0.2/30",
2318 remote_ip="1.0.0.1",
2319 local_mac="aa:bb:cc:dd:ee:11",
2320 remote_mac="aa:bb:cc:dd:ee:22")
2322 c1.vppctl_exec("set sr encaps source addr A1::1")
2323 c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.dt4 fib-table 0")
2324 c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::")
2326 c1.vppctl_exec("set ip neighbor pg1 1.0.0.1 aa:bb:cc:dd:ee:22")
2327 c1.set_ip_pgroute("pg1", "1.0.0.1", "172.200.0.1/32")
2332 p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") /
2333 IP(src="172.20.0.2", dst="172.20.0.1") /
2334 UDP(sport=2152, dport=2152) /
2335 GTP_U_Header(gtp_type="g_pdu", teid=200) /
2336 IP(src="172.100.0.1", dst="172.200.0.1") /
2339 print("Sending packet on {}:".format(c1.name))
2344 c1.pg_start_capture_name(ifname="pg1")
2346 c1.pg_create_stream(p)
2349 # timeout (sleep) if needed
2353 print("Receiving packet on {}:".format(c1.name))
2354 for p in c1.pg_read_packets():
2357 def status_containers(self):
2361 for i, name in enumerate(self.instance_names):
2362 name = self.get_name(name)
2363 print("\t[{}] {} - {}".format(
2365 "running" if self.containers.get(name) else "missing"))
2369 for i, name in enumerate(self.network_names):
2370 name = self.get_name(name)
2371 print("\t[{}] {} - {}".format(
2373 "running" if self.networks.get(name) else "missing"))
2375 def build_image(self):
2376 print("VPP Path (build): {}".format(self.vpp_path))
2377 self.containers.build(self.path, self.vpp_path)
2379 def release_image(self):
2380 print("VPP Path (release): {}".format(self.vpp_path))
2381 instance = self.containers.new("release-build")
2384 "docker cp release-build:{}/vpp-package.tgz {}/".format(
2385 self.vpp_path, self.vpp_path))
2389 self.containers.release(self.path, self.vpp_path)
2391 system("rm -rf {}/vpp-package.tgz".format(self.vpp_path))
2393 def vppctl(self, index, command=None):
2394 if index >= len(self.instance_names):
2396 name = self.get_name(self.instance_names[index])
2397 self.logger.error("connecting to: {}".format(name))
2398 self.containers.vppctl(name, command)
2400 def bash(self, index):
2401 if index >= len(self.instance_names):
2403 name = self.get_name(self.instance_names[index])
2404 self.logger.error("connecting to: {}".format(name))
2405 self.containers.bash(name)
2409 parser = ArgumentParser()
2411 parser.add_argument("--verbose", choices=['error', 'debug', 'info'])
2413 parser.add_argument('--image', choices=['debug', 'release'])
2415 subparsers = parser.add_subparsers()
2417 p1 = subparsers.add_parser(
2418 "infra", help="Infrastructure related commands.")
2430 p1.add_argument("--prefix")
2431 p1.add_argument("--image")
2433 p2 = subparsers.add_parser("cmd", help="Instance related commands.")
2435 p2.add_argument("op", choices=['vppctl', 'bash'])
2440 help="Container instance index. (./runner.py infra status)")
2443 "--command", help="Only vppctl supports this optional argument.")
2445 p3 = subparsers.add_parser("test", help="Test related commands.")
2466 "gtp6_drop_in_echo",
2467 "gtp6_drop_in_reply",
2468 "gtp6_drop_in_error",
2469 "gtp6_drop_in_ipv6",
2470 "gtp6_drop_in_ipv6_5g",
2478 args = parser.parse_args()
2479 if not hasattr(args, "op") or not args.op:
2480 parser.print_help(sys.stderr)
2486 def main(op=None, prefix=None, verbose=None,
2487 image=None, index=None, command=None):
2490 basicConfig(level=verbose_levels[verbose])
2492 if image == 'release':
2493 image = "srv6m-release-image"
2494 elif image == 'debug':
2495 image = "srv6m-image"
2497 image = "srv6m-image"
2499 print("Target image: {}".format(image))
2501 program = Program(image, prefix)
2505 program.build_image()
2506 elif op == 'release':
2507 program.release_image()
2509 program.stop_containers()
2511 program.start_containers()
2512 elif op == 'status':
2513 program.status_containers()
2514 elif op == 'vppctl':
2515 program.vppctl(index, command)
2522 # elif op == 'tmap':
2523 # program.test_tmap()
2524 # elif op == 'tmap_5g':
2525 # program.test_tmap_5g()
2526 # elif op == 'tmap_ipv6':
2527 # program.test_tmap_ipv6()
2528 # elif op == 'tmap_ipv6_5g':
2529 # program.test_tmap_ipv6_5g()
2532 elif op == 'gtp4_usid':
2533 program.test_gtp4_usid()
2534 elif op == 'gtp4_5g':
2535 program.test_gtp4_5g()
2536 elif op == 'gtp4_echo':
2537 program.test_gtp4_echo()
2538 elif op == 'gtp4_reply':
2539 program.test_gtp4_reply()
2540 elif op == 'gtp4_error':
2541 program.test_gtp4_error()
2542 elif op == 'gtp4_ipv6':
2543 program.test_gtp4_ipv6()
2544 elif op == 'gtp4_ipv6_5g':
2545 program.test_gtp4_ipv6_5g()
2546 elif op == 'gtp6_drop_in':
2547 program.test_gtp6_drop_in()
2548 elif op == 'gtp6_drop_in_5g':
2549 program.test_gtp6_drop_in_5g()
2550 elif op == 'gtp6_drop_in_echo':
2551 program.test_gtp6_drop_in_echo()
2552 elif op == 'gtp6_drop_in_reply':
2553 program.test_gtp6_drop_in_reply()
2554 elif op == 'gtp6_drop_in_error':
2555 program.test_gtp6_drop_in_error()
2556 elif op == 'gtp6_drop_in_ipv6':
2557 program.test_gtp6_drop_in_ipv6()
2558 elif op == 'gtp6_drop_in_ipv6_5g':
2559 program.test_gtp6_drop_in_ipv6_5g()
2562 elif op == 'gtp6_5g':
2563 program.test_gtp6_5g()
2564 elif op == 'gtp6_ipv6':
2565 program.test_gtp6_ipv6()
2566 elif op == 'gtp6_ipv6_5g':
2567 program.test_gtp6_ipv6_5g()
2568 elif op == 'gtp6_dt':
2569 program.test_gtp6_dt()
2570 elif op == 'gtp4_dt':
2571 program.test_gtp4_dt()
2574 program.logger.exception("")
2582 if __name__ == "__main__":
2583 sys.exit(main(**get_args()))