NetworkManager/src/core/devices
Beniamino Galvani 0c1fba5c95 wireguard: don't add peer routes if they duplicate prefix routes
With this configuration:

  [Interface]
  ...
  Address = 172.16.110.116/28,172.16.111.21/28

  [Peer]
  ...
  AllowedIPs = 172.16.110.112/28

  [Peer]
  ...
  AllowedIPs = 172.16.111.16/28

NetworkManager currently creates the following routes

  (1) 172.16.110.112/28 dev wg0 proto static scope link metric 50 <-- peer route
  (2) 172.16.110.112/28 dev wg0 proto kernel scope link src 172.16.110.116 metric 50 <-- prefix route
  (3) 172.16.111.16/28 dev wg0 proto static scope link metric 50 <-- peer route
  (4) 172.16.111.16/28 dev wg0 proto kernel scope link src 172.16.111.21 metric 50 <-- prefix route

If we try to reach a host in the second peer subnet, route (4)
matches. Route (4) doesn't specify a source IP and so the kernel will
use the first IP set on the interface (172.16.110.116), which is the
wrong one.

  # ip route get 172.16.111.17
  172.16.111.17 dev wg0 src 172.16.110.116 uid 0

To fix this problem, if the AllowedIP subnet is already reachable on
the interface via the prefix route of a static IP address, we should
skip adding the peer route.

wg-quick does something similar here:

  https://git.zx2c4.com/wireguard-tools/tree/src/wg-quick/linux.bash?h=v1.0.20250521#n177

The condition in wg-quick is a bit different because it checks that no
duplicate route exists on the interface. We can't do exactly the same
because in NMDeviceWireGuard we don't have visibility on all the
platform routes.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/1790
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2254
2025-08-25 16:49:16 +02:00
..
adsl device: simplify the nm_utils_complete_generic() machinery 2025-01-20 06:13:59 +01:00
bluetooth device: simplify the nm_utils_complete_generic() machinery 2025-01-20 06:13:59 +01:00
ovs ovs: fix logging message 2025-07-10 09:12:00 +02:00
team device: simplify the nm_utils_complete_generic() machinery 2025-01-20 06:13:59 +01:00
tests lldp: use new libnm-lldp instead of systemd's sd_lldp_rx 2022-10-25 10:59:01 +02:00
wifi device: simplify the nm_utils_complete_generic() machinery 2025-01-20 06:13:59 +01:00
wwan device: simplify the nm_utils_complete_generic() machinery 2025-01-20 06:13:59 +01:00
meson.build all: move "src/" directory to "src/core/" 2021-02-08 09:56:41 +01:00
nm-device-6lowpan.c core: virtual devices can be available without a parent set 2025-05-14 05:42:19 +00:00
nm-device-6lowpan.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-bond.c bond: fix attribute assignment macro 2025-07-10 09:12:00 +02:00
nm-device-bond.h bonding: send ARP announcement on bonding-slb link/carrier down 2024-12-18 14:45:54 +01:00
nm-device-bridge.c device: fix comment in attach_port() 2025-07-23 11:12:00 +02:00
nm-device-bridge.h device: support reapplying bridge-port VLANs 2024-08-21 07:29:37 +02:00
nm-device-dummy.c device: simplify the nm_utils_complete_generic() machinery 2025-01-20 06:13:59 +01:00
nm-device-dummy.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-ethernet-utils.c all: add "src/core/nm-default-daemon.h" as replacement for "nm-default.h" 2021-02-09 12:38:18 +01:00
nm-device-ethernet-utils.h all: move "src/" directory to "src/core/" 2021-02-08 09:56:41 +01:00
nm-device-ethernet.c core: remove duplicate include 2025-07-10 09:12:01 +02:00
nm-device-ethernet.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-factory.c manager: reword some error messages 2025-01-20 06:13:59 +01:00
nm-device-factory.h device/factory: document that some callbacks get an incomplete connection 2025-01-20 06:13:58 +01:00
nm-device-generic.c device: support creating generic devices via device-handler 2024-02-21 11:49:19 +01:00
nm-device-generic.h device: support creating generic devices via device-handler 2024-02-21 11:49:19 +01:00
nm-device-hsr.c core: fix properties update for HSR devices 2025-07-10 09:12:00 +02:00
nm-device-hsr.h HSR: add support to HSR/PRP interface 2023-12-05 08:05:56 +01:00
nm-device-infiniband.c device: simplify the nm_utils_complete_generic() machinery 2025-01-20 06:13:59 +01:00
nm-device-infiniband.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-ip-tunnel.c device: simplify the nm_utils_complete_generic() machinery 2025-01-20 06:13:59 +01:00
nm-device-ip-tunnel.h devices: support VTI tunnels 2022-12-21 14:04:44 +01:00
nm-device-ipvlan.c core: virtual devices can be available without a parent set 2025-05-14 05:42:19 +00:00
nm-device-ipvlan.h ipvlan: add support to IPVLAN interface 2024-09-18 13:19:42 +02:00
nm-device-logging.h core: log the device type when it can be ambiguous 2023-06-12 11:17:09 +02:00
nm-device-loopback.c device: simplify the nm_utils_complete_generic() machinery 2025-01-20 06:13:59 +01:00
nm-device-loopback.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-macsec.c core: virtual devices can be available without a parent set 2025-05-14 05:42:19 +00:00
nm-device-macsec.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-macvlan.c core: virtual devices can be available without a parent set 2025-05-14 05:42:19 +00:00
nm-device-macvlan.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-ppp.c device: get_connection_parent() accept incomplete connections 2025-01-20 06:13:58 +01:00
nm-device-ppp.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-private.h device: remove 'const' qualifier from function signature 2024-10-23 15:38:34 +02:00
nm-device-tun.c libnm-core,core: accept uid/gid up to (2^32 - 2) for tun devices 2025-07-10 09:12:00 +02:00
nm-device-tun.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-utils.c format: run nm-code-format 2024-10-04 11:07:35 +02:00
nm-device-utils.h core: rename NM_DEVICE_MANAGED_TYPE_MANAGED to _TYPE_FULL 2024-08-28 15:35:56 +02:00
nm-device-veth.c veth: fix detection of existing interfaces in create_and_realize() 2022-12-19 10:47:13 +01:00
nm-device-veth.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-vlan.c core: virtual devices can be available without a parent set 2025-05-14 05:42:19 +00:00
nm-device-vlan.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-vrf.c vrf: fix wrong logging domain 2025-07-10 09:12:01 +02:00
nm-device-vrf.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-vxlan.c device: simplify the nm_utils_complete_generic() machinery 2025-01-20 06:13:59 +01:00
nm-device-vxlan.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-wireguard.c wireguard: don't add peer routes if they duplicate prefix routes 2025-08-25 16:49:16 +02:00
nm-device-wireguard.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device-wpan.c device: simplify the nm_utils_complete_generic() machinery 2025-01-20 06:13:59 +01:00
nm-device-wpan.h all: use _NM_G_TYPE_CHECK_INSTANCE_CAST() for internal uses 2022-12-16 10:55:03 +01:00
nm-device.c device: add support for reapplying the sriov.vfs property 2025-08-20 09:58:52 +02:00
nm-device.h device: remove the "can_reapply_change_ovs_external_ids" device field 2025-04-29 11:03:26 +02:00
nm-lldp-listener.c lldp: fix memchr() argument order 2025-07-10 09:12:01 +02:00
nm-lldp-listener.h format: reformat source tree with clang-format 13.0 2021-11-29 09:31:09 +00:00