*: convert struct interface->connected to DLIST

Replace `struct list *` with `DLIST(if_connected, ...)`.

NB: while converting this, I found multiple places using connected
prefixes assuming they were IPv4 without checking:

- vrrpd/vrrp.c: vrrp_socket()
- zebra/irdp_interface.c: irdp_get_prefix(), irdp_if_start(),
  irdp_advert_off()

(these fixes are really hard to split off into separate commits as that
would require going back and reapplying the change but with the old list
handling)

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2023-11-22 19:05:41 +01:00
parent af22ff0bd5
commit 8b23c0b0bd
39 changed files with 184 additions and 282 deletions

View file

@ -77,7 +77,6 @@ FixNamespaceComments: false
ForEachMacros: ForEachMacros:
# lib: outliers: # lib: outliers:
- 'FOR_ALL_INTERFACES' - 'FOR_ALL_INTERFACES'
- 'FOR_ALL_INTERFACES_ADDRESSES'
# libyang outliers: # libyang outliers:
- 'LY_FOR_KEYS' - 'LY_FOR_KEYS'
- 'LY_LIST_FOR' - 'LY_LIST_FOR'

View file

@ -739,12 +739,11 @@ int
is_interface_ll_address(struct interface *ifp, const unsigned char *address) is_interface_ll_address(struct interface *ifp, const unsigned char *address)
{ {
struct connected *connected; struct connected *connected;
struct listnode *node;
if(!if_up(ifp)) if(!if_up(ifp))
return 0; return 0;
FOR_ALL_INTERFACES_ADDRESSES(ifp, connected, node) { frr_each (if_connected, ifp->connected, connected) {
if (connected->address->family == AF_INET6 if (connected->address->family == AF_INET6
&& memcmp(&connected->address->u.prefix6, address, && memcmp(&connected->address->u.prefix6, address,
IPV6_MAX_BYTELEN) IPV6_MAX_BYTELEN)

View file

@ -82,7 +82,6 @@ static inline int
if_up(struct interface *ifp) if_up(struct interface *ifp)
{ {
return (if_is_operative(ifp) && return (if_is_operative(ifp) &&
ifp->connected != NULL &&
CHECK_FLAG(babel_get_if_nfo(ifp)->flags, BABEL_IF_IS_UP)); CHECK_FLAG(babel_get_if_nfo(ifp)->flags, BABEL_IF_IS_UP));
} }

View file

@ -693,7 +693,6 @@ int bgp_update_address(struct interface *ifp, const union sockunion *dst,
{ {
struct prefix *p, *sel, d; struct prefix *p, *sel, d;
struct connected *connected; struct connected *connected;
struct listnode *node;
int common; int common;
if (!sockunion2hostprefix(dst, &d)) if (!sockunion2hostprefix(dst, &d))
@ -702,7 +701,7 @@ int bgp_update_address(struct interface *ifp, const union sockunion *dst,
sel = NULL; sel = NULL;
common = -1; common = -1;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) { frr_each (if_connected, ifp->connected, connected) {
p = connected->address; p = connected->address;
if (p->family != d.family) if (p->family != d.family)
continue; continue;

View file

@ -146,7 +146,6 @@ static void bgp_start_interface_nbrs(struct bgp *bgp, struct interface *ifp)
static void bgp_nbr_connected_add(struct bgp *bgp, struct nbr_connected *ifc) static void bgp_nbr_connected_add(struct bgp *bgp, struct nbr_connected *ifc)
{ {
struct listnode *node;
struct connected *connected; struct connected *connected;
struct interface *ifp; struct interface *ifp;
struct prefix *p; struct prefix *p;
@ -155,7 +154,7 @@ static void bgp_nbr_connected_add(struct bgp *bgp, struct nbr_connected *ifc)
* valid local address on the interface. * valid local address on the interface.
*/ */
ifp = ifc->ifp; ifp = ifc->ifp;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) { frr_each (if_connected, ifp->connected, connected) {
p = connected->address; p = connected->address;
if (p->family == AF_INET6 if (p->family == AF_INET6
&& IN6_IS_ADDR_LINKLOCAL(&p->u.prefix6)) && IN6_IS_ADDR_LINKLOCAL(&p->u.prefix6))
@ -227,7 +226,7 @@ static int bgp_ifp_up(struct interface *ifp)
if (!bgp) if (!bgp)
return 0; return 0;
for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, c)) frr_each (if_connected, ifp->connected, c)
bgp_connected_add(bgp, c); bgp_connected_add(bgp, c);
for (ALL_LIST_ELEMENTS(ifp->nbr_connected, node, nnode, nc)) for (ALL_LIST_ELEMENTS(ifp->nbr_connected, node, nnode, nc))
@ -258,7 +257,7 @@ static int bgp_ifp_down(struct interface *ifp)
if (!bgp) if (!bgp)
return 0; return 0;
for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, c)) frr_each (if_connected, ifp->connected, c)
bgp_connected_delete(bgp, c); bgp_connected_delete(bgp, c);
for (ALL_LIST_ELEMENTS(ifp->nbr_connected, node, nnode, nc)) for (ALL_LIST_ELEMENTS(ifp->nbr_connected, node, nnode, nc))
@ -559,7 +558,6 @@ static int zebra_read_route(ZAPI_CALLBACK_ARGS)
struct interface *if_lookup_by_ipv4(struct in_addr *addr, vrf_id_t vrf_id) struct interface *if_lookup_by_ipv4(struct in_addr *addr, vrf_id_t vrf_id)
{ {
struct vrf *vrf; struct vrf *vrf;
struct listnode *cnode;
struct interface *ifp; struct interface *ifp;
struct connected *connected; struct connected *connected;
struct prefix_ipv4 p; struct prefix_ipv4 p;
@ -574,7 +572,7 @@ struct interface *if_lookup_by_ipv4(struct in_addr *addr, vrf_id_t vrf_id)
p.prefixlen = IPV4_MAX_BITLEN; p.prefixlen = IPV4_MAX_BITLEN;
FOR_ALL_INTERFACES (vrf, ifp) { FOR_ALL_INTERFACES (vrf, ifp) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
cp = connected->address; cp = connected->address;
if (cp->family == AF_INET) if (cp->family == AF_INET)
@ -588,7 +586,6 @@ struct interface *if_lookup_by_ipv4(struct in_addr *addr, vrf_id_t vrf_id)
struct interface *if_lookup_by_ipv4_exact(struct in_addr *addr, vrf_id_t vrf_id) struct interface *if_lookup_by_ipv4_exact(struct in_addr *addr, vrf_id_t vrf_id)
{ {
struct vrf *vrf; struct vrf *vrf;
struct listnode *cnode;
struct interface *ifp; struct interface *ifp;
struct connected *connected; struct connected *connected;
struct prefix *cp; struct prefix *cp;
@ -598,7 +595,7 @@ struct interface *if_lookup_by_ipv4_exact(struct in_addr *addr, vrf_id_t vrf_id)
return NULL; return NULL;
FOR_ALL_INTERFACES (vrf, ifp) { FOR_ALL_INTERFACES (vrf, ifp) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
cp = connected->address; cp = connected->address;
if (cp->family == AF_INET) if (cp->family == AF_INET)
@ -613,7 +610,6 @@ struct interface *if_lookup_by_ipv6(struct in6_addr *addr, ifindex_t ifindex,
vrf_id_t vrf_id) vrf_id_t vrf_id)
{ {
struct vrf *vrf; struct vrf *vrf;
struct listnode *cnode;
struct interface *ifp; struct interface *ifp;
struct connected *connected; struct connected *connected;
struct prefix_ipv6 p; struct prefix_ipv6 p;
@ -628,7 +624,7 @@ struct interface *if_lookup_by_ipv6(struct in6_addr *addr, ifindex_t ifindex,
p.prefixlen = IPV6_MAX_BITLEN; p.prefixlen = IPV6_MAX_BITLEN;
FOR_ALL_INTERFACES (vrf, ifp) { FOR_ALL_INTERFACES (vrf, ifp) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
cp = connected->address; cp = connected->address;
if (cp->family == AF_INET6) if (cp->family == AF_INET6)
@ -649,7 +645,6 @@ struct interface *if_lookup_by_ipv6_exact(struct in6_addr *addr,
ifindex_t ifindex, vrf_id_t vrf_id) ifindex_t ifindex, vrf_id_t vrf_id)
{ {
struct vrf *vrf; struct vrf *vrf;
struct listnode *cnode;
struct interface *ifp; struct interface *ifp;
struct connected *connected; struct connected *connected;
struct prefix *cp; struct prefix *cp;
@ -659,7 +654,7 @@ struct interface *if_lookup_by_ipv6_exact(struct in6_addr *addr,
return NULL; return NULL;
FOR_ALL_INTERFACES (vrf, ifp) { FOR_ALL_INTERFACES (vrf, ifp) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
cp = connected->address; cp = connected->address;
if (cp->family == AF_INET6) if (cp->family == AF_INET6)
@ -678,11 +673,10 @@ struct interface *if_lookup_by_ipv6_exact(struct in6_addr *addr,
static int if_get_ipv6_global(struct interface *ifp, struct in6_addr *addr) static int if_get_ipv6_global(struct interface *ifp, struct in6_addr *addr)
{ {
struct listnode *cnode;
struct connected *connected; struct connected *connected;
struct prefix *cp; struct prefix *cp;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
cp = connected->address; cp = connected->address;
if (cp->family == AF_INET6) if (cp->family == AF_INET6)
@ -696,11 +690,10 @@ static int if_get_ipv6_global(struct interface *ifp, struct in6_addr *addr)
static bool if_get_ipv6_local(struct interface *ifp, struct in6_addr *addr) static bool if_get_ipv6_local(struct interface *ifp, struct in6_addr *addr)
{ {
struct listnode *cnode;
struct connected *connected; struct connected *connected;
struct prefix *cp; struct prefix *cp;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
cp = connected->address; cp = connected->address;
if (cp->family == AF_INET6) if (cp->family == AF_INET6)
@ -714,11 +707,10 @@ static bool if_get_ipv6_local(struct interface *ifp, struct in6_addr *addr)
static int if_get_ipv4_address(struct interface *ifp, struct in_addr *addr) static int if_get_ipv4_address(struct interface *ifp, struct in_addr *addr)
{ {
struct listnode *cnode;
struct connected *connected; struct connected *connected;
struct prefix *cp; struct prefix *cp;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
cp = connected->address; cp = connected->address;
if ((cp->family == AF_INET) if ((cp->family == AF_INET)
&& !ipv4_martian(&(cp->u.prefix4))) { && !ipv4_martian(&(cp->u.prefix4))) {

View file

@ -1610,12 +1610,11 @@ static int bgp_peer_conf_if_to_su_update_v4(struct peer_connection *connection,
struct connected *ifc; struct connected *ifc;
struct prefix p; struct prefix p;
uint32_t addr; uint32_t addr;
struct listnode *node;
/* If our IPv4 address on the interface is /30 or /31, we can derive the /* If our IPv4 address on the interface is /30 or /31, we can derive the
* IPv4 address of the other end. * IPv4 address of the other end.
*/ */
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
if (ifc->address && (ifc->address->family == AF_INET)) { if (ifc->address && (ifc->address->family == AF_INET)) {
prefix_copy(&p, CONNECTED_PREFIX(ifc)); prefix_copy(&p, CONNECTED_PREFIX(ifc));
if (p.prefixlen == 30) { if (p.prefixlen == 30) {
@ -8278,10 +8277,9 @@ static void bgp_if_finish(struct bgp *bgp)
return; return;
FOR_ALL_INTERFACES (vrf, ifp) { FOR_ALL_INTERFACES (vrf, ifp) {
struct listnode *c_node, *c_nnode;
struct connected *c; struct connected *c;
for (ALL_LIST_ELEMENTS(ifp->connected, c_node, c_nnode, c)) frr_each_safe (if_connected, ifp->connected, c)
bgp_connected_delete(bgp, c); bgp_connected_delete(bgp, c);
} }
} }

View file

@ -233,13 +233,11 @@ static void eigrp_network_run_interface(struct eigrp *eigrp, struct prefix *p,
struct interface *ifp) struct interface *ifp)
{ {
struct eigrp_interface *ei; struct eigrp_interface *ei;
struct listnode *cnode;
struct connected *co; struct connected *co;
/* if interface prefix is match specified prefix, /* if interface prefix is match specified prefix,
then create socket and join multicast group. */ then create socket and join multicast group. */
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, co)) { frr_each (if_connected, ifp->connected, co) {
if (CHECK_FLAG(co->flags, ZEBRA_IFA_SECONDARY)) if (CHECK_FLAG(co->flags, ZEBRA_IFA_SECONDARY))
continue; continue;

View file

@ -489,7 +489,6 @@ static uint8_t isis_circuit_id_gen(struct isis *isis, struct interface *ifp)
void isis_circuit_if_add(struct isis_circuit *circuit, struct interface *ifp) void isis_circuit_if_add(struct isis_circuit *circuit, struct interface *ifp)
{ {
struct listnode *node, *nnode;
struct connected *conn; struct connected *conn;
if (if_is_broadcast(ifp)) { if (if_is_broadcast(ifp)) {
@ -509,20 +508,18 @@ void isis_circuit_if_add(struct isis_circuit *circuit, struct interface *ifp)
circuit->circ_type = CIRCUIT_T_UNKNOWN; circuit->circ_type = CIRCUIT_T_UNKNOWN;
} }
for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, conn)) frr_each (if_connected, ifp->connected, conn)
isis_circuit_add_addr(circuit, conn); isis_circuit_add_addr(circuit, conn);
} }
void isis_circuit_if_del(struct isis_circuit *circuit, struct interface *ifp) void isis_circuit_if_del(struct isis_circuit *circuit, struct interface *ifp)
{ {
struct listnode *node, *nnode;
struct connected *conn; struct connected *conn;
assert(circuit->interface == ifp); assert(circuit->interface == ifp);
/* destroy addresses */ /* destroy addresses */
for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, conn)) frr_each_safe (if_connected, ifp->connected, conn)
isis_circuit_del_addr(circuit, conn); isis_circuit_del_addr(circuit, conn);
circuit->circ_type = CIRCUIT_T_UNKNOWN; circuit->circ_type = CIRCUIT_T_UNKNOWN;

View file

@ -936,7 +936,6 @@ int sr_if_addr_update(struct interface *ifp)
struct isis_circuit *circuit; struct isis_circuit *circuit;
struct isis_area *area; struct isis_area *area;
struct connected *connected; struct connected *connected;
struct listnode *node;
bool need_lsp_regenerate = false; bool need_lsp_regenerate = false;
/* Get corresponding circuit */ /* Get corresponding circuit */
@ -948,7 +947,7 @@ int sr_if_addr_update(struct interface *ifp)
if (!area) if (!area)
return 0; return 0;
FOR_ALL_INTERFACES_ADDRESSES (ifp, connected, node) { frr_each (if_connected, ifp->connected, connected) {
for (int i = 0; i < SR_ALGORITHM_COUNT; i++) { for (int i = 0; i < SR_ALGORITHM_COUNT; i++) {
pcfgs[i] = isis_sr_cfg_prefix_find( pcfgs[i] = isis_sr_cfg_prefix_find(
area, connected->address, i); area, connected->address, i);

View file

@ -330,7 +330,6 @@ void
kif_redistribute(const char *ifname) kif_redistribute(const char *ifname)
{ {
struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT); struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
struct listnode *cnode;
struct interface *ifp; struct interface *ifp;
struct connected *ifc; struct connected *ifc;
struct kif kif; struct kif kif;
@ -343,7 +342,7 @@ kif_redistribute(const char *ifname)
ifp2kif(ifp, &kif); ifp2kif(ifp, &kif);
main_imsg_compose_both(IMSG_IFSTATUS, &kif, sizeof(kif)); main_imsg_compose_both(IMSG_IFSTATUS, &kif, sizeof(kif));
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
ifc2kaddr(ifp, ifc, &ka); ifc2kaddr(ifp, ifc, &ka);
main_imsg_compose_ldpe(IMSG_NEWADDR, 0, &ka, sizeof(ka)); main_imsg_compose_ldpe(IMSG_NEWADDR, 0, &ka, sizeof(ka));
} }
@ -400,7 +399,6 @@ ldp_ifp_destroy(struct interface *ifp)
static int static int
ldp_interface_status_change(struct interface *ifp) ldp_interface_status_change(struct interface *ifp)
{ {
struct listnode *node;
struct connected *ifc; struct connected *ifc;
struct kif kif; struct kif kif;
struct kaddr ka; struct kaddr ka;
@ -411,12 +409,12 @@ ldp_interface_status_change(struct interface *ifp)
main_imsg_compose_both(IMSG_IFSTATUS, &kif, sizeof(kif)); main_imsg_compose_both(IMSG_IFSTATUS, &kif, sizeof(kif));
if (if_is_operative(ifp)) { if (if_is_operative(ifp)) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
ifc2kaddr(ifp, ifc, &ka); ifc2kaddr(ifp, ifc, &ka);
main_imsg_compose_ldpe(IMSG_NEWADDR, 0, &ka, sizeof(ka)); main_imsg_compose_ldpe(IMSG_NEWADDR, 0, &ka, sizeof(ka));
} }
} else { } else {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
ifc2kaddr(ifp, ifc, &ka); ifc2kaddr(ifp, ifc, &ka);
main_imsg_compose_ldpe(IMSG_DELADDR, 0, &ka, sizeof(ka)); main_imsg_compose_ldpe(IMSG_DELADDR, 0, &ka, sizeof(ka));
} }

View file

@ -1282,7 +1282,6 @@ static bool bfd_source_cache_update(struct bfd_source_cache *source,
const struct zapi_nexthop *nh = &route->nexthops[nh_index]; const struct zapi_nexthop *nh = &route->nexthops[nh_index];
const struct interface *interface; const struct interface *interface;
const struct connected *connected; const struct connected *connected;
const struct listnode *node;
interface = if_lookup_by_index(nh->ifindex, nh->vrf_id); interface = if_lookup_by_index(nh->ifindex, nh->vrf_id);
if (interface == NULL) { if (interface == NULL) {
@ -1291,8 +1290,7 @@ static bool bfd_source_cache_update(struct bfd_source_cache *source,
continue; continue;
} }
for (ALL_LIST_ELEMENTS_RO(interface->connected, node, frr_each (if_connected_const, interface->connected, connected) {
connected)) {
if (source->address.family != if (source->address.family !=
connected->address->family) connected->address->family)
continue; continue;

View file

@ -164,8 +164,7 @@ static struct interface *if_new(struct vrf *vrf)
ifp->vrf = vrf; ifp->vrf = vrf;
ifp->connected = list_new(); if_connected_init(ifp->connected);
ifp->connected->del = ifp_connected_free;
ifp->nbr_connected = list_new(); ifp->nbr_connected = list_new();
ifp->nbr_connected->del = (void (*)(void *))nbr_connected_free; ifp->nbr_connected->del = (void (*)(void *))nbr_connected_free;
@ -243,11 +242,14 @@ void if_update_to_new_vrf(struct interface *ifp, vrf_id_t vrf_id)
/* Delete interface structure. */ /* Delete interface structure. */
void if_delete_retain(struct interface *ifp) void if_delete_retain(struct interface *ifp)
{ {
struct connected *ifc;
hook_call(if_del, ifp); hook_call(if_del, ifp);
QOBJ_UNREG(ifp); QOBJ_UNREG(ifp);
/* Free connected address list */ /* Free connected address list */
list_delete_all_node(ifp->connected); while ((ifc = if_connected_pop(ifp->connected)))
ifp_connected_free(ifc);
/* Free connected nbr address list */ /* Free connected nbr address list */
list_delete_all_node(ifp->nbr_connected); list_delete_all_node(ifp->nbr_connected);
@ -265,7 +267,7 @@ void if_delete(struct interface **ifp)
if_delete_retain(ptr); if_delete_retain(ptr);
list_delete(&ptr->connected); if_connected_fini(ptr->connected);
list_delete(&ptr->nbr_connected); list_delete(&ptr->nbr_connected);
if_link_params_free(ptr); if_link_params_free(ptr);
@ -427,7 +429,6 @@ struct interface *if_lookup_address_local(const void *src, int family,
vrf_id_t vrf_id) vrf_id_t vrf_id)
{ {
struct vrf *vrf = vrf_lookup_by_id(vrf_id); struct vrf *vrf = vrf_lookup_by_id(vrf_id);
struct listnode *cnode;
struct interface *ifp, *best_down = NULL; struct interface *ifp, *best_down = NULL;
struct prefix *p; struct prefix *p;
struct connected *c; struct connected *c;
@ -436,7 +437,7 @@ struct interface *if_lookup_address_local(const void *src, int family,
return NULL; return NULL;
FOR_ALL_INTERFACES (vrf, ifp) { FOR_ALL_INTERFACES (vrf, ifp) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, c)) { frr_each (if_connected, ifp->connected, c) {
p = c->address; p = c->address;
if (!p || p->family != family) if (!p || p->family != family)
@ -468,7 +469,6 @@ struct connected *if_lookup_address(const void *matchaddr, int family,
struct vrf *vrf = vrf_lookup_by_id(vrf_id); struct vrf *vrf = vrf_lookup_by_id(vrf_id);
struct prefix addr; struct prefix addr;
int bestlen = 0; int bestlen = 0;
struct listnode *cnode;
struct interface *ifp; struct interface *ifp;
struct connected *c; struct connected *c;
struct connected *match; struct connected *match;
@ -487,7 +487,7 @@ struct connected *if_lookup_address(const void *matchaddr, int family,
match = NULL; match = NULL;
FOR_ALL_INTERFACES (vrf, ifp) { FOR_ALL_INTERFACES (vrf, ifp) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, c)) { frr_each (if_connected, ifp->connected, c) {
if (c->address && (c->address->family == AF_INET) if (c->address && (c->address->family == AF_INET)
&& prefix_match(CONNECTED_PREFIX(c), &addr) && prefix_match(CONNECTED_PREFIX(c), &addr)
&& (c->address->prefixlen > bestlen)) { && (c->address->prefixlen > bestlen)) {
@ -503,12 +503,11 @@ struct connected *if_lookup_address(const void *matchaddr, int family,
struct interface *if_lookup_prefix(const struct prefix *prefix, vrf_id_t vrf_id) struct interface *if_lookup_prefix(const struct prefix *prefix, vrf_id_t vrf_id)
{ {
struct vrf *vrf = vrf_lookup_by_id(vrf_id); struct vrf *vrf = vrf_lookup_by_id(vrf_id);
struct listnode *cnode;
struct interface *ifp; struct interface *ifp;
struct connected *c; struct connected *c;
FOR_ALL_INTERFACES (vrf, ifp) { FOR_ALL_INTERFACES (vrf, ifp) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, c)) { frr_each (if_connected, ifp->connected, c) {
if (prefix_cmp(c->address, prefix) == 0) { if (prefix_cmp(c->address, prefix) == 0) {
return ifp; return ifp;
} }
@ -775,10 +774,9 @@ const char *if_flag_dump(unsigned long flag)
/* For debugging */ /* For debugging */
static void if_dump(const struct interface *ifp) static void if_dump(const struct interface *ifp)
{ {
struct listnode *node; const struct connected *c;
struct connected *c __attribute__((unused));
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, c)) frr_each (if_connected_const, ifp->connected, c)
zlog_info( zlog_info(
"Interface %s vrf %s(%u) index %d metric %d mtu %d mtu6 %d %s", "Interface %s vrf %s(%u) index %d metric %d mtu %d mtu6 %d %s",
ifp->name, ifp->vrf->name, ifp->vrf->vrf_id, ifp->name, ifp->vrf->name, ifp->vrf->vrf_id,
@ -905,11 +903,10 @@ static int connected_same_prefix(const struct prefix *p1,
/* count the number of connected addresses that are in the given family */ /* count the number of connected addresses that are in the given family */
unsigned int connected_count_by_family(struct interface *ifp, int family) unsigned int connected_count_by_family(struct interface *ifp, int family)
{ {
struct listnode *cnode;
struct connected *connected; struct connected *connected;
unsigned int cnt = 0; unsigned int cnt = 0;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) frr_each (if_connected, ifp->connected, connected)
if (connected->address->family == family) if (connected->address->family == family)
cnt++; cnt++;
@ -919,14 +916,9 @@ unsigned int connected_count_by_family(struct interface *ifp, int family)
struct connected *connected_lookup_prefix_exact(struct interface *ifp, struct connected *connected_lookup_prefix_exact(struct interface *ifp,
const struct prefix *p) const struct prefix *p)
{ {
struct listnode *node;
struct listnode *next;
struct connected *ifc; struct connected *ifc;
for (node = listhead(ifp->connected); node; node = next) { frr_each (if_connected, ifp->connected, ifc) {
ifc = listgetdata(node);
next = node->next;
if (connected_same_prefix(ifc->address, p)) if (connected_same_prefix(ifc->address, p))
return ifc; return ifc;
} }
@ -936,17 +928,12 @@ struct connected *connected_lookup_prefix_exact(struct interface *ifp,
struct connected *connected_delete_by_prefix(struct interface *ifp, struct connected *connected_delete_by_prefix(struct interface *ifp,
struct prefix *p) struct prefix *p)
{ {
struct listnode *node;
struct listnode *next;
struct connected *ifc; struct connected *ifc;
/* In case of same prefix come, replace it with new one. */ /* In case of same prefix come, replace it with new one. */
for (node = listhead(ifp->connected); node; node = next) { frr_each_safe (if_connected, ifp->connected, ifc) {
ifc = listgetdata(node);
next = node->next;
if (connected_same_prefix(ifc->address, p)) { if (connected_same_prefix(ifc->address, p)) {
listnode_delete(ifp->connected, ifc); if_connected_del(ifp->connected, ifc);
return ifc; return ifc;
} }
} }
@ -958,13 +945,12 @@ struct connected *connected_delete_by_prefix(struct interface *ifp,
struct connected *connected_lookup_prefix(struct interface *ifp, struct connected *connected_lookup_prefix(struct interface *ifp,
const struct prefix *addr) const struct prefix *addr)
{ {
struct listnode *cnode;
struct connected *c; struct connected *c;
struct connected *match; struct connected *match;
match = NULL; match = NULL;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, c)) { frr_each (if_connected, ifp->connected, c) {
if (c->address && (c->address->family == addr->family) if (c->address && (c->address->family == addr->family)
&& prefix_match(CONNECTED_PREFIX(c), addr) && prefix_match(CONNECTED_PREFIX(c), addr)
&& (!match && (!match
@ -995,16 +981,15 @@ struct connected *connected_add_by_prefix(struct interface *ifp,
} }
/* Add connected address to the interface. */ /* Add connected address to the interface. */
listnode_add(ifp->connected, ifc); if_connected_add_tail(ifp->connected, ifc);
return ifc; return ifc;
} }
struct connected *connected_get_linklocal(struct interface *ifp) struct connected *connected_get_linklocal(struct interface *ifp)
{ {
struct listnode *n;
struct connected *c = NULL; struct connected *c = NULL;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, n, c)) { frr_each (if_connected, ifp->connected, c) {
if (c->address->family == AF_INET6 if (c->address->family == AF_INET6
&& IN6_IS_ADDR_LINKLOCAL(&c->address->u.prefix6)) && IN6_IS_ADDR_LINKLOCAL(&c->address->u.prefix6))
break; break;

View file

@ -204,6 +204,8 @@ struct if_link_params {
#define INTERFACE_LINK_PARAMS_SIZE sizeof(struct if_link_params) #define INTERFACE_LINK_PARAMS_SIZE sizeof(struct if_link_params)
#define HAS_LINK_PARAMS(ifp) ((ifp)->link_params != NULL) #define HAS_LINK_PARAMS(ifp) ((ifp)->link_params != NULL)
PREDECL_DLIST(if_connected);
/* Interface structure */ /* Interface structure */
struct interface { struct interface {
RB_ENTRY(interface) name_entry, index_entry; RB_ENTRY(interface) name_entry, index_entry;
@ -278,7 +280,7 @@ struct interface {
void *distribute_out; void *distribute_out;
/* Connected address list. */ /* Connected address list. */
struct list *connected; struct if_connected_head connected[1];
/* Neighbor connected address list. */ /* Neighbor connected address list. */
struct list *nbr_connected; struct list *nbr_connected;
@ -373,9 +375,6 @@ DECLARE_QOBJ_TYPE(interface);
if (vrf) \ if (vrf) \
RB_FOREACH (ifp, if_name_head, &vrf->ifaces_by_name) RB_FOREACH (ifp, if_name_head, &vrf->ifaces_by_name)
#define FOR_ALL_INTERFACES_ADDRESSES(ifp, connected, node) \
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected))
/* called from the library code whenever interfaces are created/deleted /* called from the library code whenever interfaces are created/deleted
* note: interfaces may not be fully realized at that point; also they * note: interfaces may not be fully realized at that point; also they
* may not exist in the system (ifindex = IFINDEX_INTERNAL) * may not exist in the system (ifindex = IFINDEX_INTERNAL)
@ -410,6 +409,8 @@ DECLARE_KOOH(if_down, (struct interface *ifp), (ifp));
/* Connected address structure. */ /* Connected address structure. */
struct connected { struct connected {
struct if_connected_item item;
/* Attached interface. */ /* Attached interface. */
struct interface *ifp; struct interface *ifp;
@ -459,6 +460,8 @@ struct connected {
uint32_t metric; uint32_t metric;
}; };
DECLARE_DLIST(if_connected, struct connected, item);
/* Nbr Connected address structure. */ /* Nbr Connected address structure. */
struct nbr_connected { struct nbr_connected {
/* Attached interface. */ /* Attached interface. */

View file

@ -259,13 +259,12 @@ static void nhrp_interface_update_address(struct interface *ifp, afi_t afi,
struct nhrp_afi_data *if_ad = &nifp->afi[afi]; struct nhrp_afi_data *if_ad = &nifp->afi[afi];
struct nhrp_cache *nc; struct nhrp_cache *nc;
struct connected *c, *best; struct connected *c, *best;
struct listnode *cnode;
union sockunion addr; union sockunion addr;
char buf[PREFIX_STRLEN]; char buf[PREFIX_STRLEN];
/* Select new best match preferring primary address */ /* Select new best match preferring primary address */
best = NULL; best = NULL;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, c)) { frr_each (if_connected, ifp->connected, c) {
if (PREFIX_FAMILY(c->address) != family) if (PREFIX_FAMILY(c->address) != family)
continue; continue;
if (best == NULL) { if (best == NULL) {

View file

@ -481,7 +481,7 @@ void ospf6_asbr_update_route_ecmp_path(struct ospf6_route *old,
static int ospf6_ase_forward_address_check(struct ospf6 *ospf6, static int ospf6_ase_forward_address_check(struct ospf6 *ospf6,
struct in6_addr *fwd_addr) struct in6_addr *fwd_addr)
{ {
struct listnode *anode, *node, *cnode; struct listnode *anode, *node;
struct ospf6_interface *oi; struct ospf6_interface *oi;
struct ospf6_area *oa; struct ospf6_area *oa;
struct interface *ifp; struct interface *ifp;
@ -494,7 +494,7 @@ static int ospf6_ase_forward_address_check(struct ospf6 *ospf6,
continue; continue;
ifp = oi->interface; ifp = oi->interface;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, c)) { frr_each (if_connected, ifp->connected, c) {
if (IPV6_ADDR_SAME(&c->address->u.prefix6, if (IPV6_ADDR_SAME(&c->address->u.prefix6,
fwd_addr)) fwd_addr))
return 0; return 0;
@ -1407,12 +1407,11 @@ static void ospf6_external_lsa_fwd_addr_set(struct ospf6 *ospf6,
FOR_ALL_INTERFACES (vrf, ifp) { FOR_ALL_INTERFACES (vrf, ifp) {
struct ospf6_interface *oi = ifp->info; struct ospf6_interface *oi = ifp->info;
struct connected *connected; struct connected *connected;
struct listnode *node;
if (!oi || CHECK_FLAG(oi->flag, OSPF6_INTERFACE_DISABLE)) if (!oi || CHECK_FLAG(oi->flag, OSPF6_INTERFACE_DISABLE))
continue; continue;
FOR_ALL_INTERFACES_ADDRESSES (ifp, connected, node) { frr_each (if_connected, ifp->connected, connected) {
if (connected->address->family != AF_INET6) if (connected->address->family != AF_INET6)
continue; continue;
if (IN6_IS_ADDR_LINKLOCAL(&connected->address->u.prefix6)) if (IN6_IS_ADDR_LINKLOCAL(&connected->address->u.prefix6))

View file

@ -343,12 +343,11 @@ void ospf6_interface_disable(struct ospf6_interface *oi)
static struct in6_addr * static struct in6_addr *
ospf6_interface_get_linklocal_address(struct interface *ifp) ospf6_interface_get_linklocal_address(struct interface *ifp)
{ {
struct listnode *n;
struct connected *c; struct connected *c;
struct in6_addr *l = (struct in6_addr *)NULL; struct in6_addr *l = (struct in6_addr *)NULL;
/* for each connected address */ /* for each connected address */
for (ALL_LIST_ELEMENTS_RO(ifp->connected, n, c)) { frr_each (if_connected, ifp->connected, c) {
/* if family not AF_INET6, ignore */ /* if family not AF_INET6, ignore */
if (c->address->family != AF_INET6) if (c->address->family != AF_INET6)
continue; continue;
@ -405,7 +404,6 @@ void ospf6_interface_connected_route_update(struct interface *ifp)
{ {
struct ospf6_interface *oi; struct ospf6_interface *oi;
struct connected *c; struct connected *c;
struct listnode *node, *nnode;
struct in6_addr nh_addr; struct in6_addr nh_addr;
oi = (struct ospf6_interface *)ifp->info; oi = (struct ospf6_interface *)ifp->info;
@ -425,7 +423,7 @@ void ospf6_interface_connected_route_update(struct interface *ifp)
/* update "route to advertise" interface route table */ /* update "route to advertise" interface route table */
ospf6_route_remove_all(oi->route_connected); ospf6_route_remove_all(oi->route_connected);
for (ALL_LIST_ELEMENTS(oi->interface->connected, node, nnode, c)) { frr_each (if_connected, ifp->connected, c) {
if (c->address->family != AF_INET6) if (c->address->family != AF_INET6)
continue; continue;
@ -1015,7 +1013,6 @@ static int ospf6_interface_show(struct vty *vty, struct interface *ifp,
struct ospf6_interface *oi; struct ospf6_interface *oi;
struct connected *c; struct connected *c;
struct prefix *p; struct prefix *p;
struct listnode *i;
char strbuf[PREFIX2STR_BUFFER], drouter[32], bdrouter[32]; char strbuf[PREFIX2STR_BUFFER], drouter[32], bdrouter[32];
uint8_t default_iftype; uint8_t default_iftype;
struct timeval res, now; struct timeval res, now;
@ -1062,7 +1059,7 @@ static int ospf6_interface_show(struct vty *vty, struct interface *ifp,
if (use_json) { if (use_json) {
json_arr = json_object_new_array(); json_arr = json_object_new_array();
for (ALL_LIST_ELEMENTS_RO(ifp->connected, i, c)) { frr_each (if_connected, ifp->connected, c) {
json_addr = json_object_new_object(); json_addr = json_object_new_object();
p = c->address; p = c->address;
prefix2str(p, strbuf, sizeof(strbuf)); prefix2str(p, strbuf, sizeof(strbuf));
@ -1094,7 +1091,7 @@ static int ospf6_interface_show(struct vty *vty, struct interface *ifp,
} else { } else {
vty_out(vty, " Internet Address:\n"); vty_out(vty, " Internet Address:\n");
for (ALL_LIST_ELEMENTS_RO(ifp->connected, i, c)) { frr_each (if_connected, ifp->connected, c) {
p = c->address; p = c->address;
prefix2str(p, strbuf, sizeof(strbuf)); prefix2str(p, strbuf, sizeof(strbuf));
switch (p->family) { switch (p->family) {
@ -1331,11 +1328,10 @@ static int ospf6_interface_show(struct vty *vty, struct interface *ifp,
/* Find the global address to be used as a forwarding address in NSSA LSA.*/ /* Find the global address to be used as a forwarding address in NSSA LSA.*/
struct in6_addr *ospf6_interface_get_global_address(struct interface *ifp) struct in6_addr *ospf6_interface_get_global_address(struct interface *ifp)
{ {
struct listnode *n;
struct connected *c; struct connected *c;
/* for each connected address */ /* for each connected address */
for (ALL_LIST_ELEMENTS_RO(ifp->connected, n, c)) { frr_each (if_connected, ifp->connected, c) {
/* if family not AF_INET6, ignore */ /* if family not AF_INET6, ignore */
if (c->address->family != AF_INET6) if (c->address->family != AF_INET6)
continue; continue;

View file

@ -962,7 +962,7 @@ struct ospf_interface *ospf_vl_new(struct ospf *ospf,
UNSET_FLAG(vi->status, ZEBRA_INTERFACE_LINKDETECTION); UNSET_FLAG(vi->status, ZEBRA_INTERFACE_LINKDETECTION);
co = connected_new(); co = connected_new();
co->ifp = vi; co->ifp = vi;
listnode_add(vi->connected, co); if_connected_add_tail(vi->connected, co);
p = prefix_ipv4_new(); p = prefix_ipv4_new();
p->family = AF_INET; p->family = AF_INET;

View file

@ -1348,7 +1348,7 @@ static int ospf_snmp_if_update(struct interface *ifp)
ifindex = 0; ifindex = 0;
/* Lookup first IPv4 address entry. */ /* Lookup first IPv4 address entry. */
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
p = CONNECTED_ID(ifc); p = CONNECTED_ID(ifc);
if (p->family == AF_INET) { if (p->family == AF_INET) {
@ -1396,11 +1396,10 @@ static int ospf_snmp_if_update(struct interface *ifp)
static int ospf_snmp_is_if_have_addr(struct interface *ifp) static int ospf_snmp_is_if_have_addr(struct interface *ifp)
{ {
struct listnode *nn;
struct connected *ifc; struct connected *ifc;
/* Is this interface having any connected IPv4 address ? */ /* Is this interface having any connected IPv4 address ? */
for (ALL_LIST_ELEMENTS_RO(ifp->connected, nn, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
if (CONNECTED_PREFIX(ifc)->family == AF_INET) if (CONNECTED_PREFIX(ifc)->family == AF_INET)
return 1; return 1;
} }

View file

@ -1444,7 +1444,6 @@ static void ospf_network_run_interface(struct ospf *ospf, struct interface *ifp,
struct prefix *p, struct prefix *p,
struct ospf_area *given_area) struct ospf_area *given_area)
{ {
struct listnode *cnode;
struct connected *co; struct connected *co;
if (memcmp(ifp->name, "VLINK", 5) == 0) if (memcmp(ifp->name, "VLINK", 5) == 0)
@ -1456,7 +1455,7 @@ static void ospf_network_run_interface(struct ospf *ospf, struct interface *ifp,
/* if interface prefix is match specified prefix, /* if interface prefix is match specified prefix,
then create socket and join multicast group. */ then create socket and join multicast group. */
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, co)) frr_each (if_connected, ifp->connected, co)
ospf_network_run_subnet(ospf, co, p, given_area); ospf_network_run_subnet(ospf, co, p, given_area);
} }

View file

@ -440,7 +440,7 @@ int pim_hello_build_tlv(struct interface *ifp, uint8_t *tlv_buf,
} }
/* Secondary Address List */ /* Secondary Address List */
if (ifp->connected->count) { if (if_connected_count(ifp->connected)) {
curr = pim_tlv_append_addrlist_ucast(curr, pastend, ifp, curr = pim_tlv_append_addrlist_ucast(curr, pastend, ifp,
PIM_AF); PIM_AF);
if (!curr) { if (!curr) {

View file

@ -379,7 +379,7 @@ static int pim_sec_addr_update(struct interface *ifp)
sec_addr->flags |= PIM_SEC_ADDRF_STALE; sec_addr->flags |= PIM_SEC_ADDRF_STALE;
} }
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
pim_addr addr = pim_addr_from_prefix(ifc->address); pim_addr addr = pim_addr_from_prefix(ifc->address);
if (pim_addr_is_any(addr)) if (pim_addr_is_any(addr))
@ -723,13 +723,12 @@ void pim_if_addr_del(struct connected *ifc, int force_prim_as_any)
if (pim_ifp && if (pim_ifp &&
(!IPV6_ADDR_CMP(&ifc->address->u.prefix6, &pim_ifp->ll_lowest) || (!IPV6_ADDR_CMP(&ifc->address->u.prefix6, &pim_ifp->ll_lowest) ||
!IPV6_ADDR_CMP(&ifc->address->u.prefix6, &pim_ifp->ll_highest))) { !IPV6_ADDR_CMP(&ifc->address->u.prefix6, &pim_ifp->ll_highest))) {
struct listnode *cnode;
struct connected *cc; struct connected *cc;
memset(&pim_ifp->ll_lowest, 0xff, sizeof(pim_ifp->ll_lowest)); memset(&pim_ifp->ll_lowest, 0xff, sizeof(pim_ifp->ll_lowest));
memset(&pim_ifp->ll_highest, 0, sizeof(pim_ifp->ll_highest)); memset(&pim_ifp->ll_highest, 0, sizeof(pim_ifp->ll_highest));
for (ALL_LIST_ELEMENTS_RO(ifc->ifp->connected, cnode, cc)) { frr_each (if_connected, ifc->ifp->connected, cc) {
if (!IN6_IS_ADDR_LINKLOCAL(&cc->address->u.prefix6) && if (!IN6_IS_ADDR_LINKLOCAL(&cc->address->u.prefix6) &&
!IN6_IS_ADDR_LOOPBACK(&cc->address->u.prefix6)) !IN6_IS_ADDR_LOOPBACK(&cc->address->u.prefix6))
continue; continue;
@ -765,8 +764,6 @@ void pim_if_addr_del(struct connected *ifc, int force_prim_as_any)
void pim_if_addr_add_all(struct interface *ifp) void pim_if_addr_add_all(struct interface *ifp)
{ {
struct connected *ifc; struct connected *ifc;
struct listnode *node;
struct listnode *nextnode;
int v4_addrs = 0; int v4_addrs = 0;
int v6_addrs = 0; int v6_addrs = 0;
struct pim_interface *pim_ifp = ifp->info; struct pim_interface *pim_ifp = ifp->info;
@ -777,7 +774,7 @@ void pim_if_addr_add_all(struct interface *ifp)
if (!pim_ifp) if (!pim_ifp)
return; return;
for (ALL_LIST_ELEMENTS(ifp->connected, node, nextnode, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
struct prefix *p = ifc->address; struct prefix *p = ifc->address;
if (p->family != AF_INET) if (p->family != AF_INET)
@ -813,8 +810,6 @@ void pim_if_addr_add_all(struct interface *ifp)
void pim_if_addr_del_all(struct interface *ifp) void pim_if_addr_del_all(struct interface *ifp)
{ {
struct connected *ifc; struct connected *ifc;
struct listnode *node;
struct listnode *nextnode;
struct pim_instance *pim; struct pim_instance *pim;
pim = ifp->vrf->info; pim = ifp->vrf->info;
@ -825,7 +820,7 @@ void pim_if_addr_del_all(struct interface *ifp)
if (!ifp->info) if (!ifp->info)
return; return;
for (ALL_LIST_ELEMENTS(ifp->connected, node, nextnode, ifc)) { frr_each_safe (if_connected, ifp->connected, ifc) {
struct prefix *p = ifc->address; struct prefix *p = ifc->address;
if (p->family != PIM_AF) if (p->family != PIM_AF)
@ -841,14 +836,12 @@ void pim_if_addr_del_all(struct interface *ifp)
void pim_if_addr_del_all_igmp(struct interface *ifp) void pim_if_addr_del_all_igmp(struct interface *ifp)
{ {
struct connected *ifc; struct connected *ifc;
struct listnode *node;
struct listnode *nextnode;
/* PIM/IGMP enabled ? */ /* PIM/IGMP enabled ? */
if (!ifp->info) if (!ifp->info)
return; return;
for (ALL_LIST_ELEMENTS(ifp->connected, node, nextnode, ifc)) { frr_each_safe (if_connected, ifp->connected, ifc) {
struct prefix *p = ifc->address; struct prefix *p = ifc->address;
if (p->family != AF_INET) if (p->family != AF_INET)
@ -861,7 +854,6 @@ void pim_if_addr_del_all_igmp(struct interface *ifp)
pim_addr pim_find_primary_addr(struct interface *ifp) pim_addr pim_find_primary_addr(struct interface *ifp)
{ {
struct connected *ifc; struct connected *ifc;
struct listnode *node;
struct pim_interface *pim_ifp = ifp->info; struct pim_interface *pim_ifp = ifp->info;
if (pim_ifp && !pim_addr_is_any(pim_ifp->update_source)) if (pim_ifp && !pim_addr_is_any(pim_ifp->update_source))
@ -873,7 +865,7 @@ pim_addr pim_find_primary_addr(struct interface *ifp)
pim_addr best_addr = PIMADDR_ANY; pim_addr best_addr = PIMADDR_ANY;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
pim_addr addr; pim_addr addr;
if (ifc->address->family != AF_INET6) if (ifc->address->family != AF_INET6)
@ -892,7 +884,7 @@ pim_addr pim_find_primary_addr(struct interface *ifp)
int v6_addrs = 0; int v6_addrs = 0;
struct connected *promote_ifc = NULL; struct connected *promote_ifc = NULL;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
switch (ifc->address->family) { switch (ifc->address->family) {
case AF_INET: case AF_INET:
v4_addrs++; v4_addrs++;
@ -1523,7 +1515,6 @@ void pim_if_create_pimreg(struct pim_instance *pim)
struct prefix *pim_if_connected_to_source(struct interface *ifp, pim_addr src) struct prefix *pim_if_connected_to_source(struct interface *ifp, pim_addr src)
{ {
struct listnode *cnode;
struct connected *c; struct connected *c;
struct prefix p; struct prefix p;
@ -1532,7 +1523,7 @@ struct prefix *pim_if_connected_to_source(struct interface *ifp, pim_addr src)
pim_addr_to_prefix(&p, src); pim_addr_to_prefix(&p, src);
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, c)) { frr_each (if_connected, ifp->connected, c) {
if (c->address->family != PIM_AF) if (c->address->family != PIM_AF)
continue; continue;
if (prefix_match(c->address, &p)) if (prefix_match(c->address, &p))

View file

@ -21,7 +21,6 @@
static struct in_addr mtrace_primary_address(struct interface *ifp) static struct in_addr mtrace_primary_address(struct interface *ifp)
{ {
struct connected *ifc; struct connected *ifc;
struct listnode *node;
struct in_addr any; struct in_addr any;
struct pim_interface *pim_ifp; struct pim_interface *pim_ifp;
@ -32,7 +31,7 @@ static struct in_addr mtrace_primary_address(struct interface *ifp)
any.s_addr = INADDR_ANY; any.s_addr = INADDR_ANY;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
struct prefix *p = ifc->address; struct prefix *p = ifc->address;
if (p->family != AF_INET) if (p->family != AF_INET)

View file

@ -743,14 +743,13 @@ static int hello_send(struct interface *ifp, uint16_t holdtime)
pim_ifp = ifp->info; pim_ifp = ifp->info;
if (PIM_DEBUG_PIM_HELLO) if (PIM_DEBUG_PIM_HELLO)
zlog_debug( zlog_debug("%s: to %pPA on %s: holdt=%u prop_d=%u overr_i=%u dis_join_supp=%d dr_prio=%u gen_id=%08x addrs=%zu",
"%s: to %pPA on %s: holdt=%u prop_d=%u overr_i=%u dis_join_supp=%d dr_prio=%u gen_id=%08x addrs=%d", __func__, &qpim_all_pim_routers_addr, ifp->name,
__func__, &qpim_all_pim_routers_addr, ifp->name, holdtime, pim_ifp->pim_propagation_delay_msec,
holdtime, pim_ifp->pim_propagation_delay_msec, pim_ifp->pim_override_interval_msec,
pim_ifp->pim_override_interval_msec, pim_ifp->pim_can_disable_join_suppression,
pim_ifp->pim_can_disable_join_suppression, pim_ifp->pim_dr_priority, pim_ifp->pim_generation_id,
pim_ifp->pim_dr_priority, pim_ifp->pim_generation_id, if_connected_count(ifp->connected));
listcount(ifp->connected));
pim_tlv_size = pim_hello_build_tlv( pim_tlv_size = pim_hello_build_tlv(
ifp, pim_msg + PIM_PIM_MIN_LEN, ifp, pim_msg + PIM_PIM_MIN_LEN,

View file

@ -217,18 +217,17 @@ int pim_encode_addr_group(uint8_t *buf, afi_t afi, int bidir, int scope,
uint8_t *pim_tlv_append_addrlist_ucast(uint8_t *buf, const uint8_t *buf_pastend, uint8_t *pim_tlv_append_addrlist_ucast(uint8_t *buf, const uint8_t *buf_pastend,
struct interface *ifp, int family) struct interface *ifp, int family)
{ {
struct listnode *node;
uint16_t option_len = 0; uint16_t option_len = 0;
uint8_t *curr; uint8_t *curr;
size_t uel; size_t uel;
struct list *ifconnected = ifp->connected; struct connected *ifc;
struct pim_interface *pim_ifp = ifp->info; struct pim_interface *pim_ifp = ifp->info;
pim_addr addr; pim_addr addr;
node = listhead(ifconnected); ifc = if_connected_first(ifp->connected);
/* Empty address list ? */ /* Empty address list ? */
if (!node) { if (!ifc) {
return buf; return buf;
} }
@ -239,8 +238,7 @@ uint8_t *pim_tlv_append_addrlist_ucast(uint8_t *buf, const uint8_t *buf_pastend,
/* Scan secondary address list */ /* Scan secondary address list */
curr = buf + 4; /* skip T and L */ curr = buf + 4; /* skip T and L */
for (; node; node = listnextnode(node)) { for (; ifc; ifc = if_connected_next(ifp->connected, ifc)) {
struct connected *ifc = listgetdata(node);
struct prefix *p = ifc->address; struct prefix *p = ifc->address;
int l_encode; int l_encode;

View file

@ -55,12 +55,11 @@ static int pim_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
static void dump_if_address(struct interface *ifp) static void dump_if_address(struct interface *ifp)
{ {
struct connected *ifc; struct connected *ifc;
struct listnode *node;
zlog_debug("%s %s: interface %s addresses:", __FILE__, __func__, zlog_debug("%s %s: interface %s addresses:", __FILE__, __func__,
ifp->name); ifp->name);
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
struct prefix *p = ifc->address; struct prefix *p = ifc->address;
if (p->family != AF_INET) if (p->family != AF_INET)

View file

@ -128,14 +128,12 @@ static void rip_request_interface_send(struct interface *ifp, uint8_t version)
/* RIPv1 and non multicast interface. */ /* RIPv1 and non multicast interface. */
if (if_is_pointopoint(ifp) || if_is_broadcast(ifp)) { if (if_is_pointopoint(ifp) || if_is_broadcast(ifp)) {
struct listnode *cnode, *cnnode;
struct connected *connected; struct connected *connected;
if (IS_RIP_DEBUG_EVENT) if (IS_RIP_DEBUG_EVENT)
zlog_debug("broadcast request to %s", ifp->name); zlog_debug("broadcast request to %s", ifp->name);
for (ALL_LIST_ELEMENTS(ifp->connected, cnode, cnnode, frr_each (if_connected, ifp->connected, connected) {
connected)) {
if (connected->address->family != AF_INET) if (connected->address->family != AF_INET)
continue; continue;
@ -197,14 +195,13 @@ static void rip_request_interface(struct interface *ifp)
/* Multicast packet receive socket. */ /* Multicast packet receive socket. */
static int rip_multicast_join(struct interface *ifp, int sock) static int rip_multicast_join(struct interface *ifp, int sock)
{ {
struct listnode *cnode;
struct connected *ifc; struct connected *ifc;
if (if_is_operative(ifp) && if_is_multicast(ifp)) { if (if_is_operative(ifp) && if_is_multicast(ifp)) {
if (IS_RIP_DEBUG_EVENT) if (IS_RIP_DEBUG_EVENT)
zlog_debug("multicast join at %s", ifp->name); zlog_debug("multicast join at %s", ifp->name);
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
struct prefix_ipv4 *p; struct prefix_ipv4 *p;
struct in_addr group; struct in_addr group;
@ -228,14 +225,13 @@ static int rip_multicast_join(struct interface *ifp, int sock)
/* Leave from multicast group. */ /* Leave from multicast group. */
static void rip_multicast_leave(struct interface *ifp, int sock) static void rip_multicast_leave(struct interface *ifp, int sock)
{ {
struct listnode *cnode;
struct connected *connected; struct connected *connected;
if (if_is_up(ifp) && if_is_multicast(ifp)) { if (if_is_up(ifp) && if_is_multicast(ifp)) {
if (IS_RIP_DEBUG_EVENT) if (IS_RIP_DEBUG_EVENT)
zlog_debug("multicast leave from %s", ifp->name); zlog_debug("multicast leave from %s", ifp->name);
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
struct prefix_ipv4 *p; struct prefix_ipv4 *p;
struct in_addr group; struct in_addr group;
@ -256,11 +252,10 @@ static void rip_multicast_leave(struct interface *ifp, int sock)
/* Is there and address on interface that I could use ? */ /* Is there and address on interface that I could use ? */
static int rip_if_ipv4_address_check(struct interface *ifp) static int rip_if_ipv4_address_check(struct interface *ifp)
{ {
struct listnode *nn;
struct connected *connected; struct connected *connected;
int count = 0; int count = 0;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, nn, connected)) { frr_each (if_connected, ifp->connected, connected) {
struct prefix *p; struct prefix *p;
p = connected->address; p = connected->address;
@ -279,10 +274,9 @@ int if_check_address(struct rip *rip, struct in_addr addr)
struct interface *ifp; struct interface *ifp;
FOR_ALL_INTERFACES (rip->vrf, ifp) { FOR_ALL_INTERFACES (rip->vrf, ifp) {
struct listnode *cnode;
struct connected *connected; struct connected *connected;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
struct prefix_ipv4 *p; struct prefix_ipv4 *p;
p = (struct prefix_ipv4 *)connected->address; p = (struct prefix_ipv4 *)connected->address;
@ -596,14 +590,13 @@ static int rip_enable_network_lookup_if(struct interface *ifp)
{ {
struct rip_interface *ri = ifp->info; struct rip_interface *ri = ifp->info;
struct rip *rip = ri->rip; struct rip *rip = ri->rip;
struct listnode *node, *nnode;
struct connected *connected; struct connected *connected;
struct prefix_ipv4 address; struct prefix_ipv4 address;
if (!rip) if (!rip)
return -1; return -1;
for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
struct prefix *p; struct prefix *p;
struct route_node *n; struct route_node *n;
@ -780,14 +773,13 @@ static void rip_connect_set(struct interface *ifp, int set)
{ {
struct rip_interface *ri = ifp->info; struct rip_interface *ri = ifp->info;
struct rip *rip = ri->rip; struct rip *rip = ri->rip;
struct listnode *node, *nnode;
struct connected *connected; struct connected *connected;
struct prefix_ipv4 address; struct prefix_ipv4 address;
struct nexthop nh; struct nexthop nh;
memset(&nh, 0, sizeof(nh)); memset(&nh, 0, sizeof(nh));
for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
struct prefix *p; struct prefix *p;
p = connected->address; p = connected->address;

View file

@ -404,7 +404,6 @@ static int rip_filter(int rip_distribute, struct prefix_ipv4 *p,
static int rip_nexthop_check(struct rip *rip, struct in_addr *addr) static int rip_nexthop_check(struct rip *rip, struct in_addr *addr)
{ {
struct interface *ifp; struct interface *ifp;
struct listnode *cnode;
struct connected *ifc; struct connected *ifc;
struct prefix *p; struct prefix *p;
@ -412,7 +411,7 @@ static int rip_nexthop_check(struct rip *rip, struct in_addr *addr)
invalid nexthop. */ invalid nexthop. */
FOR_ALL_INTERFACES (rip->vrf, ifp) { FOR_ALL_INTERFACES (rip->vrf, ifp) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
p = ifc->address; p = ifc->address;
if (p->family == AF_INET if (p->family == AF_INET
@ -2213,8 +2212,8 @@ void rip_output_process(struct connected *ifc, struct sockaddr_in *to,
} }
if (!suppress && rinfo->type == ZEBRA_ROUTE_CONNECT) { if (!suppress && rinfo->type == ZEBRA_ROUTE_CONNECT) {
for (ALL_LIST_ELEMENTS_RO(ifc->ifp->connected, frr_each (if_connected, ifc->ifp->connected,
listnode, tmp_ifc)) tmp_ifc)
if (prefix_match((struct prefix *)p, if (prefix_match((struct prefix *)p,
tmp_ifc->address)) { tmp_ifc->address)) {
suppress = 1; suppress = 1;
@ -2323,8 +2322,8 @@ void rip_output_process(struct connected *ifc, struct sockaddr_in *to,
if (rinfo->metric_out != RIP_METRIC_INFINITY && if (rinfo->metric_out != RIP_METRIC_INFINITY &&
rinfo->type == ZEBRA_ROUTE_CONNECT) { rinfo->type == ZEBRA_ROUTE_CONNECT) {
for (ALL_LIST_ELEMENTS_RO(ifc->ifp->connected, frr_each (if_connected, ifc->ifp->connected,
listnode, tmp_ifc)) tmp_ifc)
if (prefix_match((struct prefix *)p, if (prefix_match((struct prefix *)p,
tmp_ifc->address)) { tmp_ifc->address)) {
rinfo->metric_out = rinfo->metric_out =
@ -2437,7 +2436,6 @@ static void rip_update_interface(struct connected *ifc, uint8_t version,
/* Update send to all interface and neighbor. */ /* Update send to all interface and neighbor. */
static void rip_update_process(struct rip *rip, int route_type) static void rip_update_process(struct rip *rip, int route_type)
{ {
struct listnode *ifnode, *ifnnode;
struct connected *connected; struct connected *connected;
struct interface *ifp; struct interface *ifp;
struct rip_interface *ri; struct rip_interface *ri;
@ -2476,8 +2474,7 @@ static void rip_update_process(struct rip *rip, int route_type)
ifp->ifindex); ifp->ifindex);
/* send update on each connected network */ /* send update on each connected network */
for (ALL_LIST_ELEMENTS(ifp->connected, ifnode, ifnnode, frr_each (if_connected, ifp->connected, connected) {
connected)) {
if (connected->address->family == AF_INET) { if (connected->address->family == AF_INET) {
if (vsend & RIPv1) if (vsend & RIPv1)
rip_update_interface(connected, RIPv1, rip_update_interface(connected, RIPv1,
@ -2768,7 +2765,6 @@ int rip_request_send(struct sockaddr_in *to, struct interface *ifp,
{ {
struct rte *rte; struct rte *rte;
struct rip_packet rip_packet; struct rip_packet rip_packet;
struct listnode *node, *nnode;
memset(&rip_packet, 0, sizeof(rip_packet)); memset(&rip_packet, 0, sizeof(rip_packet));
@ -2792,7 +2788,7 @@ int rip_request_send(struct sockaddr_in *to, struct interface *ifp,
} }
/* send request on each connected network */ /* send request on each connected network */
for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
struct prefix_ipv4 *p; struct prefix_ipv4 *p;
p = (struct prefix_ipv4 *)connected->address; p = (struct prefix_ipv4 *)connected->address;

View file

@ -128,11 +128,10 @@ static int ripng_multicast_leave(struct interface *ifp, int sock)
/* How many link local IPv6 address could be used on the interface ? */ /* How many link local IPv6 address could be used on the interface ? */
static int ripng_if_ipv6_lladdress_check(struct interface *ifp) static int ripng_if_ipv6_lladdress_check(struct interface *ifp)
{ {
struct listnode *nn;
struct connected *connected; struct connected *connected;
int count = 0; int count = 0;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, nn, connected)) { frr_each (if_connected, ifp->connected, connected) {
struct prefix *p; struct prefix *p;
p = connected->address; p = connected->address;
@ -408,14 +407,13 @@ static int ripng_enable_network_lookup_if(struct interface *ifp)
{ {
struct ripng_interface *ri = ifp->info; struct ripng_interface *ri = ifp->info;
struct ripng *ripng = ri->ripng; struct ripng *ripng = ri->ripng;
struct listnode *node;
struct connected *connected; struct connected *connected;
struct prefix_ipv6 address; struct prefix_ipv6 address;
if (!ripng) if (!ripng)
return -1; return -1;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) { frr_each (if_connected, ifp->connected, connected) {
struct prefix *p; struct prefix *p;
struct agg_node *n; struct agg_node *n;
@ -590,11 +588,10 @@ static void ripng_connect_set(struct interface *ifp, int set)
{ {
struct ripng_interface *ri = ifp->info; struct ripng_interface *ri = ifp->info;
struct ripng *ripng = ri->ripng; struct ripng *ripng = ri->ripng;
struct listnode *node, *nnode;
struct connected *connected; struct connected *connected;
struct prefix_ipv6 address; struct prefix_ipv6 address;
for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, connected)) { frr_each (if_connected, ifp->connected, connected) {
struct prefix *p; struct prefix *p;
p = connected->address; p = connected->address;

View file

@ -392,11 +392,10 @@ static void ripng_nexthop_rte(struct rte *rte, struct sockaddr_in6 *from,
/* If ifp has same link-local address then return 1. */ /* If ifp has same link-local address then return 1. */
static int ripng_lladdr_check(struct interface *ifp, struct in6_addr *addr) static int ripng_lladdr_check(struct interface *ifp, struct in6_addr *addr)
{ {
struct listnode *node;
struct connected *connected; struct connected *connected;
struct prefix *p; struct prefix *p;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) { frr_each (if_connected, ifp->connected, connected) {
p = connected->address; p = connected->address;
if (p->family == AF_INET6 if (p->family == AF_INET6

View file

@ -555,7 +555,7 @@ our $Iterators = qr{
TAILQ_FOREACH|TAILQ_FOREACH_SAFE|TAILQ_FOREACH_REVERSE|TAILQ_FOREACH_REVERSE_SAFE| TAILQ_FOREACH|TAILQ_FOREACH_SAFE|TAILQ_FOREACH_REVERSE|TAILQ_FOREACH_REVERSE_SAFE|
RB_FOREACH|RB_FOREACH_SAFE|RB_FOREACH_REVERSE|RB_FOREACH_REVERSE_SAFE| RB_FOREACH|RB_FOREACH_SAFE|RB_FOREACH_REVERSE|RB_FOREACH_REVERSE_SAFE|
SPLAY_FOREACH| SPLAY_FOREACH|
FOR_ALL_INTERFACES|FOR_ALL_INTERFACES_ADDRESSES|JSON_FOREACH| FOR_ALL_INTERFACES|JSON_FOREACH|
LY_FOR_KEYS|LY_LIST_FOR|LY_TREE_FOR|LY_TREE_DFS_BEGIN|LYD_TREE_DFS_BEGIN| LY_FOR_KEYS|LY_LIST_FOR|LY_TREE_FOR|LY_TREE_DFS_BEGIN|LYD_TREE_DFS_BEGIN|
RE_DEST_FOREACH_ROUTE|RE_DEST_FOREACH_ROUTE_SAFE| RE_DEST_FOREACH_ROUTE|RE_DEST_FOREACH_ROUTE_SAFE|
RNODE_FOREACH_RE|RNODE_FOREACH_RE_SAFE| RNODE_FOREACH_RE|RNODE_FOREACH_RE_SAFE|

View file

@ -700,10 +700,9 @@ static int vrrp_bind_to_primary_connected(struct vrrp_router *r)
*/ */
ifp = r->family == AF_INET ? r->vr->ifp : r->mvl_ifp; ifp = r->family == AF_INET ? r->vr->ifp : r->mvl_ifp;
struct listnode *ln;
struct connected *c = NULL; struct connected *c = NULL;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, ln, c)) frr_each (if_connected, ifp->connected, c)
if (c->address->family == r->family) { if (c->address->family == r->family) {
if (r->family == AF_INET6 if (r->family == AF_INET6
&& IN6_IS_ADDR_LINKLOCAL(&c->address->u.prefix6)) && IN6_IS_ADDR_LINKLOCAL(&c->address->u.prefix6))
@ -1171,9 +1170,15 @@ static int vrrp_socket(struct vrrp_router *r)
r->vr->vrid, family2str(r->family)); r->vr->vrid, family2str(r->family));
/* Join Rx socket to VRRP IPv4 multicast group */ /* Join Rx socket to VRRP IPv4 multicast group */
assert(listhead(r->vr->ifp->connected)); struct connected *c;
struct connected *c = listhead(r->vr->ifp->connected)->data; struct in_addr v4;
struct in_addr v4 = c->address->u.prefix4;
frr_each (if_connected, r->vr->ifp->connected, c)
if (c->address->family == AF_INET)
break;
assert(c);
v4 = c->address->u.prefix4;
ret = setsockopt_ipv4_multicast(r->sock_rx, IP_ADD_MEMBERSHIP, ret = setsockopt_ipv4_multicast(r->sock_rx, IP_ADD_MEMBERSHIP,
v4, htonl(VRRP_MCASTV4_GROUP), v4, htonl(VRRP_MCASTV4_GROUP),
@ -1703,7 +1708,6 @@ int vrrp_event(struct vrrp_router *r, int event)
*/ */
static void vrrp_autoconfig_autoaddrupdate(struct vrrp_router *r) static void vrrp_autoconfig_autoaddrupdate(struct vrrp_router *r)
{ {
struct listnode *ln;
struct connected *c = NULL; struct connected *c = NULL;
bool is_v6_ll; bool is_v6_ll;
@ -1714,7 +1718,7 @@ static void vrrp_autoconfig_autoaddrupdate(struct vrrp_router *r)
VRRP_LOGPFX VRRP_LOGPFX_VRID VRRP_LOGPFX_FAM VRRP_LOGPFX VRRP_LOGPFX_VRID VRRP_LOGPFX_FAM
"Setting Virtual IP list to match IPv4 addresses on %s", "Setting Virtual IP list to match IPv4 addresses on %s",
r->vr->vrid, family2str(r->family), r->mvl_ifp->name); r->vr->vrid, family2str(r->family), r->mvl_ifp->name);
for (ALL_LIST_ELEMENTS_RO(r->mvl_ifp->connected, ln, c)) { frr_each (if_connected, r->mvl_ifp->connected, c) {
is_v6_ll = (c->address->family == AF_INET6 is_v6_ll = (c->address->family == AF_INET6
&& IN6_IS_ADDR_LINKLOCAL(&c->address->u.prefix6)); && IN6_IS_ADDR_LINKLOCAL(&c->address->u.prefix6));
if (c->address->family == r->family && !is_v6_ll) { if (c->address->family == r->family && !is_v6_ll) {

View file

@ -36,11 +36,10 @@ static void vrrp_zebra_debug_if_dump_address(struct interface *ifp,
const char *func) const char *func)
{ {
struct connected *ifc; struct connected *ifc;
struct listnode *node;
DEBUGD(&vrrp_dbg_zebra, "%s: interface %s addresses:", func, ifp->name); DEBUGD(&vrrp_dbg_zebra, "%s: interface %s addresses:", func, ifp->name);
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
struct prefix *p = ifc->address; struct prefix *p = ifc->address;
DEBUGD(&vrrp_dbg_zebra, "%s: interface %s address %pFX %s", DEBUGD(&vrrp_dbg_zebra, "%s: interface %s address %pFX %s",

View file

@ -48,7 +48,7 @@ static void connected_withdraw(struct connected *ifc)
UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED); UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED)) { if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED)) {
listnode_delete(ifc->ifp->connected, ifc); if_connected_del(ifc->ifp->connected, ifc);
connected_free(&ifc); connected_free(&ifc);
} }
} }
@ -65,7 +65,7 @@ static void connected_announce(struct interface *ifp, struct connected *ifc)
UNSET_FLAG(ifc->flags, ZEBRA_IFA_UNNUMBERED); UNSET_FLAG(ifc->flags, ZEBRA_IFA_UNNUMBERED);
} }
listnode_add(ifp->connected, ifc); if_connected_add_tail(ifp->connected, ifc);
/* Update interface address information to protocol daemon. */ /* Update interface address information to protocol daemon. */
if (ifc->address->family == AF_INET) if (ifc->address->family == AF_INET)
@ -84,9 +84,8 @@ struct connected *connected_check(struct interface *ifp,
{ {
const struct prefix *p = pu.p; const struct prefix *p = pu.p;
struct connected *ifc; struct connected *ifc;
struct listnode *node;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) frr_each (if_connected, ifp->connected, ifc)
if (prefix_same(ifc->address, p)) if (prefix_same(ifc->address, p))
return ifc; return ifc;
@ -101,9 +100,8 @@ struct connected *connected_check_ptp(struct interface *ifp,
const struct prefix *p = pu.p; const struct prefix *p = pu.p;
const struct prefix *d = du.p; const struct prefix *d = du.p;
struct connected *ifc; struct connected *ifc;
struct listnode *node;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { frr_each (if_connected, ifp->connected, ifc) {
if (!prefix_same(ifc->address, p)) if (!prefix_same(ifc->address, p))
continue; continue;
if (!CONNECTED_PEER(ifc) && !d) if (!CONNECTED_PEER(ifc) && !d)
@ -192,7 +190,6 @@ void connected_up(struct interface *ifp, struct connected *ifc)
uint32_t metric; uint32_t metric;
uint32_t flags = 0; uint32_t flags = 0;
uint32_t count = 0; uint32_t count = 0;
struct listnode *cnode;
struct connected *c; struct connected *c;
zvrf = ifp->vrf->info; zvrf = ifp->vrf->info;
@ -262,7 +259,7 @@ void connected_up(struct interface *ifp, struct connected *ifc)
* for all the addresses on an interface that * for all the addresses on an interface that
* resolve to the same network and mask * resolve to the same network and mask
*/ */
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, c)) { frr_each (if_connected, ifp->connected, c) {
struct prefix cp; struct prefix cp;
prefix_copy(&cp, CONNECTED_PREFIX(c)); prefix_copy(&cp, CONNECTED_PREFIX(c));
@ -376,7 +373,6 @@ void connected_down(struct interface *ifp, struct connected *ifc)
}; };
struct zebra_vrf *zvrf; struct zebra_vrf *zvrf;
uint32_t count = 0; uint32_t count = 0;
struct listnode *cnode;
struct connected *c; struct connected *c;
zvrf = ifp->vrf->info; zvrf = ifp->vrf->info;
@ -439,7 +435,7 @@ void connected_down(struct interface *ifp, struct connected *ifc)
* allow the deletion when are removing the last * allow the deletion when are removing the last
* one. * one.
*/ */
for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, c)) { frr_each (if_connected, ifp->connected, c) {
struct prefix cp; struct prefix cp;
prefix_copy(&cp, CONNECTED_PREFIX(c)); prefix_copy(&cp, CONNECTED_PREFIX(c));
@ -616,9 +612,8 @@ void connected_delete_ipv6(struct interface *ifp,
int connected_is_unnumbered(struct interface *ifp) int connected_is_unnumbered(struct interface *ifp)
{ {
struct connected *connected; struct connected *connected;
struct listnode *node;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) { frr_each (if_connected, ifp->connected, connected) {
if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL) if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL)
&& connected->address->family == AF_INET) && connected->address->family == AF_INET)
return CHECK_FLAG(connected->flags, return CHECK_FLAG(connected->flags,

View file

@ -489,12 +489,11 @@ void if_flags_update(struct interface *ifp, uint64_t newflags)
address. */ address. */
void if_addr_wakeup(struct interface *ifp) void if_addr_wakeup(struct interface *ifp)
{ {
struct listnode *node, *nnode;
struct connected *ifc; struct connected *ifc;
struct prefix *p; struct prefix *p;
enum zebra_dplane_result dplane_res; enum zebra_dplane_result dplane_res;
for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, ifc)) { frr_each_safe (if_connected, ifp->connected, ifc) {
p = ifc->address; p = ifc->address;
if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED) if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED)
@ -637,32 +636,24 @@ void if_add_update(struct interface *ifp)
/* Install connected routes corresponding to an interface. */ /* Install connected routes corresponding to an interface. */
static void if_install_connected(struct interface *ifp) static void if_install_connected(struct interface *ifp)
{ {
struct listnode *node;
struct listnode *next;
struct connected *ifc; struct connected *ifc;
if (ifp->connected) { frr_each (if_connected, ifp->connected, ifc) {
for (ALL_LIST_ELEMENTS(ifp->connected, node, next, ifc)) { if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL))
if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL)) zebra_interface_address_add_update(ifp, ifc);
zebra_interface_address_add_update(ifp, ifc);
connected_up(ifp, ifc); connected_up(ifp, ifc);
}
} }
} }
/* Uninstall connected routes corresponding to an interface. */ /* Uninstall connected routes corresponding to an interface. */
static void if_uninstall_connected(struct interface *ifp) static void if_uninstall_connected(struct interface *ifp)
{ {
struct listnode *node;
struct listnode *next;
struct connected *ifc; struct connected *ifc;
if (ifp->connected) { frr_each_safe (if_connected, ifp->connected, ifc) {
for (ALL_LIST_ELEMENTS(ifp->connected, node, next, ifc)) { zebra_interface_address_delete_update(ifp, ifc);
zebra_interface_address_delete_update(ifp, ifc); connected_down(ifp, ifc);
connected_down(ifp, ifc);
}
} }
} }
@ -670,20 +661,15 @@ static void if_uninstall_connected(struct interface *ifp)
/* TODO - Check why IPv4 handling here is different from install or if_down */ /* TODO - Check why IPv4 handling here is different from install or if_down */
static void if_delete_connected(struct interface *ifp) static void if_delete_connected(struct interface *ifp)
{ {
struct connected *ifc; struct connected *ifc, *ifc_next;
struct prefix cp; struct prefix cp;
struct route_node *rn; struct route_node *rn;
struct zebra_if *zebra_if; struct zebra_if *zebra_if;
struct listnode *node;
struct listnode *last = NULL;
zebra_if = ifp->info; zebra_if = ifp->info;
if (!ifp->connected) for (ifc = if_connected_first(ifp->connected); ifc; ifc = ifc_next) {
return; ifc_next = if_connected_next(ifp->connected, ifc);
while ((node = (last ? last->next : listhead(ifp->connected)))) {
ifc = listgetdata(node);
cp = *CONNECTED_PREFIX(ifc); cp = *CONNECTED_PREFIX(ifc);
apply_mask(&cp); apply_mask(&cp);
@ -732,11 +718,15 @@ static void if_delete_connected(struct interface *ifp)
* (unconditionally). */ * (unconditionally). */
if (!CHECK_FLAG(ifc->conf, if (!CHECK_FLAG(ifc->conf,
ZEBRA_IFC_CONFIGURED)) { ZEBRA_IFC_CONFIGURED)) {
listnode_delete(ifp->connected, if (ifc == ifc_next)
ifc_next = if_connected_next(
ifp->connected,
ifc); ifc);
if_connected_del(ifp->connected,
ifc);
connected_free(&ifc); connected_free(&ifc);
} else }
last = node;
} }
/* Free chain list and respective route node. */ /* Free chain list and respective route node. */
@ -751,14 +741,10 @@ static void if_delete_connected(struct interface *ifp)
UNSET_FLAG(ifc->conf, ZEBRA_IFC_REAL); UNSET_FLAG(ifc->conf, ZEBRA_IFC_REAL);
UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED); UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED)) if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED)) {
last = node; if_connected_del(ifp->connected, ifc);
else {
listnode_delete(ifp->connected, ifc);
connected_free(&ifc); connected_free(&ifc);
} }
} else {
last = node;
} }
} }
} }
@ -2497,12 +2483,12 @@ static void ifs_dump_brief_vty(struct vty *vty, struct vrf *vrf)
} }
uint32_t v6_list_size = 0; uint32_t v6_list_size = 0;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) { frr_each (if_connected, ifp->connected, connected) {
if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL) if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL)
&& (connected->address->family == AF_INET6)) && (connected->address->family == AF_INET6))
v6_list_size++; v6_list_size++;
} }
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) { frr_each (if_connected, ifp->connected, connected) {
if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL) if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL)
&& !CHECK_FLAG(connected->flags, && !CHECK_FLAG(connected->flags,
ZEBRA_IFA_SECONDARY) ZEBRA_IFA_SECONDARY)
@ -2536,7 +2522,6 @@ static void ifs_dump_brief_vty(struct vty *vty, struct vrf *vrf)
static void ifs_dump_brief_vty_json(json_object *json, struct vrf *vrf) static void ifs_dump_brief_vty_json(json_object *json, struct vrf *vrf)
{ {
struct connected *connected; struct connected *connected;
struct listnode *node;
struct interface *ifp; struct interface *ifp;
FOR_ALL_INTERFACES (vrf, ifp) { FOR_ALL_INTERFACES (vrf, ifp) {
@ -2552,7 +2537,7 @@ static void ifs_dump_brief_vty_json(json_object *json, struct vrf *vrf)
json_addrs = json_object_new_array(); json_addrs = json_object_new_array();
json_object_object_add(json_if, "addresses", json_addrs); json_object_object_add(json_if, "addresses", json_addrs);
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) { frr_each (if_connected, ifp->connected, connected) {
if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL) if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL)
&& !CHECK_FLAG(connected->flags, && !CHECK_FLAG(connected->flags,
ZEBRA_IFA_SECONDARY) ZEBRA_IFA_SECONDARY)
@ -2765,7 +2750,7 @@ static void if_dump_vty(struct vty *vty, struct interface *ifp)
connected_dump_vty(vty, NULL, connected); connected_dump_vty(vty, NULL, connected);
} }
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) { frr_each (if_connected, ifp->connected, connected) {
if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL) if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL)
&& (connected->address->family == AF_INET6)) && (connected->address->family == AF_INET6))
connected_dump_vty(vty, NULL, connected); connected_dump_vty(vty, NULL, connected);
@ -3142,7 +3127,7 @@ static void if_dump_vty_json(struct vty *vty, struct interface *ifp,
connected_dump_vty(vty, json_addrs, connected); connected_dump_vty(vty, json_addrs, connected);
} }
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) { frr_each (if_connected, ifp->connected, connected) {
if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL) if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL)
&& (connected->address->family == AF_INET6)) && (connected->address->family == AF_INET6))
connected_dump_vty(vty, json_addrs, connected); connected_dump_vty(vty, json_addrs, connected);
@ -4886,7 +4871,7 @@ int if_ip_address_install(struct interface *ifp, struct prefix *prefix,
ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label); ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label);
/* Add to linked list. */ /* Add to linked list. */
listnode_add(ifp->connected, ifc); if_connected_add_tail(ifp->connected, ifc);
} }
/* This address is configured from zebra. */ /* This address is configured from zebra. */
@ -4981,7 +4966,7 @@ static int ip_address_install(struct vty *vty, struct interface *ifp,
ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label); ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label);
/* Add to linked list. */ /* Add to linked list. */
listnode_add(ifp->connected, ifc); if_connected_add_tail(ifp->connected, ifc);
} }
/* This address is configured from zebra. */ /* This address is configured from zebra. */
@ -5043,7 +5028,7 @@ int if_ip_address_uinstall(struct interface *ifp, struct prefix *prefix)
/* This is not real address or interface is not active. */ /* This is not real address or interface is not active. */
if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED) if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED)
|| !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) { || !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) {
listnode_delete(ifp->connected, ifc); if_connected_del(ifp->connected, ifc);
connected_free(&ifc); connected_free(&ifc);
return CMD_WARNING_CONFIG_FAILED; return CMD_WARNING_CONFIG_FAILED;
} }
@ -5106,7 +5091,7 @@ static int ip_address_uninstall(struct vty *vty, struct interface *ifp,
/* This is not real address or interface is not active. */ /* This is not real address or interface is not active. */
if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED) if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED)
|| !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) { || !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) {
listnode_delete(ifp->connected, ifc); if_connected_del(ifp->connected, ifc);
connected_free(&ifc); connected_free(&ifc);
return CMD_WARNING_CONFIG_FAILED; return CMD_WARNING_CONFIG_FAILED;
} }
@ -5244,7 +5229,7 @@ int if_ipv6_address_install(struct interface *ifp, struct prefix *prefix,
ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label); ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label);
/* Add to linked list. */ /* Add to linked list. */
listnode_add(ifp->connected, ifc); if_connected_add_tail(ifp->connected, ifc);
} }
/* This address is configured from zebra. */ /* This address is configured from zebra. */
@ -5317,7 +5302,7 @@ static int ipv6_address_install(struct vty *vty, struct interface *ifp,
ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label); ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label);
/* Add to linked list. */ /* Add to linked list. */
listnode_add(ifp->connected, ifc); if_connected_add_tail(ifp->connected, ifc);
} }
/* This address is configured from zebra. */ /* This address is configured from zebra. */
@ -5354,9 +5339,8 @@ static int ipv6_address_install(struct vty *vty, struct interface *ifp,
int ipv6_address_configured(struct interface *ifp) int ipv6_address_configured(struct interface *ifp)
{ {
struct connected *connected; struct connected *connected;
struct listnode *node;
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) frr_each (if_connected, ifp->connected, connected)
if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL) if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL)
&& (connected->address->family == AF_INET6)) && (connected->address->family == AF_INET6))
return 1; return 1;
@ -5396,7 +5380,7 @@ static int ipv6_address_uninstall(struct vty *vty, struct interface *ifp,
/* This is not real address or interface is not active. */ /* This is not real address or interface is not active. */
if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED) if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED)
|| !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) { || !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) {
listnode_delete(ifp->connected, ifc); if_connected_del(ifp->connected, ifc);
connected_free(&ifc); connected_free(&ifc);
return CMD_WARNING_CONFIG_FAILED; return CMD_WARNING_CONFIG_FAILED;
} }
@ -5513,7 +5497,6 @@ static int if_config_write(struct vty *vty)
RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
FOR_ALL_INTERFACES (vrf, ifp) { FOR_ALL_INTERFACES (vrf, ifp) {
struct zebra_if *if_data; struct zebra_if *if_data;
struct listnode *addrnode;
struct connected *ifc; struct connected *ifc;
struct prefix *p; struct prefix *p;
@ -5541,8 +5524,7 @@ static int if_config_write(struct vty *vty)
ZEBRA_INTERFACE_LINKDETECTION)) ZEBRA_INTERFACE_LINKDETECTION))
vty_out(vty, " no link-detect\n"); vty_out(vty, " no link-detect\n");
for (ALL_LIST_ELEMENTS_RO(ifp->connected, addrnode, frr_each (if_connected, ifp->connected, ifc) {
ifc)) {
if (CHECK_FLAG(ifc->conf, if (CHECK_FLAG(ifc->conf,
ZEBRA_IFC_CONFIGURED)) { ZEBRA_IFC_CONFIGURED)) {
char buf[INET6_ADDRSTRLEN]; char buf[INET6_ADDRSTRLEN];

View file

@ -87,12 +87,12 @@ static const char *inet_2a(uint32_t a, char *b, size_t b_len)
static struct prefix *irdp_get_prefix(struct interface *ifp) static struct prefix *irdp_get_prefix(struct interface *ifp)
{ {
struct listnode *node;
struct connected *ifc; struct connected *ifc;
if (ifp->connected) frr_each (if_connected, ifp->connected, ifc) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) if (ifc->address->family == AF_INET)
return ifc->address; return ifc->address;
}
return NULL; return NULL;
} }
@ -198,7 +198,6 @@ static void irdp_if_start(struct interface *ifp, int multicast,
{ {
struct zebra_if *zi = ifp->info; struct zebra_if *zi = ifp->info;
struct irdp_interface *irdp = zi->irdp; struct irdp_interface *irdp = zi->irdp;
struct listnode *node;
struct connected *ifc; struct connected *ifc;
uint32_t timer, seed; uint32_t timer, seed;
@ -247,11 +246,12 @@ static void irdp_if_start(struct interface *ifp, int multicast,
/* The spec suggests this for randomness */ /* The spec suggests this for randomness */
seed = 0; seed = 0;
if (ifp->connected) frr_each (if_connected, ifp->connected, ifc) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { if (ifc->address->family == AF_INET) {
seed = ifc->address->u.prefix4.s_addr; seed = ifc->address->u.prefix4.s_addr;
break; break;
} }
}
srandom(seed); srandom(seed);
timer = (frr_weak_random() % IRDP_DEFAULT_INTERVAL) + 1; timer = (frr_weak_random() % IRDP_DEFAULT_INTERVAL) + 1;

View file

@ -197,7 +197,6 @@ void irdp_send_thread(struct event *t_advert)
struct zebra_if *zi = ifp->info; struct zebra_if *zi = ifp->info;
struct irdp_interface *irdp = zi->irdp; struct irdp_interface *irdp = zi->irdp;
struct prefix *p; struct prefix *p;
struct listnode *node, *nnode;
struct connected *ifc; struct connected *ifc;
if (!irdp) if (!irdp)
@ -205,16 +204,15 @@ void irdp_send_thread(struct event *t_advert)
irdp->flags &= ~IF_SOLICIT; irdp->flags &= ~IF_SOLICIT;
if (ifp->connected) frr_each (if_connected, ifp->connected, ifc) {
for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, ifc)) { p = ifc->address;
p = ifc->address;
if (p->family != AF_INET) if (p->family != AF_INET)
continue; continue;
irdp_advertisement(ifp, p); irdp_advertisement(ifp, p);
irdp->irdp_sent++; irdp->irdp_sent++;
} }
tmp = irdp->MaxAdvertInterval - irdp->MinAdvertInterval; tmp = irdp->MaxAdvertInterval - irdp->MinAdvertInterval;
timer = frr_weak_random() % (tmp + 1); timer = frr_weak_random() % (tmp + 1);
@ -237,7 +235,6 @@ void irdp_advert_off(struct interface *ifp)
{ {
struct zebra_if *zi = ifp->info; struct zebra_if *zi = ifp->info;
struct irdp_interface *irdp = zi->irdp; struct irdp_interface *irdp = zi->irdp;
struct listnode *node, *nnode;
int i; int i;
struct connected *ifc; struct connected *ifc;
struct prefix *p; struct prefix *p;
@ -247,19 +244,21 @@ void irdp_advert_off(struct interface *ifp)
EVENT_OFF(irdp->t_advertise); EVENT_OFF(irdp->t_advertise);
if (ifp->connected) frr_each (if_connected, ifp->connected, ifc) {
for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, ifc)) { p = ifc->address;
p = ifc->address;
/* Output some packets with Lifetime 0 if (p->family != AF_INET)
we should add a wait... continue;
*/
for (i = 0; i < IRDP_LAST_ADVERT_MESSAGES; i++) { /* Output some packets with Lifetime 0
irdp->irdp_sent++; we should add a wait...
irdp_advertisement(ifp, p); */
}
for (i = 0; i < IRDP_LAST_ADVERT_MESSAGES; i++) {
irdp->irdp_sent++;
irdp_advertisement(ifp, p);
} }
}
} }

View file

@ -415,7 +415,7 @@ int zsend_interface_addresses(struct zserv *client, struct interface *ifp)
struct nbr_connected *nc; struct nbr_connected *nc;
/* Send interface addresses. */ /* Send interface addresses. */
for (ALL_LIST_ELEMENTS(ifp->connected, cnode, cnnode, c)) { frr_each (if_connected, ifp->connected, c) {
if (!CHECK_FLAG(c->conf, ZEBRA_IFC_REAL)) if (!CHECK_FLAG(c->conf, ZEBRA_IFC_REAL))
continue; continue;

View file

@ -310,13 +310,12 @@ void zebra_evpn_print_hash_detail(struct hash_bucket *bucket, void *data)
int zebra_evpn_del_macip_for_intf(struct interface *ifp, int zebra_evpn_del_macip_for_intf(struct interface *ifp,
struct zebra_evpn *zevpn) struct zebra_evpn *zevpn)
{ {
struct listnode *cnode = NULL, *cnnode = NULL;
struct connected *c = NULL; struct connected *c = NULL;
struct ethaddr macaddr; struct ethaddr macaddr;
memcpy(&macaddr.octet, ifp->hw_addr, ETH_ALEN); memcpy(&macaddr.octet, ifp->hw_addr, ETH_ALEN);
for (ALL_LIST_ELEMENTS(ifp->connected, cnode, cnnode, c)) { frr_each_safe (if_connected, ifp->connected, c) {
struct ipaddr ip; struct ipaddr ip;
memset(&ip, 0, sizeof(struct ipaddr)); memset(&ip, 0, sizeof(struct ipaddr));
@ -344,13 +343,12 @@ int zebra_evpn_del_macip_for_intf(struct interface *ifp,
int zebra_evpn_add_macip_for_intf(struct interface *ifp, int zebra_evpn_add_macip_for_intf(struct interface *ifp,
struct zebra_evpn *zevpn) struct zebra_evpn *zevpn)
{ {
struct listnode *cnode = NULL, *cnnode = NULL;
struct connected *c = NULL; struct connected *c = NULL;
struct ethaddr macaddr; struct ethaddr macaddr;
memcpy(&macaddr.octet, ifp->hw_addr, ETH_ALEN); memcpy(&macaddr.octet, ifp->hw_addr, ETH_ALEN);
for (ALL_LIST_ELEMENTS(ifp->connected, cnode, cnnode, c)) { frr_each_safe (if_connected, ifp->connected, c) {
struct ipaddr ip; struct ipaddr ip;
if (!CHECK_FLAG(c->conf, ZEBRA_IFC_REAL)) if (!CHECK_FLAG(c->conf, ZEBRA_IFC_REAL))
@ -409,13 +407,12 @@ static int ip_prefix_send_to_client(vrf_id_t vrf_id, struct prefix *p,
int zebra_evpn_advertise_subnet(struct zebra_evpn *zevpn, struct interface *ifp, int zebra_evpn_advertise_subnet(struct zebra_evpn *zevpn, struct interface *ifp,
int advertise) int advertise)
{ {
struct listnode *cnode = NULL, *cnnode = NULL;
struct connected *c = NULL; struct connected *c = NULL;
struct ethaddr macaddr; struct ethaddr macaddr;
memcpy(&macaddr.octet, ifp->hw_addr, ETH_ALEN); memcpy(&macaddr.octet, ifp->hw_addr, ETH_ALEN);
for (ALL_LIST_ELEMENTS(ifp->connected, cnode, cnnode, c)) { frr_each (if_connected, ifp->connected, c) {
struct prefix p; struct prefix p;
memcpy(&p, c->address, sizeof(struct prefix)); memcpy(&p, c->address, sizeof(struct prefix));

View file

@ -910,7 +910,7 @@ int lib_interface_zebra_ip_addrs_destroy(struct nb_cb_destroy_args *args)
/* This is not real address or interface is not active. */ /* This is not real address or interface is not active. */
if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED) if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED)
|| !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) { || !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) {
listnode_delete(ifp->connected, ifc); if_connected_del(ifp->connected, ifc);
connected_free(&ifc); connected_free(&ifc);
return NB_ERR_VALIDATION; return NB_ERR_VALIDATION;
} }