Commit ec9a70de71 for frr
commit ec9a70de71c89ac9b5231e8fc15846954c7ab2fe
Author: Mark Stapp <mjs@cisco.com>
Date: Tue Sep 15 14:15:28 2026 -0400
zebra: encode nexthop resolved-via info for FPM
Add resolving prefix info for nexthops to the FPM encoder.
Signed-off-by: Mark Stapp <mjs@cisco.com>
diff --git a/zebra/kernel_netlink.h b/zebra/kernel_netlink.h
index d5c86bd544..d56a069a3d 100644
--- a/zebra/kernel_netlink.h
+++ b/zebra/kernel_netlink.h
@@ -39,6 +39,12 @@ struct zebra_ns;
enum fpm_nha_attrs {
/* Resolved-via nexthop group id; uint32 */
NHA_FPM_RESOLVED_VIA = 30,
+ /* Resolved-via prefix family (AF_INET or AF_INET6); uint8 */
+ NHA_FPM_RESOLVED_PREFIX_FAM = 31,
+ /* Resolved-via prefix; bytes */
+ NHA_FPM_RESOLVED_PREFIX = 32,
+ /* Resolved-via prefix-len; uint8 */
+ NHA_FPM_RESOLVED_PREFIX_LEN = 33,
NHA_FPM_MAX
};
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index db5620765d..634d837625 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -2962,6 +2962,42 @@ static int netlink_nexthop_msg_encode_end_b6_encaps(struct nlmsghdr *nlmsg,
return 1;
}
+/*
+ * Encode a nexthop's resolved-via information (for FPM, not kernel)
+ */
+static bool encode_nh_resolved_via(struct nlmsghdr *n, size_t buflen,
+ const struct nexthop *nh)
+{
+ if (nh->res_info == NULL)
+ goto done;
+
+ if (!nl_attr_put32(n, buflen, NHA_FPM_RESOLVED_VIA, nh->res_info->id))
+ return false;
+
+ if (nh->res_info->addr.ipa_type != IPADDR_NONE) {
+ if (!nl_attr_put8(n, buflen, NHA_FPM_RESOLVED_PREFIX_FAM,
+ nh->res_info->addr.ipa_type))
+ return false;
+
+ if (IS_IPADDR_V4(&(nh->res_info->addr))) {
+ if (!nl_attr_put(n, buflen, NHA_FPM_RESOLVED_PREFIX,
+ &(nh->res_info->addr.ipaddr_v4), IPV4_MAX_BYTELEN))
+ return false;
+ } else {
+ if (!nl_attr_put(n, buflen, NHA_FPM_RESOLVED_PREFIX,
+ &(nh->res_info->addr.ipaddr_v6), IPV6_MAX_BYTELEN))
+ return false;
+ }
+
+ if (!nl_attr_put8(n, buflen, NHA_FPM_RESOLVED_PREFIX_LEN, nh->res_info->pfxlen))
+ return false;
+ }
+
+done:
+
+ return true;
+}
+
/**
* Next hop packet encoding helper function.
*
@@ -3221,12 +3257,9 @@ ssize_t netlink_nexthop_msg_encode(uint16_t cmd,
/* FPM-specific nexthop-group attributes */
if (fpm) {
- if (nh->res_info) {
- if (!nl_attr_put32(&req->n, buflen,
- NHA_FPM_RESOLVED_VIA,
- nh->res_info->id))
- return 0;
- }
+ /* Resolved-via info, if present */
+ if (!encode_nh_resolved_via(&req->n, buflen, nh))
+ return 0;
}
nexthop_done: