forked from Mirror/frr
*: 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:
parent
af22ff0bd5
commit
8b23c0b0bd
|
@ -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'
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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))) {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
51
lib/if.c
51
lib/if.c
|
@ -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;
|
||||||
|
|
11
lib/if.h
11
lib/if.h
|
@ -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. */
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
18
ripd/ripd.c
18
ripd/ripd.c
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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|
|
||||||
|
|
18
vrrpd/vrrp.c
18
vrrpd/vrrp.c
|
@ -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) {
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue