diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/001-expect.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/001-expect.pcap new file mode 100644 index 00000000..853012a9 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/001-expect.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/001-send.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/001-send.pcap new file mode 100644 index 00000000..b4d96c14 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/001-send.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/002-expect.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/002-expect.pcap new file mode 100644 index 00000000..5546a68b Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/002-expect.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/002-send.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/002-send.pcap new file mode 100644 index 00000000..9849de84 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/002-send.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/003-expect.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/003-expect.pcap new file mode 100644 index 00000000..c16b13a7 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/003-expect.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/003-send.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/003-send.pcap new file mode 100644 index 00000000..694f4092 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/003-send.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/004-expect.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/004-expect.pcap new file mode 100644 index 00000000..99438afc Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/004-expect.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/004-send.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/004-send.pcap new file mode 100644 index 00000000..ef652875 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/004-send.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/005-expect.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/005-expect.pcap new file mode 100644 index 00000000..a9d32fef Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/005-expect.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/005-send.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/005-send.pcap new file mode 100644 index 00000000..af689e21 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/005-send.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/006-expect.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/006-expect.pcap new file mode 100644 index 00000000..c994457a Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/006-expect.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/006-send.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/006-send.pcap new file mode 100644 index 00000000..357edf65 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/006-send.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/007-expect.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/007-expect.pcap new file mode 100644 index 00000000..b204644c Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/007-expect.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/007-send.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/007-send.pcap new file mode 100644 index 00000000..f9b596a9 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/007-send.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/008-expect.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/008-expect.pcap new file mode 100644 index 00000000..6609e14b Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/008-expect.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/008-send.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/008-send.pcap new file mode 100644 index 00000000..a281654a Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/008-send.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/009-expect.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/009-expect.pcap new file mode 100644 index 00000000..a93d2931 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/009-expect.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/009-send.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/009-send.pcap new file mode 100644 index 00000000..3a4514b8 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/009-send.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/010-expect.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/010-expect.pcap new file mode 100644 index 00000000..db71c08d Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/010-expect.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/010-send.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/010-send.pcap new file mode 100644 index 00000000..a9158132 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/010-send.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/011-expect.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/011-expect.pcap new file mode 100644 index 00000000..f8550893 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/011-expect.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/011-send.pcap b/autotest/units/001_one_port/068_balancer_outer_source_network/011-send.pcap new file mode 100644 index 00000000..94e44907 Binary files /dev/null and b/autotest/units/001_one_port/068_balancer_outer_source_network/011-send.pcap differ diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/autotest.yaml b/autotest/units/001_one_port/068_balancer_outer_source_network/autotest.yaml new file mode 100644 index 00000000..1ffee98a --- /dev/null +++ b/autotest/units/001_one_port/068_balancer_outer_source_network/autotest.yaml @@ -0,0 +1,62 @@ +steps: +- ipv4Update: + - "0.0.0.0/0 -> 200.0.0.1" + - "100.0.0.0/8 -> 100.0.0.5" +- ipv6Update: "::/0 -> fe80::1" +- cli: + - balancer real enable balancer0 10.0.0.1 tcp 80 2000::1 80 + - balancer real enable balancer0 10.0.0.42 tcp 80 100.0.0.42 80 + - balancer real enable balancer0 2001:dead:beef::1 tcp 80 2000::1 80 + - balancer real enable balancer0 2001:dead:beef::2 tcp 80 100.0.0.6 80 + - balancer real enable balancer0 2002:dead:beef::3 tcp 80 2000::2 80 + - balancer real enable balancer0 2003:dead:beef::3 tcp 80 2000::2 80 + - balancer real enable balancer0 2004:dead:beef::3 tcp 80 2000::2 80 + - balancer real enable balancer0 2005:dead:beef::3 tcp 80 2000::2 80 + - balancer real enable balancer0 2006:dead:beef::3 tcp 80 2000::2 80 + - balancer real enable balancer0 2007:dead:beef::3 tcp 80 2000::2 80 + - balancer real enable balancer0 2008:dead:beef::3 tcp 80 2000::2 80 + - balancer real flush +- 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/068_balancer_outer_source_network/controlplane.conf b/autotest/units/001_one_port/068_balancer_outer_source_network/controlplane.conf new file mode 100644 index 00000000..5fef64d1 --- /dev/null +++ b/autotest/units/001_one_port/068_balancer_outer_source_network/controlplane.conf @@ -0,0 +1,48 @@ +{ + "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": [ + "balancer0", + "route0" + ] + }, + "balancer0": { + "type": "balancer", + "source": "2000:51b::1", + "source_ipv4": "100.0.0.22", + "services": "services.conf", + "nextModule": "route0" + }, + "route0": { + "type": "route", + "interfaces": { + "kni0.100": { + "neighborIPv6Address": "fe80::1", + "neighborIPv4Address": "100.0.0.5", + "neighborMacAddress": "00:00:00:00:00:01", + "nextModule": "lp0.100" + }, + "kni0.200": { + "neighborIPv4Address": "200.0.0.1", + "neighborMacAddress": "00:00:00:00:00:02", + "nextModule": "lp0.200" + } + } + } + } +} diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/gen.py b/autotest/units/001_one_port/068_balancer_outer_source_network/gen.py new file mode 100755 index 00000000..c8ade134 --- /dev/null +++ b/autotest/units/001_one_port/068_balancer_outer_source_network/gen.py @@ -0,0 +1,134 @@ +#!/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:02") / Dot1Q(vlan=200) / IP(dst="10.0.0.1", src="1.1.0.1", ttl=64) / TCP(dport=80, sport=12380), + 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="1.1.0.2", ttl=64) / TCP(dport=80, sport=12380) +) + +write_pcap("001-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2001:dead:beef::0101:0001:0:1", hlim=63)/IP(dst="10.0.0.1", src="1.1.0.1", ttl=64)/TCP(dport=80, sport=12380), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IPv6(dst="2000::1", src="2001:dead:beef::0101:0002:0:1", hlim=63)/IP(dst="10.0.0.1", src="1.1.0.2", ttl=64)/TCP(dport=80, sport=12380) +) + + +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.42", src="1.1.0.1", ttl=64)/TCP(dport=80, sport=12380), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IP(dst="10.0.0.42", src="1.1.0.2", ttl=64)/TCP(dport=80, sport=12380) +) + +write_pcap("002-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IP(dst="100.0.0.42", src="123.0.0.12", ttl=63)/IP(dst="10.0.0.42", src="1.1.0.1", ttl=64)/TCP(dport=80, sport=12380), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IP(dst="100.0.0.42", src="123.0.0.12", ttl=63)/IP(dst="10.0.0.42", src="1.1.0.2", ttl=64)/TCP(dport=80, sport=12380) +) + +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="2001:dead:beef::1", src="2002::1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02") / Dot1Q(vlan=200) / IPv6(dst="2001:dead:beef::1", src="2002::2", hlim=64) / TCP(dport=80, sport=12443) +) + +write_pcap("003-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55") / Dot1Q(vlan=100) / IPv6(dst="2000::1", src="2001:dead:beef:1234::1:1", hlim=63) / IPv6(dst="2001:dead:beef::1", src="2002::1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55") / Dot1Q(vlan=100) / IPv6(dst="2000::1", src="2001:dead:beef:1234::2:1", hlim=63) / IPv6(dst="2001:dead:beef::1", src="2002::2", hlim=64) / TCP(dport=80, sport=12443) +) + + +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="2001:dead:beef::2", src="2002::10", hlim=64)/TCP(dport=80, sport=12380), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02")/Dot1Q(vlan=200)/IPv6(dst="2001:dead:beef::2", src="2002::11", hlim=64)/TCP(dport=80, sport=12380) +) + +write_pcap("004-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IP(dst="100.0.0.6", src="123.0.12.0", ttl=63) /IPv6(dst="2001:dead:beef::2", src="2002::10", hlim=64)/TCP(dport=80, sport=12380), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55")/Dot1Q(vlan=100)/IP(dst="100.0.0.6", src="123.0.12.0", ttl=63) /IPv6(dst="2001:dead:beef::2", src="2002::11", hlim=64)/TCP(dport=80, sport=12380) +) + +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="2002:dead:beef::3", src="2002::1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02") / Dot1Q(vlan=200) / IPv6(dst="2002:dead:beef::3", src="2002::2", hlim=64) / TCP(dport=80, sport=12443) +) + +write_pcap("005-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55") / Dot1Q(vlan=100) / IPv6(dst="2000::2", src="2001:dead:beef:1234:5600:0000:0100:0001", hlim=63) / IPv6(dst="2002:dead:beef::3", src="2002::1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55") / Dot1Q(vlan=100) / IPv6(dst="2000::2", src="2001:dead:beef:1234:5600:0000:0200:0001", hlim=63) / IPv6(dst="2002:dead:beef::3", src="2002::2", hlim=64) / TCP(dport=80, sport=12443) +) + +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="2003:dead:beef::3", src="2002::1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02") / Dot1Q(vlan=200) / IPv6(dst="2003:dead:beef::3", src="2002::2", hlim=64) / TCP(dport=80, sport=12443) +) + +write_pcap("006-expect.pcap", + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55") / Dot1Q(vlan=100) / IPv6(dst="2000::2", src="2001:dead:beef:1234:5600::", hlim=63) / IPv6(dst="2003:dead:beef::3", src="2002::1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55") / Dot1Q(vlan=100) / IPv6(dst="2000::2", src="2001:dead:beef:1234:5600::", hlim=63) / IPv6(dst="2003:dead:beef::3", src="2002::2", hlim=64) / TCP(dport=80, sport=12443) +) + +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="2004:dead:beef::3", src="2002::1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02") / Dot1Q(vlan=200) / IPv6(dst="2004:dead:beef::3", src="2002::2", hlim=64) / TCP(dport=80, sport=12443) +) + +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="2000::2", src="2001:dead:beef:1234:5600::", hlim=63) / IPv6(dst="2004:dead:beef::3", src="2002::1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55") / Dot1Q(vlan=100) / IPv6(dst="2000::2", src="2001:dead:beef:1234:5600::", hlim=63) / IPv6(dst="2004:dead:beef::3", src="2002::2", hlim=64) / TCP(dport=80, sport=12443) +) + +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="2005:dead:beef::3", src="2002::1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02") / Dot1Q(vlan=200) / IPv6(dst="2005:dead:beef::3", src="2002::2", hlim=64) / TCP(dport=80, sport=12443) +) + +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="2000::2", src="2001:dead:beef:1234:5600::", hlim=63) / IPv6(dst="2005:dead:beef::3", src="2002::1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55") / Dot1Q(vlan=100) / IPv6(dst="2000::2", src="2001:dead:beef:1234:5600::", hlim=63) / IPv6(dst="2005:dead:beef::3", src="2002::2", hlim=64) / TCP(dport=80, sport=12443) +) + +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="2006:dead:beef::3", src="2002::1234:0:0:1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02") / Dot1Q(vlan=200) / IPv6(dst="2006:dead:beef::3", src="2002::1234:0:0:2", hlim=64) / TCP(dport=80, sport=12443) +) + +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="2000::2", src="2001:dead:beef:1234:5600::0012:3400", hlim=63) / IPv6(dst="2006:dead:beef::3", src="2002::1234:0:0:1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55") / Dot1Q(vlan=100) / IPv6(dst="2000::2", src="2001:dead:beef:1234:5600::0012:3400", hlim=63) / IPv6(dst="2006:dead:beef::3", src="2002::1234:0:0:2", hlim=64) / TCP(dport=80, sport=12443) +) + +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="2007:dead:beef::3", src="2002::1234:0:0:1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02") / Dot1Q(vlan=200) / IPv6(dst="2007:dead:beef::3", src="2002::1234:0:0:2", hlim=64) / TCP(dport=80, sport=12443) +) + +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="2000::2", src="2001:dead:beef:1234:5600::1234:0001", hlim=63) / IPv6(dst="2007:dead:beef::3", src="2002::1234:0:0:1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55") / Dot1Q(vlan=100) / IPv6(dst="2000::2", src="2001:dead:beef:1234:5600::1234:0002", hlim=63) / IPv6(dst="2007:dead:beef::3", src="2002::1234:0:0:2", hlim=64) / TCP(dport=80, sport=12443) +) + +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="2008:dead:beef::3", src="2002::1234:0:0:1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:11:22:33:44:55", src="00:00:00:00:00:02") / Dot1Q(vlan=200) / IPv6(dst="2008:dead:beef::3", src="2002::1234:0:0:2", hlim=64) / TCP(dport=80, sport=12443) +) + +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="2000::2", src="2001:dead:beef:1234:5600:1234:1:1", hlim=63) / IPv6(dst="2008:dead:beef::3", src="2002::1234:0:0:1", hlim=64) / TCP(dport=80, sport=12443), + Ether(dst="00:00:00:00:00:01", src="00:11:22:33:44:55") / Dot1Q(vlan=100) / IPv6(dst="2000::2", src="2001:dead:beef:1234:5600:1234:2:1", hlim=63) / IPv6(dst="2008:dead:beef::3", src="2002::1234:0:0:2", hlim=64) / TCP(dport=80, sport=12443) +) diff --git a/autotest/units/001_one_port/068_balancer_outer_source_network/services.conf b/autotest/units/001_one_port/068_balancer_outer_source_network/services.conf new file mode 100644 index 00000000..67e55326 --- /dev/null +++ b/autotest/units/001_one_port/068_balancer_outer_source_network/services.conf @@ -0,0 +1,156 @@ +[ + { + "vip": "10.0.0.1", + "proto": "tcp", + "vport": "80", + "scheduler": "wrr", + "ipv4_outer_source_network": "123.0.0.12/32", + "ipv6_outer_source_network": "2001:dead:beef::/64", + "reals": [ + { + "ip": "2000::1", + "port": "80" + } + ] + }, + { + "vip": "10.0.0.42", + "proto": "tcp", + "vport": "80", + "scheduler": "wrr", + "ipv4_outer_source_network": "123.0.0.12/32", + "ipv6_outer_source_network": "2001:dead:beef::/64", + "reals": [ + { + "ip": "100.0.0.42", + "port": "80" + } + ] + }, + { + "vip": "2001:dead:beef::1", + "proto": "tcp", + "vport": "80", + "scheduler": "wrr", + "ipv4_outer_source_network": "123.0.12.0/24", + "ipv6_outer_source_network": "2001:dead:beef:1234::/80", + "reals": [ + { + "ip": "2000::1", + "port": "80" + } + ] + }, + { + "vip": "2001:dead:beef::2", + "proto": "tcp", + "vport": "80", + "scheduler": "wrr", + "ipv4_outer_source_network": "123.0.12.0/24", + "ipv6_outer_source_network": "2001:dead:beef:1234::/80", + "reals": [ + { + "ip": "100.0.0.6", + "port": "80" + } + ] + }, + { + "vip": "2002:dead:beef::3", + "proto": "tcp", + "vport": "80", + "scheduler": "wrr", + "ipv4_outer_source_network": "123.0.12.0/24", + "ipv6_outer_source_network": "2001:dead:beef:1234:5600::/66", + "reals": [ + { + "ip": "2000::2", + "port": "80" + } + ] + }, + { + "vip": "2003:dead:beef::3", + "proto": "tcp", + "vport": "80", + "scheduler": "wrr", + "ipv4_outer_source_network": "123.0.12.0/24", + "ipv6_outer_source_network": "2001:dead:beef:1234:5600::/128", + "reals": [ + { + "ip": "2000::2", + "port": "80" + } + ] + }, + { + "vip": "2004:dead:beef::3", + "proto": "tcp", + "vport": "80", + "scheduler": "wrr", + "ipv4_outer_source_network": "123.0.12.0/24", + "ipv6_outer_source_network": "2001:dead:beef:1234:5600::/126", + "reals": [ + { + "ip": "2000::2", + "port": "80" + } + ] + }, + { + "vip": "2005:dead:beef::3", + "proto": "tcp", + "vport": "80", + "scheduler": "wrr", + "ipv4_outer_source_network": "123.0.12.0/24", + "ipv6_outer_source_network": "2001:dead:beef:1234:5600::/119", + "reals": [ + { + "ip": "2000::2", + "port": "80" + } + ] + }, + { + "vip": "2006:dead:beef::3", + "proto": "tcp", + "vport": "80", + "scheduler": "wrr", + "ipv4_outer_source_network": "123.0.12.0/24", + "ipv6_outer_source_network": "2001:dead:beef:1234:5600::/103", + "reals": [ + { + "ip": "2000::2", + "port": "80" + } + ] + }, + { + "vip": "2007:dead:beef::3", + "proto": "tcp", + "vport": "80", + "scheduler": "wrr", + "ipv4_outer_source_network": "123.0.12.0/24", + "ipv6_outer_source_network": "2001:dead:beef:1234:5600::/95", + "reals": [ + { + "ip": "2000::2", + "port": "80" + } + ] + }, + { + "vip": "2008:dead:beef::3", + "proto": "tcp", + "vport": "80", + "scheduler": "wrr", + "ipv4_outer_source_network": "123.0.12.0/24", + "ipv6_outer_source_network": "2001:dead:beef:1234:5600::/77", + "reals": [ + { + "ip": "2000::2", + "port": "80" + } + ] + } +] diff --git a/common/controlplaneconfig.h b/common/controlplaneconfig.h index be59c45b..3e526762 100644 --- a/common/controlplaneconfig.h +++ b/common/controlplaneconfig.h @@ -310,6 +310,8 @@ using service_t = std::tuple, ///< ipv4_outer_source_network + std::optional, ///< ipv6_outer_source_network std::vector>; class config_t diff --git a/common/idp.h b/common/idp.h index a2f52c3d..569085ca 100644 --- a/common/idp.h +++ b/common/idp.h @@ -265,7 +265,9 @@ using service = std::tuple; ///< real_size + uint32_t, ///< real_size + std::optional, ///< ipv4_outer_source_network + std::optional>; ///< ipv6_outer_source_network> using real = std::tuple; diff --git a/controlplane/balancer.cpp b/controlplane/balancer.cpp index ec5d8ec7..577bab36 100644 --- a/controlplane/balancer.cpp +++ b/controlplane/balancer.cpp @@ -216,7 +216,18 @@ void balancer_t::reload(const controlplane::base_t& base_prev, for (const auto& [module_name, balancer] : base_prev.balancers) { - for (const auto& [service_id, virtual_ip, proto, virtual_port, version, scheduler, scheduler_params, forwarding_method, flags, reals] : balancer.services) + for (const auto& [service_id, + virtual_ip, + proto, + virtual_port, + version, + scheduler, + scheduler_params, + forwarding_method, + flags, + ipv4_outer_source_network, + ipv6_outer_source_network, + reals] : balancer.services) { (void)service_id; (void)version; @@ -225,6 +236,8 @@ void balancer_t::reload(const controlplane::base_t& base_prev, (void)reals; (void)flags; (void)forwarding_method; + (void)ipv4_outer_source_network; + (void)ipv6_outer_source_network; service_counters.remove({module_name, {virtual_ip, proto, virtual_port}}); @@ -248,7 +261,18 @@ void balancer_t::reload(const controlplane::base_t& base_prev, { std::unordered_set> vip_vport_proto; - for (const auto& [service_id, virtual_ip, proto, virtual_port, version, scheduler, scheduler_params, forwarding_method, flags, reals] : balancer.services) + for (const auto& [service_id, + virtual_ip, + proto, + virtual_port, + version, + scheduler, + scheduler_params, + forwarding_method, + flags, + ipv4_outer_source_network, + ipv6_outer_source_network, + reals] : balancer.services) { (void)service_id; (void)version; @@ -256,6 +280,8 @@ void balancer_t::reload(const controlplane::base_t& base_prev, (void)scheduler_params; (void)flags; (void)forwarding_method; + (void)ipv4_outer_source_network; + (void)ipv6_outer_source_network; service_counters.insert({module_name, {virtual_ip, proto, virtual_port}}); @@ -592,11 +618,24 @@ void balancer_t::update_service(const balancer::generation_config_t& generation_ uint64_t services_reals_enabled_count = 0; uint64_t services_reals_count = 0; - for (const auto& [service_id, virtual_ip, proto, virtual_port, version, scheduler, scheduler_params, forwarding_method, flags, reals] : balancer.services) + for (const auto& [service_id, + virtual_ip, + proto, + virtual_port, + version, + scheduler, + scheduler_params, + forwarding_method, + flags, + ipv4_outer_source_network, + ipv6_outer_source_network, + reals] : balancer.services) { (void)flags; (void)scheduler_params; (void)forwarding_method; + (void)ipv4_outer_source_network; + (void)ipv6_outer_source_network; if (service_id >= YANET_CONFIG_BALANCER_SERVICES_SIZE) { @@ -676,7 +715,18 @@ void balancer_t::compile(common::idp::updateGlobalBase::request& globalbase, for (const auto& [module_name, balancer] : generation_config.config_balancers) { - for (const auto& [service_id, virtual_ip, proto, virtual_port, version, scheduler, scheduler_params, forwarding_method, flags, reals] : balancer.services) + for (const auto& [service_id, + virtual_ip, + proto, + virtual_port, + version, + scheduler, + scheduler_params, + forwarding_method, + flags, + ipv4_outer_source_network, + ipv6_outer_source_network, + reals] : balancer.services) { (void)scheduler_params; (void)version; @@ -725,9 +775,12 @@ void balancer_t::compile(common::idp::updateGlobalBase::request& globalbase, counter_ids[0], scheduler, forwarding_method, - balancer.default_wlc_power, //todo use scheduler_params.wlc_power when other services will be able to set it + balancer.default_wlc_power, // todo use scheduler_params.wlc_power when other services will be able to set it (uint32_t)real_start, - (uint32_t)(req_reals.size() - real_start)}); + (uint32_t)(req_reals.size() - real_start), + ipv4_outer_source_network, + ipv6_outer_source_network, + }); } } @@ -745,13 +798,26 @@ void balancer_t::flush_reals(common::idp::updateGlobalBaseBalancer::request& bal for (const auto& [module_name, balancer] : generation_config.config_balancers) { - for (const auto& [service_id, virtual_ip, proto, virtual_port, version, scheduler, scheduler_params, forwarding_method, flags, reals] : balancer.services) + for (const auto& [service_id, + virtual_ip, + proto, + virtual_port, + version, + scheduler, + scheduler_params, + forwarding_method, + flags, + ipv4_outer_source_network, + ipv6_outer_source_network, + reals] : balancer.services) { (void)flags; (void)scheduler; (void)scheduler_params; (void)version; (void)forwarding_method; + (void)ipv4_outer_source_network; + (void)ipv6_outer_source_network; if (service_id >= YANET_CONFIG_BALANCER_SERVICES_SIZE) { diff --git a/controlplane/configconverter.cpp b/controlplane/configconverter.cpp index 6bfb8c9d..7a13628b 100644 --- a/controlplane/configconverter.cpp +++ b/controlplane/configconverter.cpp @@ -587,7 +587,18 @@ void config_converter_t::processBalancer() balancer.source_ipv4, balancer.flow}); - for (const auto& [service_id, vip, proto, vport, version, scheduler, scheduler_params, forwarding_method, flags, reals] : balancer.services) + for (const auto& [service_id, + vip, + proto, + vport, + version, + scheduler, + scheduler_params, + forwarding_method, + flags, + ipv4_outer_source_network, + ipv6_outer_source_network, + reals] : balancer.services) { /// @todo: (void)vip; @@ -599,6 +610,8 @@ void config_converter_t::processBalancer() (void)reals; (void)version; (void)forwarding_method; + (void)ipv4_outer_source_network; + (void)ipv6_outer_source_network; if (service_id >= YANET_CONFIG_BALANCER_SERVICES_SIZE) { @@ -1470,13 +1483,26 @@ void config_converter_t::acl_rules_balancer(controlplane::base::acl_t& acl, auto flow = convertToFlow(nextModule); auto flow_fragment = convertToFlow(nextModule, "fragment"); ///< actually drop - for (const auto& [service_id, vip, proto, vport, version, scheduler, scheduler_params, forwarding_method, flags, reals] : balancer.services) + for (const auto& [service_id, + vip, + proto, + vport, + version, + scheduler, + scheduler_params, + forwarding_method, + flags, + ipv4_outer_source_network, + ipv6_outer_source_network, + reals] : balancer.services) { (void)scheduler; (void)scheduler_params; (void)version; (void)flags; (void)forwarding_method; + (void)ipv4_outer_source_network; + (void)ipv6_outer_source_network; if (reals.empty()) { @@ -1551,7 +1577,18 @@ void config_converter_t::acl_rules_balancer_icmp_reply(controlplane::base::acl_t auto flow = convertToFlow(nextModule, "icmp_reply"); - for (const auto& [service_id, vip, proto, vport, version, scheduler, scheduler_params, forwarding_method, flags, reals] : balancer.services) + for (const auto& [service_id, + vip, + proto, + vport, + version, + scheduler, + scheduler_params, + forwarding_method, + flags, + ipv4_outer_source_network, + ipv6_outer_source_network, + reals] : balancer.services) { (void)scheduler; (void)scheduler_params; @@ -1560,6 +1597,8 @@ void config_converter_t::acl_rules_balancer_icmp_reply(controlplane::base::acl_t (void)vport; (void)version; (void)forwarding_method; + (void)ipv4_outer_source_network; + (void)ipv6_outer_source_network; if (reals.empty()) { @@ -1607,7 +1646,18 @@ void config_converter_t::acl_rules_balancer_icmp_forward(controlplane::base::acl ranges_t icmpv6_forward_types(values_t({ICMP6_DST_UNREACH, ICMP6_TIME_EXCEEDED, ICMP6_PARAM_PROB, ICMP6_PACKET_TOO_BIG})); controlplane::base::acl_rule_transport_icmpv6_t rule_icmpv6_forward(icmpv6_forward_types); - for (const auto& [service_id, vip, proto, vport, version, scheduler, scheduler_params, forwarding_method, flags, reals] : balancer.services) + for (const auto& [service_id, + vip, + proto, + vport, + version, + scheduler, + scheduler_params, + forwarding_method, + flags, + ipv4_outer_source_network, + ipv6_outer_source_network, + reals] : balancer.services) { (void)scheduler; (void)scheduler_params; @@ -1616,6 +1666,8 @@ void config_converter_t::acl_rules_balancer_icmp_forward(controlplane::base::acl (void)vport; (void)version; (void)forwarding_method; + (void)ipv4_outer_source_network; + (void)ipv6_outer_source_network; if (reals.empty()) { diff --git a/controlplane/configparser.cpp b/controlplane/configparser.cpp index 920418b1..8dbc7d79 100644 --- a/controlplane/configparser.cpp +++ b/controlplane/configparser.cpp @@ -1553,6 +1553,11 @@ void config_parser_t::loadConfig_balancer_services(controlplane::base_t& baseNex std::optional service_version = exist(service_json, "version") ? std::make_optional(service_json["version"].get()) : std::nullopt; + std::optional ipv4_outer_source_network = + exist(service_json, "ipv4_outer_source_network") ? std::make_optional(service_json["ipv4_outer_source_network"].get()) : std::nullopt; + std::optional ipv6_outer_source_network = + exist(service_json, "ipv6_outer_source_network") ? std::make_optional(service_json["ipv6_outer_source_network"].get()) : std::nullopt; + std::string scheduler_string = service_json["scheduler"]; balancer::scheduler scheduler; @@ -1653,6 +1658,8 @@ void config_parser_t::loadConfig_balancer_services(controlplane::base_t& baseNex scheduler_params, forwarding_method, flags, + ipv4_outer_source_network, + ipv6_outer_source_network, reals); baseNext.services_count++; diff --git a/dataplane/common.h b/dataplane/common.h index 2e2d28fd..50689b33 100644 --- a/dataplane/common.h +++ b/dataplane/common.h @@ -52,6 +52,9 @@ #define YANET_BALANCER_ID_INVALID (0) +#define IPv4_OUTER_SOURCE_NETWORK_FLAG ((uint8_t)(1u << 0)) +#define IPv6_OUTER_SOURCE_NETWORK_FLAG ((uint8_t)(1u << 1)) + template inline bool existValue(const TMap& map, const TValue& value) diff --git a/dataplane/globalbase.cpp b/dataplane/globalbase.cpp index af61823c..2f5278b5 100644 --- a/dataplane/globalbase.cpp +++ b/dataplane/globalbase.cpp @@ -1181,7 +1181,16 @@ eResult generation::update_balancer_services(const common::idp::updateGlobalBase } balancer_services_count = 0; - for (const auto& [balancer_service_id, flags, counter_id, scheduler, forwarding_method, default_wlc_power, real_start, real_size] : services) + for (const auto& [balancer_service_id, + flags, + counter_id, + scheduler, + forwarding_method, + default_wlc_power, + real_start, + real_size, + ipv4_outer_source_network, + ipv6_outer_source_network] : services) { if (balancer_service_id >= YANET_CONFIG_BALANCER_SERVICES_SIZE) { @@ -1203,6 +1212,23 @@ eResult generation::update_balancer_services(const common::idp::updateGlobalBase return eResult::invalidCount; } + uint8_t outer_source_network_flag = 0; + ipv4_prefix_t ipv4_prefix; + if (ipv4_outer_source_network) + { + outer_source_network_flag |= IPv4_OUTER_SOURCE_NETWORK_FLAG; + ipv4_prefix.address = ipv4_prefix.address.convert(ipv4_outer_source_network.value().address()); + ipv4_prefix.mask = ipv4_outer_source_network.value().mask(); + } + + ipv6_prefix_t ipv6_prefix; + if (ipv6_outer_source_network) + { + outer_source_network_flag |= IPv6_OUTER_SOURCE_NETWORK_FLAG; + ipv6_prefix.address = ipv6_prefix.address.convert(ipv6_outer_source_network.value().address()); + ipv6_prefix.mask = ipv6_outer_source_network.value().mask(); + } + balancer_active_services[balancer_services_count++] = balancer_service_id; auto& balancer_service = balancer_services[balancer_service_id]; @@ -1213,6 +1239,9 @@ eResult generation::update_balancer_services(const common::idp::updateGlobalBase balancer_service.scheduler = scheduler; balancer_service.wlc_power = default_wlc_power; balancer_service.forwarding_method = forwarding_method; + balancer_service.outer_source_network_flag = outer_source_network_flag; + balancer_service.ipv4_outer_source_network = ipv4_prefix; + balancer_service.ipv6_outer_source_network = ipv6_prefix; } const auto& reals = std::get<1>(request); diff --git a/dataplane/type.h b/dataplane/type.h index 376b5cb8..d2eb7930 100644 --- a/dataplane/type.h +++ b/dataplane/type.h @@ -223,6 +223,18 @@ struct ipv6_address_t }; }; +struct ipv4_prefix_t +{ + ipv4_address_t address; + uint8_t mask; +}; + +struct ipv6_prefix_t +{ + ipv6_address_t address; + uint8_t mask; +}; + struct tcp_option_t { uint8_t kind; @@ -576,6 +588,15 @@ struct balancer_service_t ::balancer::scheduler scheduler; ::balancer::forwarding_method forwarding_method; uint32_t wlc_power; + + /* + outer_source_network_flag: + zero byte stores the state for ipv4_router_source_network + first byte stores the state for ipv6_router_source_network + */ + uint8_t outer_source_network_flag; + ipv4_prefix_t ipv4_outer_source_network; + ipv6_prefix_t ipv6_outer_source_network; }; static_assert(YANET_CONFIG_BALANCER_REALS_SIZE <= 0xFFFFFFFF, "invalid YANET_CONFIG_BALANCER_REALS_SIZE"); diff --git a/dataplane/worker.cpp b/dataplane/worker.cpp index a0a0d05b..a9c232a4 100644 --- a/dataplane/worker.cpp +++ b/dataplane/worker.cpp @@ -3881,16 +3881,15 @@ inline void cWorker::balancer_tunnel(rte_mbuf* mbuf, rte_ipv6_hdr* ipv6Header = rte_pktmbuf_mtod_offset(mbuf, rte_ipv6_hdr*, metadata->network_headerOffset); + balancer_ipv6_source(ipv6Header, balancer.source_ipv6, service, ipv4HeaderInner, ipv6HeaderInner); + rte_memcpy(ipv6Header->dst_addr, real.destination.bytes, 16); + if (ipv4HeaderInner) { ipv6Header->vtc_flow = rte_cpu_to_be_32((0x6 << 28) | (ipv4HeaderInner->type_of_service << 20)); ///< @todo: flow label ipv6Header->payload_len = ipv4HeaderInner->total_length; ipv6Header->proto = IPPROTO_IPIP; ipv6Header->hop_limits = ipv4HeaderInner->time_to_live; - - rte_memcpy(ipv6Header->src_addr, balancer.source_ipv6.bytes, 16); - ((uint32_t*)ipv6Header->src_addr)[2] = ipv4HeaderInner->src_addr; - rte_memcpy(ipv6Header->dst_addr, real.destination.bytes, 16); } else { @@ -3898,10 +3897,6 @@ inline void cWorker::balancer_tunnel(rte_mbuf* mbuf, ipv6Header->payload_len = rte_cpu_to_be_16(sizeof(rte_ipv6_hdr) + rte_be_to_cpu_16(ipv6HeaderInner->payload_len)); ipv6Header->proto = IPPROTO_IPV6; ipv6Header->hop_limits = ipv6HeaderInner->hop_limits; - - rte_memcpy(ipv6Header->src_addr, balancer.source_ipv6.bytes, 16); - ((uint32_t*)ipv6Header->src_addr)[2] = ((uint32_t*)ipv6HeaderInner->src_addr)[2] ^ ((uint32_t*)ipv6HeaderInner->src_addr)[3]; - rte_memcpy(ipv6Header->dst_addr, real.destination.bytes, 16); } } else // IPV4 @@ -3941,7 +3936,7 @@ inline void cWorker::balancer_tunnel(rte_mbuf* mbuf, ipv4Header->next_proto_id = IPPROTO_IPV6; } - ipv4Header->src_addr = balancer.source_ipv4.address; + balancer_ipv4_source(ipv4Header, balancer.source_ipv4, service); ipv4Header->dst_addr = real.destination.mapped_ipv4_address.address; yanet_ipv4_checksum(ipv4Header); @@ -3998,6 +3993,66 @@ inline void cWorker::balancer_tunnel(rte_mbuf* mbuf, preparePacket(mbuf); } +/// Sets the IPv6 source address for the packet, taking into account the address set for the service. +/// In order to optimize the distribution of packets across the queues of the NIC installed on the servers +/// to which the packet will be sent, the source address is (if possible) randomized taking into account the mask. +inline void cWorker::balancer_ipv6_source(rte_ipv6_hdr* header, + const ipv6_address_t& balancer_src, + const dataplane::globalBase::balancer_service_t& service, + const rte_ipv4_hdr* ipv4HeaderInner, + const rte_ipv6_hdr* ipv6HeaderInner) +{ + uint32_t random_src; + if (ipv4HeaderInner) + { + random_src = ipv4HeaderInner->src_addr; + } + else + { + random_src = ((uint32_t*)ipv6HeaderInner->src_addr)[2] ^ ((uint32_t*)ipv6HeaderInner->src_addr)[3]; + } + + if (!(service.outer_source_network_flag & IPv6_OUTER_SOURCE_NETWORK_FLAG)) + { + rte_memcpy(header->src_addr, balancer_src.bytes, 16); + ((uint32_t*)header->src_addr)[2] = random_src; + return; + } + + rte_memcpy(header->src_addr, service.ipv6_outer_source_network.address.bytes, 16); + + /// Take the index of the first byte after the mask. + uint8_t random_ptr = service.ipv6_outer_source_network.mask / 8; + if (service.ipv6_outer_source_network.mask % 8) + { + random_ptr++; + } + + uint8_t n_to_fill = RTE_MIN(sizeof(header->src_addr) - random_ptr, 4); + + /// Fill the first 4 (or less) bytes after the mask with random numbers. + rte_memcpy(&header->src_addr[random_ptr], &random_src, n_to_fill); + + /// If the last octet wasn't randomized, then fill it with the last octet of the balancer src address. + if (service.ipv6_outer_source_network.mask <= 80) + { + ((uint16_t*)header->src_addr)[7] = ((uint16_t*)balancer_src.bytes)[7]; + } +} + +/// Sets the IPv4 source address for the packet, taking into account the address set for the service. +inline void cWorker::balancer_ipv4_source(rte_ipv4_hdr* header, + const ipv4_address_t& balancer_src, + const dataplane::globalBase::balancer_service_t& service) +{ + if (!(service.outer_source_network_flag & IPv4_OUTER_SOURCE_NETWORK_FLAG)) + { + header->src_addr = balancer_src.address; + return; + } + header->src_addr = service.ipv4_outer_source_network.address.address; +} + inline void cWorker::balancer_flow(rte_mbuf* mbuf, const common::globalBase::tFlow& flow) { diff --git a/dataplane/worker.h b/dataplane/worker.h index 55dd889f..8e6b9cec 100644 --- a/dataplane/worker.h +++ b/dataplane/worker.h @@ -156,6 +156,8 @@ class cWorker inline void balancer_flow(rte_mbuf* mbuf, const common::globalBase::tFlow& flow); inline void balancer_icmp_reply_handle(); inline void balancer_icmp_forward_handle(); + inline void balancer_ipv6_source(rte_ipv6_hdr* header, const ipv6_address_t& balancer, const dataplane::globalBase::balancer_service_t& service, const rte_ipv4_hdr* ipv4HeaderInner, const rte_ipv6_hdr* ipv6HeaderInner); + inline void balancer_ipv4_source(rte_ipv4_hdr* header, const ipv4_address_t& balancer, const dataplane::globalBase::balancer_service_t& service); /// fw state inline bool acl_try_keepstate(rte_mbuf* mbuf);