diff --git a/man/systemd.network.xml b/man/systemd.network.xml index edb15cf4aa5..f2777e640fa 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -4630,6 +4630,15 @@ ServerAddress=192.168.0.1/24 Takes a boolean. Configures whether the port is "locked" and does not allow traffic forwarded until fully authenticated, e.g. via 802.1x. When unset, the kernel's default will be used. + + + MACAuthenticationBypass= + + Takes a boolean. Configures whether a locked port has "MAC Authentication Bypass" enabled and + creates newly learned fdb entries in a "locked" state. User space can authenticate these entries by + clearing the locked flag. Requires Learning to be enabled. When unset, the kernel's default will be + used. + diff --git a/src/libsystemd/sd-netlink/netlink-types-rtnl.c b/src/libsystemd/sd-netlink/netlink-types-rtnl.c index c0e820486db..187d9b6756a 100644 --- a/src/libsystemd/sd-netlink/netlink-types-rtnl.c +++ b/src/libsystemd/sd-netlink/netlink-types-rtnl.c @@ -486,6 +486,7 @@ static const struct NLAPolicy rtnl_bridge_port_policies[] = { [IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT] = BUILD_POLICY(U32), [IFLA_BRPORT_MCAST_EHT_HOSTS_CNT] = BUILD_POLICY(U32), [IFLA_BRPORT_LOCKED] = BUILD_POLICY(U8), + [IFLA_BRPORT_MAB] = BUILD_POLICY(U8), }; static const NLAPolicySetUnionElement rtnl_link_info_slave_data_policy_set_union_elements[] = { diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 30f71480298..bdbb3ad2c8a 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -384,6 +384,7 @@ Bridge.ProxyARPWiFi, config_parse_tristate, Bridge.Priority, config_parse_bridge_port_priority, 0, offsetof(Network, priority) Bridge.MulticastRouter, config_parse_multicast_router, 0, offsetof(Network, multicast_router) Bridge.Locked, config_parse_tristate, 0, offsetof(Network, bridge_locked) +Bridge.MACAuthenticationBypass, config_parse_tristate, 0, offsetof(Network, bridge_mac_authentication_bypass) BridgeFDB.MACAddress, config_parse_fdb_hwaddr, 0, 0 BridgeFDB.VLANId, config_parse_fdb_vlan_id, 0, 0 BridgeFDB.Destination, config_parse_fdb_destination, 0, 0 diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 82f39e2f800..080e184ae14 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -457,6 +457,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .priority = LINK_BRIDGE_PORT_PRIORITY_INVALID, .multicast_router = _MULTICAST_ROUTER_INVALID, .bridge_locked = -1, + .bridge_mac_authentication_bypass = -1, .bridge_vlan_pvid = BRIDGE_VLAN_KEEP_PVID, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 95407279e33..cec5f98d5bb 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -298,6 +298,7 @@ struct Network { uint16_t priority; MulticastRouter multicast_router; int bridge_locked; + int bridge_mac_authentication_bypass; /* Bridge VLAN */ uint16_t bridge_vlan_pvid; diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c index b973ffea98e..2f4a6c6e035 100644 --- a/src/network/networkd-setlink.c +++ b/src/network/networkd-setlink.c @@ -326,6 +326,12 @@ static int link_configure_fill_message( return r; } + if (link->network->bridge_mac_authentication_bypass >= 0) { + r = sd_netlink_message_append_u8(req, IFLA_BRPORT_MAB, link->network->bridge_mac_authentication_bypass); + if (r < 0) + return r; + } + r = sd_netlink_message_close_container(req); if (r < 0) return r; diff --git a/test/test-network/conf/26-bridge-slave-interface-2.network b/test/test-network/conf/26-bridge-slave-interface-2.network index 6eb955dc4bc..c76f17201f3 100644 --- a/test/test-network/conf/26-bridge-slave-interface-2.network +++ b/test/test-network/conf/26-bridge-slave-interface-2.network @@ -11,3 +11,4 @@ Bridge=bridge99 [Bridge] Priority=0 Locked=true +MACAuthenticationBypass=true diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 2d1309da289..d073e007af5 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -5791,6 +5791,8 @@ class NetworkdBridgeTests(unittest.TestCase, Utilities): print(output) self.check_bridge_port_attr('bridge99', 'test1', 'priority', '0') self.assertIn('locked on', output) + if ' mab ' in output: # This is new in kernel and iproute2 v6.2 + self.assertIn('mab on', output) def test_bridge_property(self): copy_network_unit('11-dummy.netdev', '12-dummy.netdev', '26-bridge.netdev',