From: Donald Sharp Date: Sun, 21 May 2017 12:45:46 +0000 (-0400) Subject: pimd: Convert channel_oil_hash and list into 'struct pim_instance *' X-Git-Tag: frr-4.0-dev~468^2~108 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=611925dc0261dd24fd1c02ac7c3af5c0bf3803cf;p=mirror%2Ffrr.git pimd: Convert channel_oil_hash and list into 'struct pim_instance *' Signed-off-by: Donald Sharp --- diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 580486badd..e0777e40d6 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -1863,7 +1863,7 @@ static void pim_show_state(struct pim_instance *pim, struct vty *vty, "\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]; @@ -3079,7 +3079,7 @@ static void mroute_add_all() 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]; @@ -3100,7 +3100,7 @@ static void mroute_del_all() 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]; @@ -3782,7 +3782,7 @@ static void show_mroute(struct pim_instance *pim, struct vty *vty, u_char uj) 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) @@ -4102,7 +4102,7 @@ static void show_mroute_count(struct vty *vty) "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]; diff --git a/pimd/pim_instance.c b/pimd/pim_instance.c index 82b9db53d9..5892b5c2e3 100644 --- a/pimd/pim_instance.c +++ b/pimd/pim_instance.c @@ -52,6 +52,8 @@ static void pim_instance_terminate(struct pim_instance *pim) pim_upstream_terminate(pim); + pim_oil_terminate(pim); + pim_if_terminate(pim); XFREE(MTYPE_PIM_PIM_INSTANCE, pimg); @@ -103,6 +105,8 @@ static struct pim_instance *pim_instance_init(struct vrf *vrf) pim_rp_init(pim); + pim_oil_init(pim); + pim_upstream_init(pim); return pim; diff --git a/pimd/pim_instance.h b/pimd/pim_instance.h index a00b303041..e931e7a9ff 100644 --- a/pimd/pim_instance.h +++ b/pimd/pim_instance.h @@ -77,6 +77,9 @@ struct pim_instance { struct list *ifchannel_list; int iface_vif_index[MAXVIFS]; + + struct list *channel_oil_list; + struct hash *channel_oil_hash; }; void pim_vrf_init(void); diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c index 4c0820b603..00f1bd6387 100644 --- a/pimd/pim_mroute.c +++ b/pimd/pim_mroute.c @@ -471,7 +471,8 @@ static int pim_mroute_msg_wrvifwhole(int fd, struct interface *ifp, 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, @@ -497,7 +498,7 @@ static int pim_mroute_msg_wrvifwhole(int fd, struct interface *ifp, } 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)) { diff --git a/pimd/pim_oil.c b/pimd/pim_oil.c index 375acbc663..582fb42f39 100644 --- a/pimd/pim_oil.c +++ b/pimd/pim_oil.c @@ -32,8 +32,8 @@ #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) { @@ -99,31 +99,31 @@ static unsigned int pim_oil_hash_key(void *arg) 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) @@ -131,7 +131,8 @@ 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; @@ -139,18 +140,19 @@ static struct channel_oil *pim_find_channel_oil(struct prefix_sg *sg) 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; @@ -165,11 +167,11 @@ struct channel_oil *pim_channel_oil_add(struct prefix_sg *sg, 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( @@ -186,14 +188,15 @@ struct channel_oil *pim_channel_oil_add(struct prefix_sg *sg, 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; } @@ -209,8 +212,8 @@ void pim_channel_oil_del(struct channel_oil *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); } diff --git a/pimd/pim_oil.h b/pimd/pim_oil.h index d71fb6395c..1168ba0a8f 100644 --- a/pimd/pim_oil.h +++ b/pimd/pim_oil.h @@ -82,11 +82,12 @@ struct channel_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); diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 96f49ec53f..9d46206758 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -702,7 +702,7 @@ pim_upstream_new(struct prefix_sg *sg, struct interface *incoming, int flags) 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); @@ -1414,8 +1414,8 @@ int pim_upstream_inherited_olist_decide(struct pim_instance *pim, __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) diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index e77086059f..6692c3e795 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -619,22 +619,34 @@ void pim_scan_oil() 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); + } } } @@ -998,7 +1010,7 @@ void igmp_source_forward_start(struct igmp_source *source) } 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( @@ -1208,8 +1220,8 @@ void pim_forward_start(struct pim_ifchannel *ch) 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( diff --git a/pimd/pimd.c b/pimd/pimd.c index a9793c4aa6..ffb025d97a 100644 --- a/pimd/pimd.c +++ b/pimd/pimd.c @@ -92,8 +92,6 @@ static void pim_free() { pim_ssmpingd_destroy(); - pim_oil_terminate(); - pim_route_map_terminate(); zclient_lookup_free(); @@ -114,8 +112,6 @@ void pim_init() return; } - pim_oil_init(); - /* RFC 4601: 4.6.3. Assert Metrics