Skip to content

Commit

Permalink
Add support of IPv4/v6 outer source network for services
Browse files Browse the repository at this point in the history
  • Loading branch information
saushew committed Oct 13, 2023
1 parent 3e7fffe commit 49e3b7b
Show file tree
Hide file tree
Showing 21 changed files with 494 additions and 44 deletions.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
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 flush
- sleep: 1
- sendPackets:
- port: kni0
send: 001-send.pcap
expect: 001-expect.pcap
- sleep: 1
- sendPackets:
- port: kni0
send: 002-send.pcap
expect: 002-expect.pcap
- sleep: 1
- sendPackets:
- port: kni0
send: 003-send.pcap
expect: 003-expect.pcap
- sleep: 1
- sendPackets:
- port: kni0
send: 004-send.pcap
expect: 004-expect.pcap
Original file line number Diff line number Diff line change
@@ -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"
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#!/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),
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.3", 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.4", 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),
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:0003:0:1", hlim=63)/IP(dst="10.0.0.1", src="1.1.0.3", 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:0004:0:1", hlim=63)/IP(dst="10.0.0.1", src="1.1.0.4", 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),
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.3", 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.4", 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),
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.3", 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.4", 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),
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::3", 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::4", 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::0001:0: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::0002:0:1", hlim=63) / IPv6(dst="2001:dead:beef::1", src="2002::2", 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::0003:0:1", hlim=63) / IPv6(dst="2001:dead:beef::1", src="2002::3", 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::0004:0:1", hlim=63) / IPv6(dst="2001:dead:beef::1", src="2002::4", 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),
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::12", 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::13", 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),
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::12", 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::13", hlim=64)/TCP(dport=80, sport=12380),
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
[
{
"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"
}
]
}
]
2 changes: 2 additions & 0 deletions common/controlplaneconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,8 @@ using service_t = std::tuple<balancer_service_id_t,
::balancer::scheduler_params,
::balancer::forwarding_method,
uint8_t, ///< flags: mss_fix|ops
std::optional<common::ipv4_prefix_t>, ///< ipv4_outer_source_network
std::optional<common::ipv6_prefix_t>, ///< ipv6_outer_source_network
std::vector<real_t>>;

class config_t
Expand Down
4 changes: 3 additions & 1 deletion common/idp.h
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,9 @@ using service = std::tuple<balancer_service_id_t, /// service id
balancer::forwarding_method, // tunneling method (default ipip)
uint32_t, /// default_wlc_power
uint32_t, ///< real_start
uint32_t>; ///< real_size
uint32_t, ///< real_size
std::optional<common::ipv4_prefix_t>, ///< ipv4_outer_source_network
std::optional<common::ipv6_prefix_t>>; ///< ipv6_outer_source_network>
using real = std::tuple<balancer_real_id_t, ///< real id
common::ip_address_t,
tCounterId>;
Expand Down
76 changes: 69 additions & 7 deletions controlplane/balancer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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}});

Expand All @@ -248,14 +261,27 @@ void balancer_t::reload(const controlplane::base_t& base_prev,
{
std::unordered_set<std::tuple<common::ip_address_t, uint16_t, uint8_t>> 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;
(void)scheduler;
(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}});

Expand Down Expand Up @@ -592,7 +618,18 @@ 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;
Expand Down Expand Up @@ -676,7 +713,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;
Expand Down Expand Up @@ -725,9 +773,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,
});
}
}

Expand All @@ -745,7 +796,18 @@ 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;
Expand Down
Loading

0 comments on commit 49e3b7b

Please sign in to comment.