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/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; 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 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 cab8fb6afc..fb31a65125 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 =[