]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Convert channel_oil_hash and list into 'struct pim_instance *'
authorDonald Sharp <sharpd@cumulusnetworks.com>
Sun, 21 May 2017 12:45:46 +0000 (08:45 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 24 Jul 2017 17:51:36 +0000 (13:51 -0400)
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_cmd.c
pimd/pim_instance.c
pimd/pim_instance.h
pimd/pim_mroute.c
pimd/pim_oil.c
pimd/pim_oil.h
pimd/pim_upstream.c
pimd/pim_zebra.c
pimd/pimd.c

index 580486baddc9dd0c8e99a6464a8fde92d59bbffd..e0777e40d6fc38afaaa4dd592a5177f55a16ae55 100644 (file)
@@ -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];
 
index 82b9db53d9d71176c97787d1b4e41cbb62acf36c..5892b5c2e3630690a1d85361a97ad1d71ec90384 100644 (file)
@@ -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;
index a00b303041cba923d33b531fc4e21a2e71c7e75d..e931e7a9fff4c6258e26795c2a652ac9b501f207 100644 (file)
@@ -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);
index 4c0820b6034219f70a7c1d0dc80ba6dcecb7f38f..00f1bd638743959edc93f453cb5596bd8dafc6fe 100644 (file)
@@ -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)) {
index 375acbc663c7017122d7b26571833219350c74b1..582fb42f39fb055b349ab2d2b5ed6bc92b6c8d76 100644 (file)
@@ -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);
        }
index d71fb6395c93b6e4044b9daec0ebeaf1484cbaa4..1168ba0a8fe9b8a5c3520a4dc00649e3c4027501 100644 (file)
@@ -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);
 
index 96f49ec53fc8a900827d781bf842029c538f4bc2..9d462067581a20f91e6c7b50fee716737c57ecb9 100644 (file)
@@ -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)
index e77086059fb45e040c4e7ac8dbbdff79284299d4..6692c3e7950087946bbd5b639a9d2d3b9c66570f 100644 (file)
@@ -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(
index a9793c4aa6305f92ce6a49a56d7b4ff30d804840..ffb025d97aa9fa51a168fd9fafcf323d66ff6c52 100644 (file)
@@ -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