PIM_STR
IFACE_PIM_SM_STR)
{
+ struct pim_interface *pim_ifp;
+
VTY_DECLVAR_CONTEXT(interface, ifp);
if (!pim_cmd_interface_add(ifp)) {
vty_out(vty, "Could not enable PIM SM on interface\n");
return CMD_WARNING_CONFIG_FAILED;
}
- pim_if_create_pimreg();
+ pim_ifp = ifp->info;
+ pim_if_create_pimreg(pim_ifp->pim);
return CMD_SUCCESS;
}
#include "pim_rp.h"
#include "pim_nht.h"
-struct interface *pim_regiface = NULL;
struct list *pim_ifchannel_list = NULL;
static int pim_iface_vif_index[MAXVIFS];
struct listnode *ifnode;
struct interface *ifp;
- if (vif_index == 0)
- return if_lookup_by_name("pimreg", pimg->vrf_id);
-
for (ALL_LIST_ELEMENTS_RO(vrf_iflist(pimg->vrf_id), ifnode, ifp)) {
if (ifp->info) {
struct pim_interface *pim_ifp;
* The pimreg is a special interface that we have that is not
* quite an inteface but a VIF is created for it.
*/
-void pim_if_create_pimreg(void)
+void pim_if_create_pimreg(struct pim_instance *pim)
{
- if (!pim_regiface) {
- pim_regiface =
- if_create("pimreg", strlen("pimreg"), pimg->vrf_id);
- pim_regiface->ifindex = PIM_OIF_PIM_REGISTER_VIF;
- pim_if_new(pim_regiface, 0, 0);
+ if (!pim->regiface) {
+ pim->regiface =
+ if_create("pimreg", strlen("pimreg"), pim->vrf_id);
+ pim->regiface->ifindex = PIM_OIF_PIM_REGISTER_VIF;
+
+ pim_if_new(pim->regiface, 0, 0);
}
}
struct bfd_info *bfd_info;
};
-extern struct interface *pim_regiface;
extern struct list *pim_ifchannel_list;
/*
if default_holdtime is set (>= 0), use it;
void pim_if_update_assert_tracking_desired(struct interface *ifp);
-void pim_if_create_pimreg(void);
+void pim_if_create_pimreg(struct pim_instance *pim);
int pim_if_connected_to_source(struct interface *ifp, struct in_addr src);
int pim_update_source_set(struct interface *ifp, struct in_addr source);
{
struct pim_ifchannel *ch, *starch;
struct pim_interface *pim_ifp;
+ struct pim_instance *pim;
/* PIM enabled on interface? */
pim_ifp = ifp->info;
if (!PIM_IF_TEST_PIM(pim_ifp->options))
return 0;
+ pim = pim_ifp->pim;
+
/* skip (*,G) ch creation if G is of type SSM */
if (sg->src.s_addr == INADDR_ANY) {
if (pim_is_grp_ssm(sg->grp)) {
}
}
- if (pimg->spt.switchover == PIM_SPT_INFINITY) {
+ if (pim->spt.switchover == PIM_SPT_INFINITY) {
if (pimg->spt.plist) {
struct prefix_list *plist = prefix_list_lookup(
- AFI_IP, pimg->spt.plist);
+ AFI_IP, pim->spt.plist);
struct prefix g;
g.family = AF_INET;
g.prefixlen = IPV4_MAX_PREFIXLEN;
if (prefix_list_apply(plist, &g)
== PREFIX_DENY) {
pim_channel_add_oif(
- up->channel_oil, pim_regiface,
+ up->channel_oil, pim->regiface,
PIM_OIF_FLAG_PROTO_IGMP);
}
}
} else
- pim_channel_add_oif(up->channel_oil, pim_regiface,
+ pim_channel_add_oif(up->channel_oil, pim->regiface,
PIM_OIF_FLAG_PROTO_IGMP);
}
return;
}
- pim_channel_add_oif(up->channel_oil, pim_regiface,
+ pim_channel_add_oif(up->channel_oil, pimg->regiface,
PIM_OIF_FLAG_PROTO_PIM);
up->reg_state = PIM_REG_JOIN;
}
break;
case PIM_REG_JOIN:
upstream->reg_state = PIM_REG_PRUNE;
- pim_channel_del_oif(upstream->channel_oil, pim_regiface,
+ pim_channel_del_oif(upstream->channel_oil, pimg->regiface,
PIM_OIF_FLAG_PROTO_PIM);
pim_upstream_start_register_stop_timer(upstream, 0);
break;
up->sg_str);
/* remove regiface from the OIL if it is there*/
pim_channel_del_oif(up->channel_oil,
- pim_regiface,
+ pimg->regiface,
PIM_OIF_FLAG_PROTO_PIM);
up->reg_state = PIM_REG_NOINFO;
}
"Register %s as G is now ASM",
up->sg_str);
pim_channel_add_oif(up->channel_oil,
- pim_regiface,
+ pimg->regiface,
PIM_OIF_FLAG_PROTO_PIM);
up->reg_state = PIM_REG_JOIN;
}
/* stop reg-stop timer */
THREAD_OFF(up->t_rs_timer);
/* remove regiface from the OIL if it is there*/
- pim_channel_del_oif(up->channel_oil, pim_regiface,
+ pim_channel_del_oif(up->channel_oil, pimg->regiface,
PIM_OIF_FLAG_PROTO_PIM);
/* clear the register state */
up->reg_state = PIM_REG_NOINFO;
switch (up->reg_state) {
case PIM_REG_JOIN_PENDING:
up->reg_state = PIM_REG_JOIN;
- pim_channel_add_oif(up->channel_oil, pim_regiface,
+ pim_channel_add_oif(up->channel_oil, pimg->regiface,
PIM_OIF_FLAG_PROTO_PIM);
break;
case PIM_REG_JOIN:
if (!PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(up->flags))
continue;
- pim_channel_add_oif(up->channel_oil, pim_regiface,
+ pim_channel_add_oif(up->channel_oil, pimg->regiface,
PIM_OIF_FLAG_PROTO_IGMP);
}
}
continue;
if (!nlist) {
- pim_channel_del_oif(up->channel_oil, pim_regiface,
+ pim_channel_del_oif(up->channel_oil, pimg->regiface,
PIM_OIF_FLAG_PROTO_IGMP);
continue;
}
g.u.prefix4 = up->sg.grp;
apply_new = prefix_list_apply(np, &g);
if (apply_new == PREFIX_DENY)
- pim_channel_add_oif(up->channel_oil, pim_regiface,
+ pim_channel_add_oif(up->channel_oil, pimg->regiface,
PIM_OIF_FLAG_PROTO_IGMP);
else
- pim_channel_del_oif(up->channel_oil, pim_regiface,
+ pim_channel_del_oif(up->channel_oil, pimg->regiface,
PIM_OIF_FLAG_PROTO_IGMP);
}
}
int64_t mroute_add_last;
int64_t mroute_del_events;
int64_t mroute_del_last;
+
+ struct interface *regiface;
};
extern struct pim_instance *pimg; // Pim Global Instance