]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce ifb (Intermediate Functional Block)
authorSusant Sahani <ssahani@vmware.com>
Sat, 7 Dec 2019 13:35:55 +0000 (14:35 +0100)
committerSusant Sahani <ssahani@vmware.com>
Sat, 7 Dec 2019 14:29:50 +0000 (15:29 +0100)
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
src/network/meson.build
src/network/netdev/ifb.c [new file with mode: 0644]
src/network/netdev/ifb.h [new file with mode: 0644]
src/network/netdev/netdev.c
src/network/netdev/netdev.h

index 8031bc0e0b49a41471223c01062e67340251f036..5703e4f53b4a32805ce9ea762528f5436d61fa81 100644 (file)
           <row><entry><varname>xfrm</varname></entry>
           <entry>A virtual tunnel interface like vti/vti6 but with several advantages.</entry></row>
 
+          <row><entry><varname>ifb</varname></entry>
+          <entry> The Intermediate Functional Block (ifb) pseudo network interface acts as a QoS concentrator for multiple different sources of traffic.</entry></row>
+
         </tbody>
       </tgroup>
     </table>
index e2324a01b38006bc110e89645b767ce65ffb9bdc..8a09078315994821a5a5a1a8493881410cb19387 100644 (file)
@@ -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 (file)
index 0000000..7736a16
--- /dev/null
@@ -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 (file)
index 0000000..761d215
--- /dev/null
@@ -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;
index 423750a6a0e4cf9f573b8ef83a05bfb951bf2c8c..f8121a48ed92932efd6f5643afe431461b313d92 100644 (file)
@@ -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);
index 078d0aca4f9657bf8279dc9610769f5f1a00e5c4..cc530022c1aed449390a270c6b5eee6f3923aaba 100644 (file)
@@ -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