diff options
| -rw-r--r-- | bgpd/bgp_evpn_mh.c | 28 | ||||
| -rw-r--r-- | bgpd/bgp_fsm.c | 4 | ||||
| -rw-r--r-- | pimd/pim_iface.c | 20 | ||||
| -rw-r--r-- | pimd/pim_iface.h | 28 | ||||
| -rw-r--r-- | pimd/pim_ifchannel.c | 4 | ||||
| -rw-r--r-- | pimd/pim_igmp.c | 19 | ||||
| -rw-r--r-- | pimd/pim_nb_config.c | 25 | ||||
| -rw-r--r-- | pimd/pim_nht.c | 55 | ||||
| -rw-r--r-- | pimd/pim_pim.c | 12 | ||||
| -rw-r--r-- | pimd/pim_vty.c | 4 | ||||
| -rw-r--r-- | pimd/pim_vxlan.c | 12 | ||||
| -rw-r--r-- | pimd/pim_zebra.c | 7 | ||||
| -rw-r--r-- | pimd/pim_zlookup.c | 6 | ||||
| -rw-r--r-- | zebra/rt_netlink.c | 2 | ||||
| -rw-r--r-- | zebra/zebra_evpn.c | 23 | ||||
| -rw-r--r-- | zebra/zebra_vxlan.c | 27 |
16 files changed, 125 insertions, 151 deletions
diff --git a/bgpd/bgp_evpn_mh.c b/bgpd/bgp_evpn_mh.c index ed3716f601..858fee50b3 100644 --- a/bgpd/bgp_evpn_mh.c +++ b/bgpd/bgp_evpn_mh.c @@ -1273,9 +1273,9 @@ void bgp_evpn_mh_config_ead_export_rt(struct bgp *bgp, } } - if (node_to_del) - list_delete_node(bgp_mh_info->ead_es_export_rtl, - node_to_del); + assert(node_to_del); + list_delete_node(bgp_mh_info->ead_es_export_rtl, + node_to_del); } } else { listnode_add_sort(bgp_mh_info->ead_es_export_rtl, ecomcfg); @@ -1902,9 +1902,6 @@ static struct bgp_evpn_es *bgp_evpn_es_new(struct bgp *bgp, const esi_t *esi) { struct bgp_evpn_es *es; - if (!bgp) - return NULL; - es = XCALLOC(MTYPE_BGP_EVPN_ES, sizeof(struct bgp_evpn_es)); /* set the ESI */ @@ -2364,7 +2361,6 @@ int bgp_evpn_local_es_add(struct bgp *bgp, esi_t *esi, struct in_addr originator_ip, bool oper_up, uint16_t df_pref, bool bypass) { - char buf[ESI_STR_LEN]; struct bgp_evpn_es *es; bool new_es = true; bool regen_esr = false; @@ -2374,15 +2370,8 @@ int bgp_evpn_local_es_add(struct bgp *bgp, esi_t *esi, if (es) { if (CHECK_FLAG(es->flags, BGP_EVPNES_LOCAL)) new_es = false; - } else { + } else es = bgp_evpn_es_new(bgp, esi); - if (!es) { - flog_err(EC_BGP_ES_CREATE, - "%u: Failed to allocate ES entry for ESI %s - at Local ES Add", - bgp->vrf_id, esi_to_str(esi, buf, sizeof(buf))); - return -1; - } - } if (BGP_DEBUG(evpn_mh, EVPN_MH_ES)) zlog_debug("add local es %s orig-ip %pI4 df_pref %u %s", @@ -3821,15 +3810,8 @@ int bgp_evpn_remote_es_evi_add(struct bgp *bgp, struct bgpevpn *vpn, &p->prefix.ead_addr.ip.ipaddr_v4); es = bgp_evpn_es_find(esi); - if (!es) { + if (!es) es = bgp_evpn_es_new(bgp, esi); - if (!es) { - flog_err(EC_BGP_ES_CREATE, - "%u: Failed to allocate ES entry for ESI %s - at remote ES Add", - bgp->vrf_id, esi_to_str(esi, buf, sizeof(buf))); - return -1; - } - } es_evi = bgp_evpn_es_evi_find(es, vpn); if (!es_evi) diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index 26aac6e6f7..6854a6501a 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -2755,10 +2755,10 @@ const char *print_peer_gr_cmd(enum peer_gr_command pr_gr_cmd) peer_gr_cmd = "NO_PEER_GR_CMD"; break; case PEER_DISABLE_CMD: - peer_gr_cmd = "PEER_GR_CMD"; + peer_gr_cmd = "PEER_DISABLE_GR_CMD"; break; case NO_PEER_DISABLE_CMD: - peer_gr_cmd = "NO_PEER_GR_CMD"; + peer_gr_cmd = "NO_PEER_DISABLE_GR_CMD"; break; case PEER_HELPER_CMD: peer_gr_cmd = "PEER_HELPER_CMD"; diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 4470d05663..a644d9cfec 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -150,13 +150,9 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim, assert(pim_ifp->gm_query_max_response_time_dsec < pim_ifp->gm_default_query_interval); - if (pim) - PIM_IF_DO_PIM(pim_ifp->options); + pim_ifp->pim_enable = pim; #if PIM_IPV == 4 - if (igmp) - PIM_IF_DO_IGMP(pim_ifp->options); - - PIM_IF_DO_IGMP_LISTEN_ALLROUTERS(pim_ifp->options); + pim_ifp->igmp_enable = igmp; #endif pim_ifp->gm_join_list = NULL; @@ -317,7 +313,7 @@ static int detect_primary_address_change(struct interface *ifp, if (changed) { /* Before updating pim_ifp send Hello time with 0 hold time */ - if (PIM_IF_TEST_PIM(pim_ifp->options)) { + if (pim_ifp->pim_enable) { pim_hello_send(ifp, 0 /* zero-sec holdtime */); } pim_ifp->primary_address = new_prim_addr; @@ -462,7 +458,7 @@ static void detect_address_change(struct interface *ifp, int force_prim_as_any, if (changed) { - if (!PIM_IF_TEST_PIM(pim_ifp->options)) { + if (!pim_ifp->pim_enable) { return; } @@ -543,7 +539,7 @@ void pim_if_addr_add(struct connected *ifc) #if PIM_IPV == 4 struct in_addr ifaddr = ifc->address->u.prefix4; - if (PIM_IF_TEST_IGMP(pim_ifp->options)) { + if (pim_ifp->igmp_enable) { struct gm_sock *igmp; /* lookup IGMP socket */ @@ -610,7 +606,7 @@ void pim_if_addr_add(struct connected *ifc) } /* igmp mtrace only */ #endif - if (PIM_IF_TEST_PIM(pim_ifp->options)) { + if (pim_ifp->pim_enable) { if (!pim_addr_is_any(pim_ifp->primary_address)) { @@ -802,7 +798,7 @@ void pim_if_addr_add_all(struct interface *ifp) } if (!v4_addrs && v6_addrs && !if_is_loopback(ifp)) { - if (PIM_IF_TEST_PIM(pim_ifp->options)) { + if (pim_ifp->pim_enable) { /* Interface has a valid primary address ? */ if (!pim_addr_is_any(pim_ifp->primary_address)) { @@ -1211,7 +1207,7 @@ long pim_if_t_suppressed_msec(struct interface *ifp) assert(pim_ifp); /* join suppression disabled ? */ - if (PIM_IF_TEST_PIM_CAN_DISABLE_JOIN_SUPPRESSION(pim_ifp->options)) + if (pim_ifp->pim_can_disable_join_suppression) return 0; /* t_suppressed = t_periodic * rand(1.1, 1.4) */ diff --git a/pimd/pim_iface.h b/pimd/pim_iface.h index bab73eae86..b0f7e52ac2 100644 --- a/pimd/pim_iface.h +++ b/pimd/pim_iface.h @@ -34,31 +34,8 @@ #include "bfd.h" #include "pim_str.h" -#define PIM_IF_MASK_PIM (1 << 0) -#define PIM_IF_MASK_IGMP (1 << 1) -#define PIM_IF_MASK_IGMP_LISTEN_ALLROUTERS (1 << 2) -#define PIM_IF_MASK_PIM_CAN_DISABLE_JOIN_SUPPRESSION (1 << 3) - #define PIM_IF_IS_DELETED(ifp) ((ifp)->ifindex == IFINDEX_INTERNAL) -#define PIM_IF_TEST_PIM(options) (PIM_IF_MASK_PIM & (options)) -#define PIM_IF_TEST_IGMP(options) (PIM_IF_MASK_IGMP & (options)) -#define PIM_IF_TEST_IGMP_LISTEN_ALLROUTERS(options) (PIM_IF_MASK_IGMP_LISTEN_ALLROUTERS & (options)) -#define PIM_IF_TEST_PIM_CAN_DISABLE_JOIN_SUPPRESSION(options) \ - (PIM_IF_MASK_PIM_CAN_DISABLE_JOIN_SUPPRESSION & (options)) - -#define PIM_IF_DO_PIM(options) ((options) |= PIM_IF_MASK_PIM) -#define PIM_IF_DO_IGMP(options) ((options) |= PIM_IF_MASK_IGMP) -#define PIM_IF_DO_IGMP_LISTEN_ALLROUTERS(options) ((options) |= PIM_IF_MASK_IGMP_LISTEN_ALLROUTERS) -#define PIM_IF_DO_PIM_CAN_DISABLE_JOIN_SUPPRESSION(options) \ - ((options) |= PIM_IF_MASK_PIM_CAN_DISABLE_JOIN_SUPPRESSION) - -#define PIM_IF_DONT_PIM(options) ((options) &= ~PIM_IF_MASK_PIM) -#define PIM_IF_DONT_IGMP(options) ((options) &= ~PIM_IF_MASK_IGMP) -#define PIM_IF_DONT_IGMP_LISTEN_ALLROUTERS(options) ((options) &= ~PIM_IF_MASK_IGMP_LISTEN_ALLROUTERS) -#define PIM_IF_DONT_PIM_CAN_DISABLE_JOIN_SUPPRESSION(options) \ - ((options) &= ~PIM_IF_MASK_PIM_CAN_DISABLE_JOIN_SUPPRESSION) - #define PIM_I_am_DR(pim_ifp) \ !pim_addr_cmp((pim_ifp)->pim_dr_addr, (pim_ifp)->primary_address) #define PIM_I_am_DualActive(pim_ifp) (pim_ifp)->activeactive == true @@ -93,6 +70,11 @@ struct pim_secondary_addr { }; struct pim_interface { + bool pim_enable : 1; + bool pim_can_disable_join_suppression : 1; + + bool igmp_enable : 1; + uint32_t options; /* bit vector */ ifindex_t mroute_vif_index; struct pim_instance *pim; diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c index f9fb8cf094..54cd824f9e 100644 --- a/pimd/pim_ifchannel.c +++ b/pimd/pim_ifchannel.c @@ -1155,7 +1155,7 @@ int pim_ifchannel_local_membership_add(struct interface *ifp, pim_sgaddr *sg, return 0; } - if (!PIM_IF_TEST_PIM(pim_ifp->options)) { + if (!pim_ifp->pim_enable) { if (PIM_DEBUG_EVENTS) zlog_debug("%s:%pSG PIM is not configured on this interface %s", __func__, sg, ifp->name); @@ -1249,7 +1249,7 @@ void pim_ifchannel_local_membership_del(struct interface *ifp, pim_sgaddr *sg) pim_ifp = ifp->info; if (!pim_ifp) return; - if (!PIM_IF_TEST_PIM(pim_ifp->options)) + if (!pim_ifp->pim_enable) return; orig = ch = pim_ifchannel_find(ifp, sg); diff --git a/pimd/pim_igmp.c b/pimd/pim_igmp.c index 13c51b9372..6dea9f38f1 100644 --- a/pimd/pim_igmp.c +++ b/pimd/pim_igmp.c @@ -255,17 +255,14 @@ static int igmp_sock_open(struct in_addr ifaddr, struct interface *ifp, if (fd < 0) return -1; - if (PIM_IF_TEST_IGMP_LISTEN_ALLROUTERS(pim_options)) { - if (inet_aton(PIM_ALL_ROUTERS, &group)) { - if (!pim_socket_join(fd, group, ifaddr, ifp->ifindex, - pim_ifp)) - ++join; - } else { - zlog_warn( - "%s %s: IGMP socket fd=%d interface %pI4: could not solve %s to group address: errno=%d: %s", - __FILE__, __func__, fd, &ifaddr, - PIM_ALL_ROUTERS, errno, safe_strerror(errno)); - } + if (inet_aton(PIM_ALL_ROUTERS, &group)) { + if (!pim_socket_join(fd, group, ifaddr, ifp->ifindex, pim_ifp)) + ++join; + } else { + zlog_warn( + "%s %s: IGMP socket fd=%d interface %pI4: could not solve %s to group address: errno=%d: %s", + __FILE__, __func__, fd, &ifaddr, PIM_ALL_ROUTERS, errno, + safe_strerror(errno)); } /* diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index ec63200d37..d174b8a0af 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -63,8 +63,7 @@ static void pim_if_membership_clear(struct interface *ifp) pim_ifp = ifp->info; assert(pim_ifp); - if (PIM_IF_TEST_PIM(pim_ifp->options) - && PIM_IF_TEST_IGMP(pim_ifp->options)) { + if (pim_ifp->pim_enable && pim_ifp->igmp_enable) { return; } @@ -90,9 +89,9 @@ static void pim_if_membership_refresh(struct interface *ifp) pim_ifp = ifp->info; assert(pim_ifp); - if (!PIM_IF_TEST_PIM(pim_ifp->options)) + if (!pim_ifp->pim_enable) return; - if (!PIM_IF_TEST_IGMP(pim_ifp->options)) + if (!pim_ifp->igmp_enable) return; /* @@ -143,7 +142,7 @@ static int pim_cmd_interface_add(struct interface *ifp) if (!pim_ifp) pim_ifp = pim_if_new(ifp, false, true, false, false); else - PIM_IF_DO_PIM(pim_ifp->options); + pim_ifp->pim_enable = true; pim_if_addr_add_all(ifp); pim_if_membership_refresh(ifp); @@ -159,7 +158,7 @@ static int pim_cmd_interface_delete(struct interface *ifp) if (!pim_ifp) return 1; - PIM_IF_DONT_PIM(pim_ifp->options); + pim_ifp->pim_enable = false; pim_if_membership_clear(ifp); @@ -169,7 +168,7 @@ static int pim_cmd_interface_delete(struct interface *ifp) */ pim_sock_delete(ifp, "pim unconfigured on interface"); - if (!PIM_IF_TEST_IGMP(pim_ifp->options)) { + if (!pim_ifp->igmp_enable) { pim_if_addr_del_all(ifp); pim_if_delete(ifp); } @@ -360,8 +359,8 @@ static int pim_cmd_igmp_start(struct interface *ifp) pim_ifp = pim_if_new(ifp, true, false, false, false); need_startup = 1; } else { - if (!PIM_IF_TEST_IGMP(pim_ifp->options)) { - PIM_IF_DO_IGMP(pim_ifp->options); + if (!pim_ifp->igmp_enable) { + pim_ifp->igmp_enable = true; need_startup = 1; } } @@ -2539,13 +2538,13 @@ int lib_interface_gmp_address_family_destroy(struct nb_cb_destroy_args *args) if (!pim_ifp) return NB_OK; - PIM_IF_DONT_IGMP(pim_ifp->options); + pim_ifp->igmp_enable = false; pim_if_membership_clear(ifp); pim_if_addr_del_all_igmp(ifp); - if (!PIM_IF_TEST_PIM(pim_ifp->options)) + if (!pim_ifp->pim_enable) pim_if_delete(ifp); } @@ -2596,13 +2595,13 @@ int lib_interface_gmp_address_family_enable_modify( if (!pim_ifp) return NB_ERR_INCONSISTENCY; - PIM_IF_DONT_IGMP(pim_ifp->options); + pim_ifp->igmp_enable = false; pim_if_membership_clear(ifp); pim_if_addr_del_all_igmp(ifp); - if (!PIM_IF_TEST_PIM(pim_ifp->options)) + if (!pim_ifp->pim_enable) pim_if_delete(ifp); } } diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index 94dcfb8265..106bce61db 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -696,9 +696,7 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS) int i; struct pim_rpf rpf; struct pim_nexthop_cache *pnc = NULL; - struct pim_neighbor *nbr = NULL; struct interface *ifp = NULL; - struct interface *ifp1 = NULL; struct vrf *vrf = vrf_lookup_by_id(vrf_id); struct pim_instance *pim; struct zapi_route nhr; @@ -739,11 +737,6 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS) for (i = 0; i < nhr.nexthop_num; i++) { nexthop = nexthop_from_zapi_nexthop(&nhr.nexthops[i]); switch (nexthop->type) { - case NEXTHOP_TYPE_IPV4: - case NEXTHOP_TYPE_IPV4_IFINDEX: - case NEXTHOP_TYPE_IPV6: - case NEXTHOP_TYPE_BLACKHOLE: - break; case NEXTHOP_TYPE_IFINDEX: /* * Connected route (i.e. no nexthop), use @@ -760,31 +753,44 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS) pnc->rpf.rpf_addr.u.prefix6; #endif break; - case NEXTHOP_TYPE_IPV6_IFINDEX: +#if PIM_IPV == 4 + /* RFC5549 IPv4-over-IPv6 nexthop handling: + * if we get an IPv6 nexthop in IPv4 PIM, hunt down a + * PIM neighbor and use that instead. + */ + case NEXTHOP_TYPE_IPV6_IFINDEX: { + struct interface *ifp1 = NULL; + struct pim_neighbor *nbr = NULL; + ifp1 = if_lookup_by_index(nexthop->ifindex, pim->vrf->vrf_id); if (!ifp1) nbr = NULL; else + /* FIXME: should really use nbr's + * secondary address list here + */ nbr = pim_neighbor_find_if(ifp1); + /* Overwrite with Nbr address as NH addr */ if (nbr) -#if PIM_IPV == 4 nexthop->gate.ipv4 = nbr->source_addr; -#else - nexthop->gate.ipv6 = nbr->source_addr; -#endif - else { + else // Mark nexthop address to 0 until PIM // Nbr is resolved. -#if PIM_IPV == 4 nexthop->gate.ipv4 = PIMADDR_ANY; + + break; + } #else - nexthop->gate.ipv6 = PIMADDR_ANY; + case NEXTHOP_TYPE_IPV6_IFINDEX: #endif - } - + case NEXTHOP_TYPE_IPV6: + case NEXTHOP_TYPE_IPV4: + case NEXTHOP_TYPE_IPV4_IFINDEX: + case NEXTHOP_TYPE_BLACKHOLE: + /* nothing to do for the other nexthop types */ break; } @@ -804,13 +810,18 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS) continue; } - if (PIM_DEBUG_PIM_NHT) + if (PIM_DEBUG_PIM_NHT) { +#if PIM_IPV == 4 + pim_addr nhaddr = nexthop->gate.ipv4; +#else + pim_addr nhaddr = nexthop->gate.ipv6; +#endif zlog_debug( - "%s: NHT addr %pFX(%s) %d-nhop via %pI4(%s) type %d distance:%u metric:%u ", + "%s: NHT addr %pFX(%s) %d-nhop via %pPA(%s) type %d distance:%u metric:%u ", __func__, &match, pim->vrf->name, i + 1, - &nexthop->gate.ipv4, ifp->name, - nexthop->type, nhr.distance, - nhr.metric); + &nhaddr, ifp->name, nexthop->type, + nhr.distance, nhr.metric); + } if (!ifp->info) { /* diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c index 50bbc0fe18..1baa5c38ca 100644 --- a/pimd/pim_pim.c +++ b/pimd/pim_pim.c @@ -526,11 +526,8 @@ void pim_sock_reset(struct interface *ifp) PIM_DEFAULT_PROPAGATION_DELAY_MSEC; pim_ifp->pim_override_interval_msec = PIM_DEFAULT_OVERRIDE_INTERVAL_MSEC; - if (PIM_DEFAULT_CAN_DISABLE_JOIN_SUPPRESSION) { - PIM_IF_DO_PIM_CAN_DISABLE_JOIN_SUPPRESSION(pim_ifp->options); - } else { - PIM_IF_DONT_PIM_CAN_DISABLE_JOIN_SUPPRESSION(pim_ifp->options); - } + pim_ifp->pim_can_disable_join_suppression = + PIM_DEFAULT_CAN_DISABLE_JOIN_SUPPRESSION; /* neighbors without lan_delay */ pim_ifp->pim_number_of_nonlandelay_neighbors = 0; @@ -702,8 +699,7 @@ static int hello_send(struct interface *ifp, uint16_t holdtime) __func__, &qpim_all_pim_routers_addr, ifp->name, holdtime, pim_ifp->pim_propagation_delay_msec, pim_ifp->pim_override_interval_msec, - PIM_IF_TEST_PIM_CAN_DISABLE_JOIN_SUPPRESSION( - pim_ifp->options), + pim_ifp->pim_can_disable_join_suppression, pim_ifp->pim_dr_priority, pim_ifp->pim_generation_id, listcount(ifp->connected)); @@ -713,7 +709,7 @@ static int hello_send(struct interface *ifp, uint16_t holdtime) pim_ifp->pim_dr_priority, pim_ifp->pim_generation_id, pim_ifp->pim_propagation_delay_msec, pim_ifp->pim_override_interval_msec, - PIM_IF_TEST_PIM_CAN_DISABLE_JOIN_SUPPRESSION(pim_ifp->options)); + pim_ifp->pim_can_disable_join_suppression); if (pim_tlv_size < 0) { return -1; } diff --git a/pimd/pim_vty.c b/pimd/pim_vty.c index a0dea63b79..b360181f43 100644 --- a/pimd/pim_vty.c +++ b/pimd/pim_vty.c @@ -289,7 +289,7 @@ static int pim_igmp_config_write(struct vty *vty, int writes, struct pim_interface *pim_ifp) { /* IF ip igmp */ - if (PIM_IF_TEST_IGMP(pim_ifp->options)) { + if (pim_ifp->igmp_enable) { vty_out(vty, " ip igmp\n"); ++writes; } @@ -361,7 +361,7 @@ int pim_config_write(struct vty *vty, int writes, struct interface *ifp, { struct pim_interface *pim_ifp = ifp->info; - if (PIM_IF_TEST_PIM(pim_ifp->options)) { + if (pim_ifp->pim_enable) { vty_out(vty, " " PIM_AF_NAME " pim\n"); ++writes; } diff --git a/pimd/pim_vxlan.c b/pimd/pim_vxlan.c index 5e55b9f9c8..120293dbfd 100644 --- a/pimd/pim_vxlan.c +++ b/pimd/pim_vxlan.c @@ -880,6 +880,12 @@ void pim_vxlan_mlag_update(bool enable, bool peer_state, uint32_t role, */ pim = pim_get_pim_instance(VRF_DEFAULT); + if (!pim) { + if (PIM_DEBUG_VXLAN) + zlog_debug("%s: Unable to find pim instance", __func__); + return; + } + if (enable) vxlan_mlag.flags |= PIM_VXLAN_MLAGF_ENABLED; else @@ -1137,7 +1143,7 @@ void pim_vxlan_add_term_dev(struct pim_instance *pim, /* enable pim on the term ifp */ pim_ifp = (struct pim_interface *)ifp->info; if (pim_ifp) { - PIM_IF_DO_PIM(pim_ifp->options); + pim_ifp->pim_enable = true; /* ifp is already oper up; activate it as a term dev */ if (pim_ifp->mroute_vif_index >= 0) pim_vxlan_term_oif_update(pim, ifp); @@ -1165,8 +1171,8 @@ void pim_vxlan_del_term_dev(struct pim_instance *pim) pim_ifp = (struct pim_interface *)ifp->info; if (pim_ifp) { - PIM_IF_DONT_PIM(pim_ifp->options); - if (!PIM_IF_TEST_IGMP(pim_ifp->options)) + pim_ifp->pim_enable = false; + if (!pim_ifp->igmp_enable) pim_if_delete(ifp); } } diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 7f463715a5..4bed8d5b73 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -166,6 +166,13 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS) struct pim_instance *pim; pim = pim_get_pim_instance(vrf_id); + if (!pim) { + if (PIM_DEBUG_ZEBRA) + zlog_debug("%s: Unable to find pim instance", + __func__); + return 0; + } + pim_ifp->pim = pim; pim_rp_check_on_if_add(pim_ifp); diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c index c487f995e7..5d99f131a8 100644 --- a/pimd/pim_zlookup.c +++ b/pimd/pim_zlookup.c @@ -388,6 +388,12 @@ void zclient_lookup_read_pipe(struct thread *thread) struct pim_zlookup_nexthop nexthop_tab[10]; struct in_addr l = {.s_addr = INADDR_ANY}; + if (!pim) { + if (PIM_DEBUG_PIM_NHT_DETAIL) + zlog_debug("%s: Unable to find pim instance", __func__); + return; + } + zclient_lookup_nexthop_once(pim, nexthop_tab, 10, l); thread_add_timer(router->master, zclient_lookup_read_pipe, zlookup, 60, &zlookup_read); diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index f2cf9122fa..2ff083dec5 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -3273,7 +3273,7 @@ static int netlink_macfdb_change(struct nlmsghdr *h, int len, ns_id_t ns_id) memcpy(&mac, RTA_DATA(tb[NDA_LLADDR]), ETH_ALEN); - if ((NDA_VLAN <= NDA_MAX) && tb[NDA_VLAN]) { + if (tb[NDA_VLAN]) { vid_present = 1; vid = *(uint16_t *)RTA_DATA(tb[NDA_VLAN]); snprintf(vid_buf, sizeof(vid_buf), " VLAN %u", vid); diff --git a/zebra/zebra_evpn.c b/zebra/zebra_evpn.c index d9d21462fb..d223a21eda 100644 --- a/zebra/zebra_evpn.c +++ b/zebra/zebra_evpn.c @@ -649,10 +649,9 @@ static int zebra_evpn_map_vlan_ns(struct ns *ns, struct zebra_l2info_vxlan *vxl = NULL; struct zebra_from_svi_param *in_param = (struct zebra_from_svi_param *)_in_param; - int found = 0; - if (!in_param) - return NS_WALK_STOP; + assert(p_zevpn && in_param); + br_if = in_param->br_if; zif = in_param->zif; assert(zif); @@ -676,17 +675,13 @@ static int zebra_evpn_map_vlan_ns(struct ns *ns, if (!in_param->bridge_vlan_aware || vxl->access_vlan == in_param->vid) { - found = 1; - break; + zevpn = zebra_evpn_lookup(vxl->vni); + *p_zevpn = zevpn; + return NS_WALK_STOP; } } - if (!found) - return NS_WALK_CONTINUE; - zevpn = zebra_evpn_lookup(vxl->vni); - if (p_zevpn) - *p_zevpn = zevpn; - return NS_WALK_STOP; + return NS_WALK_CONTINUE; } /* @@ -831,8 +826,7 @@ static int zvni_map_to_macvlan_ns(struct ns *ns, struct interface *tmp_if = NULL; struct zebra_if *zif; - if (!in_param) - return NS_WALK_STOP; + assert(in_param && p_ifp); /* Identify corresponding VLAN interface. */ for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) { @@ -846,8 +840,7 @@ static int zvni_map_to_macvlan_ns(struct ns *ns, continue; if (zif->link == in_param->svi_if) { - if (p_ifp) - *p_ifp = tmp_if; + *p_ifp = tmp_if; return NS_WALK_STOP; } } diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c index 13e1f63457..fc7eb8c87a 100644 --- a/zebra/zebra_vxlan.c +++ b/zebra/zebra_vxlan.c @@ -1754,6 +1754,8 @@ static int zl3vni_map_to_vxlan_if_ns(struct ns *ns, if (!zvrf) return NS_WALK_STOP; + assert(_pifp); + /* loop through all vxlan-interface */ for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) { @@ -1784,8 +1786,7 @@ static int zl3vni_map_to_vxlan_if_ns(struct ns *ns, zl3vni->local_vtep_ip = vxl->vtep_ip; - if (_pifp) - *_pifp = (void *)ifp; + *_pifp = (void *)ifp; return NS_WALK_STOP; } @@ -1856,7 +1857,6 @@ struct zebra_l3vni *zl3vni_from_vrf(vrf_id_t vrf_id) static int zl3vni_from_svi_ns(struct ns *ns, void *_in_param, void **_p_zl3vni) { - int found = 0; struct zebra_ns *zns = ns->info; struct zebra_l3vni **p_zl3vni = (struct zebra_l3vni **)_p_zl3vni; struct zebra_from_svi_param *in_param = @@ -1866,8 +1866,7 @@ static int zl3vni_from_svi_ns(struct ns *ns, void *_in_param, void **_p_zl3vni) struct zebra_if *zif = NULL; struct zebra_l2info_vxlan *vxl = NULL; - if (!in_param) - return NS_WALK_STOP; + assert(in_param && p_zl3vni); /* loop through all vxlan-interface */ for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) { @@ -1886,17 +1885,12 @@ static int zl3vni_from_svi_ns(struct ns *ns, void *_in_param, void **_p_zl3vni) if (!in_param->bridge_vlan_aware || vxl->access_vlan == in_param->vid) { - found = 1; - break; + *p_zl3vni = zl3vni_lookup(vxl->vni); + return NS_WALK_STOP; } } - if (!found) - return NS_WALK_CONTINUE; - - if (p_zl3vni) - *p_zl3vni = zl3vni_lookup(vxl->vni); - return NS_WALK_STOP; + return NS_WALK_CONTINUE; } /* @@ -5130,8 +5124,13 @@ int zebra_vxlan_if_update(struct interface *ifp, uint16_t chgflags) zevpn_vxlan_if_set(zevpn, ifp, true /* set */); vlan_if = zvni_map_to_svi(vxl->access_vlan, zif->brslave_info.br_if); - if (vlan_if) + if (vlan_if) { zevpn->svi_if = vlan_if; + zevpn->vrf_id = vlan_if->vrf->vrf_id; + zl3vni = zl3vni_from_vrf(vlan_if->vrf->vrf_id); + if (zl3vni) + listnode_add_sort_nodup(zl3vni->l2vnis, zevpn); + } /* Take further actions needed. * Note that if we are here, there is a change of interest. |
