"\nInstalled Source Group IIF OIL\n");
}
- for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list, node, c_oil)) {
+ for (ALL_LIST_ELEMENTS_RO(pimg->channel_oil_list, node, c_oil)) {
char grp_str[INET_ADDRSTRLEN];
char src_str[INET_ADDRSTRLEN];
char in_ifname[INTERFACE_NAMSIZ + 1];
struct listnode *node;
struct channel_oil *c_oil;
- for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list, node, c_oil)) {
+ for (ALL_LIST_ELEMENTS_RO(pimg->channel_oil_list, node, c_oil)) {
if (pim_mroute_add(c_oil, __PRETTY_FUNCTION__)) {
/* just log warning */
char source_str[INET_ADDRSTRLEN];
struct listnode *node;
struct channel_oil *c_oil;
- for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list, node, c_oil)) {
+ for (ALL_LIST_ELEMENTS_RO(pimg->channel_oil_list, node, c_oil)) {
if (pim_mroute_del(c_oil, __PRETTY_FUNCTION__)) {
/* just log warning */
char source_str[INET_ADDRSTRLEN];
now = pim_time_monotonic_sec();
/* print list of PIM and IGMP routes */
- for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list, node, c_oil)) {
+ for (ALL_LIST_ELEMENTS_RO(pimg->channel_oil_list, node, c_oil)) {
found_oif = 0;
first = 1;
if (!c_oil->installed && !uj)
"Source Group LastUsed Packets Bytes WrongIf \n");
/* Print PIM and IGMP route counts */
- for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list, node, c_oil)) {
+ for (ALL_LIST_ELEMENTS_RO(pimg->channel_oil_list, node, c_oil)) {
char group_str[INET_ADDRSTRLEN];
char source_str[INET_ADDRSTRLEN];
pim_upstream_terminate(pim);
+ pim_oil_terminate(pim);
+
pim_if_terminate(pim);
XFREE(MTYPE_PIM_PIM_INSTANCE, pimg);
pim_rp_init(pim);
+ pim_oil_init(pim);
+
pim_upstream_init(pim);
return pim;
struct list *ifchannel_list;
int iface_vif_index[MAXVIFS];
+
+ struct list *channel_oil_list;
+ struct hash *channel_oil_hash;
};
void pim_vrf_init(void);
up->upstream_register);
if (!up->channel_oil)
up->channel_oil = pim_channel_oil_add(
- &sg, pim_ifp->mroute_vif_index);
+ pim_ifp->pim, &sg,
+ pim_ifp->mroute_vif_index);
pim_upstream_inherited_olist(pim_ifp->pim, up);
if (!up->channel_oil->installed)
pim_mroute_add(up->channel_oil,
}
pim_ifp = ifp->info;
- oil = pim_channel_oil_add(&sg, pim_ifp->mroute_vif_index);
+ oil = pim_channel_oil_add(pim_ifp->pim, &sg, pim_ifp->mroute_vif_index);
if (!oil->installed)
pim_mroute_add(oil, __PRETTY_FUNCTION__);
if (pim_if_connected_to_source(ifp, sg.src)) {
#include "pim_iface.h"
#include "pim_time.h"
-struct list *pim_channel_oil_list = NULL;
-struct hash *pim_channel_oil_hash = NULL;
+// struct list *pim_channel_oil_list = NULL;
+// struct hash *pim_channel_oil_hash = NULL;
char *pim_channel_oil_dump(struct channel_oil *c_oil, char *buf, size_t size)
{
oil->oil.mfcc_origin.s_addr, 0);
}
-void pim_oil_init(void)
+void pim_oil_init(struct pim_instance *pim)
{
- pim_channel_oil_hash =
+ pim->channel_oil_hash =
hash_create_size(8192, pim_oil_hash_key, pim_oil_equal, NULL);
- pim_channel_oil_list = list_new();
- if (!pim_channel_oil_list) {
+ pim->channel_oil_list = list_new();
+ if (!pim->channel_oil_list) {
zlog_err("%s %s: failure: channel_oil_list=list_new()",
__FILE__, __PRETTY_FUNCTION__);
return;
}
- pim_channel_oil_list->del = (void (*)(void *))pim_channel_oil_free;
- pim_channel_oil_list->cmp =
+ pim->channel_oil_list->del = (void (*)(void *))pim_channel_oil_free;
+ pim->channel_oil_list->cmp =
(int (*)(void *, void *))pim_channel_oil_compare;
}
-void pim_oil_terminate(void)
+void pim_oil_terminate(struct pim_instance *pim)
{
- if (pim_channel_oil_list)
- list_free(pim_channel_oil_list);
- pim_channel_oil_list = NULL;
+ if (pim->channel_oil_list)
+ list_free(pim->channel_oil_list);
+ pim->channel_oil_list = NULL;
- if (pim_channel_oil_hash)
- hash_free(pim_channel_oil_hash);
- pim_channel_oil_hash = NULL;
+ if (pim->channel_oil_hash)
+ hash_free(pim->channel_oil_hash);
+ pim->channel_oil_hash = NULL;
}
void pim_channel_oil_free(struct channel_oil *c_oil)
XFREE(MTYPE_PIM_CHANNEL_OIL, c_oil);
}
-static struct channel_oil *pim_find_channel_oil(struct prefix_sg *sg)
+static struct channel_oil *pim_find_channel_oil(struct pim_instance *pim,
+ struct prefix_sg *sg)
{
struct channel_oil *c_oil = NULL;
struct channel_oil lookup;
lookup.oil.mfcc_mcastgrp = sg->grp;
lookup.oil.mfcc_origin = sg->src;
- c_oil = hash_lookup(pim_channel_oil_hash, &lookup);
+ c_oil = hash_lookup(pim->channel_oil_hash, &lookup);
return c_oil;
}
-struct channel_oil *pim_channel_oil_add(struct prefix_sg *sg,
+struct channel_oil *pim_channel_oil_add(struct pim_instance *pim,
+ struct prefix_sg *sg,
int input_vif_index)
{
struct channel_oil *c_oil;
struct interface *ifp;
- c_oil = pim_find_channel_oil(sg);
+ c_oil = pim_find_channel_oil(pim, sg);
if (c_oil) {
if (c_oil->oil.mfcc_parent != input_vif_index) {
c_oil->oil_inherited_rescan = 1;
c_oil->oil.mfcc_parent = input_vif_index;
++c_oil->oil_ref_count;
c_oil->up = pim_upstream_find(
- pimg, sg); // channel might be present prior to upstream
+ pim, sg); // channel might be present prior to upstream
return c_oil;
}
- ifp = pim_if_find_by_vif_index(pimg, input_vif_index);
+ ifp = pim_if_find_by_vif_index(pim, input_vif_index);
if (!ifp) {
/* warning only */
zlog_warn(
c_oil->oil.mfcc_mcastgrp = sg->grp;
c_oil->oil.mfcc_origin = sg->src;
- c_oil = hash_get(pim_channel_oil_hash, c_oil, hash_alloc_intern);
+ c_oil = hash_get(pim->channel_oil_hash, c_oil, hash_alloc_intern);
c_oil->oil.mfcc_parent = input_vif_index;
c_oil->oil_ref_count = 1;
c_oil->installed = 0;
- c_oil->up = pim_upstream_find(pimg, sg);
+ c_oil->up = pim_upstream_find(pim, sg);
+ c_oil->pim = pim;
- listnode_add_sort(pim_channel_oil_list, c_oil);
+ listnode_add_sort(pim->channel_oil_list, c_oil);
return c_oil;
}
* called by list_delete_all_node()
*/
c_oil->up = NULL;
- listnode_delete(pim_channel_oil_list, c_oil);
- hash_release(pim_channel_oil_hash, c_oil);
+ listnode_delete(c_oil->pim->channel_oil_list, c_oil);
+ hash_release(c_oil->pim->channel_oil_hash, c_oil);
pim_channel_oil_free(c_oil);
}
extern struct list *pim_channel_oil_list;
-void pim_oil_init(void);
-void pim_oil_terminate(void);
+void pim_oil_init(struct pim_instance *pim);
+void pim_oil_terminate(struct pim_instance *pim);
void pim_channel_oil_free(struct channel_oil *c_oil);
-struct channel_oil *pim_channel_oil_add(struct prefix_sg *sg,
+struct channel_oil *pim_channel_oil_add(struct pim_instance *pim,
+ struct prefix_sg *sg,
int input_vif_index);
void pim_channel_oil_del(struct channel_oil *c_oil);
pim_ifp = up->rpf.source_nexthop.interface->info;
if (pim_ifp)
up->channel_oil = pim_channel_oil_add(
- &up->sg, pim_ifp->mroute_vif_index);
+ pim, &up->sg, pim_ifp->mroute_vif_index);
}
listnode_add_sort(pim->upstream_list, up);
__PRETTY_FUNCTION__, up->sg_str);
}
if (pim_ifp && !up->channel_oil)
- up->channel_oil =
- pim_channel_oil_add(&up->sg, pim_ifp->mroute_vif_index);
+ up->channel_oil = pim_channel_oil_add(
+ pim, &up->sg, pim_ifp->mroute_vif_index);
for (ALL_LIST_ELEMENTS_RO(vrf_iflist(pim->vrf_id), node, ifp)) {
if (!ifp->info)
struct channel_oil *c_oil;
ifindex_t ifindex;
int vif_index = 0;
+ struct vrf *vrf;
+ struct pim_instance *pim;
qpim_scan_oil_last = pim_time_monotonic_sec();
++qpim_scan_oil_events;
- for (ALL_LIST_ELEMENTS(pim_channel_oil_list, node, nextnode, c_oil)) {
- if (c_oil->up && c_oil->up->rpf.source_nexthop.interface) {
- ifindex = c_oil->up->rpf.source_nexthop
- .interface->ifindex;
- vif_index = pim_if_find_vifindex_by_ifindex(c_oil->pim,
- ifindex);
- /* Pass Current selected NH vif index to mroute download
- */
- if (vif_index)
- pim_scan_individual_oil(c_oil, vif_index);
- } else
- pim_scan_individual_oil(c_oil, 0);
+ RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name)
+ {
+ pim = vrf->info;
+ if (!pim)
+ continue;
+
+ for (ALL_LIST_ELEMENTS(pim->channel_oil_list, node, nextnode,
+ c_oil)) {
+ if (c_oil->up
+ && c_oil->up->rpf.source_nexthop.interface) {
+ ifindex = c_oil->up->rpf.source_nexthop
+ .interface->ifindex;
+ vif_index = pim_if_find_vifindex_by_ifindex(
+ pim, ifindex);
+ /* Pass Current selected NH vif index to mroute
+ * download */
+ if (vif_index)
+ pim_scan_individual_oil(c_oil,
+ vif_index);
+ } else
+ pim_scan_individual_oil(c_oil, 0);
+ }
}
}
}
source->source_channel_oil =
- pim_channel_oil_add(&sg, input_iface_vif_index);
+ pim_channel_oil_add(pimg, &sg, input_iface_vif_index);
if (!source->source_channel_oil) {
if (PIM_DEBUG_IGMP_TRACE) {
zlog_debug(
in_intf ? in_intf->name : "NIL",
input_iface_vif_index, up->sg_str);
}
- up->channel_oil =
- pim_channel_oil_add(&up->sg, input_iface_vif_index);
+ up->channel_oil = pim_channel_oil_add(pimg, &up->sg,
+ input_iface_vif_index);
if (!up->channel_oil) {
if (PIM_DEBUG_PIM_TRACE)
zlog_debug(
{
pim_ssmpingd_destroy();
- pim_oil_terminate();
-
pim_route_map_terminate();
zclient_lookup_free();
return;
}
- pim_oil_init();
-
/*
RFC 4601: 4.6.3. Assert Metrics