diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/001-expect.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/001-expect.pcap new file mode 100644 index 00000000..23671f52 Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/001-expect.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/001-send.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/001-send.pcap new file mode 100644 index 00000000..6e7b1f38 Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/001-send.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/002-expect.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/002-expect.pcap new file mode 100644 index 00000000..334235bd Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/002-expect.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/002-send.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/002-send.pcap new file mode 100644 index 00000000..b58b665e Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/002-send.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/003-expect.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/003-expect.pcap new file mode 100644 index 00000000..87a85b3c Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/003-expect.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/003-send.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/003-send.pcap new file mode 100644 index 00000000..18cf163c Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/003-send.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/004-expect.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/004-expect.pcap new file mode 100644 index 00000000..3ee1438e Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/004-expect.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/004-send.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/004-send.pcap new file mode 100644 index 00000000..62767430 Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/004-send.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/005-expect.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/005-expect.pcap new file mode 100644 index 00000000..31380c53 Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/005-expect.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/005-send.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/005-send.pcap new file mode 100644 index 00000000..164ff594 Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/005-send.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/006-expect.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/006-expect.pcap new file mode 100644 index 00000000..1b825877 Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/006-expect.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/006-send.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/006-send.pcap new file mode 100644 index 00000000..4d5cc588 Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/006-send.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/007-expect.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/007-expect.pcap new file mode 100644 index 00000000..86d52c8f Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/007-expect.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/007-send.pcap b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/007-send.pcap new file mode 100644 index 00000000..0fd7c5cc Binary files /dev/null and b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/007-send.pcap differ diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/autotest.yaml b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/autotest.yaml new file mode 100644 index 00000000..2c49b21e --- /dev/null +++ b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/autotest.yaml @@ -0,0 +1,31 @@ +steps: +- ipv4Update: "0.0.0.0/0 -> 200.0.0.1" +- ipv6Update: "::/0 -> fe80::1" +- sendPackets: + - port: kni0 + send: 001-send.pcap + expect: 001-expect.pcap +- sendPackets: + - port: kni0 + send: 002-send.pcap + expect: 002-expect.pcap +- sendPackets: + - port: kni0 + send: 003-send.pcap + expect: 003-expect.pcap +- sendPackets: + - port: kni0 + send: 004-send.pcap + expect: 004-expect.pcap +- sendPackets: + - port: kni0 + send: 005-send.pcap + expect: 005-expect.pcap +- sendPackets: + - port: kni0 + send: 006-send.pcap + expect: 006-expect.pcap +- sendPackets: + - port: kni0 + send: 007-send.pcap + expect: 007-expect.pcap diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/controlplane.conf b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/controlplane.conf new file mode 100644 index 00000000..f10320bc --- /dev/null +++ b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/controlplane.conf @@ -0,0 +1,72 @@ +{ + "modules": { + "lp0.100": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "100", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "lp0.200": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "200", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "acl0": { + "type": "acl", + "nextModules": [ + "nat64stateless0", + "decap0", + "vrf0" + ] + }, + "decap0": { + "type": "decap", + "ipv6DestinationPrefixes": [ + "1234::abcd/128" + ], + "nextModule": "vrf0" + }, + "nat64stateless0": { + "type": "nat64stateless", + "translations": [ + { + "ipv6Address": "2000::", + "ipv6DestinationAddress": "64:ff9b::", + "ipv4Address": "10.0.0.0" + } + ], + "firewall": "false", + "nextModule": "vrf0" + }, + "vrf0": { + "type": "route", + "interfaces": { + "lo0": { + "ipAddresses": [ + "1234::abcd" + ], + "nextModule": "controlPlane" + }, + "kni0.100": { + "ipAddresses": [ + "fe80::2" + ], + "neighborIPv6Address": "fe80::1", + "neighborMacAddress": "00:00:00:00:00:01", + "nextModule": "lp0.100" + }, + "kni0.200": { + "ipAddresses": [ + "200.0.0.2" + ], + "neighborIPv4Address": "200.0.0.1", + "neighborMacAddress": "00:00:00:00:00:02", + "nextModule": "lp0.200" + } + } + } + } +} diff --git a/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/gen.py b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/gen.py new file mode 100755 index 00000000..3e6501f3 --- /dev/null +++ b/autotest/units/001_one_port/020_acls_decap_nat64stateless_route/gen.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from scapy.all import * + + +def write_pcap(filename, *packetsList): + if len(packetsList) == 0: + PcapWriter(filename)._write_header(Ether()) + return + + PcapWriter(filename) + + for packets in packetsList: + if type(packets) == list: + for packet in packets: + packet.time = 0 + wrpcap(filename, [p for p in packet], append=True) + else: + packets.time = 0 + wrpcap(filename, [p for p in packets], append=True) + + +write_pcap("001-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="64:ff9b::1.1.0.0", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("001-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.1.0.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=80, sport=2048)) + + +write_pcap("002-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::abcd", src="2000::", hlim=64)/IP(dst="1.1.0.1", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048)) + +write_pcap("002-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.1.0.1", src="0.0.0.0", ttl=63)/TCP(dport=80, sport=2048)) + + +write_pcap("003-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IP(dst="1.1.0.2", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="::ffff", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("003-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.1.0.2", src="0.0.0.0", ttl=63)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="::ffff", src="2000::", hlim=63)/TCP(dport=80, sport=2048)) + + +write_pcap("004-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="1.1.0.3", ttl=64)/TCP(dport=2048, sport=80)) + +write_pcap("004-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="64:ff9b::1.1.0.3", hlim=63, fl=0)/TCP(dport=2048, sport=80)) + + +write_pcap("005-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="1.1.0.5", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="::fffe", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("005-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.1.0.5", src="0.0.0.0", ttl=63)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="::fffe", src="2000::", hlim=63)/TCP(dport=80, sport=2048)) + + +write_pcap("006-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IP(dst="200.0.0.9", src="1.1.0.6", ttl=64)/TCP(dport=2048, sport=80)) + +write_pcap("006-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.9", src="1.1.0.6", ttl=63)/TCP(dport=2048, sport=80)) + + +write_pcap("007-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("007-expect.pcap", + Ether(dst="71:71:71:71:71:71", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/001-expect.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/001-expect.pcap new file mode 100644 index 00000000..23671f52 Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/001-expect.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/001-send.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/001-send.pcap new file mode 100644 index 00000000..6e7b1f38 Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/001-send.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/002-expect.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/002-expect.pcap new file mode 100644 index 00000000..334235bd Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/002-expect.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/002-send.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/002-send.pcap new file mode 100644 index 00000000..b58b665e Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/002-send.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/003-expect.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/003-expect.pcap new file mode 100644 index 00000000..acfe821e Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/003-expect.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/003-send.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/003-send.pcap new file mode 100644 index 00000000..18cf163c Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/003-send.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/004-expect.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/004-expect.pcap new file mode 100644 index 00000000..3ee1438e Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/004-expect.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/004-send.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/004-send.pcap new file mode 100644 index 00000000..62767430 Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/004-send.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/005-expect.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/005-expect.pcap new file mode 100644 index 00000000..acfe821e Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/005-expect.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/005-send.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/005-send.pcap new file mode 100644 index 00000000..164ff594 Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/005-send.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/006-expect.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/006-expect.pcap new file mode 100644 index 00000000..acfe821e Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/006-expect.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/006-send.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/006-send.pcap new file mode 100644 index 00000000..c6a90715 Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/006-send.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/007-expect.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/007-expect.pcap new file mode 100644 index 00000000..acfe821e Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/007-expect.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/007-send.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/007-send.pcap new file mode 100644 index 00000000..e29aa688 Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/007-send.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/008-expect.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/008-expect.pcap new file mode 100644 index 00000000..acfe821e Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/008-expect.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/008-send.pcap b/autotest/units/001_one_port/021_acls_decap_nat64stateless/008-send.pcap new file mode 100644 index 00000000..875cc3e1 Binary files /dev/null and b/autotest/units/001_one_port/021_acls_decap_nat64stateless/008-send.pcap differ diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/autotest.yaml b/autotest/units/001_one_port/021_acls_decap_nat64stateless/autotest.yaml new file mode 100644 index 00000000..8f1a0069 --- /dev/null +++ b/autotest/units/001_one_port/021_acls_decap_nat64stateless/autotest.yaml @@ -0,0 +1,35 @@ +steps: +- ipv4Update: "0.0.0.0/0 -> 200.0.0.1" +- ipv6Update: "::/0 -> fe80::1" +- sendPackets: + - port: kni0 + send: 001-send.pcap + expect: 001-expect.pcap +- sendPackets: + - port: kni0 + send: 002-send.pcap + expect: 002-expect.pcap +- sendPackets: + - port: kni0 + send: 003-send.pcap + expect: 003-expect.pcap +- sendPackets: + - port: kni0 + send: 004-send.pcap + expect: 004-expect.pcap +- sendPackets: + - port: kni0 + send: 005-send.pcap + expect: 005-expect.pcap +- sendPackets: + - port: kni0 + send: 006-send.pcap + expect: 006-expect.pcap +- sendPackets: + - port: kni0 + send: 007-send.pcap + expect: 007-expect.pcap +- sendPackets: + - port: kni0 + send: 008-send.pcap + expect: 008-expect.pcap diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/controlplane.conf b/autotest/units/001_one_port/021_acls_decap_nat64stateless/controlplane.conf new file mode 100644 index 00000000..17d05fa0 --- /dev/null +++ b/autotest/units/001_one_port/021_acls_decap_nat64stateless/controlplane.conf @@ -0,0 +1,67 @@ +{ + "modules": { + "lp0.100": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "100", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "lp0.200": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "200", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl1" + }, + "acl0": { + "type": "acl", + "nextModules": [ + "nat64stateless0:ingress", + "decap0" + ] + }, + "acl1": { + "type": "acl", + "nextModules": [ + "nat64stateless0:egress" + ] + }, + "decap0": { + "type": "decap", + "ipv6DestinationPrefixes": [ + "1234::abcd/128" + ], + "nextModule": "vrf0" + }, + "nat64stateless0": { + "type": "nat64stateless", + "translations": [ + { + "ipv6Address": "2000::", + "ipv6DestinationAddress": "64:ff9b::", + "ipv4Address": "10.0.0.0" + } + ], + "firewall": "false", + "nextModule": "vrf0" + }, + "vrf0": { + "type": "route", + "interfaces": { + "kni0.100": { + "ipv6Prefix": "fe80::2/64", + "neighborIPv6Address": "fe80::1", + "neighborMacAddress": "00:00:00:00:00:01", + "nextModule": "lp0.100" + }, + "kni0.200": { + "ipv4Prefix": "200.0.0.2/24", + "neighborIPv4Address": "200.0.0.1", + "neighborMacAddress": "00:00:00:00:00:02", + "nextModule": "lp0.200" + } + } + } + } +} diff --git a/autotest/units/001_one_port/021_acls_decap_nat64stateless/gen.py b/autotest/units/001_one_port/021_acls_decap_nat64stateless/gen.py new file mode 100755 index 00000000..b00c2d37 --- /dev/null +++ b/autotest/units/001_one_port/021_acls_decap_nat64stateless/gen.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from scapy.all import * + + +def write_pcap(filename, *packetsList): + if len(packetsList) == 0: + PcapWriter(filename)._write_header(Ether()) + return + + PcapWriter(filename) + + for packets in packetsList: + if type(packets) == list: + for packet in packets: + packet.time = 0 + wrpcap(filename, [p for p in packet], append=True) + else: + packets.time = 0 + wrpcap(filename, [p for p in packets], append=True) + + +write_pcap("001-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="64:ff9b::1.1.0.0", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("001-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.1.0.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=80, sport=2048)) + + +write_pcap("002-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::abcd", src="2000::", hlim=64)/IP(dst="1.1.0.1", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048)) + +write_pcap("002-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.1.0.1", src="0.0.0.0", ttl=63)/TCP(dport=80, sport=2048)) + + +write_pcap("003-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IP(dst="1.1.0.2", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="::ffff", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("003-expect.pcap") + + +write_pcap("004-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="1.1.0.3", ttl=64)/TCP(dport=2048, sport=80)) + +write_pcap("004-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="64:ff9b::1.1.0.3", hlim=63, fl=0)/TCP(dport=2048, sport=80)) + + +write_pcap("005-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="1.1.0.5", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="::fffe", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("005-expect.pcap") + + +write_pcap("006-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IP(dst="10.0.0.0", src="1.1.0.6", ttl=64)/TCP(dport=2048, sport=80)) + +write_pcap("006-expect.pcap") + + +write_pcap("007-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="64:ff9b::1.1.0.0", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("007-expect.pcap") + + +write_pcap("008-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="2000::", hlim=64)/IP(dst="1.1.0.1", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048)) + +write_pcap("008-expect.pcap") diff --git a/autotest/units/001_one_port/022_nat64stateless_range_ports/001-expect.pcap b/autotest/units/001_one_port/022_nat64stateless_range_ports/001-expect.pcap new file mode 100644 index 00000000..6f8854ce Binary files /dev/null and b/autotest/units/001_one_port/022_nat64stateless_range_ports/001-expect.pcap differ diff --git a/autotest/units/001_one_port/022_nat64stateless_range_ports/001-send.pcap b/autotest/units/001_one_port/022_nat64stateless_range_ports/001-send.pcap new file mode 100644 index 00000000..543cc839 Binary files /dev/null and b/autotest/units/001_one_port/022_nat64stateless_range_ports/001-send.pcap differ diff --git a/autotest/units/001_one_port/022_nat64stateless_range_ports/002-expect.pcap b/autotest/units/001_one_port/022_nat64stateless_range_ports/002-expect.pcap new file mode 100644 index 00000000..780df47c Binary files /dev/null and b/autotest/units/001_one_port/022_nat64stateless_range_ports/002-expect.pcap differ diff --git a/autotest/units/001_one_port/022_nat64stateless_range_ports/002-send.pcap b/autotest/units/001_one_port/022_nat64stateless_range_ports/002-send.pcap new file mode 100644 index 00000000..313eda3c Binary files /dev/null and b/autotest/units/001_one_port/022_nat64stateless_range_ports/002-send.pcap differ diff --git a/autotest/units/001_one_port/022_nat64stateless_range_ports/003-expect.pcap b/autotest/units/001_one_port/022_nat64stateless_range_ports/003-expect.pcap new file mode 100644 index 00000000..7bd19b82 Binary files /dev/null and b/autotest/units/001_one_port/022_nat64stateless_range_ports/003-expect.pcap differ diff --git a/autotest/units/001_one_port/022_nat64stateless_range_ports/003-send.pcap b/autotest/units/001_one_port/022_nat64stateless_range_ports/003-send.pcap new file mode 100644 index 00000000..6bcfec6f Binary files /dev/null and b/autotest/units/001_one_port/022_nat64stateless_range_ports/003-send.pcap differ diff --git a/autotest/units/001_one_port/022_nat64stateless_range_ports/004-expect.pcap b/autotest/units/001_one_port/022_nat64stateless_range_ports/004-expect.pcap new file mode 100644 index 00000000..7dd299f4 Binary files /dev/null and b/autotest/units/001_one_port/022_nat64stateless_range_ports/004-expect.pcap differ diff --git a/autotest/units/001_one_port/022_nat64stateless_range_ports/004-send.pcap b/autotest/units/001_one_port/022_nat64stateless_range_ports/004-send.pcap new file mode 100644 index 00000000..3e3257e8 Binary files /dev/null and b/autotest/units/001_one_port/022_nat64stateless_range_ports/004-send.pcap differ diff --git a/autotest/units/001_one_port/022_nat64stateless_range_ports/autotest.yaml b/autotest/units/001_one_port/022_nat64stateless_range_ports/autotest.yaml new file mode 100644 index 00000000..3fa9909f --- /dev/null +++ b/autotest/units/001_one_port/022_nat64stateless_range_ports/autotest.yaml @@ -0,0 +1,19 @@ +steps: +- ipv4Update: "0.0.0.0/0 -> 200.0.0.1" +- ipv6Update: "::/0 -> fe80::1" +- sendPackets: + - port: kni0 + send: 001-send.pcap + expect: 001-expect.pcap +- sendPackets: + - port: kni0 + send: 002-send.pcap + expect: 002-expect.pcap +- sendPackets: + - port: kni0 + send: 003-send.pcap + expect: 003-expect.pcap +- sendPackets: + - port: kni0 + send: 004-send.pcap + expect: 004-expect.pcap diff --git a/autotest/units/001_one_port/022_nat64stateless_range_ports/controlplane.conf b/autotest/units/001_one_port/022_nat64stateless_range_ports/controlplane.conf new file mode 100644 index 00000000..3c4a0ff3 --- /dev/null +++ b/autotest/units/001_one_port/022_nat64stateless_range_ports/controlplane.conf @@ -0,0 +1,132 @@ +{ + "modules": { + "lp0.100": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "100", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "lp0.200": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "200", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "acl0": { + "type": "acl", + "nextModules": [ + "nat64stateless0" + ] + }, + "nat64stateless0": { + "type": "nat64stateless", + "translations": [ + { + "ipv6Address": "2000::", + "ipv6DestinationAddress": "2222:987:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2001-2004", + "egressPortRange": "12001-12004" + }, + { + "ipv6Address": "2000::1", + "ipv6DestinationAddress": "2222:987:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2001-2004", + "egressPortRange": "12005-12008" + }, + { + "ipv6Address": "2000::2", + "ipv6DestinationAddress": "2222:987:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2001-2004", + "egressPortRange": "12009-12012" + }, + { + "ipv6Address": "2000::", + "ipv6DestinationAddress": "2222:987:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2005-2008", + "egressPortRange": "12013-12016" + }, + { + "ipv6Address": "2000::1", + "ipv6DestinationAddress": "2222:987:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2005-2008", + "egressPortRange": "12017-12020" + }, + { + "ipv6Address": "2000::2", + "ipv6DestinationAddress": "2222:987:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2005-2008", + "egressPortRange": "12021-12024" + }, + { + "ipv6Address": "2000::", + "ipv6DestinationAddress": "2222:987:0a00:0001::", + "ipv4Address": "10.0.0.1", + "ingressPortRange": "2001-2004", + "egressPortRange": "12001-12004" + }, + { + "ipv6Address": "2000::1", + "ipv6DestinationAddress": "2222:987:0a00:0001::", + "ipv4Address": "10.0.0.1", + "ingressPortRange": "2001-2004", + "egressPortRange": "12005-12008" + }, + { + "ipv6Address": "2000::2", + "ipv6DestinationAddress": "2222:987:0a00:0001::", + "ipv4Address": "10.0.0.1", + "ingressPortRange": "2001-2004", + "egressPortRange": "12009-12012" + }, + { + "ipv6Address": "2000::", + "ipv6DestinationAddress": "2222:987:0a00:0001::", + "ipv4Address": "10.0.0.1", + "ingressPortRange": "2005-2008", + "egressPortRange": "12013-12016" + }, + { + "ipv6Address": "2000::1", + "ipv6DestinationAddress": "2222:987:0a00:0001::", + "ipv4Address": "10.0.0.1", + "ingressPortRange": "2005-2008", + "egressPortRange": "12017-12020" + }, + { + "ipv6Address": "2000::2", + "ipv6DestinationAddress": "2222:987:0a00:0001::", + "ipv4Address": "10.0.0.1", + "ingressPortRange": "2005-2008", + "egressPortRange": "12021-12024" + } + ], + "firewall": "false", + "nextModule": "vrf0" + }, + "vrf0": { + "type": "route", + "interfaces": { + "kni0.100": { + "ipv6Prefix": "fe80::2/64", + "neighborIPv6Address": "fe80::1", + "neighborMacAddress": "00:00:00:11:11:11", + "nextModule": "lp0.100" + }, + "kni0.200": { + "ipv4Prefix": "200.0.0.2/24", + "neighborIPv4Address": "200.0.0.1", + "neighborMacAddress": "00:00:00:22:22:22", + "nextModule": "lp0.200" + } + } + } + } +} diff --git a/autotest/units/001_one_port/022_nat64stateless_range_ports/gen.py b/autotest/units/001_one_port/022_nat64stateless_range_ports/gen.py new file mode 100755 index 00000000..42e21fcd --- /dev/null +++ b/autotest/units/001_one_port/022_nat64stateless_range_ports/gen.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from scapy.all import * + + +def write_pcap(filename, *packetsList): + PcapWriter(filename) + for packets in packetsList: + if type(packets) == list: + for packet in packets: + packet.time = 0 + wrpcap(filename, [p for p in packet], append=True) + else: + packets.time = 0 + wrpcap(filename, [p for p in packets], append=True) + + +write_pcap("001-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::/126", hlim=64)/TCP(dport=80, sport=(2000,2009)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0001::11.11.11.0", src="2000::/126", hlim=64)/TCP(dport=80, sport=(2000,2009)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::/126", hlim=64)/UDP(dport=80, sport=(2000,2009)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0001::11.11.11.0", src="2000::/126", hlim=64)/UDP(dport=80, sport=(2000,2009)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::/126", hlim=64)/ICMPv6EchoRequest(id=(2000,2009)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0001::11.11.11.0", src="2000::/126", hlim=64)/ICMPv6EchoRequest(id=(2000,2009)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::/126", hlim=64)/ICMPv6EchoReply(id=(2000,2009)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0001::11.11.11.0", src="2000::/126", hlim=64)/ICMPv6EchoReply(id=(2000,2009))) + +write_pcap("001-expect.pcap", + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=80, sport=(12001,12004)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=80, sport=(12013,12016)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=80, sport=(12005,12008)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=80, sport=(12017,12020)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=80, sport=(12009,12012)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=80, sport=(12021,12024)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/TCP(dport=80, sport=(12001,12004)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/TCP(dport=80, sport=(12013,12016)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/TCP(dport=80, sport=(12005,12008)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/TCP(dport=80, sport=(12017,12020)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/TCP(dport=80, sport=(12009,12012)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/TCP(dport=80, sport=(12021,12024)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/UDP(dport=80, sport=(12001,12004)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/UDP(dport=80, sport=(12013,12016)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/UDP(dport=80, sport=(12005,12008)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/UDP(dport=80, sport=(12017,12020)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/UDP(dport=80, sport=(12009,12012)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/UDP(dport=80, sport=(12021,12024)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/UDP(dport=80, sport=(12001,12004)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/UDP(dport=80, sport=(12013,12016)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/UDP(dport=80, sport=(12005,12008)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/UDP(dport=80, sport=(12017,12020)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/UDP(dport=80, sport=(12009,12012)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/UDP(dport=80, sport=(12021,12024)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/ICMP(type=8, id=(12001,12004)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/ICMP(type=8, id=(12013,12016)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/ICMP(type=8, id=(12005,12008)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/ICMP(type=8, id=(12017,12020)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/ICMP(type=8, id=(12009,12012)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/ICMP(type=8, id=(12021,12024)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/ICMP(type=8, id=(12001,12004)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/ICMP(type=8, id=(12013,12016)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/ICMP(type=8, id=(12005,12008)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/ICMP(type=8, id=(12017,12020)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/ICMP(type=8, id=(12009,12012)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.1", ttl=63, id=0)/ICMP(type=8, id=(12021,12024))) + + +write_pcap("002-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/TCP(dport=(12000,12004), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/TCP(dport=(12013,12016), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/TCP(dport=(12005,12008), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/TCP(dport=(12017,12020), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/TCP(dport=(12009,12012), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/TCP(dport=(12021,12025), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/TCP(dport=(12000,12004), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/TCP(dport=(12013,12016), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/TCP(dport=(12005,12008), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/TCP(dport=(12017,12020), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/TCP(dport=(12009,12012), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/TCP(dport=(12021,12025), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/UDP(dport=(12000,12004), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/UDP(dport=(12013,12016), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/UDP(dport=(12005,12008), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/UDP(dport=(12017,12020), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/UDP(dport=(12009,12012), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/UDP(dport=(12021,12025), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/UDP(dport=(12000,12004), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/UDP(dport=(12013,12016), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/UDP(dport=(12005,12008), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/UDP(dport=(12017,12020), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/UDP(dport=(12009,12012), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/UDP(dport=(12021,12025), sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12000,12004)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12013,12016)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12005,12008)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12017,12020)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12009,12012)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12021,12025)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12000,12004)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12013,12016)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12005,12008)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12017,12020)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12009,12012)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=8, id=(12021,12025)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12000,12004)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12013,12016)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12005,12008)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12017,12020)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12009,12012)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12021,12025)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12000,12004)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12013,12016)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12005,12008)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12017,12020)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12009,12012)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.1", src="11.11.11.0", ttl=64)/ICMP(type=0, id=(12021,12025))) + +write_pcap("002-expect.pcap", + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/TCP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/TCP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::2", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/TCP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0001::11.11.11.0", hlim=63, fl=0)/TCP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2222:987:0a00:0001::11.11.11.0", hlim=63, fl=0)/TCP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::2", src="2222:987:0a00:0001::11.11.11.0", hlim=63, fl=0)/TCP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/UDP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/UDP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::2", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/UDP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0001::11.11.11.0", hlim=63, fl=0)/UDP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2222:987:0a00:0001::11.11.11.0", hlim=63, fl=0)/UDP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::2", src="2222:987:0a00:0001::11.11.11.0", hlim=63, fl=0)/UDP(dport=(2001,2008), sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/ICMPv6EchoReply(id=(2001,2008)), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/ICMPv6EchoReply(id=(2001,2008)), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::2", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/ICMPv6EchoReply(id=(2001,2008)), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0001::11.11.11.0", hlim=63, fl=0)/ICMPv6EchoReply(id=(2001,2008)), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2222:987:0a00:0001::11.11.11.0", hlim=63, fl=0)/ICMPv6EchoReply(id=(2001,2008)), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::2", src="2222:987:0a00:0001::11.11.11.0", hlim=63, fl=0)/ICMPv6EchoReply(id=(2001,2008))) + + +write_pcap("003-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::", hlim=64)/TCP(dport=80, sport=2001), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::", hlim=64)/IPv6ExtHdrDestOpt()/TCP(dport=81, sport=2001), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::", hlim=64)/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/TCP(dport=82, sport=2001), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::", hlim=64, plen=800)/TCP(dport=80, sport=2001), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::", hlim=64, plen=0)/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/TCP(dport=83, sport=2001), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::", hlim=64, plen=1)/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/TCP(dport=84, sport=2001), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::", hlim=64, plen=20)/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/TCP(dport=85, sport=2001), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::", hlim=64, plen=64)/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/TCP(dport=86, sport=2001), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::", hlim=64, plen=65)/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/TCP(dport=87, sport=2001), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:987:0a00:0000::11.11.11.0", src="2000::", hlim=64, plen=83)/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/TCP(dport=88, sport=2001)) + +write_pcap("003-expect.pcap", + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=80, sport=12001), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=81, sport=12001), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=82, sport=12001)) + + +write_pcap("004-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64)/TCP(dport=12001, sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, options=("\x02"*4))/TCP(dport=12001, sport=81), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, options=("\x02"*16))/TCP(dport=12001, sport=82), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, options=("\x02"*20))/TCP(dport=12001, sport=83), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, options=("\x02"*24))/TCP(dport=12001, sport=84), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, options=("\x02"*36))/TCP(dport=12001, sport=85), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, options=("\x02"*40))/TCP(dport=12001, sport=86), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, len=800)/TCP(dport=12001, sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, len=0)/TCP(dport=12001, sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, len=39)/TCP(dport=12001, sport=80), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, len=43, options=("\x02"*4))/TCP(dport=12001, sport=81), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, len=55, options=("\x02"*16))/TCP(dport=12001, sport=82), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, len=59, options=("\x02"*20))/TCP(dport=12001, sport=83), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, len=63, options=("\x02"*24))/TCP(dport=12001, sport=84), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, len=75, options=("\x02"*36))/TCP(dport=12001, sport=85), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, len=79, options=("\x02"*40))/TCP(dport=12001, sport=86)) + +write_pcap("004-expect.pcap", + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/TCP(dport=2001, sport=80), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/TCP(dport=2001, sport=81), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/TCP(dport=2001, sport=82), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/TCP(dport=2001, sport=83), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/TCP(dport=2001, sport=84), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/TCP(dport=2001, sport=85), + Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:987:0a00:0000::11.11.11.0", hlim=63, fl=0)/TCP(dport=2001, sport=86)) diff --git a/autotest/units/001_one_port/023_acl_decaps/001-expect.pcap b/autotest/units/001_one_port/023_acl_decaps/001-expect.pcap new file mode 100644 index 00000000..3b44b959 Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/001-expect.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/001-send.pcap b/autotest/units/001_one_port/023_acl_decaps/001-send.pcap new file mode 100644 index 00000000..14eebe26 Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/001-send.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/002-expect.pcap b/autotest/units/001_one_port/023_acl_decaps/002-expect.pcap new file mode 100644 index 00000000..a0006f6d Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/002-expect.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/002-send.pcap b/autotest/units/001_one_port/023_acl_decaps/002-send.pcap new file mode 100644 index 00000000..14abcccf Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/002-send.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/003-expect.pcap b/autotest/units/001_one_port/023_acl_decaps/003-expect.pcap new file mode 100644 index 00000000..b50c713b Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/003-expect.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/003-send.pcap b/autotest/units/001_one_port/023_acl_decaps/003-send.pcap new file mode 100644 index 00000000..60ce8891 Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/003-send.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/004-expect.pcap b/autotest/units/001_one_port/023_acl_decaps/004-expect.pcap new file mode 100644 index 00000000..47d781bd Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/004-expect.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/004-send.pcap b/autotest/units/001_one_port/023_acl_decaps/004-send.pcap new file mode 100644 index 00000000..86b1511a Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/004-send.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/005-expect.pcap b/autotest/units/001_one_port/023_acl_decaps/005-expect.pcap new file mode 100644 index 00000000..f3215eaa Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/005-expect.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/005-send.pcap b/autotest/units/001_one_port/023_acl_decaps/005-send.pcap new file mode 100644 index 00000000..dd5a2083 Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/005-send.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/006-expect.pcap b/autotest/units/001_one_port/023_acl_decaps/006-expect.pcap new file mode 100644 index 00000000..721c21bc Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/006-expect.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/006-send.pcap b/autotest/units/001_one_port/023_acl_decaps/006-send.pcap new file mode 100644 index 00000000..001d9baf Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/006-send.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/007-expect.pcap b/autotest/units/001_one_port/023_acl_decaps/007-expect.pcap new file mode 100644 index 00000000..8a8602ee Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/007-expect.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/007-send.pcap b/autotest/units/001_one_port/023_acl_decaps/007-send.pcap new file mode 100644 index 00000000..7998bfaa Binary files /dev/null and b/autotest/units/001_one_port/023_acl_decaps/007-send.pcap differ diff --git a/autotest/units/001_one_port/023_acl_decaps/autotest.yaml b/autotest/units/001_one_port/023_acl_decaps/autotest.yaml new file mode 100644 index 00000000..c55c7861 --- /dev/null +++ b/autotest/units/001_one_port/023_acl_decaps/autotest.yaml @@ -0,0 +1,30 @@ +steps: +- ipv4Update: "0.0.0.0/0 -> 200.0.0.1" +- sendPackets: + - port: kni0 + send: 001-send.pcap + expect: 001-expect.pcap +- sendPackets: + - port: kni0 + send: 002-send.pcap + expect: 002-expect.pcap +- sendPackets: + - port: kni0 + send: 003-send.pcap + expect: 003-expect.pcap +- sendPackets: + - port: kni0 + send: 004-send.pcap + expect: 004-expect.pcap +- sendPackets: + - port: kni0 + send: 005-send.pcap + expect: 005-expect.pcap +- sendPackets: + - port: kni0 + send: 006-send.pcap + expect: 006-expect.pcap +- sendPackets: + - port: kni0 + send: 007-send.pcap + expect: 007-expect.pcap diff --git a/autotest/units/001_one_port/023_acl_decaps/controlplane.conf b/autotest/units/001_one_port/023_acl_decaps/controlplane.conf new file mode 100644 index 00000000..5bf131b0 --- /dev/null +++ b/autotest/units/001_one_port/023_acl_decaps/controlplane.conf @@ -0,0 +1,84 @@ +{ + "modules": { + "lp0.100": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "100", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "lp0.200": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "200", + "macAddress": "00:11:22:33:44:55", + "nextModule": "drop" + }, + "acl0": { + "type": "acl", + "nextModules": [ + "decap0", + "decap1", + "decap2", + "decap3" + ] + }, + "decap0": { + "type": "decap", + "ipv6DestinationPrefixes": [ + "1234::ab00/128" + ], + "dscpMarkType": "never", + "nextModule": "vrf0" + }, + "decap1": { + "type": "decap", + "ipv6DestinationPrefixes": [ + "1234::ab00/127" + ], + "dscpMarkType": "onlyDefault", + "dscp": 10, + "nextModule": "vrf0" + }, + "decap2": { + "type": "decap", + "ipv6DestinationPrefixes": [ + "1234::ab02/127" + ], + "dscpMarkType": "always", + "dscp": 20, + "nextModule": "vrf0" + }, + "decap3": { + "type": "decap", + "ipv6DestinationPrefixes": [ + "1234::fa00/128", + "1234::fa01/128", + "1234::fa02/128", + "1234::fa03/128", + "1234::fa04/128", + "1234::fa05/128", + "1234::fa10/126", + "1234::fa20/126", + "1234::fa30/126", + "1234::fa40/126" + ], + "dscpMarkType": "never", + "nextModule": "vrf0" + }, + "vrf0": { + "type": "route", + "interfaces": { + "kni0.100": { + "nextModule": "lp0.100" + }, + "kni0.200": { + "ipv4Prefix": "200.0.0.2/24", + "neighborIPv4Address": "200.0.0.1", + "neighborMacAddress": "00:00:00:00:00:02", + "nextModule": "lp0.200" + } + } + } + } +} diff --git a/autotest/units/001_one_port/023_acl_decaps/gen.py b/autotest/units/001_one_port/023_acl_decaps/gen.py new file mode 100755 index 00000000..f3752426 --- /dev/null +++ b/autotest/units/001_one_port/023_acl_decaps/gen.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from scapy.all import * + + +def write_pcap(filename, *packetsList): + if len(packetsList) == 0: + PcapWriter(filename)._write_header(Ether()) + return + + PcapWriter(filename) + + for packets in packetsList: + if type(packets) == list: + for packet in packets: + packet.time = 0 + wrpcap(filename, [p for p in packet], append=True) + else: + packets.time = 0 + wrpcap(filename, [p for p in packets], append=True) + + +write_pcap("001-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0x4)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0x80)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0xfc)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0xff)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab01", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab01", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0x4)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab01", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0x80)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab01", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0xfc)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab01", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0xff)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab02", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab02", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0x4)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab02", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0x80)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab02", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0xfc)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab02", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0xff)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab03", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab03", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0x4)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab03", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0x80)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab03", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0xfc)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab03", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0xff)/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab04", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64, tos=0)/ICMP()) + +write_pcap("001-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x4)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x80)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0xfc)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0xff)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x28)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x4)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x80)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0xfc)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0xff)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x50)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x50)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x50)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x50)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x53)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x50)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x50)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x50)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x50)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0x53)/ICMP()) + + +write_pcap("002-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE()/IP(dst="1.2.3.0", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(chksum_present=1)/IP(dst="1.2.3.1", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(key_present=1)/IP(dst="1.2.3.2", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(seqnum_present=1)/IP(dst="1.2.3.3", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(chksum_present=1, key_present=1, seqnum_present=1)/IP(dst="1.2.3.4", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(version=1)/IP(dst="1.2.3.5", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(version=4)/IP(dst="1.2.3.6", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(flags=1)/IP(dst="1.2.3.7", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(flags=16)/IP(dst="1.2.3.8", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(recursion_control=1)/IP(dst="1.2.3.9", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(recursion_control=4)/IP(dst="1.2.3.10", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(strict_route_source=1)/IP(dst="1.2.3.11", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::", nh=47)/GRE(routing_present=1)/IP(dst="1.2.3.12", src="0.0.0.0")/ICMP()) + +write_pcap("002-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.0", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.1", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.2", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.3", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63)/ICMP()) + + +write_pcap("003-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="2000::", hlim=64)/IP(dst="90.90.90.0/30", src="5.5.5.0/30", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::ab00", src="2000::", hlim=64)/IP(dst="90.90.90.0/30", src="5.5.5.0/30", ttl=164)/TCP(dport=80, sport=2048)) + +write_pcap("003-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="90.90.90.0/30", src="5.5.5.0/30", ttl=63)/TCP(dport=80, sport=2048)) + + +write_pcap("004-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="2000::", hlim=64)/IP(dst="90.90.90.4", src="5.5.5.4", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="2000::", hlim=64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="2000::", hlim=64, nh=47)/GRE()) + +write_pcap("004-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="90.90.90.4", src="5.5.5.4", ttl=63)/TCP(dport=80, sport=2048)) + + +write_pcap("005-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IP(dst="1.2.3.0/25", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6ExtHdrFragment(offset=0, m=0)/IP(dst="1.2.3.255", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6ExtHdrDestOpt()/IP(dst="1.2.3.254", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6ExtHdrHopByHop()/IP(dst="1.2.3.253", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6ExtHdrRouting()/IP(dst="1.2.3.252", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IP(dst="1.2.3.251", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting(nh=47)/GRE()/IP(dst="1.2.3.250", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrFragment(offset=0, m=0)/IPv6ExtHdrRouting(nh=47)/GRE()/IP(dst="1.2.3.249", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrFragment(offset=0, m=0, nh=47)/GRE()/IP(dst="1.2.3.249", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IP(dst="1.2.3.248", src="0.0.0.0", ttl=[2, 255])/ICMP()) + +write_pcap("005-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.0/25", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.255", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.254", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.253", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.252", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.251", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.250", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.249", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.249", src="0.0.0.0", ttl=63)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.248", src="0.0.0.0", ttl=[1, 254])/ICMP()) + + +write_pcap("006-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IP(dst="1.1.1.1", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6ExtHdrFragment(offset=1, m=0)/IP(dst="1.1.1.1", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6ExtHdrFragment(offset=[0, 1], m=1)/IP(dst="1.1.1.1", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6()/IP(dst="1.1.1.1", src="0.0.0.0")/ICMP(), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::ab00", src="::")/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IPv6ExtHdrDestOpt()/IPv6ExtHdrHopByHop()/IPv6ExtHdrRouting()/IP(dst="1.1.1.1", src="0.0.0.0")/ICMP()) + +write_pcap("006-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.1.1.1", src="0.0.0.0", ttl=63)/ICMP()) + + +write_pcap("007-send.pcap", + [Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst=f"1234::fa{ip:02x}", src="::")/IP(dst=f"1.2.3.{ip}", src="0.0.0.0", ttl=64, tos=0)/ICMP() for ip in range(256)]) + +write_pcap("007-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.0", src="0.0.0.0", ttl=63, tos=0)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.1", src="0.0.0.0", ttl=63, tos=0)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.2", src="0.0.0.0", ttl=63, tos=0)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.3", src="0.0.0.0", ttl=63, tos=0)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63, tos=0)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.5", src="0.0.0.0", ttl=63, tos=0)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.16/30", src="0.0.0.0", ttl=63, tos=0)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.32/30", src="0.0.0.0", ttl=63, tos=0)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.48/30", src="0.0.0.0", ttl=63, tos=0)/ICMP(), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.64/30", src="0.0.0.0", ttl=63, tos=0)/ICMP()) diff --git a/autotest/units/001_one_port/024_firewall/001-expect.pcap b/autotest/units/001_one_port/024_firewall/001-expect.pcap new file mode 100644 index 00000000..fd71e0fa Binary files /dev/null and b/autotest/units/001_one_port/024_firewall/001-expect.pcap differ diff --git a/autotest/units/001_one_port/024_firewall/001-send.pcap b/autotest/units/001_one_port/024_firewall/001-send.pcap new file mode 100644 index 00000000..db392617 Binary files /dev/null and b/autotest/units/001_one_port/024_firewall/001-send.pcap differ diff --git a/autotest/units/001_one_port/024_firewall/002-expect.pcap b/autotest/units/001_one_port/024_firewall/002-expect.pcap new file mode 100644 index 00000000..a3243045 Binary files /dev/null and b/autotest/units/001_one_port/024_firewall/002-expect.pcap differ diff --git a/autotest/units/001_one_port/024_firewall/002-send.pcap b/autotest/units/001_one_port/024_firewall/002-send.pcap new file mode 100644 index 00000000..d7573dee Binary files /dev/null and b/autotest/units/001_one_port/024_firewall/002-send.pcap differ diff --git a/autotest/units/001_one_port/024_firewall/003-expect.pcap b/autotest/units/001_one_port/024_firewall/003-expect.pcap new file mode 100644 index 00000000..874b3259 Binary files /dev/null and b/autotest/units/001_one_port/024_firewall/003-expect.pcap differ diff --git a/autotest/units/001_one_port/024_firewall/003-send.pcap b/autotest/units/001_one_port/024_firewall/003-send.pcap new file mode 100644 index 00000000..48855024 Binary files /dev/null and b/autotest/units/001_one_port/024_firewall/003-send.pcap differ diff --git a/autotest/units/001_one_port/024_firewall/004-expect.pcap b/autotest/units/001_one_port/024_firewall/004-expect.pcap new file mode 100644 index 00000000..a3243045 Binary files /dev/null and b/autotest/units/001_one_port/024_firewall/004-expect.pcap differ diff --git a/autotest/units/001_one_port/024_firewall/004-send.pcap b/autotest/units/001_one_port/024_firewall/004-send.pcap new file mode 100644 index 00000000..9f91b820 Binary files /dev/null and b/autotest/units/001_one_port/024_firewall/004-send.pcap differ diff --git a/autotest/units/001_one_port/024_firewall/autotest.yaml b/autotest/units/001_one_port/024_firewall/autotest.yaml new file mode 100644 index 00000000..3fa9909f --- /dev/null +++ b/autotest/units/001_one_port/024_firewall/autotest.yaml @@ -0,0 +1,19 @@ +steps: +- ipv4Update: "0.0.0.0/0 -> 200.0.0.1" +- ipv6Update: "::/0 -> fe80::1" +- sendPackets: + - port: kni0 + send: 001-send.pcap + expect: 001-expect.pcap +- sendPackets: + - port: kni0 + send: 002-send.pcap + expect: 002-expect.pcap +- sendPackets: + - port: kni0 + send: 003-send.pcap + expect: 003-expect.pcap +- sendPackets: + - port: kni0 + send: 004-send.pcap + expect: 004-expect.pcap diff --git a/autotest/units/001_one_port/024_firewall/controlplane.conf b/autotest/units/001_one_port/024_firewall/controlplane.conf new file mode 100644 index 00000000..3c0da4fd --- /dev/null +++ b/autotest/units/001_one_port/024_firewall/controlplane.conf @@ -0,0 +1,42 @@ +{ + "modules": { + "lp0.100": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "100", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "lp0.200": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "200", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "acl0": { + "type": "acl", + "firewall": "firewall.txt", + "nextModules": [ + "vrf0" + ] + }, + "vrf0": { + "type": "route", + "interfaces": { + "kni0.100": { + "ipv6Prefix": "fe80::2/64", + "neighborIPv6Address": "fe80::1", + "neighborMacAddress": "00:00:00:11:11:11", + "nextModule": "lp0.100" + }, + "kni0.200": { + "ipv4Prefix": "200.0.0.2/24", + "neighborIPv4Address": "200.0.0.1", + "neighborMacAddress": "00:00:00:22:22:22", + "nextModule": "lp0.200" + } + } + } + } +} diff --git a/autotest/units/001_one_port/024_firewall/firewall.txt b/autotest/units/001_one_port/024_firewall/firewall.txt new file mode 100644 index 00000000..af164395 --- /dev/null +++ b/autotest/units/001_one_port/024_firewall/firewall.txt @@ -0,0 +1,25 @@ +:BEGIN +add skipto :IN ip from any to any in + +:IN +add deny udp from 10.0.0.0/24 to any +add allow tcp from 10.0.0.0/24 to 10.0.0.0/24 dst-port 80,443 +add deny tcp from 10.1.0.0/24 to 21.0.0.16/28 src-port 1024 frag +add allow tcp from 10.1.0.0/24 to 21.0.0.16/28 src-port 1024 +add allow icmp from 10.2.0.0/24 to any frag +add deny icmp from 10.2.0.0/24 to any icmptypes 1,2,3,9,10,13 +add allow icmp from 10.0.0.0/8 to 10.0.0.0/8 + +add deny tcp from any to 2000::1:0/112 +add allow udp from 2000::1:0/112 to 2000::1:0/112 dst-port 53 +add deny udp from 2000::0/112 to any src-port 53 dst-port 53 frag +add allow udp from 2000::0/112 to any src-port 53 dst-port 53 +add deny icmp6 from 2200::/112 to 2000::/112 +add allow icmp6 from any to 2000::/112 +add deny tcp from 2300::/112 to 2300::/112 tcpflags urg,psh +add allow tcp from 2300::/112 to 2300::/112 +add deny tcp from 2301::/112 to 2301::/112 tcpflags fin,!rst +add allow tcp from 2301::/112 to 2301::/112 + +add allow tcp from any to any established +add deny ip from any to any diff --git a/autotest/units/001_one_port/024_firewall/gen.py b/autotest/units/001_one_port/024_firewall/gen.py new file mode 100755 index 00000000..f4ce7324 --- /dev/null +++ b/autotest/units/001_one_port/024_firewall/gen.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from scapy.all import * +from scapy.contrib.mpls import MPLS + + +def write_pcap(filename, *packetsList): + if len(packetsList) == 0: + PcapWriter(filename)._write_header(Ether()) + return + + PcapWriter(filename) + + for packets in packetsList: + if type(packets) == list: + for packet in packets: + packet.time = 0 + wrpcap(filename, [p for p in packet], append=True) + else: + packets.time = 0 + wrpcap(filename, [p for p in packets], append=True) + +def ipv4_send(_src, _dst): + return Ether(dst="00:11:22:33:44:55", src="00:00:00:11:11:11")/Dot1Q(vlan=100)/IP(src=_src, dst=_dst, ttl=64) + +def ipv4_recv(_src, _dst): + return Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(src=_src, dst=_dst, ttl=63) + +def ipv6_send(_src, _dst): + return Ether(dst="00:11:22:33:44:55", src="00:00:00:22:22:22")/Dot1Q(vlan=200)/IPv6(src=_src, dst=_dst, hlim=64, fl=0) + +def ipv6_recv(_src, _dst): + return Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(src=_src, dst=_dst, hlim=63, fl=0) + +write_pcap("001-send.pcap", + ipv4_send("10.0.0.3", "10.0.0.55")/TCP(dport=80, sport=(1024,1040), flags="S"), + ipv4_send("10.1.0.5", "21.0.0.18")/TCP(dport=80, sport=1024, flags="S"), + fragment(ipv4_send("10.1.0.5", "21.0.0.18")/TCP(dport=80, sport=1024, flags="S")/("QQQ"*400), fragsize=256), + ipv4_send("10.1.0.5", "10.0.0.18")/ICMP(type=10), + fragment(ipv4_send("10.2.0.5", "10.0.0.18")/ICMP(type=10)/("."*192), fragsize=128), + ipv4_send("33.33.33.33", "33.33.33.34")/TCP(flags="A"), + ipv4_send("33.33.33.33", "33.33.33.34")/TCP(flags="R")) + +write_pcap("001-expect.pcap", + ipv4_recv("10.0.0.3", "10.0.0.55")/TCP(dport=80, sport=(1024,1040), flags="S"), + ipv4_recv("10.1.0.5", "21.0.0.18")/TCP(dport=80, sport=1024, flags="S"), + fragment(ipv4_recv("10.1.0.5", "21.0.0.18")/TCP(dport=80, sport=1024, flags="S")/("QQQ"*400), fragsize=256)[0], + ipv4_recv("10.1.0.5", "10.0.0.18")/ICMP(type=10), + fragment(ipv4_recv("10.2.0.5", "10.0.0.18")/ICMP(type=10)/("."*192), fragsize=128)[1], + ipv4_recv("33.33.33.33", "33.33.33.34")/TCP(flags="A"), + ipv4_recv("33.33.33.33", "33.33.33.34")/TCP(flags="R")) + +write_pcap("002-send.pcap", + ipv4_send("10.0.0.3", "10.0.0.55")/TCP(dport=81, sport=(1024,1040)), + ipv4_send("10.1.0.5", "21.0.0.18")/TCP(dport=(80,85), sport=5024), + ipv4_send("10.2.0.5", "10.0.0.18")/ICMP(type=10), + ipv4_send("20.0.0.1", "21.0.0.18")/TCP(flags="S"), + ipv4_recv("33.33.33.33", "33.33.33.34")/TCP(flags="S")) + +write_pcap("002-expect.pcap") + +write_pcap("003-send.pcap", + ipv6_send("2000::1:b", "2000::1:bc")/UDP(dport=53, sport=(1024,1040)), + ipv6_send("2000::b", "2200::1:bc")/UDP(dport=53, sport=53), + fragment6(ipv6_send("2000::b", "2200::1:bc")/IPv6ExtHdrFragment(id=0x12345678)/UDP(dport=53, sport=53)/("ABCD"*1000), fragSize=1280), + ipv6_send("2222::a", "2000::1")/ICMPv6DestUnreach(code=0), + ipv6_send("3456::a", "3456::b")/TCP(flags="A"), + ipv6_send("3456::a", "3456::b")/TCP(flags="R"), + ipv6_send("2300::1", "2300::b")/TCP(flags="S"), + ipv6_send("2301::1", "2301::b")/TCP(flags="FR")) + +write_pcap("003-expect.pcap", + ipv6_recv("2000::1:b", "2000::1:bc")/UDP(dport=53, sport=(1024,1040)), + ipv6_recv("2000::b", "2200::1:bc")/UDP(dport=53, sport=53), + fragment6(ipv6_recv("2000::b", "2200::1:bc")/IPv6ExtHdrFragment(id=0x12345678)/UDP(dport=53, sport=53)/("ABCD"*1000), fragSize=1280)[0], + ipv6_recv("2222::a", "2000::1")/ICMPv6DestUnreach(code=0), + ipv6_recv("3456::a", "3456::b")/TCP(flags="A"), + ipv6_recv("3456::a", "3456::b")/TCP(flags="R"), + ipv6_recv("2300::1", "2300::b")/TCP(flags="S"), + ipv6_recv("2301::1", "2301::b")/TCP(flags="FR")) + +write_pcap("004-send.pcap", + ipv6_send("2000::1:b", "2000::1:bc")/UDP(dport=55, sport=(1024,1040)), + ipv6_send("2000::b", "2200::1:bc")/UDP(dport=53, sport=55), + ipv6_send("2200::a", "2000::1")/ICMPv6DestUnreach(code=0), + ipv6_send("2300::1", "2300::b")/TCP(flags="RPU"), + ipv6_send("2301::1", "2301::b")/TCP(flags="UF")) + +write_pcap("004-expect.pcap") diff --git a/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/001-expect.pcap b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/001-expect.pcap new file mode 100644 index 00000000..079793f0 Binary files /dev/null and b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/001-expect.pcap differ diff --git a/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/001-send.pcap b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/001-send.pcap new file mode 100644 index 00000000..15b30a4f Binary files /dev/null and b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/001-send.pcap differ diff --git a/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/002-expect.pcap b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/002-expect.pcap new file mode 100644 index 00000000..a3243045 Binary files /dev/null and b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/002-expect.pcap differ diff --git a/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/002-send.pcap b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/002-send.pcap new file mode 100644 index 00000000..91fa398f Binary files /dev/null and b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/002-send.pcap differ diff --git a/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/003-expect.pcap b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/003-expect.pcap new file mode 100644 index 00000000..152f699e Binary files /dev/null and b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/003-expect.pcap differ diff --git a/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/003-send.pcap b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/003-send.pcap new file mode 100644 index 00000000..5f106e9b Binary files /dev/null and b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/003-send.pcap differ diff --git a/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/autotest.yaml b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/autotest.yaml new file mode 100644 index 00000000..99a8257d --- /dev/null +++ b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/autotest.yaml @@ -0,0 +1,15 @@ +steps: +- ipv4Update: "0.0.0.0/0 -> 200.0.0.1" +- ipv6Update: "::/0 -> aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:1" +- sendPackets: + - port: kni0 + send: 001-send.pcap + expect: 001-expect.pcap +- sendPackets: + - port: kni0 + send: 002-send.pcap + expect: 002-expect.pcap +- sendPackets: + - port: kni0 + send: 003-send.pcap + expect: 003-expect.pcap diff --git a/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/controlplane.conf b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/controlplane.conf new file mode 100644 index 00000000..1c22f805 --- /dev/null +++ b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/controlplane.conf @@ -0,0 +1,70 @@ +{ + "modules": { + "lp0.100": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "100", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "lp0.200": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "200", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "acl0": { + "type": "acl", + "nextModules": [ + "nat64stateless0", + "nat64stateless1" + ] + }, + "nat64stateless0": { + "type": "nat64stateless", + "translations": [ + { + "ipv6Address": "aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa", + "ipv6DestinationAddress": "5555:5555:5555:5555:5555:5555::", + "ipv4Address": "10.88.88.88", + "ingressPortRange": "2001-2004", + "egressPortRange": "12001-12004" + } + ], + "firewall": "true", + "nextModule": "vrf0" + }, + "nat64stateless1": { + "type": "nat64stateless", + "translations": [ + { + "ipv6Address": "aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", + "ipv6DestinationAddress": "5555:5555:5555:5555:5555:5555::", + "ipv4Address": "10.88.88.88", + "ingressPortRange": "2001-2004", + "egressPortRange": "22001-22004" + } + ], + "firewall": "false", + "nextModule": "vrf0" + }, + "vrf0": { + "type": "route", + "interfaces": { + "kni0.100": { + "ipv6Prefix": "aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:2/112", + "neighborIPv6Address": "aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:1", + "neighborMacAddress": "00:00:00:11:11:11", + "nextModule": "lp0.100" + }, + "kni0.200": { + "ipv4Prefix": "200.0.0.2/24", + "neighborIPv4Address": "200.0.0.1", + "neighborMacAddress": "00:00:00:22:22:22", + "nextModule": "lp0.200" + } + } + } + } +} diff --git a/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/gen.py b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/gen.py new file mode 100755 index 00000000..09eef7fe --- /dev/null +++ b/autotest/units/001_one_port/025_nat64stateless_range_ports_firewall/gen.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from scapy.all import * + + +def write_pcap(filename, *packetsList): + if len(packetsList) == 0: + PcapWriter(filename)._write_header(Ether()) + return + + PcapWriter(filename) + + for packets in packetsList: + if type(packets) == list: + for packet in packets: + packet.time = 0 + wrpcap(filename, [p for p in packet], append=True) + else: + packets.time = 0 + wrpcap(filename, [p for p in packets], append=True) + + +write_pcap("001-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/TCP(sport=443, dport=(12000,12005), flags="S"), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/TCP(sport=443, dport=(12000,12005), flags="FPU"), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/TCP(sport=443, dport=(12000,12005), flags=""), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/UDP(sport=50, dport=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/UDP(sport=53, dport=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=0, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=8, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/TCP(sport=443, dport=(12000,12005), flags="SA"), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/TCP(sport=443, dport=(12000,12005), flags="A"), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/TCP(sport=443, dport=(22000,22005), flags="S"), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/TCP(sport=443, dport=(22000,22005), flags="FPU"), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/TCP(sport=443, dport=(22000,22005), flags=""), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/UDP(sport=50, dport=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/UDP(sport=53, dport=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=0, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=8, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/TCP(sport=443, dport=(22000,22005), flags="SA"), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/TCP(sport=443, dport=(22000,22005), flags="A"), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/GRE()) + +write_pcap("001-expect.pcap", + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/UDP(dport=(2001,2004), sport=53), + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/ICMPv6EchoReply(id=(2001,2004)), + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/TCP(dport=(2001,2004), sport=443, flags="SA"), + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/TCP(dport=(2001,2004), sport=443, flags="A"), + + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/TCP(dport=(2001,2004), sport=443, flags="S"), + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/TCP(dport=(2001,2004), sport=443, flags="FPU"), + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/TCP(dport=(2001,2004), sport=443, flags=""), + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/UDP(dport=(2001,2004), sport=50), + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/UDP(dport=(2001,2004), sport=53), + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/ICMPv6EchoReply(id=(2001,2004)), + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/TCP(dport=(2001,2004), sport=443, flags="SA"), + Ether(src="00:11:22:33:44:55", dst="00:00:00:11:11:11")/Dot1Q(vlan=100)/IPv6(dst="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", src="5555:5555:5555:5555:5555:5555:10.99.99.99", hlim=63)/TCP(dport=(2001,2004), sport=443, flags="A")) + + +write_pcap("002-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=3, id=(12000,12005))/IP(dst="10.99.99.99", src="10.88.88.88")/TCP(), # todo: tcp ports + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=4, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=5, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=9, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=10, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=11, id=(12000,12005))/IP(dst="10.99.99.99", src="10.88.88.88")/TCP(), # todo: tcp ports + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=12, id=(12000,12005), ptr=13)/IP(dst="10.99.99.99", src="10.88.88.88")/TCP(), # todo: tcp ports + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=13, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=14, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=15, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=16, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=17, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=18, id=(12000,12005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=30, id=(12000,12005)), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=3, id=(22000,22005))/IP(dst="10.99.99.99", src="10.88.88.88")/TCP(), # todo: tcp ports + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=4, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=5, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=9, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=10, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=11, id=(22000,22005))/IP(dst="10.99.99.99", src="10.88.88.88")/TCP(), # todo: tcp ports + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=12, id=(22000,22005), ptr=13)/IP(dst="10.99.99.99", src="10.88.88.88")/TCP(), # todo: tcp ports + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=13, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=14, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=15, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=16, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=17, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=18, id=(22000,22005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=200)/IP(dst="10.88.88.88", src="10.99.99.99")/ICMP(type=30, id=(22000,22005))) + +write_pcap("002-expect.pcap") + + +write_pcap("003-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="5555:5555:5555:5555:5555:5555:102.102.102.103", src="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa", hlim=64)/TCP(dport=443, sport=(2000,2005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="5555:5555:5555:5555:5555:5555:102.102.102.103", src="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa", hlim=64)/UDP(dport=50, sport=(2000,2005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="5555:5555:5555:5555:5555:5555:102.102.102.103", src="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa", hlim=64)/UDP(dport=53, sport=(2000,2005)), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="5555:5555:5555:5555:5555:5555:102.102.102.103", src="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", hlim=64)/TCP(dport=443, sport=(2000,2005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="5555:5555:5555:5555:5555:5555:102.102.102.103", src="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", hlim=64)/UDP(dport=50, sport=(2000,2005)), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="5555:5555:5555:5555:5555:5555:102.102.102.103", src="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:bbbb", hlim=64)/UDP(dport=53, sport=(2000,2005)), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="5555:5555:5555:5555:5555:5555:102.102.102.103", src="aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa", hlim=64)/GRE()) + +write_pcap("003-expect.pcap", + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="102.102.102.103", src="10.88.88.88", ttl=63, id=0)/TCP(dport=443, sport=(12001,12004)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="102.102.102.103", src="10.88.88.88", ttl=63, id=0)/UDP(dport=50, sport=(12001,12004)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="102.102.102.103", src="10.88.88.88", ttl=63, id=0)/UDP(dport=53, sport=(12001,12004)), + + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="102.102.102.103", src="10.88.88.88", ttl=63, id=0)/TCP(dport=443, sport=(22001,22004)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="102.102.102.103", src="10.88.88.88", ttl=63, id=0)/UDP(dport=50, sport=(22001,22004)), + Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="102.102.102.103", src="10.88.88.88", ttl=63, id=0)/UDP(dport=53, sport=(22001,22004))) diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/001-expect.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/001-expect.pcap new file mode 100644 index 00000000..e6b78254 Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/001-expect.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/001-send.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/001-send.pcap new file mode 100644 index 00000000..ff15198c Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/001-send.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/002-expect.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/002-expect.pcap new file mode 100644 index 00000000..f1114ab7 Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/002-expect.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/002-send.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/002-send.pcap new file mode 100644 index 00000000..64d71545 Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/002-send.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/003-expect.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/003-expect.pcap new file mode 100644 index 00000000..cd47a524 Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/003-expect.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/003-send.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/003-send.pcap new file mode 100644 index 00000000..b4d66c2f Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/003-send.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/004-expect.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/004-expect.pcap new file mode 100644 index 00000000..b3789c9c Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/004-expect.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/004-send.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/004-send.pcap new file mode 100644 index 00000000..5642183c Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/004-send.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/005-expect.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/005-expect.pcap new file mode 100644 index 00000000..9e69b74b Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/005-expect.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/005-send.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/005-send.pcap new file mode 100644 index 00000000..8764b317 Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/005-send.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/006-expect.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/006-expect.pcap new file mode 100644 index 00000000..814d66de Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/006-expect.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/006-send.pcap b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/006-send.pcap new file mode 100644 index 00000000..17167323 Binary files /dev/null and b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/006-send.pcap differ diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/autotest.yaml b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/autotest.yaml new file mode 100644 index 00000000..ad33ffe3 --- /dev/null +++ b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/autotest.yaml @@ -0,0 +1,27 @@ +steps: +- ipv4Update: "0.0.0.0/0 -> 200.0.0.1" +- ipv6Update: "::/0 -> fe80::1" +- sendPackets: + - port: kni0 + send: 001-send.pcap + expect: 001-expect.pcap +- sendPackets: + - port: kni0 + send: 002-send.pcap + expect: 002-expect.pcap +- sendPackets: + - port: kni0 + send: 003-send.pcap + expect: 003-expect.pcap +- sendPackets: + - port: kni0 + send: 004-send.pcap + expect: 004-expect.pcap +- sendPackets: + - port: kni0 + send: 005-send.pcap + expect: 005-expect.pcap +- sendPackets: + - port: kni0 + send: 006-send.pcap + expect: 006-expect.pcap diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/controlplane.conf b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/controlplane.conf new file mode 100644 index 00000000..507ae9e5 --- /dev/null +++ b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/controlplane.conf @@ -0,0 +1,88 @@ +{ + "modules": { + "lp0.100": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "100", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "lp0.200": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "200", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "acl0": { + "type": "acl", + "nextModules": [ + "nat64stateless0" + ] + }, + "nat64stateless0": { + "type": "nat64stateless", + "translations": [ + { + "ipv6Address": "2000::", + "ipv6DestinationAddress": "2222:123:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2001-2004", + "egressPortRange": "12001-12004" + }, + { + "ipv6Address": "2000::1", + "ipv6DestinationAddress": "2222:123:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2001-2004", + "egressPortRange": "12005-12008" + }, + { + "ipv6Address": "2000::2", + "ipv6DestinationAddress": "2222:123:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2001-2004", + "egressPortRange": "12009-12012" + }, + { + "ipv6Address": "2000::", + "ipv6DestinationAddress": "2222:123:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2005-2008", + "egressPortRange": "12013-12016" + }, + { + "ipv6Address": "2000::1", + "ipv6DestinationAddress": "2222:123:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2005-2008", + "egressPortRange": "12017-12020" + }, + { + "ipv6Address": "2000::2", + "ipv6DestinationAddress": "2222:123:0a00:0000::", + "ipv4Address": "10.0.0.0", + "ingressPortRange": "2005-2008", + "egressPortRange": "12021-12024" + } + ], + "firewall": "false", + "nextModule": "vrf0" + }, + "vrf0": { + "type": "route", + "interfaces": { + "kni0.100": { + "neighborIPv6Address": "fe80::1", + "neighborMacAddress": "00:00:00:11:11:11", + "nextModule": "lp0.100" + }, + "kni0.200": { + "neighborIPv4Address": "200.0.0.1", + "neighborMacAddress": "00:00:00:22:22:22", + "nextModule": "lp0.200" + } + } + } + } +} diff --git a/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/gen.py b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/gen.py new file mode 100755 index 00000000..599ceaec --- /dev/null +++ b/autotest/units/001_one_port/026_nat64stateless_range_ports_fragmentation/gen.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from scapy.all import * + + +def write_pcap(filename, *packetsList): + PcapWriter(filename) + for packets in packetsList: + if type(packets) == list: + for packet in packets: + packet.time = 0 + wrpcap(filename, [p for p in packet], append=True) + else: + packets.time = 0 + wrpcap(filename, [p for p in packets], append=True) + + +write_pcap("001-send.pcap", + fragment6(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::", hlim=64)/IPv6ExtHdrFragment(id=0x12345670)/TCP(dport=80, sport=2001)/("ABCDEFGH1234AAAAAAAA"*128), fragSize=1280), + list(reversed(fragment6(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::", hlim=64)/IPv6ExtHdrFragment(id=0x12345671)/TCP(dport=80, sport=2005)/("ABCDEFGH1234DDDDDDDD"*128), fragSize=1280))), + + fragment6(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::1", hlim=64)/IPv6ExtHdrFragment(id=0x12345672)/UDP(dport=80, sport=2002)/("ABCDEFGH1234BBBBBBBB"*128), fragSize=1280), + list(reversed(fragment6(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::1", hlim=64)/IPv6ExtHdrFragment(id=0x12345673)/UDP(dport=80, sport=2006)/("ABCDEFGH1234EEEEEEEE"*128), fragSize=1280))), + + fragment6(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x12345674)/ICMPv6EchoRequest(id=2003)/("ABCDEFGH123CCCCCCCCC"*128), fragSize=1280), + list(reversed(fragment6(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x12345675)/ICMPv6EchoRequest(id=2007)/("ABCDEFGH1234FFFFFFFF"*128), fragSize=1280)))) + +write_pcap("001-expect.pcap", + fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0x8282)/TCP(dport=80, sport=12001)/("ABCDEFGH1234AAAAAAAA"*128), fragsize=1208), + list(reversed(fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0x8101)/TCP(dport=80, sport=12013)/("ABCDEFGH1234DDDDDDDD"*128), fragsize=1208))), + + fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0x75f2)/UDP(dport=80, sport=12006)/("ABCDEFGH1234BBBBBBBB"*128), fragsize=1208), + list(reversed(fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0x7671)/UDP(dport=80, sport=12018)/("ABCDEFGH1234EEEEEEEE"*128), fragsize=1208))), + + fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0x9d15)/ICMP(type=8, id=12011)/("ABCDEFGH123CCCCCCCCC"*128), fragsize=1208), + fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0x9e96)/ICMP(type=8, id=12023)/("ABCDEFGH1234FFFFFFFF"*128), fragsize=1208)) + + +write_pcap("002-send.pcap", + fragment(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0x1111)/TCP(dport=12002, sport=80)/("ABCDEFGH1234AAAAAAAA"*128), fragsize=1208), + list(reversed(fragment(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0x2222)/TCP(dport=12014, sport=80)/("ABCDEFGH1234DDDDDDDD"*128), fragsize=1208))), + + fragment(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0x3333)/UDP(dport=12007, sport=80)/("ABCDEFGH1234BBBBBBBB"*128), fragsize=1208), + list(reversed(fragment(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0x4444)/UDP(dport=12019, sport=80)/("ABCDEFGH1234EEEEEEEE"*128), fragsize=1208))), + + fragment(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0x5555)/ICMP(type=0, id=12012)/("ABCDEFGH123CCCCCCCCC"*128), fragsize=1208), + list(reversed(fragment(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0x6666)/ICMP(type=0, id=12024)/("ABCDEFGH1234FFFFFFFF"*128), fragsize=1208)))) + +write_pcap("002-expect.pcap", + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0x11110000)/TCP(dport=2002, sport=80)/("ABCDEFGH1234AAAAAAAA"*128), fragSize=1280), + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0x22220000)/TCP(dport=2006, sport=80)/("ABCDEFGH1234DDDDDDDD"*128), fragSize=1280), + + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0x33330000)/UDP(dport=2003, sport=80)/("ABCDEFGH1234BBBBBBBB"*128), fragSize=1280), + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0x44440000)/UDP(dport=2007, sport=80)/("ABCDEFGH1234EEEEEEEE"*128), fragSize=1280), + + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::2", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0x55550000)/ICMPv6EchoReply(id=2004)/("ABCDEFGH123CCCCCCCCC"*128), fragSize=1280), + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::2", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0x66660000)/ICMPv6EchoReply(id=2008)/("ABCDEFGH1234FFFFFFFF"*128), fragSize=1280)) + + +write_pcap("003-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA0, m=1)/ICMPv6EchoRequest(id=2001, cksum=0x2cc6)/("1BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA0, m=1, offset=84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA0, m=0, offset=84+84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA1, m=1)/ICMPv6EchoRequest(id=2002)/("2BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA1, m=1, offset=84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA1, m=1, offset=84+84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA2, m=1)/ICMPv6EchoRequest(id=2003)/("3BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA2, m=1, offset=83, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*40), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA2, m=0, offset=84+84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA3, m=1)/ICMPv6EchoRequest(id=2004)/("4BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA3, m=1, offset=85, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*40), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA3, m=0, offset=84+84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA4, m=1)/ICMPv6EchoRequest(id=2001)/("5BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA4, m=1, offset=84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA4, m=0, offset=84+83, nh=58)/("ABCDEFGH1234AAAAAAAA"*32), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA5, m=1)/ICMPv6EchoRequest(id=2002)/("6BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA5, m=1, offset=84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA5, m=0, offset=84+85, nh=58)/("ABCDEFGH1234AAAAAAAA"*32), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA6, m=1)/ICMPv6EchoRequest(id=2003, cksum=0x6cc3)/("7BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA6, m=1, offset=84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA6, m=1, offset=84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA6, m=0, offset=84+84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA7, m=1)/ICMPv6EchoRequest(id=2004, cksum=0x4cc2)/("8BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA7, m=1, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA7, m=1, offset=84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA7, m=0, offset=84+84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA8, m=1)/ICMPv6EchoRequest(id=2001)/("9BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA8, m=1, offset=84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234AAA9, m=0, offset=84+84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234FFF0, m=1)/ICMPv6EchoRequest(id=2002, cksum=0x4cc5)/("0BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234FFF0, m=1, offset=84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::2", hlim=64)/IPv6ExtHdrFragment(id=0x1234FFF0, m=0, offset=84+84, nh=58)/("ABCDEFGH1234AAAAAAAA"*32)) + +write_pcap("003-expect.pcap", + fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0x33ef)/ICMP(type=8, id=12009)/("1BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III"/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32)/("ABCDEFGH1234AAAAAAAA"*32), fragsize=672), + fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0xdb08)/ICMP(type=8, id=12011)/("7BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III"/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32)/("ABCDEFGH1234AAAAAAAA"*32), fragsize=672), + fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0xd88b)/ICMP(type=8, id=12012)/("8BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III"/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32)/("ABCDEFGH1234AAAAAAAA"*32), fragsize=672), + fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0xcefb)/ICMP(type=8, id=12010)/("0BCDEFGH1234AAAAAAAA"*32)/" voevat'-masterit' III"/("ABCDEFGH1234AAAAAAAA"*32)/(" "*32)/("ABCDEFGH1234AAAAAAAA"*32), fragsize=672)) + + +write_pcap("004-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA0, flags="MF", frag=0)/UDP(dport=12002, sport=80, len=1536, chksum=0xddff)/("DEADBEAF"*63), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA0, flags="MF", frag=64, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA0, flags="", frag=64+64, proto=17)/("DEADBEAF"*64), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA1, flags="MF", frag=0)/UDP(dport=12002, sport=80, len=1536, chksum=0xddff)/("DEADBEAF"*63), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA1, flags="MF", frag=64, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA1, flags="MF", frag=64+64, proto=17)/("DEADBEAF"*64), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA2, flags="MF", frag=0)/UDP(dport=12002, sport=80, len=1536, chksum=0xddff)/("DEADBEAF"*63), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA2, flags="MF", frag=63, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA2, flags="", frag=64+64, proto=17)/("DEADBEAF"*64), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA3, flags="MF", frag=0)/UDP(dport=12002, sport=80, len=1536, chksum=0xddff)/("DEADBEAF"*63), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA3, flags="MF", frag=65, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA3, flags="", frag=64+64, proto=17)/("DEADBEAF"*64), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA4, flags="MF", frag=0)/UDP(dport=12002, sport=80, len=1536, chksum=0xddff)/("DEADBEAF"*63), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA4, flags="MF", frag=64, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA4, flags="", frag=64+63, proto=17)/("DEADBEAF"*64), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA5, flags="MF", frag=0)/UDP(dport=12002, sport=80, len=1536, chksum=0xddff)/("DEADBEAF"*63), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA5, flags="MF", frag=64, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA5, flags="", frag=64+65, proto=17)/("DEADBEAF"*64), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA6, flags="MF", frag=0)/UDP(dport=12002, sport=80, len=1536, chksum=0xddff)/("DEADBEAF"*63), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA6, flags="MF", frag=64, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA6, flags="MF", frag=64, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA6, flags="", frag=64+64, proto=17)/("DEADBEAF"*64), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA7, flags="MF", frag=0)/UDP(dport=12002, sport=80, len=1536, chksum=0xddff)/("DEADBEAF"*63), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA7, flags="MF", frag=0, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA7, flags="MF", frag=64, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA7, flags="", frag=64+64, proto=17)/("DEADBEAF"*64), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA8, flags="MF", frag=0)/UDP(dport=12002, sport=80, len=1536, chksum=0xddff)/("DEADBEAF"*63), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA8, flags="MF", frag=64, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xAAA9, flags="", frag=64+64, proto=17)/("DEADBEAF"*64), + + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xFFF0, flags="MF", frag=0)/UDP(dport=12002, sport=80, len=1536, chksum=0xddff)/("DEADBEAF"*63), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xFFF0, flags="MF", frag=64, proto=17)/("DEADBEAF"*64), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xFFF0, flags="", frag=64+64, proto=17)/("DEADBEAF"*64)) + +write_pcap("004-expect.pcap", + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0xAAA00000)/UDP(dport=2002, sport=80)/("DEADBEAF"*(63+64+64)), fragSize=584), + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0xAAA60000)/UDP(dport=2002, sport=80)/("DEADBEAF"*(63+64+64)), fragSize=584), + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0xAAA70000)/UDP(dport=2002, sport=80)/("DEADBEAF"*(63+64+64)), fragSize=584), + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0xFFF00000)/UDP(dport=2002, sport=80)/("DEADBEAF"*(63+64+64)), fragSize=584)) + + +write_pcap("005-send.pcap", + fragment6(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::1", hlim=64)/IPv6ExtHdrDestOpt()/IPv6ExtHdrFragment(id=0x12CDCDC0)/UDP(dport=80, sport=2002)/("ABCDEFGH1234BBBBBBBB"*128), fragSize=1280), +# last extension? fragment6(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::1", hlim=64)/IPv6ExtHdrFragment(id=0x12CDCDC1)/IPv6ExtHdrDestOpt()/UDP(dport=81, sport=2002)/("ABCDEFGH1234BBBBBBBB"*128), fragSize=1280), +# last extension? fragment6(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::1", hlim=64)/IPv6ExtHdrDestOpt()/IPv6ExtHdrFragment(id=0x12CDCDC2)/IPv6ExtHdrDestOpt()/UDP(dport=82, sport=2002)/("ABCDEFGH1234BBBBBBBB"*128), fragSize=1280), + fragment6(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="2222:123:0a00:0000::11.11.11.0", src="2000::1", hlim=64)/IPv6ExtHdrDestOpt()/IPv6ExtHdrDestOpt()/IPv6ExtHdrDestOpt()/IPv6ExtHdrDestOpt()/IPv6ExtHdrDestOpt()/IPv6ExtHdrDestOpt()/IPv6ExtHdrDestOpt()/IPv6ExtHdrFragment(id=0x12CDCDC3)/UDP(dport=83, sport=2002)/("ABCDEFGH1234BBBBBBBB"*128), fragSize=1280)) + +write_pcap("005-expect.pcap", + fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0xad4d)/UDP(dport=80, sport=12006)/("ABCDEFGH1234BBBBBBBB"*128), fragsize=1200), +# last extension? fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0x75f2)/UDP(dport=81, sport=12006)/("ABCDEFGH1234BBBBBBBB"*128), fragsize=1208), +# last extension? fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0x75f2)/UDP(dport=82, sport=12006)/("ABCDEFGH1234BBBBBBBB"*128), fragsize=1208), + fragment(Ether(dst="00:00:00:22:22:22", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="11.11.11.0", src="10.0.0.0", ttl=63, id=0x59be)/UDP(dport=83, sport=12006)/("ABCDEFGH1234BBBBBBBB"*128), fragsize=1152)) + + +write_pcap("006-send.pcap", + fragment(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xc1c0, options=("\x02"*4))/UDP(dport=12007, sport=80)/("ABCDEFGH1234BBBBBBBB"*128), fragsize=1208), + fragment(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xc1c1, options=("\x02"*20))/UDP(dport=12007, sport=80)/("ABCDEFGH1234BBBBBBBB"*128), fragsize=1208), + fragment(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="11.11.11.0", ttl=64, id=0xc1c2, options=("\x02"*40))/UDP(dport=12007, sport=80)/("ABCDEFGH1234BBBBBBBB"*128), fragsize=1208)) + +write_pcap("006-expect.pcap", + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0xc1c00000)/UDP(dport=2003, sport=80)/("ABCDEFGH1234BBBBBBBB"*128), fragSize=1280), + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0xc1c10000)/UDP(dport=2003, sport=80)/("ABCDEFGH1234BBBBBBBB"*128), fragSize=1280), + fragment6(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2222:123:0a00:0000::11.11.11.0", hlim=63, fl=0)/IPv6ExtHdrFragment(id=0xc1c20000)/UDP(dport=2003, sport=80)/("ABCDEFGH1234BBBBBBBB"*128), fragSize=1280)) diff --git a/autotest/units/001_one_port/027_decap_fragment/001-expect.pcap b/autotest/units/001_one_port/027_decap_fragment/001-expect.pcap new file mode 100644 index 00000000..f50c5117 Binary files /dev/null and b/autotest/units/001_one_port/027_decap_fragment/001-expect.pcap differ diff --git a/autotest/units/001_one_port/027_decap_fragment/001-send.pcap b/autotest/units/001_one_port/027_decap_fragment/001-send.pcap new file mode 100644 index 00000000..e025146d Binary files /dev/null and b/autotest/units/001_one_port/027_decap_fragment/001-send.pcap differ diff --git a/autotest/units/001_one_port/027_decap_fragment/002-expect.pcap b/autotest/units/001_one_port/027_decap_fragment/002-expect.pcap new file mode 100644 index 00000000..a3243045 Binary files /dev/null and b/autotest/units/001_one_port/027_decap_fragment/002-expect.pcap differ diff --git a/autotest/units/001_one_port/027_decap_fragment/002-send.pcap b/autotest/units/001_one_port/027_decap_fragment/002-send.pcap new file mode 100644 index 00000000..6a1a5480 Binary files /dev/null and b/autotest/units/001_one_port/027_decap_fragment/002-send.pcap differ diff --git a/autotest/units/001_one_port/027_decap_fragment/autotest.yaml b/autotest/units/001_one_port/027_decap_fragment/autotest.yaml new file mode 100644 index 00000000..f806e43b --- /dev/null +++ b/autotest/units/001_one_port/027_decap_fragment/autotest.yaml @@ -0,0 +1,10 @@ +steps: +- ipv4Update: "0.0.0.0/0 -> 200.0.0.1" +- sendPackets: + - port: kni0 + send: 001-send.pcap + expect: 001-expect.pcap +- sendPackets: + - port: kni0 + send: 002-send.pcap + expect: 002-expect.pcap diff --git a/autotest/units/001_one_port/027_decap_fragment/controlplane.conf b/autotest/units/001_one_port/027_decap_fragment/controlplane.conf new file mode 100644 index 00000000..3dcb4f04 --- /dev/null +++ b/autotest/units/001_one_port/027_decap_fragment/controlplane.conf @@ -0,0 +1,45 @@ +{ + "modules": { + "lp0.100": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "100", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "lp0.200": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "200", + "macAddress": "00:11:22:33:44:55", + "nextModule": "drop" + }, + "acl0": { + "type": "acl", + "nextModules": [ + "decap0" + ] + }, + "decap0": { + "type": "decap", + "ipv6DestinationPrefixes": [ + "1:2:3:4::abcd/128" + ], + "nextModule": "vrf0" + }, + "vrf0": { + "type": "route", + "interfaces": { + "kni0.100": { + "nextModule": "lp0.100" + }, + "kni0.200": { + "ipv4Prefix": "200.0.0.2/24", + "neighborIPv4Address": "200.0.0.1", + "neighborMacAddress": "00:00:00:11:11:11", + "nextModule": "lp0.200" + } + } + } + } +} diff --git a/autotest/units/001_one_port/027_decap_fragment/gen.py b/autotest/units/001_one_port/027_decap_fragment/gen.py new file mode 100755 index 00000000..20508049 --- /dev/null +++ b/autotest/units/001_one_port/027_decap_fragment/gen.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from scapy.all import * + + +def write_pcap(filename, *packetsList): + if len(packetsList) == 0: + PcapWriter(filename)._write_header(Ether()) + return + + PcapWriter(filename) + + for packets in packetsList: + if type(packets) == list: + for packet in packets: + packet.time = 0 + wrpcap(filename, [p for p in packet], append=True) + else: + packets.time = 0 + wrpcap(filename, [p for p in packets], append=True) + + +write_pcap("001-send.pcap", + fragment(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1:2:3:4::abcd", src="::")/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64)/ICMP()/("ABCDEFGH123CCCCCCCCC"*120)/"QWERTY123", fragsize=1208)) + +write_pcap("001-expect.pcap", + fragment(Ether(dst="00:00:00:11:11:11", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=63)/ICMP()/("ABCDEFGH123CCCCCCCCC"*120)/"QWERTY123", fragsize=1208)) + + +write_pcap("002-send.pcap", + fragment6(Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1:2:3:4::abcd", src="::")/IPv6ExtHdrFragment(id=0x31337)/IP(dst="1.2.3.4", src="0.0.0.0", ttl=64)/ICMP()/("ABCDEFGH123CCCCCCCCC"*120)/"QWERTY123", fragSize=1280)) + +write_pcap("002-expect.pcap") diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/001-expect.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/001-expect.pcap new file mode 100644 index 00000000..25af5f88 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/001-expect.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/001-send.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/001-send.pcap new file mode 100644 index 00000000..1bd76897 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/001-send.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/002-expect.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/002-expect.pcap new file mode 100644 index 00000000..1641e40f Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/002-expect.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/002-send.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/002-send.pcap new file mode 100644 index 00000000..25d16e88 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/002-send.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/003-expect.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/003-expect.pcap new file mode 100644 index 00000000..b25dc03b Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/003-expect.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/003-send.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/003-send.pcap new file mode 100644 index 00000000..625ec3c6 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/003-send.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/004-expect.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/004-expect.pcap new file mode 100644 index 00000000..f5ff5f70 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/004-expect.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/004-send.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/004-send.pcap new file mode 100644 index 00000000..aab5b873 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/004-send.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/005-expect.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/005-expect.pcap new file mode 100644 index 00000000..9ce1b72b Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/005-expect.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/005-send.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/005-send.pcap new file mode 100644 index 00000000..86fd8b04 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/005-send.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/006-expect.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/006-expect.pcap new file mode 100644 index 00000000..1b825877 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/006-expect.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/006-send.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/006-send.pcap new file mode 100644 index 00000000..4d5cc588 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/006-send.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/007-expect.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/007-expect.pcap new file mode 100644 index 00000000..d1929eb9 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/007-expect.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/007-send.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/007-send.pcap new file mode 100644 index 00000000..0ba7f956 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/007-send.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/008-expect.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/008-expect.pcap new file mode 100644 index 00000000..1641e40f Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/008-expect.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/008-send.pcap b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/008-send.pcap new file mode 100644 index 00000000..c1a727d4 Binary files /dev/null and b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/008-send.pcap differ diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/autotest.yaml b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/autotest.yaml new file mode 100644 index 00000000..8f1a0069 --- /dev/null +++ b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/autotest.yaml @@ -0,0 +1,35 @@ +steps: +- ipv4Update: "0.0.0.0/0 -> 200.0.0.1" +- ipv6Update: "::/0 -> fe80::1" +- sendPackets: + - port: kni0 + send: 001-send.pcap + expect: 001-expect.pcap +- sendPackets: + - port: kni0 + send: 002-send.pcap + expect: 002-expect.pcap +- sendPackets: + - port: kni0 + send: 003-send.pcap + expect: 003-expect.pcap +- sendPackets: + - port: kni0 + send: 004-send.pcap + expect: 004-expect.pcap +- sendPackets: + - port: kni0 + send: 005-send.pcap + expect: 005-expect.pcap +- sendPackets: + - port: kni0 + send: 006-send.pcap + expect: 006-expect.pcap +- sendPackets: + - port: kni0 + send: 007-send.pcap + expect: 007-expect.pcap +- sendPackets: + - port: kni0 + send: 008-send.pcap + expect: 008-expect.pcap diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/controlplane.conf b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/controlplane.conf new file mode 100644 index 00000000..6246b80c --- /dev/null +++ b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/controlplane.conf @@ -0,0 +1,68 @@ +{ + "modules": { + "lp0.100": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "100", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "lp0.200": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "200", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl1" + }, + "acl0": { + "type": "acl", + "nextModules": [ + "nat64stateless0:ingress", + "decap0", + "vrf0" + ] + }, + "acl1": { + "type": "acl", + "nextModules": [ + "nat64stateless0:egress", + "vrf0" + ] + }, + "decap0": { + "type": "decap", + "ipv6DestinationPrefixes": [ + ], + "nextModule": "vrf0" + }, + "nat64stateless0": { + "type": "nat64stateless", + "translations": [ + { + "ipv6Address": "2000::", + "ipv6DestinationAddress": "64:ff9b::", + "ipv4Address": "10.0.0.0" + } + ], + "firewall": "false", + "nextModule": "vrf0" + }, + "vrf0": { + "type": "route", + "interfaces": { + "kni0.100": { + "ipv6Prefix": "fe80::2/64", + "neighborIPv6Address": "fe80::1", + "neighborMacAddress": "00:00:00:00:00:01", + "nextModule": "lp0.100" + }, + "kni0.200": { + "ipv4Prefix": "200.0.0.2/24", + "neighborIPv4Address": "200.0.0.1", + "neighborMacAddress": "00:00:00:00:00:02", + "nextModule": "lp0.200" + } + } + } + } +} diff --git a/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/gen.py b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/gen.py new file mode 100755 index 00000000..183efcd4 --- /dev/null +++ b/autotest/units/001_one_port/028_acls_nodecap_nat64stateless_route/gen.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from scapy.all import * + + +def write_pcap(filename, *packetsList): + if len(packetsList) == 0: + PcapWriter(filename)._write_header(Ether()) + return + + PcapWriter(filename) + + for packets in packetsList: + if type(packets) == list: + for packet in packets: + packet.time = 0 + wrpcap(filename, [p for p in packet], append=True) + else: + packets.time = 0 + wrpcap(filename, [p for p in packets], append=True) + + +write_pcap("001-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="64:ff9b::1.1.0.0", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("001-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.1.0.0", src="10.0.0.0", ttl=63, id=0)/TCP(dport=80, sport=2048)) + + +write_pcap("002-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::abcd", src="2000::", hlim=64)/IP(dst="1.1.0.1", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048)) + +write_pcap("002-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="1234::abcd", src="2000::", hlim=63)/IP(dst="1.1.0.1", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048)) + + +write_pcap("003-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IP(dst="1.1.0.2", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="::ffff", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("003-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.1.0.2", src="0.0.0.0", ttl=63)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="::ffff", src="2000::", hlim=63)/TCP(dport=80, sport=2048)) + + +write_pcap("004-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.0", src="1.1.0.3", ttl=64)/TCP(dport=2048, sport=80)) + +write_pcap("004-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::", src="64:ff9b::1.1.0.3", hlim=63, fl=0)/TCP(dport=2048, sport=80)) + + +write_pcap("005-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="1.1.0.5", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="::fffe", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("005-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="1.1.0.5", src="0.0.0.0", ttl=63)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="::fffe", src="2000::", hlim=63)/TCP(dport=80, sport=2048)) + + +write_pcap("006-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IP(dst="200.0.0.9", src="1.1.0.6", ttl=64)/TCP(dport=2048, sport=80)) + +write_pcap("006-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.9", src="1.1.0.6", ttl=63)/TCP(dport=2048, sport=80)) + + +write_pcap("007-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="64:ff9b::1.1.0.0", src="2000::", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("007-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="64:ff9b::1.1.0.0", src="2000::", hlim=63)/TCP(dport=80, sport=2048)) + + +write_pcap("008-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="2000::", hlim=64)/IP(dst="1.1.0.1", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048)) + +write_pcap("008-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="1234::abcd", src="2000::", hlim=63)/IP(dst="1.1.0.1", src="0.0.0.0", ttl=64)/TCP(dport=80, sport=2048)) diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/001-expect.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/001-expect.pcap new file mode 100644 index 00000000..0d3c0ded Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/001-expect.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/001-send.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/001-send.pcap new file mode 100644 index 00000000..d4c08b1d Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/001-send.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/002-expect.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/002-expect.pcap new file mode 100644 index 00000000..97fe030d Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/002-expect.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/002-send.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/002-send.pcap new file mode 100644 index 00000000..09c4e728 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/002-send.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/003-expect.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/003-expect.pcap new file mode 100644 index 00000000..17929979 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/003-expect.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/003-send.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/003-send.pcap new file mode 100644 index 00000000..0dabc24b Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/003-send.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/004-expect.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/004-expect.pcap new file mode 100644 index 00000000..11d48a33 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/004-expect.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/004-send.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/004-send.pcap new file mode 100644 index 00000000..a1463b5a Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/004-send.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/005-expect.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/005-expect.pcap new file mode 100644 index 00000000..fd22894c Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/005-expect.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/005-send.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/005-send.pcap new file mode 100644 index 00000000..7a25e9b0 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/005-send.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/006-expect.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/006-expect.pcap new file mode 100644 index 00000000..8f9a8adf Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/006-expect.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/006-send.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/006-send.pcap new file mode 100644 index 00000000..b9e4e934 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/006-send.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/007-expect.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/007-expect.pcap new file mode 100644 index 00000000..a6473ff2 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/007-expect.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/007-send.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/007-send.pcap new file mode 100644 index 00000000..78d483e7 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/007-send.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/008-expect.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/008-expect.pcap new file mode 100644 index 00000000..b8dc3618 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/008-expect.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/008-send.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/008-send.pcap new file mode 100644 index 00000000..6e79d6d8 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/008-send.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/009-expect.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/009-expect.pcap new file mode 100644 index 00000000..c707b706 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/009-expect.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/009-send.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/009-send.pcap new file mode 100644 index 00000000..e3b68039 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/009-send.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/010-expect.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/010-expect.pcap new file mode 100644 index 00000000..9b2d92e3 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/010-expect.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/010-send.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/010-send.pcap new file mode 100644 index 00000000..b8f0c3a0 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/010-send.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/011-expect.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/011-expect.pcap new file mode 100644 index 00000000..a691fee9 Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/011-expect.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/011-send.pcap b/autotest/units/001_one_port/029_acl_dregress_decap/011-send.pcap new file mode 100644 index 00000000..ff060edb Binary files /dev/null and b/autotest/units/001_one_port/029_acl_dregress_decap/011-send.pcap differ diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/autotest.yaml b/autotest/units/001_one_port/029_acl_dregress_decap/autotest.yaml new file mode 100644 index 00000000..10c3abc8 --- /dev/null +++ b/autotest/units/001_one_port/029_acl_dregress_decap/autotest.yaml @@ -0,0 +1,59 @@ +steps: +- ipv4Update: "0.0.0.0/0 -> 200.0.0.1" +- ipv4LabelledUpdate: + - "6.7.8.0/32 -> 200.0.0.1:110" + - "6.7.8.1/32 -> 200.0.0.1:111" + - "6.7.8.2/32 -> 200.0.0.1:112" + - "6.7.8.3/32 -> 200.0.0.1:113" + - "6.7.8.6/32 -> 200.0.0.1:114" + - "7.0.0.0/24 -> 200.0.0.1:115" + - "200.0.0.0/8 -> 9.9.9.9:222" + - "9.9.9.9/32 -> 200.0.0.1:999" +- ipv6Update: "::/0 -> fe80::1" +- ipv6LabelledUpdate: + - "cccc::/16 -> caca::123|210" + - "dddd::/16 -> fe80::1|211" +- sendPackets: + - port: kni0 + send: 001-send.pcap + expect: 001-expect.pcap +- sendPackets: + - port: kni0 + send: 002-send.pcap + expect: 002-expect.pcap +- sendPackets: + - port: kni0 + send: 003-send.pcap + expect: 003-expect.pcap +- sendPackets: + - port: kni0 + send: 004-send.pcap + expect: 004-expect.pcap +- sendPackets: + - port: kni0 + send: 005-send.pcap + expect: 005-expect.pcap +- sendPackets: + - port: kni0 + send: 006-send.pcap + expect: 006-expect.pcap +- sendPackets: + - port: kni0 + send: 007-send.pcap + expect: 007-expect.pcap +- sendPackets: + - port: kni0 + send: 008-send.pcap + expect: 008-expect.pcap +- sendPackets: + - port: kni0 + send: 009-send.pcap + expect: 009-expect.pcap +- sendPackets: + - port: kni0 + send: 010-send.pcap + expect: 010-expect.pcap +- sendPackets: + - port: kni0 + send: 011-send.pcap + expect: 011-expect.pcap diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/controlplane.conf b/autotest/units/001_one_port/029_acl_dregress_decap/controlplane.conf new file mode 100644 index 00000000..e4cfc7b6 --- /dev/null +++ b/autotest/units/001_one_port/029_acl_dregress_decap/controlplane.conf @@ -0,0 +1,71 @@ +{ + "modules": { + "lp0.100": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "100", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "lp0.200": { + "type": "logicalPort", + "physicalPort": "kni0", + "vlanId": "200", + "macAddress": "00:11:22:33:44:55", + "nextModule": "acl0" + }, + "acl0": { + "type": "acl", + "nextModules": [ + "dregress0", + "decap0", + "vrf0" + ] + }, + "dregress0": { + "type": "dregress", + "ipv6SourcePrefixes": [ + "abba::1/128", + "daad::0/127" + ], + "ipv6DestinationPrefix": "1234::abcd/128", + "ipv4SourceAddress": "10.50.0.1", + "ipv6SourceAddress": "2222:9876:0:1234:aeae:0101:fefe:ca11", + "udpDestinationPort": 6635, + "communities": { + "123:101": "A101", + "123:102": "A102", + "123:103": "A103" + }, + "localPrefixes": [ + "7.0.0.2/31", + "cccc::/128" + ], + "nextModule": "vrf0" + }, + "decap0": { + "type": "decap", + "ipv6DestinationPrefixes": [ + "1234::abcd/128" + ], + "nextModule": "vrf0" + }, + "vrf0": { + "type": "route", + "interfaces": { + "kni0.100": { + "ipv6Prefix": "fe80::2/64", + "neighborIPv6Address": "fe80::1", + "neighborMacAddress": "00:00:00:00:00:01", + "nextModule": "lp0.100" + }, + "kni0.200": { + "ipv4Prefix": "200.0.0.2/24", + "neighborIPv4Address": "200.0.0.1", + "neighborMacAddress": "00:00:00:00:00:02", + "nextModule": "lp0.200" + } + } + } + } +} diff --git a/autotest/units/001_one_port/029_acl_dregress_decap/gen.py b/autotest/units/001_one_port/029_acl_dregress_decap/gen.py new file mode 100755 index 00000000..6c226f19 --- /dev/null +++ b/autotest/units/001_one_port/029_acl_dregress_decap/gen.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from scapy.all import * +from scapy.contrib.mpls import MPLS + + +def write_pcap(filename, *packetsList): + if len(packetsList) == 0: + PcapWriter(filename)._write_header(Ether()) + return + + PcapWriter(filename) + + for packets in packetsList: + if type(packets) == list: + for packet in packets: + packet.time = 0 + wrpcap(filename, [p for p in packet], append=True) + else: + packets.time = 0 + wrpcap(filename, [p for p in packets], append=True) + + +write_pcap("001-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:01")/Dot1Q(vlan=100)/IPv6(dst="1234::abcd", src="2000::", fl=0x12345, hlim=64)/IP(dst="90.90.90.0/30", src="5.5.5.0/30", ttl=64)/TCP(dport=80, sport=2048)) + +write_pcap("001-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="90.90.90.0/30", src="5.5.5.0/30", ttl=63)/TCP(dport=80, sport=2048)) + + +write_pcap("002-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.0/30", src="5.5.5.55", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="daad::0", fl=0x12345, hlim=64)/IP(dst="6.7.8.0", src="5.5.5.80", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="daad::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.0", src="5.5.5.81", ttl=64)/TCP(dport=80, sport=2048)) + +write_pcap("002-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0xbe62 | 0xc000, chksum=0)/MPLS(label=110, ttl=255)/IP(dst="6.7.8.0", src="5.5.5.55", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0x682a | 0xc000, chksum=0)/MPLS(label=111, ttl=255)/IP(dst="6.7.8.1", src="5.5.5.55", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0x6403 | 0xc000, chksum=0)/MPLS(label=112, ttl=255)/IP(dst="6.7.8.2", src="5.5.5.55", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0xb24b | 0xc000, chksum=0)/MPLS(label=113, ttl=255)/IP(dst="6.7.8.3", src="5.5.5.55", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0x58d3 | 0xc000, chksum=0)/MPLS(label=110, ttl=255)/IP(dst="6.7.8.0", src="5.5.5.80", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0x60b6 | 0xc000, chksum=0)/MPLS(label=110, ttl=255)/IP(dst="6.7.8.0", src="5.5.5.81", ttl=64)/TCP(dport=80, sport=2048)) + + +TCP_SYNACK = TCP(sport=8800, dport=555, flags='SA', seq=3535) +TCP_ACK1_1 = TCP(sport=8800, dport=555, flags='A', seq=TCP_SYNACK.seq + 1, options=[("NOP", None), (253, "\x79\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")])/"luchshe prosto pozvonit'" +TCP_ACK2_1 = TCP(sport=8800, dport=555, flags='A', seq=TCP_ACK1_1.seq + 24, options=[("NOP", None), (253, "\x79\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09")])/"chem u kogo-to zanimat'" +TCP_ACK1_2 = TCP(sport=8800, dport=555, flags='A', seq=TCP_SYNACK.seq + 1, options=[("Timestamp", (0, 0)), (253, "\x79\x61\x00\x00\x00\x00\x09\x00\x00\x00\x00\x09")])/"luchshe prosto pozvonit'" +TCP_ACK2_2 = TCP(sport=8800, dport=555, flags='A', seq=TCP_ACK1_2.seq + 24, options=[("NOP", None), ("NOP", None), (253, "\x79\x61\x00\x00\x00\x00\x09\x09\x00\x00\x09\x09")])/"chem u kogo-to zanimat'" + +write_pcap("003-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.6", src="5.5.5.66", ttl=64)/TCP_SYNACK, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.6", src="5.5.5.66", ttl=64)/TCP_ACK1_1, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.6", src="5.5.5.66", ttl=64)/TCP_ACK2_1, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.6", src="5.5.5.66", ttl=64)/TCP_ACK1_2, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.6", src="5.5.5.66", ttl=64)/TCP_ACK2_2) + +write_pcap("003-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0x974e | 0xc000, chksum=0)/MPLS(label=114, ttl=255)/IP(dst="6.7.8.6", src="5.5.5.66", ttl=64)/TCP_SYNACK, + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0x974e | 0xc000, chksum=0)/MPLS(label=114, ttl=255)/IP(dst="6.7.8.6", src="5.5.5.66", ttl=64)/TCP_ACK1_1, + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0x974e | 0xc000, chksum=0)/MPLS(label=114, ttl=254)/IP(dst="6.7.8.6", src="5.5.5.66", ttl=64)/TCP_ACK2_1, + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0x974e | 0xc000, chksum=0)/MPLS(label=114, ttl=253)/IP(dst="6.7.8.6", src="5.5.5.66", ttl=64)/TCP_ACK1_2, + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0x974e | 0xc000, chksum=0)/MPLS(label=114, ttl=252)/IP(dst="6.7.8.6", src="5.5.5.66", ttl=64)/TCP_ACK2_2) + + +write_pcap("004-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_SYNACK, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_ACK1_1, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_ACK2_1, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_SYNACK, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_ACK1_1, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_ACK2_1) + +write_pcap("004-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0xaf2b | 0xc000, chksum=0)/MPLS(label=114, ttl=255)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_SYNACK, + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0xaf2b | 0xc000, chksum=0)/MPLS(label=114, ttl=255)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_ACK1_1, + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0xaf2b | 0xc000, chksum=0)/MPLS(label=114, ttl=254)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_ACK2_1, + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0xaf2b | 0xc000, chksum=0)/MPLS(label=114, ttl=255)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_SYNACK, + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0xaf2b | 0xc000, chksum=0)/MPLS(label=114, ttl=255)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_ACK1_1, + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0xaf2b | 0xc000, chksum=0)/MPLS(label=114, ttl=254)/IP(dst="6.7.8.6", src="5.5.5.67", ttl=64)/TCP_ACK2_1) + + +write_pcap("005-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="7.0.0.1", src="5.5.5.55", ttl=64)/TCP(dport=80, sport=2048)) + +write_pcap("005-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/IP(dst="200.0.0.1", src="10.50.0.1", ttl=64)/UDP(dport=6635, sport=0x0b40 | 0xc000, chksum=0)/MPLS(label=115, ttl=255)/IP(dst="7.0.0.1", src="5.5.5.55", ttl=64)/TCP(dport=80, sport=2048)) + + +write_pcap("006-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IP(dst="7.0.0.2/31", src="5.5.5.55", ttl=64)/TCP(dport=80, sport=2048)) + +write_pcap("006-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/MPLS(label=115, ttl=255)/IP(dst="7.0.0.2/31", src="5.5.5.55", ttl=63)/TCP(dport=80, sport=2048)) + + +write_pcap("007-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="daad::2", fl=0x12345, hlim=64)/IP(dst="6.7.8.0", src="5.5.5.82", ttl=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="daad::3", fl=0x12345, hlim=64)/IP(dst="6.7.8.0", src="5.5.5.83", ttl=64)/TCP(dport=80, sport=2048)) + +write_pcap("007-expect.pcap", + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/MPLS(label=110, ttl=255)/IP(dst="6.7.8.0", src="5.5.5.82", ttl=63)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:02", src="00:11:22:33:44:55")/Dot1Q(vlan=200)/MPLS(label=110, ttl=255)/IP(dst="6.7.8.0", src="5.5.5.83", ttl=63)/TCP(dport=80, sport=2048)) + + +write_pcap("008-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="b0b0::1", src="cafe::1", hlim=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::", src="cafe::2", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("008-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="b0b0::1", src="cafe::1", hlim=63)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="cccc::", src="cafe::2", hlim=63)/TCP(dport=80, sport=2048)) + + +write_pcap("009-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::1", src="cafe::2", hlim=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="daad::0", fl=0x12345, hlim=64)/IPv6(dst="cccc::100", src="cafe::3", hlim=64)/TCP(dport=80, sport=2048), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="daad::1", fl=0x12345, hlim=64)/IPv6(dst="dddd::200", src="cafe::4", hlim=64)/TCP(dport=80, sport=2048)) + +write_pcap("009-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0xa0b8 | 0xc000, chksum=0)/MPLS(label=210, ttl=255)/IPv6(dst="cccc::1", src="cafe::2", hlim=64)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0xc6c8 | 0xc000, chksum=0)/MPLS(label=210, ttl=255)/IPv6(dst="cccc::100", src="cafe::3", hlim=64)/TCP(dport=80, sport=2048), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="fe80::1", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0x3b9f | 0xc000, chksum=0)/MPLS(label=211, ttl=255)/IPv6(dst="dddd::200", src="cafe::4", hlim=64)/TCP(dport=80, sport=2048)) + + +write_pcap("010-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::6", src="cafe::2", hlim=64)/TCP_SYNACK, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::6", src="cafe::2", hlim=64)/TCP_ACK1_1, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::6", src="cafe::2", hlim=64)/TCP_ACK2_1, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::6", src="cafe::2", hlim=64)/TCP_ACK1_2, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::6", src="cafe::2", hlim=64)/TCP_ACK2_2) + +write_pcap("010-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0xd4e4 | 0xc000, chksum=0)/MPLS(label=210, ttl=255)/IPv6(dst="cccc::6", src="cafe::2", hlim=64)/TCP_SYNACK, + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0xd4e4 | 0xc000, chksum=0)/MPLS(label=210, ttl=255)/IPv6(dst="cccc::6", src="cafe::2", hlim=64)/TCP_ACK1_1, + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0xd4e4 | 0xc000, chksum=0)/MPLS(label=210, ttl=254)/IPv6(dst="cccc::6", src="cafe::2", hlim=64)/TCP_ACK2_1, + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0xd4e4 | 0xc000, chksum=0)/MPLS(label=210, ttl=253)/IPv6(dst="cccc::6", src="cafe::2", hlim=64)/TCP_ACK1_2, + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0xd4e4 | 0xc000, chksum=0)/MPLS(label=210, ttl=252)/IPv6(dst="cccc::6", src="cafe::2", hlim=64)/TCP_ACK2_2) + + +write_pcap("011-send.pcap", + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_SYNACK, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_ACK1_1, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_ACK2_1, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_SYNACK, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_ACK1_1, + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="1234::abcd", src="abba::1", fl=0x12345, hlim=64)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_ACK2_1) + +write_pcap("011-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0x6daa | 0xc000, chksum=0)/MPLS(label=210, ttl=255)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_SYNACK, + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0x6daa | 0xc000, chksum=0)/MPLS(label=210, ttl=255)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_ACK1_1, + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0x6daa | 0xc000, chksum=0)/MPLS(label=210, ttl=254)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_ACK2_1, + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0x6daa | 0xc000, chksum=0)/MPLS(label=210, ttl=255)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_SYNACK, + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0x6daa | 0xc000, chksum=0)/MPLS(label=210, ttl=255)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_ACK1_1, + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="caca::123", src="2222:9876:0:1234:aeae:0101:fefe:ca11", hlim=64)/UDP(dport=6635, sport=0x6daa | 0xc000, chksum=0)/MPLS(label=210, ttl=254)/IPv6(dst="cccc::6", src="cafe::4", hlim=64)/TCP_ACK2_1) + +# @todo: ipv6 ext diff --git a/autotest/units/001_one_port/066_route_bw_zero/controlplane.conf b/autotest/units/001_one_port/066_route_bw_zero/controlplane.conf index ed597df7..1a0b8196 100644 --- a/autotest/units/001_one_port/066_route_bw_zero/controlplane.conf +++ b/autotest/units/001_one_port/066_route_bw_zero/controlplane.conf @@ -23,7 +23,7 @@ "route0": { "type": "route", "ipv4SourceAddress": "10.50.0.1", - "ipv6SourceAddress": "2a02:6b8:0:2e06:ae1f:6bff:feb0:7b20", + "ipv6SourceAddress": "2222:1111:0:1234:5678:0101:ca11:ca11", "udpDestinationPort": 6635, "interfaces": { "kni0.100": {