pim6d: reenable address management code

A few more pieces that should now work reasonably well for IPv6.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2022-03-10 13:10:37 +01:00
parent cfef61553f
commit 97feb13f0f
3 changed files with 30 additions and 29 deletions

View File

@ -127,7 +127,6 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,
pim_ifp->pim = ifp->vrf->info;
pim_ifp->mroute_vif_index = -1;
#if PIM_IPV == 4
pim_ifp->igmp_version = IGMP_DEFAULT_VERSION;
pim_ifp->gm_default_robustness_variable =
IGMP_DEFAULT_ROBUSTNESS_VARIABLE;
@ -153,10 +152,12 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,
if (pim)
PIM_IF_DO_PIM(pim_ifp->options);
#if PIM_IPV == 4
if (igmp)
PIM_IF_DO_IGMP(pim_ifp->options);
PIM_IF_DO_IGMP_LISTEN_ALLROUTERS(pim_ifp->options);
#endif
pim_ifp->gm_join_list = NULL;
pim_ifp->pim_neighbor_list = NULL;
@ -186,10 +187,11 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,
ifp->info = pim_ifp;
#if PIM_IPV == 4
pim_sock_reset(ifp);
#endif
pim_if_add_vif(ifp, ispimreg, is_vxlan_term);
#endif
pim_ifp->pim->mcast_if_count++;
return pim_ifp;
@ -208,9 +210,12 @@ void pim_if_delete(struct interface *ifp)
if (pim_ifp->gm_join_list) {
pim_if_igmp_join_del_all(ifp);
}
#endif
pim_ifchannel_delete_all(ifp);
#if PIM_IPV == 4
igmp_sock_delete_all(ifp);
#endif
pim_neighbor_delete_all(ifp, "Interface removed from configuration");
@ -224,7 +229,6 @@ void pim_if_delete(struct interface *ifp)
XFREE(MTYPE_PIM_INTERFACE, pim_ifp->boundary_oil_plist);
XFREE(MTYPE_PIM_INTERFACE, pim_ifp);
#endif
ifp->info = NULL;
}
@ -1618,7 +1622,6 @@ static int pim_ifp_create(struct interface *ifp)
*/
if (pim_ifp)
pim_ifp->pim = pim;
#if PIM_IPV == 4
pim_if_addr_add_all(ifp);
/*
@ -1630,7 +1633,6 @@ static int pim_ifp_create(struct interface *ifp)
* this is a no-op if it's already been done.
*/
pim_if_create_pimreg(pim);
#endif
}
#if PIM_IPV == 4
@ -1668,6 +1670,7 @@ static int pim_ifp_create(struct interface *ifp)
static int pim_ifp_up(struct interface *ifp)
{
uint32_t table_id;
struct pim_interface *pim_ifp;
struct pim_instance *pim;
@ -1690,9 +1693,6 @@ static int pim_ifp_up(struct interface *ifp)
if (pim_ifp)
pim_ifp->pim = pim;
#if PIM_IPV == 4
uint32_t table_id;
/*
pim_if_addr_add_all() suffices for bringing up both IGMP and
PIM
@ -1721,7 +1721,6 @@ static int pim_ifp_up(struct interface *ifp)
}
}
}
#endif
return 0;
}
@ -1735,7 +1734,6 @@ static int pim_ifp_down(struct interface *ifp)
ifp->mtu, if_is_operative(ifp));
}
#if PIM_IPV == 4
if (!if_is_operative(ifp)) {
pim_ifchannel_delete_all(ifp);
/*
@ -1744,6 +1742,7 @@ static int pim_ifp_down(struct interface *ifp)
*/
pim_if_addr_del_all(ifp);
#if PIM_IPV == 4
/*
pim_sock_delete() closes the socket, stops read and timer
threads,
@ -1752,13 +1751,15 @@ static int pim_ifp_down(struct interface *ifp)
if (ifp->info) {
pim_sock_delete(ifp, "link down");
}
#endif
}
if (ifp->info) {
pim_if_del_vif(ifp);
#if PIM_IPV == 4
pim_ifstat_reset(ifp);
}
#endif
}
return 0;
}
@ -1773,12 +1774,12 @@ static int pim_ifp_destroy(struct interface *ifp)
ifp->mtu, if_is_operative(ifp));
}
#if PIM_IPV == 4
struct pim_instance *pim;
if (!if_is_operative(ifp))
pim_if_addr_del_all(ifp);
#if PIM_IPV == 4
struct pim_instance *pim;
pim = ifp->vrf->info;
if (pim && pim->vxlan.term_if == ifp)
pim_vxlan_del_term_dev(pim);

View File

@ -128,6 +128,15 @@ void pim_igmp_other_querier_timer_off(struct gm_sock *igmp);
int igmp_validate_checksum(char *igmp_msg, int igmp_msg_len);
#else /* PIM_IPV != 4 */
static inline void pim_igmp_if_init(struct pim_interface *pim_ifp,
struct interface *ifp)
{
}
static inline void pim_igmp_if_fini(struct pim_interface *pim_ifp)
{
}
static inline void pim_igmp_general_query_on(struct gm_sock *igmp)
{
}

View File

@ -55,7 +55,6 @@ struct zclient *zclient;
/* Router-id update message from zebra. */
__attribute__((unused))
static int pim_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
{
struct prefix router_id;
@ -65,7 +64,6 @@ static int pim_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
return 0;
}
__attribute__((unused))
static int pim_zebra_interface_vrf_update(ZAPI_CALLBACK_ARGS)
{
struct interface *ifp;
@ -158,6 +156,10 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)
SET_FLAG(c->flags, ZEBRA_IFA_SECONDARY);
}
}
#else /* PIM_IPV != 4 */
if (p->family != PIM_AF)
return 0;
#endif
pim_if_addr_add(c);
if (pim_ifp) {
@ -178,12 +180,6 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)
pim_if_addr_add_all(ifp);
}
}
#else /* PIM_IPV != 4 */
(void)pim_ifp;
if (p->family == PIM_AF)
pim_if_addr_add(c);
#endif
return 0;
}
@ -222,8 +218,7 @@ static int pim_zebra_if_address_del(ZAPI_CALLBACK_ARGS)
#endif
}
#if PIM_IPV == 4
if (p->family == AF_INET) {
if (p->family == PIM_AF) {
struct pim_instance *pim;
pim = vrf->info;
@ -231,10 +226,6 @@ static int pim_zebra_if_address_del(ZAPI_CALLBACK_ARGS)
pim_rp_setup(pim);
pim_i_am_rp_re_evaluate(pim);
}
#else
if (p->family == PIM_AF)
pim_if_addr_del(c, 0);
#endif
connected_free(&c);
return 0;
@ -461,10 +452,10 @@ static zclient_handler *const pim_handlers[] = {
[ZEBRA_INTERFACE_ADDRESS_DELETE] = pim_zebra_if_address_del,
[ZEBRA_NEXTHOP_UPDATE] = pim_parse_nexthop_update,
#if PIM_IPV == 4
[ZEBRA_ROUTER_ID_UPDATE] = pim_router_id_update_zebra,
[ZEBRA_INTERFACE_VRF_UPDATE] = pim_zebra_interface_vrf_update,
#if PIM_IPV == 4
[ZEBRA_VXLAN_SG_ADD] = pim_zebra_vxlan_sg_proc,
[ZEBRA_VXLAN_SG_DEL] = pim_zebra_vxlan_sg_proc,