Compare commits

..

5 Commits

Author SHA1 Message Date
Yu Watanabe debda5a4e5
Merge pull request #14273 from ssahani/ifb
network: introduce IFB
2019-12-08 05:13:08 +09:00
Yu Watanabe 6d62ec61b9 network: fix copy and paste mistake 2019-12-08 05:11:26 +09:00
Yu Watanabe b076d5d76d test-network: add test case for IFB 2019-12-08 00:03:29 +09:00
Susant Sahani 3295a461b3 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
2019-12-07 15:29:50 +01:00
Susant Sahani cec1552ad4 sd-netlink: add support for ifb device 2019-12-07 14:35:23 +01:00
12 changed files with 49 additions and 1 deletions

View File

@ -182,6 +182,9 @@
<row><entry><varname>xfrm</varname></entry> <row><entry><varname>xfrm</varname></entry>
<entry>A virtual tunnel interface like vti/vti6 but with several advantages.</entry></row> <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> </tbody>
</tgroup> </tgroup>
</table> </table>

View File

@ -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_MACSEC] = "macsec",
[NL_UNION_LINK_INFO_DATA_NLMON] = "nlmon", [NL_UNION_LINK_INFO_DATA_NLMON] = "nlmon",
[NL_UNION_LINK_INFO_DATA_XFRM] = "xfrm", [NL_UNION_LINK_INFO_DATA_XFRM] = "xfrm",
[NL_UNION_LINK_INFO_DATA_IFB] = "ifb",
}; };
DEFINE_STRING_TABLE_LOOKUP(nl_union_link_info_data, NLUnionLinkInfoData); DEFINE_STRING_TABLE_LOOKUP(nl_union_link_info_data, NLUnionLinkInfoData);

View File

@ -83,6 +83,7 @@ typedef enum NLUnionLinkInfoData {
NL_UNION_LINK_INFO_DATA_MACSEC, NL_UNION_LINK_INFO_DATA_MACSEC,
NL_UNION_LINK_INFO_DATA_NLMON, NL_UNION_LINK_INFO_DATA_NLMON,
NL_UNION_LINK_INFO_DATA_XFRM, NL_UNION_LINK_INFO_DATA_XFRM,
NL_UNION_LINK_INFO_DATA_IFB,
_NL_UNION_LINK_INFO_DATA_MAX, _NL_UNION_LINK_INFO_DATA_MAX,
_NL_UNION_LINK_INFO_DATA_INVALID = -1 _NL_UNION_LINK_INFO_DATA_INVALID = -1
} NLUnionLinkInfoData; } NLUnionLinkInfoData;

View File

@ -7,6 +7,8 @@ sources = files('''
netdev/bridge.h netdev/bridge.h
netdev/dummy.c netdev/dummy.c
netdev/dummy.h netdev/dummy.h
netdev/ifb.c
netdev/ifb.h
netdev/ipvlan.c netdev/ipvlan.c
netdev/ipvlan.h netdev/ipvlan.h
netdev/macvlan.c netdev/macvlan.c

11
src/network/netdev/ifb.c Normal file
View File

@ -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,
};

13
src/network/netdev/ifb.h Normal file
View File

@ -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;

View File

@ -12,6 +12,7 @@
#include "fd-util.h" #include "fd-util.h"
#include "fou-tunnel.h" #include "fou-tunnel.h"
#include "geneve.h" #include "geneve.h"
#include "ifb.h"
#include "ipvlan.h" #include "ipvlan.h"
#include "l2tp-tunnel.h" #include "l2tp-tunnel.h"
#include "list.h" #include "list.h"
@ -73,6 +74,7 @@ const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX] = {
[NETDEV_KIND_MACSEC] = &macsec_vtable, [NETDEV_KIND_MACSEC] = &macsec_vtable,
[NETDEV_KIND_NLMON] = &nlmon_vtable, [NETDEV_KIND_NLMON] = &nlmon_vtable,
[NETDEV_KIND_XFRM] = &xfrm_vtable, [NETDEV_KIND_XFRM] = &xfrm_vtable,
[NETDEV_KIND_IFB] = &ifb_vtable,
}; };
static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = { 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_MACSEC] = "macsec",
[NETDEV_KIND_NLMON] = "nlmon", [NETDEV_KIND_NLMON] = "nlmon",
[NETDEV_KIND_XFRM] = "xfrm", [NETDEV_KIND_XFRM] = "xfrm",
[NETDEV_KIND_IFB] = "ifb",
}; };
DEFINE_STRING_TABLE_LOOKUP(netdev_kind, NetDevKind); DEFINE_STRING_TABLE_LOOKUP(netdev_kind, NetDevKind);

View File

@ -80,6 +80,7 @@ typedef enum NetDevKind {
NETDEV_KIND_MACSEC, NETDEV_KIND_MACSEC,
NETDEV_KIND_NLMON, NETDEV_KIND_NLMON,
NETDEV_KIND_XFRM, NETDEV_KIND_XFRM,
NETDEV_KIND_IFB,
_NETDEV_KIND_MAX, _NETDEV_KIND_MAX,
_NETDEV_KIND_TUNNEL, /* Used by config_parse_stacked_netdev() */ _NETDEV_KIND_TUNNEL, /* Used by config_parse_stacked_netdev() */
_NETDEV_KIND_INVALID = -1 _NETDEV_KIND_INVALID = -1

View File

@ -104,7 +104,7 @@ static int qdisc_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
return 1; return 1;
} }
if (link->route_messages == 0) { if (link->qdisc_messages == 0) {
log_link_debug(link, "QDisc configured"); log_link_debug(link, "QDisc configured");
link->qdiscs_configured = true; link->qdiscs_configured = true;
link_check_ready(link); link_check_ready(link);

View File

@ -0,0 +1,3 @@
[NetDev]
Kind=ifb
Name=ifb99

View File

@ -10,6 +10,7 @@ Name=vxcan99
Name=vxcan-peer Name=vxcan-peer
Name=vrf99 Name=vrf99
Name=geneve99 Name=geneve99
Name=ifb99
Name=ipiptun99 Name=ipiptun99
Name=nlmon99 Name=nlmon99
Name=xfrm99 Name=xfrm99

View File

@ -556,6 +556,7 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
'gretun97', 'gretun97',
'gretun98', 'gretun98',
'gretun99', 'gretun99',
'ifb99',
'ip6gretap98', 'ip6gretap98',
'ip6gretap99', 'ip6gretap99',
'ip6gretun96', 'ip6gretun96',
@ -633,6 +634,7 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
'25-gre-tunnel-local-any.netdev', '25-gre-tunnel-local-any.netdev',
'25-gre-tunnel-remote-any.netdev', '25-gre-tunnel-remote-any.netdev',
'25-gre-tunnel.netdev', '25-gre-tunnel.netdev',
'25-ifb.netdev',
'25-ip6gretap-tunnel-local-any.netdev', '25-ip6gretap-tunnel-local-any.netdev',
'25-ip6gretap-tunnel.netdev', '25-ip6gretap-tunnel.netdev',
'25-ip6gre-tunnel-any-any.netdev', '25-ip6gre-tunnel-any-any.netdev',
@ -1379,6 +1381,13 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
self.wait_online(['nlmon99:carrier']) 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): class NetworkdL2TPTests(unittest.TestCase, Utilities):
links =[ links =[