[CALL FOR TESTING] Metric support in routing stack (netlink and rtsock)

Pouria Mousavizadeh Tehrani <[email protected]> Fri, 15 May 2026 02:00:49 +0330
Newsgroups gmane.os.freebsd.devel.hackers,gmane.os.freebsd.devel.net
Message-ID <[email protected]>
Hi,

I've implemented metric support for the FreeBSD routing stack, enabling 
per-nexthop metrics for both netlink and rtsock interfaces.
This allows multiple routes with same destination to have different metrics.
The routing system should now use only the lowest-metric nexthops for 
actual forwarding.

The implementation includes:
D56335 route(8): Add metric argument
D56326 route(8): Show metric value in monitor route
D56325 route(8): Show metric value in get route
D56324 rtnetlink.4: Add RTA_PRIORITY
D57007 routing: Allow nhop reuse in nhgrp with different metric
D56323 netlink: Add RTA_PRIORITY support (metric)
D56322 routing: Add support for route metric

Testing:
I'm looking for feedback and testing across different scenarios.
Here are some example use cases:
```
# Adding routes with different metrics:
route -n6 add 3fff:a::/64 -gateway 3fff::1 -metric 2
route -n6 add 3fff:a::/64 -gateway 3fff::2 -metric 3
route -n6 add 3fff:a::/64 -gateway 3fff::1 -metric 1 # 1 is default
# Show all the nexthops with their metrics:
route -on6 get 3fff:a::/64
# Remove route with specific metric
route -n6 del 3fff:a::/64 -gateway 3fff::2 -metric 3

# ECMP routes with metrics:
route -n6 add -net 3fff::/64 -gateway ::2 -weight 3 -metric 3
route -n6 add -net 3fff::/64 -gateway ::1 -weight 3
# Metric 1 gateway preferred for forwarding
route -n6 get 3fff::/64
```

Netlink integration and routing daemons:
Routes created via netlink now properly exchange metrics through 
RTA_PRIORITY, allowing external tools like Bird to work with metric.

Here is an example configuration for bird:
```
protocol kernel kernel61 {
   metric 10;
   ipv6 {
     import all;
     export all;
   };
   learn all;
}

protocol ospf v3 {
   ecmp yes;
   ipv6 {
     export none;
     import all;
   };
   area 0 {
     interface "vtnet1" {};
   };
}
```

Testing help needed:
- Testing with various metric combinations and ECMP scenarios, including 
   performance impact.
- Verify slot/memory handling in the actual forwarding table. (`netstat 
-on6` and `netstat -On6` output helps)
- rtnetlink(4) compatibility testing with routing daemons (Bird, etc.)
- rtsock usability and compatibility.
- Any edge cases or unexpected behavior.
- UX of route(8) and netstat(1) in relation to metric.

The implementation is available on my github in mpath branch and in 
phabricator:
https://github.com/spmzt/freebsd-src/tree/mpath

Please reply with any issues, feedback, or test results.

BR
-- 
Pouria
OpenPGP_signature.asc (application/pgp-signature, 228 B)
-----BEGIN PGP SIGNATURE-----

iHUEARYKAB0WIQSqt7cppfvJ816gj0lUwVnUeMwagAUCagZNGQAKCRBUwVnUeMwa
gO6RAQD1/GDsP5yZN0Ni09ZweYpVSapzj8hT5eP3AgKdS0VHcwEAoTyEl2iuEGYi
RawdMifVFVPJMDQa5C0QpY2qta91yQA=
=a108
-----END PGP SIGNATURE-----