diff options
Diffstat (limited to 'src/plugins/srv6-mobile/extra')
-rw-r--r-- | src/plugins/srv6-mobile/extra/README.md | 209 | ||||
-rwxr-xr-x | src/plugins/srv6-mobile/extra/runner.py | 477 | ||||
-rw-r--r-- | src/plugins/srv6-mobile/extra/runner_doc.md | 105 | ||||
-rw-r--r-- | src/plugins/srv6-mobile/extra/topo-init.png | bin | 121503 -> 0 bytes | |||
-rw-r--r-- | src/plugins/srv6-mobile/extra/topo-test_gtp4d.png | bin | 138014 -> 0 bytes | |||
-rw-r--r-- | src/plugins/srv6-mobile/extra/topo-test_gtp6.png | bin | 131731 -> 0 bytes | |||
-rw-r--r-- | src/plugins/srv6-mobile/extra/topo-test_gtp6d.png | bin | 127820 -> 0 bytes | |||
-rw-r--r-- | src/plugins/srv6-mobile/extra/topo-test_gtp6ip6.png | bin | 116633 -> 0 bytes |
8 files changed, 113 insertions, 678 deletions
diff --git a/src/plugins/srv6-mobile/extra/README.md b/src/plugins/srv6-mobile/extra/README.md index ed6bb40f7ff..3b24dea6fd6 100644 --- a/src/plugins/srv6-mobile/extra/README.md +++ b/src/plugins/srv6-mobile/extra/README.md @@ -1,168 +1,173 @@ -Test and Demonstrate SRv6 Mobile User Plane Plugin -======================== +# What's `runner.py` doing? +## Common configurations -## Getting started -To play with SRv6 Mobile User Plane on VPP, you need to install following packages: +### VPP1 +``` +create host-interface name eth1 +set int ip addr host-eth1 A1::1/120 +set int state host-eth1 up +ip route add ::/0 via host-eth1 A1::2 +``` - docker - python3 - pip3 - Python packages (use pip): - docker - scapy - jinja2 +### VPP2 +``` +create host-interface name eth1 +set int ip addr host-eth1 A1::2/120 +create host-interface name eth2 +set int ip addr host-eth2 A2::1/120 +set int state host-eth1 up +set int state host-eth2 up +ip route add ::/0 via host-eth2 A2::2 +``` -### Quick-start -1. Build up the docker container image as following: +### VPP3 ``` -$ git clone https://github.com/filvarga/srv6-mobile.git -$ cd ./srv6-mobile/src/plugins/srv6-mobile/extra -$ ./runner.py infra build - -$ docker images -REPOSITORY TAG IMAGE ID CREATED SIZE -srv6m-image latest 577e786b7ec6 2 days ago 8GB -ubuntu 18.04 4c108a37151f 4 weeks ago 64.2MB - +create host-interface name eth1 +set int ip addr host-eth1 A2::2/120 +create host-interface name eth2 +set int ip addr host-eth2 A3::1/120 +set int state host-eth1 up +set int state host-eth2 up +ip route add ::/0 via host-eth1 A2::1 ``` -The runner script [runner.py](runner.py) has features to automate configurations and procedures for the test. - -2. Instantiate test Scenario - -Let's try following command to instantiate a topology: +### VPP4 ``` -$ ./runner.py infra start +create host-interface name eth1 +set int ip addr host-eth1 A3::2/120 +set int state host-eth1 up +ip route add ::/0 via host-eth1 A3::1 ``` -This command instantiates 4 VPP containers with following topology: -![Topology Diagram](topo-init.png) +## Drop-in for GTP-U over IPv4 -You can check the instantiated docker instances with "docker ps". +What's happened when you run `test tmap`: + $ ./runner.py test tmap -``` -$ docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -44cb98994500 srv6m-image "/bin/sh -c 'vpp -c …" About a minute ago Up About a minute hck-vpp-4 -6d65fff8aee9 srv6m-image "/bin/sh -c 'vpp -c …" About a minute ago Up About a minute hck-vpp-3 -ad123b516b24 srv6m-image "/bin/sh -c 'vpp -c …" About a minute ago Up About a minute hck-vpp-2 -5efed405b96a srv6m-image "/bin/sh -c 'vpp -c …" About a minute ago Up About a minute hck-vpp-1 -``` +Setting up a virtual interface of packet generator: -You can login to and configure each instantiated container. +#### VPP1 ``` -$ ./runner.py cmd vppctl 0 - -Verified image: None -connecting to: hck-vpp-1 - _______ _ _ _____ ___ - __/ __/ _ \ (_)__ | | / / _ \/ _ \ - _/ _// // / / / _ \ | |/ / ___/ ___/ - /_/ /____(_)_/\___/ |___/_/ /_/ - -vpp# +create packet-generator interface pg0 +set int mac address pg0 aa:bb:cc:dd:ee:01 +set int ip addr pg0 172.16.0.1/30 +set ip arp pg0 172.16.0.2/30 aa:bb:cc:dd:ee:02 ``` -## Test Scenarios -### SRv6 Drop-in between GTP-U tunnel - -This test scenario introduces SRv6 path between GTP-U tunnel transparently. A GTP-U packet sent out from one end to another is translated to SRv6 and then back to GTP-U. All GTP-U tunnel identifiers are preserved in IPv6 header and SRH. +#### VPP4 +``` +create packet-generator interface pg0 +set int mac address pg0 aa:bb:cc:dd:ee:11 +set int ip addr pg0 1.0.0.2/30 +set ip arp pg0 1.0.0.1 aa:bb:cc:dd:ee:22 +``` -#### GTP-U over UDP/IPv4 case +SRv6 and IP routing settings: -This case uses SRv6 end functions, T.M.GTP4.D and End.M.GTP4.E. +#### VPP1 -![Topology Diagram](topo-test_gtp4d.png) +``` +sr policy add bsid D1:: next D2:: next D3:: gtp4_removal sr_prefix D4::/32 v6src_prefix C1::/64 +sr steer l3 172.20.0.1/32 via bsid D1:: -VPP1 is configured with "T.M.GTP4.D", and VPP4 is configured with "End.M.GTP4.E". Others are configured with "End". The packet generator sends a GTP-U packet over UDP/IPv4 toward the packet capture. VPP1 translates it to SRv6 toward D4::TEID with SR policy <D2::, D3::> in SRH. VPP4 translates the SRv6 packet to the original GTP-U packet and send out to the packet capture. +``` -To start this case with IPv4 payload over GTP-U, you can run: +#### VPP2 ``` -$ ./runner.py test gtp4 +sr localsid address D2:: behavior end +ip route add D3::/128 via host-eth2 A2::2 ``` -If you want to use IPv6 payload instead of IPv4, you can run: +#### VPP3 ``` -$ ./runner.py test gtp4_ipv6 +sr localsid address D3:: behavior end +ip route add D4::/32 via host-eth2 A3::2 ``` -If you use the latest scapy codes from the master branch, you can test the functions with GTP-U packet in 5G format: +#### VPP4 ``` -$ ./runner.py test gtp4_5g +sr localsid prefix D4::/32 behavior end.m.gtp4.e v4src_position 64 +ip route add 172.20.0.1/32 via pg0 1.0.0.1 ``` -#### GTP-U over UDP/IPv6 case -This case uses SRv6 end functions, End.M.GTP6.D.Di and End.M.GTP6.E. +## Packet generator and testing -![Topology Diagram](topo-test_gtp6d.png) + Example how to build custom SRv6 packet in scapy and ipaddress pkgs -VPP1 is configured with "End.M.GTP6.D.Di", and VPP4 is configured with "End.M.GTP4.E". Others are configured with "End". The packet generator sends a GTP-U packet over UDP/IPv6 toward D:: of the packet capture. VPP1 translates it to SRv6 toward D:: with SR policy <D2::, D3::, D4::TEID> in SRH. VPP4 translates the SRv6 packet to the original GTP-U packet and send out to the packet capture. + s = '\x11' * 4 + IPv4Address(u"192.168.192.10").packed + '\x11' * 8 + ip6 = IPv6Address(s) + IPv6(dst=ip6, src=ip6) -To start this case with IPv4 payload over GTP-U, you can run: -``` -$ ./runner.py test gtp6_drop_in -``` +## end.m.gtp4.e -If you want to use IPv6 payload instead of IPv4, you can run: + First set behavior so our localsid node is called with the packet + matching C1::1 in fib table + sr localsid address C1::1 behavior end.m.gtp4.ess -``` -$ ./runner.py test gtp6_drop_in_ipv6 -``` + show sr localsids behaviors + show sr localsid + We should send a well formated packet to C::1 destination address + that contains the correct spec as for end.m.gtp4.e with encapsulated + ipv4 src and dst address and teid with port for the conversion to + GTPU IPv4 packet -### GTP-U to SRv6 -This test scenario demonstrates GTP-U to SRv6 translation. A GTP-U packet sent out from one end to another is translated to SRv6. +## additional commands -#### GTP-U over UDP/IPv6 case + gdb - breakpoint -##### IPv4 payload + break sr_policy_rewrite.c:1620 -This case uses SRv6 end functions, End.M.GTP6.D and End.DT4. + break src/plugins/srv6-end/node.c:84 -![Topology Diagram](topo-test_gtp6.png) + TMAP + Linux: -VPP1 is configured with "End.M.GTP6.D", and VPP4 is configured with "End.DT4". Others are configured with "End". The packet generator sends a GTP-U packet over UDP/IPv6 toward D::2. VPP1 translates it to SRv6 toward the IPv6 destination consists of D4:: and TEID of GTP-U with SR policy <D2::, D3::> in SRH. VPP4 decapsulates the SRv6 packet and lookup the table for the inner IPv4 packet and send out to the packet capture. + ip link add tmp1 type veth peer name tmp2 + ip link set dev tmp1 up + ip link set dev tmp2 up + ip addr add 172.20.0.2/24 dev tmp2 -To start this case, you can run: + create host-interface name tmp1 + set int mac address host-tmp1 02:fe:98:c6:c8:7b + set interface ip address host-tmp1 172.20.0.1/24 + set interface state host-tmp1 up -``` -$ ./runner.py test gtp6 -``` + VPP + set sr encaps source addr C1:: + sr policy add bsid D1::999:2 next D2:: next D3:: gtp4_removal sr-prefix fc34:5678::/64 local-prefix C1::/64 + sr steer l3 172.21.0.0/24 via bsid d1::999:2 -##### IPv6 payload + END + Linux + create host-interface name tmp1 + set int mac address host-tmp1 02:fe:98:c6:c8:7b + set interface ip address host-tmp1 A1::1/64 + set interface state host-tmp1 up -This case uses SRv6 end functions, End.M.GTP6.D and End.DT6. - - -![Topology Diagram](topo-test_gtp6ip6.png) - -The configurations are same with IPv4 payload case, except D4:: is configured as "End.DT6" in VPP4. VPP4 decapsulates the SRv6 packet and lookup the table for the inner IPv6 packet and send out to the packet capture. - -If you want to use IPv6 payload instead of IPv4, you can run: - -``` -$ ./runner.py test gtp6_ipv6 -``` + VPP + sr localsid address 1111:1111:c0a8:c00a:1122:1111:1111:1111 behavior end.m.gtp4.e -## More information + trace add af-packet-input 10 -- @subpage runner_doc.md + sr localsid address C3:: behavior end.m.gtp4.e + sr localsid address 2001:200:0:1ce1:3000:757f:0:2 behavior end.m.gtp4.e diff --git a/src/plugins/srv6-mobile/extra/runner.py b/src/plugins/srv6-mobile/extra/runner.py index c438fb161b7..79ec2d007c5 100755 --- a/src/plugins/srv6-mobile/extra/runner.py +++ b/src/plugins/srv6-mobile/extra/runner.py @@ -135,7 +135,7 @@ class Container(object): self.vppctl_exec("set int mac address pg0 {}".format(local_mac)) self.vppctl_exec("set int ip addr pg0 {}".format(local_ip)) self.vppctl_exec( - "set ip neighbor pg0 {} {}".format(remote_ip, remote_mac)) + "set ip6 neighbor pg0 {} {}".format(remote_ip, remote_mac)) self.vppctl_exec("set int state pg0 up") def pg_create_interface4(self, local_ip, remote_ip, local_mac, remote_mac): @@ -145,7 +145,7 @@ class Container(object): self.vppctl_exec("create packet-generator interface pg0") self.vppctl_exec("set int mac address pg0 {}".format(local_mac)) self.vppctl_exec("set int ip addr pg0 {}".format(local_ip)) - self.vppctl_exec("set ip neighbor pg0 {} {}".format(remote_ip, remote_mac)) + self.vppctl_exec("set ip arp pg0 {} {}".format(remote_ip, remote_mac)) self.vppctl_exec("set int state pg0 up") def pg_create_interface6(self, local_ip, remote_ip, local_mac, remote_mac): @@ -154,30 +154,10 @@ class Container(object): time.sleep(2) self.vppctl_exec("create packet-generator interface pg0") self.vppctl_exec("set int mac address pg0 {}".format(local_mac)) - self.vppctl_exec("set int ip addr pg0 {}".format(local_ip)) - self.vppctl_exec("set ip neighbor pg0 {} {}".format(remote_ip, remote_mac)) + self.vppctl_exec("set int ip6 addr pg0 {}".format(local_ip)) + self.vppctl_exec("set ip6 arp pg0 {} {}".format(remote_ip, remote_mac)) self.vppctl_exec("set int state pg0 up") - def pg_create_interface4_name(self, ifname, local_ip, remote_ip, local_mac, remote_mac): - # remote_ip can't have subnet mask - - time.sleep(2) - self.vppctl_exec("create packet-generator interface {}".format(ifname)) - self.vppctl_exec("set int mac address {} {}".format(ifname, local_mac)) - self.vppctl_exec("set int ip addr {} {}".format(ifname, local_ip)) - self.vppctl_exec("set ip neighbor {} {} {}".format(ifname, remote_ip, remote_mac)) - self.vppctl_exec("set int state {} up".format(ifname)) - - def pg_create_interface6_name(self, ifname, local_ip, remote_ip, local_mac, remote_mac): - # remote_ip can't have subnet mask - - time.sleep(2) - self.vppctl_exec("create packet-generator interface {}".format(ifname)) - self.vppctl_exec("set int mac address {} {}".format(ifname, local_mac)) - self.vppctl_exec("set int ip addr {} {}".format(ifname, local_ip)) - self.vppctl_exec("set ip neighbor {} {} {}".format(ifname, remote_ip, remote_mac)) - self.vppctl_exec("set int state {} up".format(ifname)) - def pg_enable(self): # start packet generator self.vppctl_exec("packet-generator enable") @@ -196,13 +176,6 @@ class Container(object): "packet-generator capture pg0 pcap {}".format( self.pg_output_file_in)) - def pg_start_capture_name(self, ifname): - if exists(self.pg_output_file): - remove(self.pg_output_file) - self.vppctl_exec( - "packet-generator capture {} pcap {}".format( - ifname, self.pg_output_file_in)) - def pg_read_packets(self): return rdpcap(self.pg_output_file) @@ -211,11 +184,6 @@ class Container(object): "ip route add {} via host-{} {}".format( subnet, out_if_name, next_hop_ip)) - def set_ipv6_route2(self, out_if_name, next_hop_ip, subnet): - self.vppctl_exec( - "ip route add {} via {} {}".format( - subnet, out_if_name, next_hop_ip)) - def set_ip_pgroute(self, out_if_name, next_hop_ip, subnet): self.vppctl_exec("ip route add {} via {} {}".format( subnet, out_if_name, next_hop_ip)) @@ -1121,142 +1089,6 @@ class Program(object): for p in c4.pg_read_packets(): p.show2() - def test_gtp4_reply(self): - # TESTS: - # trace add af-packet-input 10 - # pg interface on c1 172.20.0.1 - # pg interface on c4 B::1/120 - - self.start_containers() - - c1 = self.containers.get(self.get_name(self.instance_names[0])) - c2 = self.containers.get(self.get_name(self.instance_names[1])) - c3 = self.containers.get(self.get_name(self.instance_names[2])) - c4 = self.containers.get(self.get_name(self.instance_names[-1])) - - c1.pg_create_interface4( - local_ip="172.16.0.1/30", - remote_ip="172.16.0.2/30", - local_mac="aa:bb:cc:dd:ee:01", - remote_mac="aa:bb:cc:dd:ee:02") - c4.pg_create_interface4( - local_ip="1.0.0.2/30", - remote_ip="1.0.0.1", - local_mac="aa:bb:cc:dd:ee:11", - remote_mac="aa:bb:cc:dd:ee:22") - - c1.vppctl_exec("set sr encaps source addr A1::1") - c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::") - c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4") - c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::") - - c2.vppctl_exec("sr localsid address D2:: behavior end") - - c3.vppctl_exec("sr localsid address D3:: behavior end") - - c4.vppctl_exec( - "sr localsid prefix D4::/32 " - "behavior end.m.gtp4.e v4src_position 64") - - c2.set_ipv6_route("eth2", "A2::2", "D3::/128") - c2.set_ipv6_route("eth1", "A1::1", "C::/120") - c3.set_ipv6_route("eth2", "A3::2", "D4::/32") - c3.set_ipv6_route("eth1", "A2::1", "C::/120") - c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32") - - p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") / - IP(src="172.20.0.2", dst="172.20.0.1") / - UDP(sport=2152, dport=2152) / - GTP_U_Header(gtp_type="echo_response", S=1, teid=200, seq=200)) - - print("Sending packet on {}:".format(c1.name)) - p.show2() - - c1.enable_trace(10) - c4.enable_trace(10) - - c4.pg_start_capture() - - c1.pg_create_stream(p) - c1.pg_enable() - - # timeout (sleep) if needed - print("Sleeping") - time.sleep(5) - - print("Receiving packet on {}:".format(c4.name)) - for p in c4.pg_read_packets(): - p.show2() - - def test_gtp4_error(self): - # TESTS: - # trace add af-packet-input 10 - # pg interface on c1 172.20.0.1 - # pg interface on c4 B::1/120 - - self.start_containers() - - c1 = self.containers.get(self.get_name(self.instance_names[0])) - c2 = self.containers.get(self.get_name(self.instance_names[1])) - c3 = self.containers.get(self.get_name(self.instance_names[2])) - c4 = self.containers.get(self.get_name(self.instance_names[-1])) - - c1.pg_create_interface4( - local_ip="172.16.0.1/30", - remote_ip="172.16.0.2/30", - local_mac="aa:bb:cc:dd:ee:01", - remote_mac="aa:bb:cc:dd:ee:02") - c4.pg_create_interface4( - local_ip="1.0.0.2/30", - remote_ip="1.0.0.1", - local_mac="aa:bb:cc:dd:ee:11", - remote_mac="aa:bb:cc:dd:ee:22") - - c1.vppctl_exec("set sr encaps source addr A1::1") - c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::") - c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4") - c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::") - - c2.vppctl_exec("sr localsid address D2:: behavior end") - - c3.vppctl_exec("sr localsid address D3:: behavior end") - - c4.vppctl_exec( - "sr localsid prefix D4::/32 " - "behavior end.m.gtp4.e v4src_position 64") - - c2.set_ipv6_route("eth2", "A2::2", "D3::/128") - c2.set_ipv6_route("eth1", "A1::1", "C::/120") - c3.set_ipv6_route("eth2", "A3::2", "D4::/32") - c3.set_ipv6_route("eth1", "A2::1", "C::/120") - c4.set_ip_pgroute("pg0", "1.0.0.1", "172.20.0.1/32") - - p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") / - IP(src="172.20.0.2", dst="172.20.0.1") / - UDP(sport=2152, dport=2152) / - GTP_U_Header(gtp_type="error_indication", S=1, teid=200, seq=200)/ - IE_TEIDI(TEIDI=65535)/IE_GSNAddress(address="1.1.1.1")/ - IE_PrivateExtension(extention_value="z")) - - print("Sending packet on {}:".format(c1.name)) - p.show2() - - c1.enable_trace(10) - c4.enable_trace(10) - - c4.pg_start_capture() - - c1.pg_create_stream(p) - c1.pg_enable() - - # timeout (sleep) if needed - print("Sleeping") - time.sleep(5) - - print("Receiving packet on {}:".format(c4.name)) - for p in c4.pg_read_packets(): - p.show2() - def test_gtp4_ipv6(self): # TESTS: # trace add af-packet-input 10 @@ -1620,154 +1452,6 @@ class Program(object): for p in c4.pg_read_packets(): p.show2() - def test_gtp6_drop_in_reply(self): - # TESTS: - # trace add af-packet-input 10 - # pg interface on c1 172.20.0.1 - # pg interface on c4 B::1/120 - - self.start_containers() - - print("Deleting the old containers...") - time.sleep(30) - print("Starting the new containers...") - - c1 = self.containers.get(self.get_name(self.instance_names[0])) - c2 = self.containers.get(self.get_name(self.instance_names[1])) - c3 = self.containers.get(self.get_name(self.instance_names[2])) - c4 = self.containers.get(self.get_name(self.instance_names[-1])) - - c1.pg_create_interface( - local_ip="C::1/120", - remote_ip="C::2", - local_mac="aa:bb:cc:dd:ee:01", - remote_mac="aa:bb:cc:dd:ee:02") - c4.pg_create_interface( - local_ip="B::1/120", - remote_ip="B::2", - local_mac="aa:bb:cc:dd:ee:11", - remote_mac="aa:bb:cc:dd:ee:22") - - c1.vppctl_exec("set sr encaps source addr A1::1") - c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::") - - c1.vppctl_exec( - "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64") - - c2.vppctl_exec("sr localsid address D2:: behavior end") - - c3.vppctl_exec("sr localsid address D3:: behavior end") - - c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e") - - c2.set_ipv6_route("eth2", "A2::2", "D3::/128") - c2.set_ipv6_route("eth1", "A1::1", "C::/120") - c3.set_ipv6_route("eth2", "A3::2", "D4::/32") - c3.set_ipv6_route("eth1", "A2::1", "C::/120") - c4.set_ip_pgroute("pg0", "B::2", "D::2/128") - - print("Waiting...") - time.sleep(30) - - p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") / - IPv6(src="C::2", dst="D::2") / - UDP(sport=2152, dport=2152) / - GTP_U_Header(gtp_type="echo_response", S=1, teid=200, seq=300)) - - print("Sending packet on {}:".format(c1.name)) - p.show2() - - c1.enable_trace(10) - c4.enable_trace(10) - - c4.pg_start_capture() - - c1.pg_create_stream(p) - c1.pg_enable() - - # timeout (sleep) if needed - print("Sleeping") - time.sleep(5) - - print("Receiving packet on {}:".format(c4.name)) - for p in c4.pg_read_packets(): - p.show2() - - def test_gtp6_drop_in_error(self): - # TESTS: - # trace add af-packet-input 10 - # pg interface on c1 172.20.0.1 - # pg interface on c4 B::1/120 - - self.start_containers() - - print("Deleting the old containers...") - time.sleep(30) - print("Starting the new containers...") - - c1 = self.containers.get(self.get_name(self.instance_names[0])) - c2 = self.containers.get(self.get_name(self.instance_names[1])) - c3 = self.containers.get(self.get_name(self.instance_names[2])) - c4 = self.containers.get(self.get_name(self.instance_names[-1])) - - c1.pg_create_interface( - local_ip="C::1/120", - remote_ip="C::2", - local_mac="aa:bb:cc:dd:ee:01", - remote_mac="aa:bb:cc:dd:ee:02") - c4.pg_create_interface( - local_ip="B::1/120", - remote_ip="B::2", - local_mac="aa:bb:cc:dd:ee:11", - remote_mac="aa:bb:cc:dd:ee:22") - - c1.vppctl_exec("set sr encaps source addr A1::1") - c1.vppctl_exec("sr policy add bsid D4:: next D2:: next D3::") - - c1.vppctl_exec( - "sr localsid prefix D::/64 behavior end.m.gtp6.d.di D4::/64") - - c2.vppctl_exec("sr localsid address D2:: behavior end") - - c3.vppctl_exec("sr localsid address D3:: behavior end") - - c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.m.gtp6.e") - - c2.set_ipv6_route("eth2", "A2::2", "D3::/128") - c2.set_ipv6_route("eth1", "A1::1", "C::/120") - c3.set_ipv6_route("eth2", "A3::2", "D4::/32") - c3.set_ipv6_route("eth1", "A2::1", "C::/120") - c4.set_ip_pgroute("pg0", "B::2", "D::2/128") - - print("Waiting...") - time.sleep(30) - - p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") / - IPv6(src="C::2", dst="D::2") / - UDP(sport=2152, dport=2152) / - GTP_U_Header(gtp_type="error_indication", S=1, teid=200, seq=300)/ - IE_TEIDI(TEIDI=65535)/IE_GSNAddress(address="1.1.1.1")/ - IE_PrivateExtension(extention_value="z")) - - print("Sending packet on {}:".format(c1.name)) - p.show2() - - c1.enable_trace(10) - c4.enable_trace(10) - - c4.pg_start_capture() - - c1.pg_create_stream(p) - c1.pg_enable() - - # timeout (sleep) if needed - print("Sleeping") - time.sleep(5) - - print("Receiving packet on {}:".format(c4.name)) - for p in c4.pg_read_packets(): - p.show2() - def test_gtp6_drop_in_ipv6(self): # TESTS: # trace add af-packet-input 10 @@ -1957,7 +1641,6 @@ class Program(object): c3.vppctl_exec("sr localsid address D3:: behavior end") - c4.vppctl_exec("set ip neighbor pg0 1.0.0.1 aa:bb:cc:dd:ee:22") c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2") c2.set_ipv6_route("eth2", "A2::2", "D3::/128") @@ -2033,7 +1716,6 @@ class Program(object): c3.vppctl_exec("sr localsid address D3:: behavior end") - c4.vppctl_exec("set ip neighbor pg0 1.0.0.1 aa:bb:cc:dd:ee:22") c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt4 2") c2.set_ipv6_route("eth2", "A2::2", "D3::/128") @@ -2110,7 +1792,6 @@ class Program(object): c3.vppctl_exec("sr localsid address D3:: behavior end") - c4.vppctl_exec("set ip neighbor pg0 B::2 aa:bb:cc:dd:ee:22") c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2") c2.set_ipv6_route("eth2", "A2::2", "D3::/128") @@ -2186,7 +1867,6 @@ class Program(object): c3.vppctl_exec("sr localsid address D3:: behavior end") - c4.vppctl_exec("set ip neighbor pg0 B::2 aa:bb:cc:dd:ee:22") c4.vppctl_exec("sr localsid prefix D4::/64 behavior end.dt6 2") c2.set_ipv6_route("eth2", "A2::2", "D3::/128") @@ -2225,133 +1905,6 @@ class Program(object): for p in c4.pg_read_packets(): p.show2() - def test_gtp6_dt(self): - # TESTS: - # trace add af-packet-input 10 - # pg interface on c1 172.20.0.1 - # pg interface on c4 B::1/120 - - self.start_containers() - - print("Deleting the old containers...") - time.sleep(30) - print("Starting the new containers...") - - c1 = self.containers.get(self.get_name(self.instance_names[0])) - - c1.pg_create_interface6_name( - ifname="pg0", - local_ip="C::1/120", - remote_ip="C::2", - local_mac="aa:bb:cc:dd:ee:01", - remote_mac="aa:bb:cc:dd:ee:02") - - c1.pg_create_interface4_name( - ifname="pg1", - local_ip="1.0.0.2/30", - remote_ip="1.0.0.1", - local_mac="aa:bb:cc:dd:ee:11", - remote_mac="aa:bb:cc:dd:ee:22") - - c1.vppctl_exec("set sr encaps source addr A1::1") - - c1.vppctl_exec( - "sr localsid prefix D::/64 behavior end.m.gtp6.dt46 fib-table 0 local-fib-table 0") - - c1.vppctl_exec("set ip neighbor pg1 1.0.0.1 aa:bb:cc:dd:ee:22") - c1.set_ip_pgroute("pg1", "1.0.0.1", "172.200.0.1/32") - - print("Waiting...") - time.sleep(30) - - p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") / - IPv6(src="C::2", dst="D::2") / - UDP(sport=2152, dport=2152) / - GTP_U_Header(gtp_type="g_pdu", teid=200) / - IP(src="172.100.0.1", dst="172.200.0.1") / - ICMP()) - - print("Sending packet on {}:".format(c1.name)) - p.show2() - - c1.enable_trace(10) - - c1.pg_start_capture_name(ifname="pg1") - - c1.pg_create_stream(p) - c1.pg_enable() - - # timeout (sleep) if needed - print("Sleeping") - time.sleep(5) - - print("Receiving packet on {}:".format(c1.name)) - for p in c1.pg_read_packets(): - p.show2() - - def test_gtp4_dt(self): - # TESTS: - # trace add af-packet-input 10 - # pg interface on c1 172.20.0.1 - # pg interface on c4 B::1/120 - - self.start_containers() - - print("Deleting the old containers...") - time.sleep(30) - print("Starting the new containers...") - - c1 = self.containers.get(self.get_name(self.instance_names[0])) - - c1.pg_create_interface4_name( - ifname="pg0", - local_ip="172.16.0.1/30", - remote_ip="172.16.0.2", - local_mac="aa:bb:cc:dd:ee:01", - remote_mac="aa:bb:cc:dd:ee:02") - - c1.pg_create_interface4_name( - ifname="pg1", - local_ip="1.0.0.2/30", - remote_ip="1.0.0.1", - local_mac="aa:bb:cc:dd:ee:11", - remote_mac="aa:bb:cc:dd:ee:22") - - c1.vppctl_exec("set sr encaps source addr A1::1") - c1.vppctl_exec("sr policy add bsid D5:: behavior t.m.gtp4.dt4 fib-table 0") - c1.vppctl_exec("sr steer l3 172.20.0.1/32 via bsid D5::") - - c1.vppctl_exec("set ip neighbor pg1 1.0.0.1 aa:bb:cc:dd:ee:22") - c1.set_ip_pgroute("pg1", "1.0.0.1", "172.200.0.1/32") - - print("Waiting...") - time.sleep(30) - - p = (Ether(src="aa:bb:cc:dd:ee:02", dst="aa:bb:cc:dd:ee:01") / - IP(src="172.20.0.2", dst="172.20.0.1") / - UDP(sport=2152, dport=2152) / - GTP_U_Header(gtp_type="g_pdu", teid=200) / - IP(src="172.100.0.1", dst="172.200.0.1") / - ICMP()) - - print("Sending packet on {}:".format(c1.name)) - p.show2() - - c1.enable_trace(10) - - c1.pg_start_capture_name(ifname="pg1") - - c1.pg_create_stream(p) - c1.pg_enable() - - # timeout (sleep) if needed - print("Sleeping") - time.sleep(5) - - print("Receiving packet on {}:".format(c1.name)) - for p in c1.pg_read_packets(): - p.show2() - def status_containers(self): print("Instances:") @@ -2455,23 +2008,17 @@ def get_args(): "gtp4_usid", "gtp4_5g", "gtp4_echo", - "gtp4_reply", - "gtp4_error", "gtp4_ipv6", "gtp4_ipv6_5g", "gtp6_drop_in", "gtp6_drop_in_5g", "gtp6_drop_in_echo", - "gtp6_drop_in_reply", - "gtp6_drop_in_error", "gtp6_drop_in_ipv6", "gtp6_drop_in_ipv6_5g", "gtp6", "gtp6_5g", "gtp6_ipv6", - "gtp6_ipv6_5g", - "gtp6_dt", - "gtp4_dt"]) + "gtp6_ipv6_5g"]) args = parser.parse_args() if not hasattr(args, "op") or not args.op: @@ -2491,7 +2038,7 @@ def main(op=None, prefix=None, verbose=None, image = "srv6m-release-image" elif image == 'debug': image = "srv6m-image" - else: + else image = "srv6m-image" print("Target image: {}".format(image)) @@ -2533,10 +2080,6 @@ def main(op=None, prefix=None, verbose=None, program.test_gtp4_5g() elif op == 'gtp4_echo': program.test_gtp4_echo() - elif op == 'gtp4_reply': - program.test_gtp4_reply() - elif op == 'gtp4_error': - program.test_gtp4_error() elif op == 'gtp4_ipv6': program.test_gtp4_ipv6() elif op == 'gtp4_ipv6_5g': @@ -2547,10 +2090,6 @@ def main(op=None, prefix=None, verbose=None, program.test_gtp6_drop_in_5g() elif op == 'gtp6_drop_in_echo': program.test_gtp6_drop_in_echo() - elif op == 'gtp6_drop_in_reply': - program.test_gtp6_drop_in_reply() - elif op == 'gtp6_drop_in_error': - program.test_gtp6_drop_in_error() elif op == 'gtp6_drop_in_ipv6': program.test_gtp6_drop_in_ipv6() elif op == 'gtp6_drop_in_ipv6_5g': @@ -2563,10 +2102,6 @@ def main(op=None, prefix=None, verbose=None, program.test_gtp6_ipv6() elif op == 'gtp6_ipv6_5g': program.test_gtp6_ipv6_5g() - elif op == 'gtp6_dt': - program.test_gtp6_dt() - elif op == 'gtp4_dt': - program.test_gtp4_dt() except Exception: program.logger.exception("") diff --git a/src/plugins/srv6-mobile/extra/runner_doc.md b/src/plugins/srv6-mobile/extra/runner_doc.md deleted file mode 100644 index a6fb0277378..00000000000 --- a/src/plugins/srv6-mobile/extra/runner_doc.md +++ /dev/null @@ -1,105 +0,0 @@ -# What's `runner.py` doing? - -## Common configurations - -### VPP1 -``` -create host-interface name eth1 -set int ip addr host-eth1 A1::1/120 -set int state host-eth1 up -ip route add ::/0 via host-eth1 A1::2 -``` - - -### VPP2 - -``` -create host-interface name eth1 -set int ip addr host-eth1 A1::2/120 -create host-interface name eth2 -set int ip addr host-eth2 A2::1/120 -set int state host-eth1 up -set int state host-eth2 up -ip route add ::/0 via host-eth2 A2::2 -``` - - -### VPP3 - -``` -create host-interface name eth1 -set int ip addr host-eth1 A2::2/120 -create host-interface name eth2 -set int ip addr host-eth2 A3::1/120 -set int state host-eth1 up -set int state host-eth2 up -ip route add ::/0 via host-eth1 A2::1 -``` - -### VPP4 - -``` -create host-interface name eth1 -set int ip addr host-eth1 A3::2/120 -set int state host-eth1 up -ip route add ::/0 via host-eth1 A3::1 -``` - - -## Drop-in for GTP-U over IPv4 - -Drop-in mode is handy to test both GTP-U-to-SRv6 and SRv6-to-GTP-U functions at same time. Let's see what's happened when you run `test gtp4`: - - $ ./runner.py test gtp4 - - -Setting up a virtual interface of packet generator: - -#### VPP1 - -``` -create packet-generator interface pg0 -set int mac address pg0 aa:bb:cc:dd:ee:01 -set int ip addr pg0 172.16.0.1/30 -set ip arp pg0 172.16.0.2/30 aa:bb:cc:dd:ee:02 -``` - -#### VPP4 - -``` -create packet-generator interface pg0 -set int mac address pg0 aa:bb:cc:dd:ee:11 -set int ip addr pg0 1.0.0.2/30 -set ip arp pg0 1.0.0.1 aa:bb:cc:dd:ee:22 -``` - -SRv6 and IP routing settings: - -#### VPP1 - -``` -sr policy add bsid D4:: next D2:: next D3:: -sr policy add bsid D5:: behavior t.m.gtp4.d D4::/32 v6src_prefix C1::/64 nhtype ipv4 -sr steer l3 172.20.0.1/32 via bsid D5:: -``` - -#### VPP2 - -``` -sr localsid address D2:: behavior end -ip route add D3::/128 via host-eth2 A2::2 -``` - -#### VPP3 - -``` -sr localsid address D3:: behavior end -ip route add D4::/32 via host-eth2 A3::2 -``` - -#### VPP4 - -``` -sr localsid prefix D4::/32 behavior end.m.gtp4.e v4src_position 64 -ip route add 172.20.0.1/32 via pg0 1.0.0.1 -``` diff --git a/src/plugins/srv6-mobile/extra/topo-init.png b/src/plugins/srv6-mobile/extra/topo-init.png Binary files differindex dc9603ba290..e69de29bb2d 100644 --- a/src/plugins/srv6-mobile/extra/topo-init.png +++ b/src/plugins/srv6-mobile/extra/topo-init.png diff --git a/src/plugins/srv6-mobile/extra/topo-test_gtp4d.png b/src/plugins/srv6-mobile/extra/topo-test_gtp4d.png Binary files differindex d60beb23093..e69de29bb2d 100644 --- a/src/plugins/srv6-mobile/extra/topo-test_gtp4d.png +++ b/src/plugins/srv6-mobile/extra/topo-test_gtp4d.png diff --git a/src/plugins/srv6-mobile/extra/topo-test_gtp6.png b/src/plugins/srv6-mobile/extra/topo-test_gtp6.png Binary files differindex 2cad260215a..e69de29bb2d 100644 --- a/src/plugins/srv6-mobile/extra/topo-test_gtp6.png +++ b/src/plugins/srv6-mobile/extra/topo-test_gtp6.png diff --git a/src/plugins/srv6-mobile/extra/topo-test_gtp6d.png b/src/plugins/srv6-mobile/extra/topo-test_gtp6d.png Binary files differindex 78b083daa8a..e69de29bb2d 100644 --- a/src/plugins/srv6-mobile/extra/topo-test_gtp6d.png +++ b/src/plugins/srv6-mobile/extra/topo-test_gtp6d.png diff --git a/src/plugins/srv6-mobile/extra/topo-test_gtp6ip6.png b/src/plugins/srv6-mobile/extra/topo-test_gtp6ip6.png Binary files differindex fe78f673787..e69de29bb2d 100644 --- a/src/plugins/srv6-mobile/extra/topo-test_gtp6ip6.png +++ b/src/plugins/srv6-mobile/extra/topo-test_gtp6ip6.png |