[PATCH net-next 0/2] ipv6: report why a route was deleted in RTM_DELROUTE
From: Yuyang Huang
Date: Fri Jul 17 2026 - 18:23:46 EST
When the kernel deletes an IPv6 route on its own, the RTM_DELROUTE
notification does not say why. User space cannot tell a route that
expired from one the router explicitly withdrew, yet the two call for
different reactions: an expired RA route means the router failed to
refresh it in time, which points at a misconfigured or unreliable
router and may warrant action such as disabling IPv6 on that network,
while a zero-lifetime withdrawal is normal, RFC-compliant operation.
Patch 1 adds RTA_DEL_REASON (u8) to RTM_DELROUTE notifications and
records the cause in the kernel-initiated IPv6 deletion paths:
RTA_DEL_REASON_EXPIRED for routes garbage collected after their
RTF_EXPIRES lifetime ran out, and RTA_DEL_REASON_RA_WITHDRAWN for
default routes, prefix routes and RFC 4191 route information routes
withdrawn by Router Advertisements. The rt-route Netlink spec is
extended with the attribute, the route notifications and their
multicast groups.
Only kernel-initiated deletions that user space cannot otherwise
explain are attributed. User-requested deletions are self-explanatory
to the requester, so they carry no reason; the UAPI documents that
absence and RTA_DEL_REASON_UNSPEC must be treated identically, which
keeps the door open for attributing more paths (nexthop removal
cascades, device removal) later.
Patch 2 adds selftests covering all three producer paths: a GC-expired
route, and a default route + PIO prefix route + RIO route advertised
and then withdrawn by hand-crafted RAs over a raw ICMPv6 socket (no
external RA tool needed), plus a check that user-requested deletions
carry no attribute. The notifications are decoded with YNL, which also
exercises the rt-route spec additions.
Yuyang Huang (2):
ipv6: report why a route was deleted in RTM_DELROUTE
selftests: net: verify RTA_DEL_REASON on route deletion
Documentation/netlink/specs/rt-route.yaml | 33 ++++
include/net/ip6_fib.h | 4 +-
include/net/ip6_route.h | 2 +
include/uapi/linux/rtnetlink.h | 17 ++
net/ipv6/addrconf.c | 3 +-
net/ipv6/ip6_fib.c | 19 +-
net/ipv6/ndisc.c | 7 +-
net/ipv6/route.c | 66 ++++---
.../testing/selftests/net/lib/py/__init__.py | 4 +-
tools/testing/selftests/net/lib/py/ynl.py | 7 +-
tools/testing/selftests/net/rtnetlink.py | 181 +++++++++++++++++-
11 files changed, 303 insertions(+), 40 deletions(-)
--
2.43.0