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: