Commit d2e970cdbf for frr

commit d2e970cdbfbe40f829986cf81b9da93e6e621f83
Author: Gabriel Goller <g.goller@proxmox.com>
Date:   Fri Sep 11 15:18:01 2026 +0200

    *: use ipaddr_set_v4()/ipaddr_set_v6() where available

    Creating a struct ipaddr takes two steps: tagging the type via
    SET_IPADDR_V4()/SET_IPADDR_V6() and writing the address itself.

    ipaddr_set_v4() and ipaddr_set_v6() are helpers that do these operations
    in one line, which means that it is less likely one operation is
    forgotten. There is also a subtle difference in ipv6, where we copy the
    address instead of just moving it.

    Sites where the helpers are awkward are left alone: EVPN NLRI parsing
    would need an unaligned *(struct in_addr *) load on the packet buffer,
    the netlink route attributes are copied with a runtime length instead
    of a fixed one, and a few places only tag the type because the address
    arrives later.

    Signed-off-by: Gabriel Goller <g.goller@proxmox.com>

diff --git a/bgpd/bgp_attr_evpn.c b/bgpd/bgp_attr_evpn.c
index c87e6ee016..4a60e81bc7 100644
--- a/bgpd/bgp_attr_evpn.c
+++ b/bgpd/bgp_attr_evpn.c
@@ -294,16 +294,10 @@ extern int bgp_build_evpn_prefix(int evpn_type, uint32_t eth_tag,
 		p_evpn_p->prefix_addr.eth_tag = eth_tag;
 		p_evpn_p->prefix_addr.ip_prefix_length = p2.prefixlen;
 		if (src->family == AF_INET) {
-			SET_IPADDR_V4(&p_evpn_p->prefix_addr.ip);
-			memcpy(&p_evpn_p->prefix_addr.ip.ipaddr_v4,
-			       &src->u.prefix4,
-			       sizeof(struct in_addr));
+			ipaddr_set_v4(&p_evpn_p->prefix_addr.ip, src->u.prefix4);
 			dst->prefixlen = (uint16_t)PREFIX_LEN_ROUTE_TYPE_5_IPV4;
 		} else {
-			SET_IPADDR_V6(&p_evpn_p->prefix_addr.ip);
-			memcpy(&p_evpn_p->prefix_addr.ip.ipaddr_v6,
-			       &src->u.prefix6,
-			       sizeof(struct in6_addr));
+			ipaddr_set_v6(&p_evpn_p->prefix_addr.ip, &src->u.prefix6);
 			dst->prefixlen = (uint16_t)PREFIX_LEN_ROUTE_TYPE_5_IPV6;
 		}
 	} else
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
index 13467e0163..391ca55f09 100644
--- a/bgpd/bgp_evpn.c
+++ b/bgpd/bgp_evpn.c
@@ -1581,12 +1581,10 @@ enum zclient_send_status evpn_zebra_install(struct bgp *bgp, struct bgpevpn *vpn

 		switch (nhfamily) {
 		case AF_INET:
-			SET_IPADDR_V4(&vtep_ip);
-			vtep_ip.ipaddr_v4 = pi->attr->mp_nexthop_global_in;
+			ipaddr_set_v4(&vtep_ip, pi->attr->mp_nexthop_global_in);
 			break;
 		case AF_INET6:
-			SET_IPADDR_V6(&vtep_ip);
-			IPV6_ADDR_COPY(&vtep_ip.ipaddr_v6, &pi->attr->mp_nexthop_global);
+			ipaddr_set_v6(&vtep_ip, &pi->attr->mp_nexthop_global);
 			break;
 		}

@@ -1641,12 +1639,10 @@ enum zclient_send_status evpn_zebra_uninstall(struct bgp *bgp,

 		switch (nhfamily) {
 		case AF_INET:
-			SET_IPADDR_V4(&vtep_ip);
-			vtep_ip.ipaddr_v4 = pi->attr->mp_nexthop_global_in;
+			ipaddr_set_v4(&vtep_ip, pi->attr->mp_nexthop_global_in);
 			break;
 		case AF_INET6:
-			SET_IPADDR_V6(&vtep_ip);
-			IPV6_ADDR_COPY(&vtep_ip.ipaddr_v6, &pi->attr->mp_nexthop_global);
+			ipaddr_set_v6(&vtep_ip, &pi->attr->mp_nexthop_global);
 			break;
 		}
 	}
@@ -2058,10 +2054,7 @@ static int update_evpn_type5_route(struct bgp *bgp_vrf, struct bgp_path_info *or
 					sizeof(struct bgp_route_evpn));

 			bre->type = OVERLAY_INDEX_GATEWAY_IP;
-			SET_IPADDR_V6(&bre->gw_ip);
-			memcpy(&bre->gw_ip.ipaddr_v6,
-			       &src_attr->mp_nexthop_global,
-			       sizeof(struct in6_addr));
+			ipaddr_set_v6(&bre->gw_ip, &src_attr->mp_nexthop_global);
 			bgp_attr_set_evpn_overlay(&attr, bre);
 		}
 	} else if (src_afi == AFI_IP &&
@@ -2073,9 +2066,7 @@ static int update_evpn_type5_route(struct bgp *bgp_vrf, struct bgp_path_info *or
 					sizeof(struct bgp_route_evpn));

 			bre->type = OVERLAY_INDEX_GATEWAY_IP;
-			SET_IPADDR_V4(&bre->gw_ip);
-			memcpy(&bre->gw_ip.ipaddr_v4, &src_attr->nexthop,
-			       sizeof(struct in_addr));
+			ipaddr_set_v4(&bre->gw_ip, src_attr->nexthop);
 			bgp_attr_set_evpn_overlay(&attr, bre);
 		}
 	}
@@ -3573,13 +3564,11 @@ static int install_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
 	if (bgp_debug_zebra(NULL)) {
 		struct ipaddr nhip = {};

-		if (pi->net->rn->p.family == AF_INET6) {
-			SET_IPADDR_V6(&nhip);
-			IPV6_ADDR_COPY(&nhip.ipaddr_v6, &pi->attr->mp_nexthop_global);
-		} else {
-			SET_IPADDR_V4(&nhip);
-			IPV4_ADDR_COPY(&nhip.ipaddr_v4, &pi->attr->nexthop);
-		}
+		if (pi->net->rn->p.family == AF_INET6)
+			ipaddr_set_v6(&nhip, &pi->attr->mp_nexthop_global);
+		else
+			ipaddr_set_v4(&nhip, pi->attr->nexthop);
+
 		zlog_debug("... %s pi %s dest %p (l %d) pi %p (l %d, f 0x%x) nh %pIA",
 			   new_pi ? "new" : "update",
 			   bgp_vrf->name_pretty, dest,
@@ -3922,13 +3911,10 @@ int uninstall_evpn_route_entry_in_vrf(struct bgp *bgp_vrf, const struct prefix_e
 	if (bgp_debug_zebra(NULL)) {
 		struct ipaddr nhip = {};

-		if (pi->net->rn->p.family == AF_INET6) {
-			SET_IPADDR_V6(&nhip);
-			IPV6_ADDR_COPY(&nhip.ipaddr_v6, &pi->attr->mp_nexthop_global);
-		} else {
-			SET_IPADDR_V4(&nhip);
-			IPV4_ADDR_COPY(&nhip.ipaddr_v4, &pi->attr->nexthop);
-		}
+		if (pi->net->rn->p.family == AF_INET6)
+			ipaddr_set_v6(&nhip, &pi->attr->mp_nexthop_global);
+		else
+			ipaddr_set_v4(&nhip, pi->attr->nexthop);

 		zlog_debug("... delete pi %s dest %p (l %d) pi %p (l %d, f 0x%x) nh %pIA",
 			   bgp_vrf->name_pretty, dest,
@@ -6550,8 +6536,7 @@ void bgp_evpn_handle_router_id_update(struct bgp *bgp, int withdraw)
 				    IS_IPADDR_V4(&bgp_vrf->originator_ip) &&
 				    (bgp_vrf->evpn_info->pip_ip_static.ipaddr_v4.s_addr ==
 				     INADDR_ANY)) {
-					SET_IPADDR_V4(&bgp_vrf->evpn_info->pip_ip);
-					bgp_vrf->evpn_info->pip_ip.ipaddr_v4 = bgp->router_id;
+					ipaddr_set_v4(&bgp_vrf->evpn_info->pip_ip, bgp->router_id);
 					/* advertise type-5 routes with
 					 * new nexthop
 					 */
@@ -8016,8 +8001,7 @@ int bgp_evpn_local_l3vni_add(vni_t l3vni, vrf_id_t vrf_id, struct ethaddr *svi_r
 			if (bgp_debug_zebra(NULL))
 				zlog_debug("%s vni %u ifp %s addr %pI6 copy as pip", __func__,
 					   bgp_vrf->l3vni, ifp->name, &addr);
-			SET_IPADDR_V6(&bgp_vrf->evpn_info->pip_ip);
-			IPV6_ADDR_COPY(&bgp_vrf->evpn_info->pip_ip.ipaddr_v6, &addr);
+			ipaddr_set_v6(&bgp_vrf->evpn_info->pip_ip, &addr);
 		} else if (ifp)
 			if (bgp_debug_zebra(NULL))
 				zlog_debug("%s vni %u ifp %s v6 addr not found, skip pip assignment",
@@ -8550,10 +8534,8 @@ void bgp_evpn_init(struct bgp *bgp)

 			bgp->evpn_info->advertise_pip = DFLT_BGP_EVPN_ADVERTISE_PIP;
 			bgp_default = bgp_get_default();
-			if (bgp_default) {
-				SET_IPADDR_V4(&bgp->evpn_info->pip_ip);
-				bgp->evpn_info->pip_ip.ipaddr_v4 = bgp_default->router_id;
-			}
+			if (bgp_default)
+				ipaddr_set_v4(&bgp->evpn_info->pip_ip, bgp_default->router_id);
 		}
 	}

diff --git a/bgpd/bgp_evpn_mh.c b/bgpd/bgp_evpn_mh.c
index 82c494bdf5..7d6a236846 100644
--- a/bgpd/bgp_evpn_mh.c
+++ b/bgpd/bgp_evpn_mh.c
@@ -51,18 +51,15 @@ static void bgp_evpn_mh_get_vtep_ip(const struct attr *attr, struct ipaddr *vtep
 	nhfamily = NEXTHOP_FAMILY(attr->mp_nexthop_len);

 	if (nhfamily == AF_INET) {
-		SET_IPADDR_V4(vtep_ip);
 		if (attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV4 ||
 		    attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV4)
-			IPV4_ADDR_COPY(&vtep_ip->ipaddr_v4, &attr->mp_nexthop_global_in);
+			ipaddr_set_v4(vtep_ip, attr->mp_nexthop_global_in);
 		else
-			IPV4_ADDR_COPY(&vtep_ip->ipaddr_v4, &attr->nexthop);
+			ipaddr_set_v4(vtep_ip, attr->nexthop);
 	} else if (nhfamily == AF_INET6) {
-		SET_IPADDR_V6(vtep_ip);
-		IPV6_ADDR_COPY(&vtep_ip->ipaddr_v6, &attr->mp_nexthop_global);
+		ipaddr_set_v6(vtep_ip, &attr->mp_nexthop_global);
 	} else {
-		SET_IPADDR_V4(vtep_ip);
-		IPV4_ADDR_COPY(&vtep_ip->ipaddr_v4, &attr->nexthop);
+		ipaddr_set_v4(vtep_ip, attr->nexthop);
 	}
 }

@@ -78,15 +75,12 @@ bgp_evpn_mh_fill_vtep_ip_from_pi(const struct bgp_path_info *pi,
 	 */
 	if (pi->attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV4 ||
 	    pi->attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV4) {
-		SET_IPADDR_V4(vtep_ip);
-		vtep_ip->ipaddr_v4 = pi->attr->mp_nexthop_global_in;
+		ipaddr_set_v4(vtep_ip, pi->attr->mp_nexthop_global_in);
 	} else if (pi->attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL ||
 		   pi->attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL ||
 		   pi->attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL ||
 		   pi->attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL_AND_LL) {
-		SET_IPADDR_V6(vtep_ip);
-		IPV6_ADDR_COPY(&vtep_ip->ipaddr_v6,
-			       &pi->attr->mp_nexthop_global);
+		ipaddr_set_v6(vtep_ip, &pi->attr->mp_nexthop_global);
 	}
 }

@@ -236,17 +230,12 @@ static int bgp_evpn_es_route_select_install(struct bgp *bgp,
 			uint8_t nhfamily = NEXTHOP_FAMILY(old_select->attr->mp_nexthop_len);

 			if (nhfamily == AF_INET) {
-				SET_IPADDR_V4(&vtep_ip);
-				IPV4_ADDR_COPY(&vtep_ip.ipaddr_v4,
-					       &old_select->attr->mp_nexthop_global_in);
+				ipaddr_set_v4(&vtep_ip, old_select->attr->mp_nexthop_global_in);
 			} else if (nhfamily == AF_INET6) {
-				SET_IPADDR_V6(&vtep_ip);
-				IPV6_ADDR_COPY(&vtep_ip.ipaddr_v6,
-					       &old_select->attr->mp_nexthop_global);
+				ipaddr_set_v6(&vtep_ip, &old_select->attr->mp_nexthop_global);
 			} else {
 				/* default condition */
-				SET_IPADDR_V4(&vtep_ip);
-				IPV4_ADDR_COPY(&vtep_ip.ipaddr_v4, &old_select->attr->nexthop);
+				ipaddr_set_v4(&vtep_ip, old_select->attr->nexthop);
 			}
 			bgp_evpn_es_vtep_del(bgp, es, vtep_ip, true /*esr*/);
 		}
@@ -561,13 +550,11 @@ int bgp_evpn_mh_route_update(struct bgp *bgp, struct bgp_evpn_es *es,
 		if (es) {
 			struct ipaddr vtep_ip = {};

-			if (IS_IPADDR_V4(&es->originator_ip)) {
-				SET_IPADDR_V4(&vtep_ip);
-				vtep_ip.ipaddr_v4 = attr->mp_nexthop_global_in;
-			} else if (IS_IPADDR_V6(&es->originator_ip)) {
-				SET_IPADDR_V6(&vtep_ip);
-				IPV6_ADDR_COPY(&vtep_ip.ipaddr_v6, &attr->mp_nexthop_global);
-			}
+			if (IS_IPADDR_V4(&es->originator_ip))
+				ipaddr_set_v4(&vtep_ip, attr->mp_nexthop_global_in);
+			else if (IS_IPADDR_V6(&es->originator_ip))
+				ipaddr_set_v6(&vtep_ip, &attr->mp_nexthop_global);
+
 			frrtrace(4, frr_bgp, evpn_mh_local_ead_es_evi_route_upd, &es->esi,
 				 (vpn ? vpn->vni : 0), evp->prefix.route_type, &vtep_ip);
 		}
@@ -5051,17 +5038,13 @@ static void bgp_evpn_path_nh_link(struct bgp *bgp_vrf, struct bgp_path_info *pi)
 	memset(&ip, 0, sizeof(ip));
 	/* copy path attribute's ipv4 or ipv6 address as nexthop field synced to zebra */
 	if (pi->net->rn->p.family == AF_INET6 || BGP_ATTR_MP_NEXTHOP_LEN_IP6(pi->attr)) {
-		SET_IPADDR_V6(&ip);
-		memcpy(&ip.ipaddr_v6, &pi->attr->mp_nexthop_global,
-		       sizeof(ip.ipaddr_v6));
+		ipaddr_set_v6(&ip, &pi->attr->mp_nexthop_global);
 	} else {
-		SET_IPADDR_V4(&ip);
 		if (pi->attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV4 ||
 		    pi->attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV4)
-			memcpy(&ip.ipaddr_v4, &pi->attr->mp_nexthop_global_in,
-			       sizeof(ip.ipaddr_v4));
+			ipaddr_set_v4(&ip, pi->attr->mp_nexthop_global_in);
 		else
-			memcpy(&ip.ipaddr_v4, &pi->attr->nexthop, sizeof(ip.ipaddr_v4));
+			ipaddr_set_v4(&ip, pi->attr->nexthop);
 	}

 	nh = bgp_evpn_nh_find(bgp_vrf, &ip);
diff --git a/bgpd/bgp_evpn_private.h b/bgpd/bgp_evpn_private.h
index 25c646a4eb..24dba91c62 100644
--- a/bgpd/bgp_evpn_private.h
+++ b/bgpd/bgp_evpn_private.h
@@ -815,11 +815,9 @@ static inline void build_evpn_type1_prefix(struct prefix_evpn *p, uint32_t eth_t
 	p->prefix.ead_addr.eth_tag = eth_tag;
 	/* Set IP address and type based on originator_ip */
 	if (IS_IPADDR_V4(&originator_ip)) {
-		SET_IPADDR_V4(&p->prefix.ead_addr.ip);
-		IPV4_ADDR_COPY(&p->prefix.ead_addr.ip.ipaddr_v4, &originator_ip.ipaddr_v4);
+		ipaddr_set_v4(&p->prefix.ead_addr.ip, originator_ip.ipaddr_v4);
 	} else if (IS_IPADDR_V6(&originator_ip)) {
-		SET_IPADDR_V6(&p->prefix.ead_addr.ip);
-		IPV6_ADDR_COPY(&p->prefix.ead_addr.ip.ipaddr_v6, &originator_ip.ipaddr_v6);
+		ipaddr_set_v6(&p->prefix.ead_addr.ip, &originator_ip.ipaddr_v6);
 	} else {
 		/* IPADDR_NONE - should not happen, but handle gracefully */
 		p->prefix.ead_addr.ip.ipa_type = IPADDR_NONE;
@@ -864,15 +862,13 @@ evpn_type1_prefix_vni_ip_copy(struct prefix_evpn *vni_p,
 	if (attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV4 ||
 	    attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV4) {
 		/* IPv4 nexthop */
-		SET_IPADDR_V4(&vni_p->prefix.ead_addr.ip);
-		IPV4_ADDR_COPY(&vni_p->prefix.ead_addr.ip.ipaddr_v4, &attr->nexthop);
+		ipaddr_set_v4(&vni_p->prefix.ead_addr.ip, attr->nexthop);
 	} else if (attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL ||
 		   attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL ||
 		   attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL ||
 		   attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL_AND_LL) {
 		/* IPv6 nexthop - use global address */
-		SET_IPADDR_V6(&vni_p->prefix.ead_addr.ip);
-		IPV6_ADDR_COPY(&vni_p->prefix.ead_addr.ip.ipaddr_v6, &attr->mp_nexthop_global);
+		ipaddr_set_v6(&vni_p->prefix.ead_addr.ip, &attr->mp_nexthop_global);
 	} else {
 		/* IPADDR_NONE - should not happen, but handle gracefully */
 		vni_p->prefix.ead_addr.ip.ipa_type = IPADDR_NONE;
diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c
index 85ab2daacf..e6b8c266ec 100644
--- a/bgpd/bgp_evpn_vty.c
+++ b/bgpd/bgp_evpn_vty.c
@@ -2293,8 +2293,7 @@ static struct bgpevpn *evpn_create_update_vni(struct bgp *bgp, vni_t vni)
 		/* tenant vrf will be updated when we get local_vni_add from
 		 * zebra
 		 */
-		SET_IPADDR_V4(&orignator_ip);
-		orignator_ip.ipaddr_v4 = bgp->router_id;
+		ipaddr_set_v4(&orignator_ip, bgp->router_id);
 		vpn = bgp_evpn_new(bgp, vni, &orignator_ip, 0, mcast_grp, 0);
 	}

@@ -2393,13 +2392,10 @@ static void evpn_show_routes_vni_all(struct vty *vty, struct bgp *bgp, int type,
 	wctx.mac_table = mac_table;
 	SET_IPADDR_NONE(&wctx.vtep_ip);
 	if (vtep_ip) {
-		if (sockunion_family(vtep_ip) == AF_INET) {
-			SET_IPADDR_V4(&wctx.vtep_ip);
-			wctx.vtep_ip.ipaddr_v4 = vtep_ip->sin.sin_addr;
-		} else if (sockunion_family(vtep_ip) == AF_INET6) {
-			SET_IPADDR_V6(&wctx.vtep_ip);
-			wctx.vtep_ip.ipaddr_v6 = vtep_ip->sin6.sin6_addr;
-		}
+		if (sockunion_family(vtep_ip) == AF_INET)
+			ipaddr_set_v4(&wctx.vtep_ip, vtep_ip->sin.sin_addr);
+		else if (sockunion_family(vtep_ip) == AF_INET6)
+			ipaddr_set_v6(&wctx.vtep_ip, &vtep_ip->sin6.sin6_addr);
 	}
 	wctx.json = json;
 	wctx.detail = detail;
@@ -2427,13 +2423,10 @@ static void evpn_show_routes_vni_all_type_all(struct vty *vty, struct bgp *bgp,
 	wctx.vty = vty;
 	SET_IPADDR_NONE(&wctx.vtep_ip);
 	if (vtep_ip) {
-		if (sockunion_family(vtep_ip) == AF_INET) {
-			SET_IPADDR_V4(&wctx.vtep_ip);
-			wctx.vtep_ip.ipaddr_v4 = vtep_ip->sin.sin_addr;
-		} else if (sockunion_family(vtep_ip) == AF_INET6) {
-			SET_IPADDR_V6(&wctx.vtep_ip);
-			wctx.vtep_ip.ipaddr_v6 = vtep_ip->sin6.sin6_addr;
-		}
+		if (sockunion_family(vtep_ip) == AF_INET)
+			ipaddr_set_v4(&wctx.vtep_ip, vtep_ip->sin.sin_addr);
+		else if (sockunion_family(vtep_ip) == AF_INET6)
+			ipaddr_set_v6(&wctx.vtep_ip, &vtep_ip->sin6.sin6_addr);
 	}
 	wctx.json = json;
 	wctx.detail = detail;
@@ -2673,15 +2666,12 @@ static void evpn_show_routes_vni(struct vty *vty, struct bgp *bgp, vni_t vni,
 		return;
 	}

-	if (_vtep_ip && sockunion_family(_vtep_ip) == AF_INET) {
-		SET_IPADDR_V4(&vtep_ip);
-		vtep_ip.ipaddr_v4 = _vtep_ip->sin.sin_addr;
-	} else if (_vtep_ip && sockunion_family(_vtep_ip) == AF_INET6) {
-		SET_IPADDR_V6(&vtep_ip);
-		vtep_ip.ipaddr_v6 = _vtep_ip->sin6.sin6_addr;
-	} else {
+	if (_vtep_ip && sockunion_family(_vtep_ip) == AF_INET)
+		ipaddr_set_v4(&vtep_ip, _vtep_ip->sin.sin_addr);
+	else if (_vtep_ip && sockunion_family(_vtep_ip) == AF_INET6)
+		ipaddr_set_v6(&vtep_ip, &_vtep_ip->sin6.sin6_addr);
+	else
 		SET_IPADDR_NONE(&vtep_ip);
-	}

 	/* Walk this VNI's route table and display appropriate routes. */
 	show_vni_routes(bgp, vpn, vty, type, mac_table, &vtep_ip, json, 0);
@@ -4780,10 +4770,8 @@ DEFPY (bgp_evpn_advertise_pip_ip_mac,
 			if (IPV4_ADDR_SAME(&ip, &bgp_vrf->evpn_info->pip_ip_static.ipaddr_v4))
 				return CMD_SUCCESS;

-			SET_IPADDR_V4(&bgp_vrf->evpn_info->pip_ip_static);
-			bgp_vrf->evpn_info->pip_ip_static.ipaddr_v4 = ip;
-			SET_IPADDR_V4(&bgp_vrf->evpn_info->pip_ip);
-			bgp_vrf->evpn_info->pip_ip.ipaddr_v4 = ip;
+			ipaddr_set_v4(&bgp_vrf->evpn_info->pip_ip_static, ip);
+			ipaddr_set_v4(&bgp_vrf->evpn_info->pip_ip, ip);
 		} else {
 			bgp_vrf->evpn_info->pip_ip_static.ipaddr_v4.s_addr = INADDR_ANY;
 			/* default instance router-id assignemt */
@@ -6378,8 +6366,7 @@ DEFPY_HIDDEN(test_es_add,
 			oper_up = true;
 		else
 			oper_up = false;
-		SET_IPADDR_V4(&vtep_ip);
-		vtep_ip.ipaddr_v4 = bgp->router_id;
+		ipaddr_set_v4(&vtep_ip, bgp->router_id);

 		ret = bgp_evpn_local_es_add(bgp, &esi, vtep_ip, oper_up,
 					    EVPN_MH_DF_PREF_MIN, false);
diff --git a/bgpd/bgp_nexthop.c b/bgpd/bgp_nexthop.c
index e9cbf7fd70..87f0096a48 100644
--- a/bgpd/bgp_nexthop.c
+++ b/bgpd/bgp_nexthop.c
@@ -571,8 +571,7 @@ bool bgp_nexthop_self(struct bgp *bgp, afi_t afi, uint8_t type,

 	if (new_afi == AF_INET && hashcount(bgp->tip_hash)) {
 		memset(&tmp_tip, 0, sizeof(tmp_tip));
-		SET_IPADDR_V4(&tmp_tip.addr);
-		IPV4_ADDR_COPY(&tmp_tip.addr.ipaddr_v4, &attr->nexthop);
+		ipaddr_set_v4(&tmp_tip.addr, attr->nexthop);

 		if (bgp_attr_exists(attr, BGP_ATTR_NEXT_HOP)) {
 			IPV4_ADDR_COPY(&tmp_tip.addr.ipaddr_v4, &attr->nexthop);
@@ -584,8 +583,7 @@ bool bgp_nexthop_self(struct bgp *bgp, afi_t afi, uint8_t type,
 			   (attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL) ||
 			   (attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL) ||
 			   (attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL_AND_LL)) {
-			SET_IPADDR_V6(&tmp_tip.addr);
-			IPV6_ADDR_COPY(&tmp_tip.addr.ipaddr_v6, &attr->mp_nexthop_global);
+			ipaddr_set_v6(&tmp_tip.addr, &attr->mp_nexthop_global);
 		}

 		tip = hash_lookup(bgp->tip_hash, &tmp_tip);
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 58e31fe088..af2f0f5144 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -8910,20 +8910,14 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
 				XCALLOC(MTYPE_BGP_EVPN_OVERLAY,
 					sizeof(struct bgp_route_evpn));

-			SET_IPADDR_V4(&bre->gw_ip);
-			memcpy(&bre->gw_ip.ipaddr_v4,
-			       &bgp_static->gatewayIp.u.prefix4,
-			       IPV4_MAX_BYTELEN);
+			ipaddr_set_v4(&bre->gw_ip, bgp_static->gatewayIp.u.prefix4);
 			bgp_attr_set_evpn_overlay(&attr, bre);
 		} else if (bgp_static->gatewayIp.family == AF_INET6) {
 			struct bgp_route_evpn *bre =
 				XCALLOC(MTYPE_BGP_EVPN_OVERLAY,
 					sizeof(struct bgp_route_evpn));

-			SET_IPADDR_V6(&bre->gw_ip);
-			memcpy(&bre->gw_ip.ipaddr_v6,
-			       &bgp_static->gatewayIp.u.prefix6,
-			       IPV6_MAX_BYTELEN);
+			ipaddr_set_v6(&bre->gw_ip, &bgp_static->gatewayIp.u.prefix6);
 			bgp_attr_set_evpn_overlay(&attr, bre);
 		}
 		memcpy(&attr.esi, bgp_static->eth_s_id, sizeof(esi_t));
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index bf95d42b21..9f24f22c6f 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -3548,8 +3548,7 @@ static int bgp_zebra_process_local_vni(ZAPI_CALLBACK_ARGS)
 	 * the EVPN VTEP/originator IP.
 	 */
 	if (cmd == ZEBRA_VNI_ADD && ipaddr_is_zero(&vtep_ip)) {
-		SET_IPADDR_V4(&vtep_ip);
-		vtep_ip.ipaddr_v4 = bgp->router_id;
+		ipaddr_set_v4(&vtep_ip, bgp->router_id);
 		if (BGP_DEBUG(zebra, ZEBRA))
 			zlog_debug("Rx VNI add with unspecified VTEP IP, using router-id %pIA",
 				   &vtep_ip);
diff --git a/lib/nexthop.c b/lib/nexthop.c
index b1d0dc6d3f..1c968aa82d 100644
--- a/lib/nexthop.c
+++ b/lib/nexthop.c
@@ -1666,13 +1666,11 @@ void nexthop_set_res_info(struct nexthop *nh, uint32_t id, const struct prefix *
 		nh->res_info = XCALLOC(MTYPE_NH_RESINFO, sizeof(struct nh_res_info));

 	nh->res_info->id = id;
-	if (pfx->family == AF_INET) {
-		SET_IPADDR_V4(&nh->res_info->addr);
-		nh->res_info->addr.ipaddr_v4 = pfx->u.prefix4;
-	} else {
-		SET_IPADDR_V6(&nh->res_info->addr);
-		nh->res_info->addr.ipaddr_v6 = pfx->u.prefix6;
-	}
+	if (pfx->family == AF_INET)
+		ipaddr_set_v4(&nh->res_info->addr, pfx->u.prefix4);
+	else
+		ipaddr_set_v6(&nh->res_info->addr, &pfx->u.prefix6);
+
 	nh->res_info->pfxlen = pfx->prefixlen;
 }

diff --git a/pathd/path_pcep_lib.c b/pathd/path_pcep_lib.c
index 664aebb764..7f6d708cef 100644
--- a/pathd/path_pcep_lib.c
+++ b/pathd/path_pcep_lib.c
@@ -1133,19 +1133,15 @@ void pcep_lib_parse_metric(struct path *path, struct pcep_object_metric *obj)
 void pcep_lib_parse_endpoints_ipv4(struct path *path,
 				   struct pcep_object_endpoints_ipv4 *obj)
 {
-	SET_IPADDR_V4(&path->pcc_addr);
-	path->pcc_addr.ipaddr_v4 = obj->src_ipv4;
-	SET_IPADDR_V4(&path->nbkey.endpoint);
-	path->nbkey.endpoint.ipaddr_v4 = obj->dst_ipv4;
+	ipaddr_set_v4(&path->pcc_addr, obj->src_ipv4);
+	ipaddr_set_v4(&path->nbkey.endpoint, obj->dst_ipv4);
 }

 void pcep_lib_parse_endpoints_ipv6(struct path *path,
 				   struct pcep_object_endpoints_ipv6 *obj)
 {
-	SET_IPADDR_V6(&path->pcc_addr);
-	path->pcc_addr.ipaddr_v6 = obj->src_ipv6;
-	SET_IPADDR_V6(&path->nbkey.endpoint);
-	path->nbkey.endpoint.ipaddr_v6 = obj->dst_ipv6;
+	ipaddr_set_v6(&path->pcc_addr, &obj->src_ipv6);
+	ipaddr_set_v6(&path->nbkey.endpoint, &obj->dst_ipv6);
 }

 void pcep_lib_parse_vendor_info(struct path *path,
diff --git a/staticd/static_srv6.c b/staticd/static_srv6.c
index 35456897fc..377802d1ec 100644
--- a/staticd/static_srv6.c
+++ b/staticd/static_srv6.c
@@ -540,8 +540,7 @@ void static_srv6_neigh_add(struct interface *ifp, struct in6_addr *addr, uint32_
 					       "%s: Requesting neighbor discovery for STALE neighbor %pI6 on interface %s (index %u)",
 					       __func__, addr, ifp->name, ifp->ifindex);

-					SET_IPADDR_V6(&ipaddr);
-					ipaddr.ipaddr_v6 = *addr;
+					ipaddr_set_v6(&ipaddr, addr);

 					static_zebra_send_neigh_discovery_req(ifp, &ipaddr);
 				}
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index d13ee0e7a7..de2f12b2ca 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -452,13 +452,11 @@ static int netlink_extract_gre_info(struct rtattr *link_data, struct zebra_l2inf

 		frrtrace(1, frr_zebra, if_netlink_parse_error, 3);
 	} else if (ipv6) {
-		SET_IPADDR_V6(&gre_info->vtep_ip_remote);
-		IPV6_ADDR_COPY(&gre_info->vtep_ip_remote.ipaddr_v6,
-			       (struct in6_addr *)RTA_DATA(attr[IFLA_GRE_REMOTE]));
+		ipaddr_set_v6(&gre_info->vtep_ip_remote,
+			      (struct in6_addr *)RTA_DATA(attr[IFLA_GRE_REMOTE]));
 	} else {
-		SET_IPADDR_V4(&gre_info->vtep_ip_remote);
-		gre_info->vtep_ip_remote.ipaddr_v4 =
-			*(struct in_addr *)RTA_DATA(attr[IFLA_GRE_REMOTE]);
+		ipaddr_set_v4(&gre_info->vtep_ip_remote,
+			      *(struct in_addr *)RTA_DATA(attr[IFLA_GRE_REMOTE]));
 	}

 	if (!attr[IFLA_GRE_LINK]) {
@@ -524,15 +522,14 @@ static int netlink_extract_vxlan_info(struct rtattr *link_data,


 	if (attr[IFLA_VXLAN_LOCAL]) {
-		vxl_info->vtep_ip.ipaddr_v4 = *(struct in_addr *)RTA_DATA(attr[IFLA_VXLAN_LOCAL]);
-		SET_IPADDR_V4(&vxl_info->vtep_ip);
+		ipaddr_set_v4(&vxl_info->vtep_ip,
+			      *(struct in_addr *)RTA_DATA(attr[IFLA_VXLAN_LOCAL]));
 		if (IS_ZEBRA_DEBUG_KERNEL)
 			zlog_debug("IFLA_VXLAN_LOCAL VXLAN IF message, local address V4: %pIA",
 				   &vxl_info->vtep_ip);
 	} else if (attr[IFLA_VXLAN_LOCAL6]) {
-		IPV6_ADDR_COPY(&vxl_info->vtep_ip.ipaddr_v6,
-			       (struct in6_addr *)RTA_DATA(attr[IFLA_VXLAN_LOCAL6]));
-		SET_IPADDR_V6(&vxl_info->vtep_ip);
+		ipaddr_set_v6(&vxl_info->vtep_ip,
+			      (struct in6_addr *)RTA_DATA(attr[IFLA_VXLAN_LOCAL6]));
 		if (IS_ZEBRA_DEBUG_KERNEL)
 			zlog_debug("IFLA_VXLAN_LOCAL VXLAN IF message, local address V6: %pIA",
 				   &vxl_info->vtep_ip);
diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c
index 257fb8e705..d8195a770d 100644
--- a/zebra/zebra_vty.c
+++ b/zebra/zebra_vty.c
@@ -3412,13 +3412,10 @@ DEFPY (show_evpn_mac_vni_all_vtep,
 	bool uj = use_json(argc, argv);

 	if (ip) {
-		if (sockunion_family(ip) == AF_INET) {
-			SET_IPADDR_V4(&vtep_ip);
-			vtep_ip.ipaddr_v4.s_addr = sockunion2ip(ip);
-		} else {
-			SET_IPADDR_V6(&vtep_ip);
-			memcpy(&vtep_ip.ipaddr_v6, &ip->sin6.sin6_addr, sizeof(struct in6_addr));
-		}
+		if (sockunion_family(ip) == AF_INET)
+			ipaddr_set_v4(&vtep_ip, ip->sin.sin_addr);
+		else
+			ipaddr_set_v6(&vtep_ip, &ip->sin6.sin6_addr);
 	}

 	if (IS_IPADDR_NONE(&vtep_ip)) {
@@ -3481,13 +3478,10 @@ DEFPY (show_evpn_mac_vni_vtep,
 	bool uj = use_json(argc, argv);

 	if (ip) {
-		if (sockunion_family(ip) == AF_INET) {
-			SET_IPADDR_V4(&vtep_ip);
-			vtep_ip.ipaddr_v4.s_addr = sockunion2ip(ip);
-		} else {
-			SET_IPADDR_V6(&vtep_ip);
-			memcpy(&vtep_ip.ipaddr_v6, &ip->sin6.sin6_addr, sizeof(struct in6_addr));
-		}
+		if (sockunion_family(ip) == AF_INET)
+			ipaddr_set_v4(&vtep_ip, ip->sin.sin_addr);
+		else
+			ipaddr_set_v6(&vtep_ip, &ip->sin6.sin6_addr);
 	}

 	if (IS_IPADDR_NONE(&vtep_ip)) {
@@ -3682,13 +3676,10 @@ DEFPY (show_evpn_neigh_vni_vtep,
 	bool uj = use_json(argc, argv);

 	if (ip) {
-		if (sockunion_family(ip) == AF_INET) {
-			SET_IPADDR_V4(&vtep_ip);
-			vtep_ip.ipaddr_v4.s_addr = sockunion2ip(ip);
-		} else {
-			SET_IPADDR_V6(&vtep_ip);
-			memcpy(&vtep_ip.ipaddr_v6, &ip->sin6.sin6_addr, sizeof(struct in6_addr));
-		}
+		if (sockunion_family(ip) == AF_INET)
+			ipaddr_set_v4(&vtep_ip, ip->sin.sin_addr);
+		else
+			ipaddr_set_v6(&vtep_ip, &ip->sin6.sin6_addr);
 	} else {
 		SET_IPADDR_NONE(&vtep_ip);
 	}