From cec1552ad4e0c8276286efa3619db2e2aefb8413 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Sat, 7 Dec 2019 14:35:23 +0100 Subject: [PATCH 1/3] sd-netlink: add support for ifb device --- src/libsystemd/sd-netlink/netlink-types.c | 1 + src/libsystemd/sd-netlink/netlink-types.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/libsystemd/sd-netlink/netlink-types.c b/src/libsystemd/sd-netlink/netlink-types.c index 26bd0dd620..937e7e2759 100644 --- a/src/libsystemd/sd-netlink/netlink-types.c +++ b/src/libsystemd/sd-netlink/netlink-types.c @@ -371,6 +371,7 @@ static const char* const nl_union_link_info_data_table[] = { [NL_UNION_LINK_INFO_DATA_MACSEC] = "macsec", [NL_UNION_LINK_INFO_DATA_NLMON] = "nlmon", [NL_UNION_LINK_INFO_DATA_XFRM] = "xfrm", + [NL_UNION_LINK_INFO_DATA_IFB] = "ifb", }; DEFINE_STRING_TABLE_LOOKUP(nl_union_link_info_data, NLUnionLinkInfoData); diff --git a/src/libsystemd/sd-netlink/netlink-types.h b/src/libsystemd/sd-netlink/netlink-types.h index 9bc6f68339..c42a9c25d0 100644 --- a/src/libsystemd/sd-netlink/netlink-types.h +++ b/src/libsystemd/sd-netlink/netlink-types.h @@ -83,6 +83,7 @@ typedef enum NLUnionLinkInfoData { NL_UNION_LINK_INFO_DATA_MACSEC, NL_UNION_LINK_INFO_DATA_NLMON, NL_UNION_LINK_INFO_DATA_XFRM, + NL_UNION_LINK_INFO_DATA_IFB, _NL_UNION_LINK_INFO_DATA_MAX, _NL_UNION_LINK_INFO_DATA_INVALID = -1 } NLUnionLinkInfoData; From 3295a461b373135e13b409288501cd84b2a69036 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Sat, 7 Dec 2019 14:35:55 +0100 Subject: [PATCH 2/3] network: introduce ifb (Intermediate Functional Block) Intermediate Functional Block The Intermediate Functional Block (ifb) pseudo network interface acts as a QoS concentrator for multiple different sources of traffic. Packets from or to other interfaces have to be redirected to it using the mirred action in order to be handled, regularly routed traffic will be dropped. This way, a single stack of qdiscs, classes and filters can be shared between multiple interfaces. Here's a simple example to feed incoming traffic from multiple interfaces through a Stochastic Fairness Queue (sfq): (1) # modprobe ifb (2) # ip link set ifb0 up (3) # tc qdisc add dev ifb0 root sfq --- man/systemd.netdev.xml | 3 +++ src/network/meson.build | 2 ++ src/network/netdev/ifb.c | 11 +++++++++++ src/network/netdev/ifb.h | 13 +++++++++++++ src/network/netdev/netdev.c | 3 +++ src/network/netdev/netdev.h | 1 + 6 files changed, 33 insertions(+) create mode 100644 src/network/netdev/ifb.c create mode 100644 src/network/netdev/ifb.h diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml index 8031bc0e0b..5703e4f53b 100644 --- a/man/systemd.netdev.xml +++ b/man/systemd.netdev.xml @@ -182,6 +182,9 @@ xfrm A virtual tunnel interface like vti/vti6 but with several advantages. + ifb + The Intermediate Functional Block (ifb) pseudo network interface acts as a QoS concentrator for multiple different sources of traffic. + diff --git a/src/network/meson.build b/src/network/meson.build index e2324a01b3..8a09078315 100644 --- a/src/network/meson.build +++ b/src/network/meson.build @@ -7,6 +7,8 @@ sources = files(''' netdev/bridge.h netdev/dummy.c netdev/dummy.h + netdev/ifb.c + netdev/ifb.h netdev/ipvlan.c netdev/ipvlan.h netdev/macvlan.c diff --git a/src/network/netdev/ifb.c b/src/network/netdev/ifb.c new file mode 100644 index 0000000000..7736a162f9 --- /dev/null +++ b/src/network/netdev/ifb.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: LGPL-2.1+ + * Copyright © 2019 VMware, Inc. */ + +#include "ifb.h" + +const NetDevVTable ifb_vtable = { + .object_size = sizeof(IntermediateFunctionalBlock), + .sections = NETDEV_COMMON_SECTIONS, + .create_type = NETDEV_CREATE_INDEPENDENT, + .generate_mac = true, +}; diff --git a/src/network/netdev/ifb.h b/src/network/netdev/ifb.h new file mode 100644 index 0000000000..761d215894 --- /dev/null +++ b/src/network/netdev/ifb.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: LGPL-2.1+ + * Copyright © 2019 VMware, Inc. */ + +#pragma once + +#include "netdev.h" + +typedef struct IntermediateFunctionalBlock { + NetDev meta; +} IntermediateFunctionalBlock; + +DEFINE_NETDEV_CAST(IFB, IntermediateFunctionalBlock); +extern const NetDevVTable ifb_vtable; diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index 423750a6a0..f8121a48ed 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -12,6 +12,7 @@ #include "fd-util.h" #include "fou-tunnel.h" #include "geneve.h" +#include "ifb.h" #include "ipvlan.h" #include "l2tp-tunnel.h" #include "list.h" @@ -73,6 +74,7 @@ const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX] = { [NETDEV_KIND_MACSEC] = &macsec_vtable, [NETDEV_KIND_NLMON] = &nlmon_vtable, [NETDEV_KIND_XFRM] = &xfrm_vtable, + [NETDEV_KIND_IFB] = &ifb_vtable, }; static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = { @@ -109,6 +111,7 @@ static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = { [NETDEV_KIND_MACSEC] = "macsec", [NETDEV_KIND_NLMON] = "nlmon", [NETDEV_KIND_XFRM] = "xfrm", + [NETDEV_KIND_IFB] = "ifb", }; DEFINE_STRING_TABLE_LOOKUP(netdev_kind, NetDevKind); diff --git a/src/network/netdev/netdev.h b/src/network/netdev/netdev.h index 078d0aca4f..cc530022c1 100644 --- a/src/network/netdev/netdev.h +++ b/src/network/netdev/netdev.h @@ -80,6 +80,7 @@ typedef enum NetDevKind { NETDEV_KIND_MACSEC, NETDEV_KIND_NLMON, NETDEV_KIND_XFRM, + NETDEV_KIND_IFB, _NETDEV_KIND_MAX, _NETDEV_KIND_TUNNEL, /* Used by config_parse_stacked_netdev() */ _NETDEV_KIND_INVALID = -1 From b076d5d76ddc1eb9fcbe36d4664b73ef6f1e9506 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 8 Dec 2019 00:03:29 +0900 Subject: [PATCH 3/3] test-network: add test case for IFB --- test/test-network/conf/25-ifb.netdev | 3 +++ .../conf/netdev-link-local-addressing-yes.network | 1 + test/test-network/systemd-networkd-tests.py | 9 +++++++++ 3 files changed, 13 insertions(+) create mode 100644 test/test-network/conf/25-ifb.netdev diff --git a/test/test-network/conf/25-ifb.netdev b/test/test-network/conf/25-ifb.netdev new file mode 100644 index 0000000000..a4ba771967 --- /dev/null +++ b/test/test-network/conf/25-ifb.netdev @@ -0,0 +1,3 @@ +[NetDev] +Kind=ifb +Name=ifb99 diff --git a/test/test-network/conf/netdev-link-local-addressing-yes.network b/test/test-network/conf/netdev-link-local-addressing-yes.network index d7dfa7ea97..a5a3d67f43 100644 --- a/test/test-network/conf/netdev-link-local-addressing-yes.network +++ b/test/test-network/conf/netdev-link-local-addressing-yes.network @@ -10,6 +10,7 @@ Name=vxcan99 Name=vxcan-peer Name=vrf99 Name=geneve99 +Name=ifb99 Name=ipiptun99 Name=nlmon99 Name=xfrm99 diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index f47463956e..aa29221e85 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -556,6 +556,7 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities): 'gretun97', 'gretun98', 'gretun99', + 'ifb99', 'ip6gretap98', 'ip6gretap99', 'ip6gretun96', @@ -633,6 +634,7 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities): '25-gre-tunnel-local-any.netdev', '25-gre-tunnel-remote-any.netdev', '25-gre-tunnel.netdev', + '25-ifb.netdev', '25-ip6gretap-tunnel-local-any.netdev', '25-ip6gretap-tunnel.netdev', '25-ip6gre-tunnel-any-any.netdev', @@ -1379,6 +1381,13 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities): self.wait_online(['nlmon99:carrier']) + @expectedFailureIfModuleIsNotAvailable('ifb') + def test_ifb(self): + copy_unit_to_networkd_unit_path('25-ifb.netdev', 'netdev-link-local-addressing-yes.network') + start_networkd() + + self.wait_online(['ifb99:degraded']) + class NetworkdL2TPTests(unittest.TestCase, Utilities): links =[