diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml index 449b23d5ac..ff0bdee51f 100644 --- a/man/systemd.netdev.xml +++ b/man/systemd.netdev.xml @@ -1994,7 +1994,7 @@ InterfaceId= Sets the ID/key of the xfrm interface which needs to be associated with a SA/policy. - Can be decimal or hexadecimal, valid range is 0-0xffffffff, defaults to 0. + Can be decimal or hexadecimal, valid range is 1-0xffffffff. This is mandatory. diff --git a/src/network/netdev/xfrm.c b/src/network/netdev/xfrm.c index 05844b8321..a961d8fef2 100644 --- a/src/network/netdev/xfrm.c +++ b/src/network/netdev/xfrm.c @@ -14,6 +14,7 @@ static int xfrm_fill_message_create(NetDev *netdev, Link *link, sd_netlink_messa x = XFRM(netdev); + assert(x); assert(link || x->independent); r = sd_netlink_message_append_u32(message, IFLA_XFRM_LINK, link ? link->ifindex : LOOPBACK_IFINDEX); @@ -27,10 +28,28 @@ static int xfrm_fill_message_create(NetDev *netdev, Link *link, sd_netlink_messa return 0; } +static int xfrm_verify(NetDev *netdev, const char *filename) { + Xfrm *x; + + assert(netdev); + assert(filename); + + x = XFRM(netdev); + + assert(x); + + if (x->if_id == 0) + return log_netdev_warning_errno(netdev, SYNTHETIC_ERRNO(EINVAL), + "%s: Xfrm interface ID cannot be zero.", filename); + + return 0; +} + const NetDevVTable xfrm_vtable = { .object_size = sizeof(Xfrm), .sections = NETDEV_COMMON_SECTIONS "Xfrm\0", .fill_message_create = xfrm_fill_message_create, + .config_verify = xfrm_verify, .create_type = NETDEV_CREATE_STACKED, .iftype = ARPHRD_NONE, }; diff --git a/test/test-network/conf/25-xfrm-independent.netdev b/test/test-network/conf/25-xfrm-independent.netdev index b2378849d1..b54c659d83 100644 --- a/test/test-network/conf/25-xfrm-independent.netdev +++ b/test/test-network/conf/25-xfrm-independent.netdev @@ -4,4 +4,5 @@ Kind=xfrm Name=xfrm99 [Xfrm] +InterfaceId=0x99 Independent=yes diff --git a/test/test-network/conf/25-xfrm.netdev b/test/test-network/conf/25-xfrm.netdev index 353bfb7003..8e1d5c8122 100644 --- a/test/test-network/conf/25-xfrm.netdev +++ b/test/test-network/conf/25-xfrm.netdev @@ -1,4 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later [NetDev] Kind=xfrm -Name=xfrm99 +Name=xfrm98 + +[Xfrm] +InterfaceId=0x98 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 0cc9cfa96b..ea1811bbfd 100644 --- a/test/test-network/conf/netdev-link-local-addressing-yes.network +++ b/test/test-network/conf/netdev-link-local-addressing-yes.network @@ -18,7 +18,7 @@ Name=geneve99 Name=ifb99 Name=ipiptun99 Name=nlmon99 -Name=xfrm99 +Name=xfrm98 xfrm99 Name=vxlan98 Name=hogehogehogehogehogehoge diff --git a/test/test-network/conf/xfrm.network b/test/test-network/conf/xfrm.network index c852601733..19f22146f8 100644 --- a/test/test-network/conf/xfrm.network +++ b/test/test-network/conf/xfrm.network @@ -4,4 +4,4 @@ Name=dummy98 [Network] IPv6AcceptRA=no -Xfrm=xfrm99 +Xfrm=xfrm98 diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 9a2a839b40..4fcae28ce3 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -886,6 +886,7 @@ class NetworkctlTests(unittest.TestCase, Utilities): class NetworkdNetDevTests(unittest.TestCase, Utilities): links_remove_earlier = [ + 'xfrm98', 'xfrm99', ] @@ -1797,20 +1798,21 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities): @expectedFailureIfModuleIsNotAvailable('xfrm_interface') def test_xfrm(self): copy_unit_to_networkd_unit_path('12-dummy.netdev', 'xfrm.network', - '25-xfrm.netdev', 'netdev-link-local-addressing-yes.network') + '25-xfrm.netdev', '25-xfrm-independent.netdev', + 'netdev-link-local-addressing-yes.network') start_networkd() - self.wait_online(['xfrm99:degraded', 'dummy98:degraded']) + self.wait_online(['dummy98:degraded', 'xfrm98:degraded', 'xfrm99:degraded']) - output = check_output('ip link show dev xfrm99') + output = check_output('ip -d link show dev xfrm98') print(output) + self.assertIn('xfrm98@dummy98:', output) + self.assertIn('xfrm if_id 0x98 ', output) - @expectedFailureIfModuleIsNotAvailable('xfrm_interface') - def test_xfrm_independent(self): - copy_unit_to_networkd_unit_path('25-xfrm-independent.netdev', 'netdev-link-local-addressing-yes.network') - start_networkd() - - self.wait_online(['xfrm99:degraded']) + output = check_output('ip -d link show dev xfrm99') + print(output) + self.assertIn('xfrm99@lo:', output) + self.assertIn('xfrm if_id 0x99 ', output) @expectedFailureIfModuleIsNotAvailable('fou') def test_fou(self):