]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Make pim_ssmpingd.c 'struct pim_instance' aware
authorDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 22 May 2017 15:09:13 +0000 (11:09 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 24 Jul 2017 17:51:37 +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_ssmpingd.c
pimd/pim_ssmpingd.h
pimd/pim_vty.c
pimd/pimd.c
pimd/pimd.h

index a65e4a41598b9cadfb6d5e5e79cf91d1a14cb6b5..de87c39bc829201518922fc2d3279e1871feb6c6 100644 (file)
@@ -4212,7 +4212,7 @@ DEFUN (show_ip_rib,
        return CMD_SUCCESS;
 }
 
-static void show_ssmpingd(struct vty *vty)
+static void show_ssmpingd(struct pim_instance *pim, struct vty *vty)
 {
        struct listnode *node;
        struct ssmpingd_sock *ss;
@@ -4221,12 +4221,12 @@ static void show_ssmpingd(struct vty *vty)
        vty_out(vty,
                "Source          Socket Address          Port Uptime   Requests\n");
 
-       if (!qpim_ssmpingd_list)
+       if (!pim->ssmpingd_list)
                return;
 
        now = pim_time_monotonic_sec();
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_ssmpingd_list, node, ss)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->ssmpingd_list, node, ss)) {
                char source_str[INET_ADDRSTRLEN];
                char ss_uptime[10];
                struct sockaddr_in bind_addr;
@@ -4261,7 +4261,7 @@ DEFUN (show_ip_ssmpingd,
        IP_STR
        SHOW_SSMPINGD_STR)
 {
-       show_ssmpingd(vty);
+       show_ssmpingd(pimg, vty);
        return CMD_SUCCESS;
 }
 
@@ -4785,7 +4785,7 @@ DEFUN (ip_ssmpingd,
                return CMD_WARNING_CONFIG_FAILED;
        }
 
-       result = pim_ssmpingd_start(source_addr);
+       result = pim_ssmpingd_start(pimg, source_addr);
        if (result) {
                vty_out(vty, "%% Failure starting ssmpingd for source %s: %d\n",
                        source_str, result);
@@ -4815,7 +4815,7 @@ DEFUN (no_ip_ssmpingd,
                return CMD_WARNING_CONFIG_FAILED;
        }
 
-       result = pim_ssmpingd_stop(source_addr);
+       result = pim_ssmpingd_stop(pimg, source_addr);
        if (result) {
                vty_out(vty, "%% Failure stopping ssmpingd for source %s: %d\n",
                        source_str, result);
index 6b10f14d935135af85a0f42f1e3096defd46e9e0..eae05803ccc0b23b67155b546b2d9810bcce04ab 100644 (file)
@@ -30,6 +30,7 @@
 #include "pim_mroute.h"
 #include "pim_oil.h"
 #include "pim_static.h"
+#include "pim_ssmpingd.h"
 
 static void pim_instance_terminate(struct pim_instance *pim)
 {
@@ -128,13 +129,21 @@ struct pim_instance *pim_get_pim_instance(vrf_id_t vrf_id)
 
 static int pim_vrf_new(struct vrf *vrf)
 {
+       struct pim_instance *pim = vrf->info;
+
        zlog_debug("VRF Created: %s(%d)", vrf->name, vrf->vrf_id);
+
+       pim_ssmpingd_init(pim);
        return 0;
 }
 
 static int pim_vrf_delete(struct vrf *vrf)
 {
+       struct pim_instance *pim = vrf->info;
+
        zlog_debug("VRF Deletion: %s(%d)", vrf->name, vrf->vrf_id);
+
+       pim_ssmpingd_destroy(pim);
        return 0;
 }
 
index b33ae537cd2ccbeac202f86f83068bf3ba66c08d..44f3b3c09748b7607559b9dd0afd415a6bd96ff5 100644 (file)
@@ -85,6 +85,9 @@ struct pim_instance {
        struct hash *channel_oil_hash;
 
        struct pim_msdp msdp;
+
+       struct list *ssmpingd_list;
+       struct in_addr ssmpingd_group_addr;
 };
 
 void pim_vrf_init(void);
index d7ff71f9aada8a74082f6d1e054c3ad5b0592f06..f83a585a8d430810a35b7df86e6560c6cd487e98 100644 (file)
@@ -36,35 +36,36 @@ enum { PIM_SSMPINGD_REQUEST = 'Q', PIM_SSMPINGD_REPLY = 'A' };
 
 static void ssmpingd_read_on(struct ssmpingd_sock *ss);
 
-void pim_ssmpingd_init()
+void pim_ssmpingd_init(struct pim_instance *pim)
 {
        int result;
 
-       zassert(!qpim_ssmpingd_list);
+       zassert(!pim->ssmpingd_list);
 
        result = inet_pton(AF_INET, PIM_SSMPINGD_REPLY_GROUP,
-                          &qpim_ssmpingd_group_addr);
+                          &pim->ssmpingd_group_addr);
 
        zassert(result > 0);
 }
 
-void pim_ssmpingd_destroy()
+void pim_ssmpingd_destroy(struct pim_instance *pim)
 {
-       if (qpim_ssmpingd_list) {
-               list_free(qpim_ssmpingd_list);
-               qpim_ssmpingd_list = 0;
+       if (pim->ssmpingd_list) {
+               list_free(pim->ssmpingd_list);
+               pim->ssmpingd_list = 0;
        }
 }
 
-static struct ssmpingd_sock *ssmpingd_find(struct in_addr source_addr)
+static struct ssmpingd_sock *ssmpingd_find(struct pim_instance *pim,
+                                          struct in_addr source_addr)
 {
        struct listnode *node;
        struct ssmpingd_sock *ss;
 
-       if (!qpim_ssmpingd_list)
+       if (!pim->ssmpingd_list)
                return 0;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_ssmpingd_list, node, ss))
+       for (ALL_LIST_ELEMENTS_RO(pim->ssmpingd_list, node, ss))
                if (source_addr.s_addr == ss->source_addr.s_addr)
                        return ss;
 
@@ -202,7 +203,6 @@ static int ssmpingd_socket(struct in_addr addr, int port, int mttl)
 static void ssmpingd_delete(struct ssmpingd_sock *ss)
 {
        zassert(ss);
-       zassert(qpim_ssmpingd_list);
 
        THREAD_OFF(ss->t_sock_read);
 
@@ -217,7 +217,7 @@ static void ssmpingd_delete(struct ssmpingd_sock *ss)
                /* warning only */
        }
 
-       listnode_delete(qpim_ssmpingd_list, ss);
+       listnode_delete(ss->pim->ssmpingd_list, ss);
        ssmpingd_free(ss);
 }
 
@@ -272,7 +272,7 @@ static int ssmpingd_read_msg(struct ssmpingd_sock *ss)
                return -1;
        }
 
-       ifp = if_lookup_by_index(ifindex, pimg->vrf_id);
+       ifp = if_lookup_by_index(ifindex, ss->pim->vrf_id);
 
        if (buf[0] != PIM_SSMPINGD_REQUEST) {
                char source_str[INET_ADDRSTRLEN];
@@ -315,7 +315,7 @@ static int ssmpingd_read_msg(struct ssmpingd_sock *ss)
        ssmpingd_sendto(ss, buf, len, from);
 
        /* multicast reply */
-       from.sin_addr = qpim_ssmpingd_group_addr;
+       from.sin_addr = ss->pim->ssmpingd_group_addr;
        ssmpingd_sendto(ss, buf, len, from);
 
        return 0;
@@ -342,20 +342,21 @@ static void ssmpingd_read_on(struct ssmpingd_sock *ss)
                        &ss->t_sock_read);
 }
 
-static struct ssmpingd_sock *ssmpingd_new(struct in_addr source_addr)
+static struct ssmpingd_sock *ssmpingd_new(struct pim_instance *pim,
+                                         struct in_addr source_addr)
 {
        struct ssmpingd_sock *ss;
        int sock_fd;
 
-       if (!qpim_ssmpingd_list) {
-               qpim_ssmpingd_list = list_new();
-               if (!qpim_ssmpingd_list) {
+       if (!pim->ssmpingd_list) {
+               pim->ssmpingd_list = list_new();
+               if (!pim->ssmpingd_list) {
                        zlog_err(
                                "%s %s: failure: qpim_ssmpingd_list=list_new()",
                                __FILE__, __PRETTY_FUNCTION__);
                        return 0;
                }
-               qpim_ssmpingd_list->del = (void (*)(void *))ssmpingd_free;
+               pim->ssmpingd_list->del = (void (*)(void *))ssmpingd_free;
        }
 
        sock_fd =
@@ -380,24 +381,25 @@ static struct ssmpingd_sock *ssmpingd_new(struct in_addr source_addr)
                return 0;
        }
 
+       ss->pim = pim;
        ss->sock_fd = sock_fd;
        ss->t_sock_read = NULL;
        ss->source_addr = source_addr;
        ss->creation = pim_time_monotonic_sec();
        ss->requests = 0;
 
-       listnode_add(qpim_ssmpingd_list, ss);
+       listnode_add(pim->ssmpingd_list, ss);
 
        ssmpingd_read_on(ss);
 
        return ss;
 }
 
-int pim_ssmpingd_start(struct in_addr source_addr)
+int pim_ssmpingd_start(struct pim_instance *pim, struct in_addr source_addr)
 {
        struct ssmpingd_sock *ss;
 
-       ss = ssmpingd_find(source_addr);
+       ss = ssmpingd_find(pim, source_addr);
        if (ss) {
                /* silently ignore request to recreate entry */
                return 0;
@@ -411,7 +413,7 @@ int pim_ssmpingd_start(struct in_addr source_addr)
                          __PRETTY_FUNCTION__, source_str);
        }
 
-       ss = ssmpingd_new(source_addr);
+       ss = ssmpingd_new(pim, source_addr);
        if (!ss) {
                char source_str[INET_ADDRSTRLEN];
                pim_inet4_dump("<src?>", source_addr, source_str,
@@ -424,11 +426,11 @@ int pim_ssmpingd_start(struct in_addr source_addr)
        return 0;
 }
 
-int pim_ssmpingd_stop(struct in_addr source_addr)
+int pim_ssmpingd_stop(struct pim_instance *pim, struct in_addr source_addr)
 {
        struct ssmpingd_sock *ss;
 
-       ss = ssmpingd_find(source_addr);
+       ss = ssmpingd_find(pim, source_addr);
        if (!ss) {
                char source_str[INET_ADDRSTRLEN];
                pim_inet4_dump("<src?>", source_addr, source_str,
index 89fb320a76c1a2d72015211e4c079e44a2b15446..fafdd7ade128b1c555660f0793a8c4f19f21b7c5 100644 (file)
@@ -27,6 +27,8 @@
 #include "pim_iface.h"
 
 struct ssmpingd_sock {
+       struct pim_instance *pim;
+
        int sock_fd;                /* socket */
        struct thread *t_sock_read; /* thread for reading socket */
        struct in_addr source_addr; /* source address */
@@ -34,9 +36,9 @@ struct ssmpingd_sock {
        int64_t requests;          /* counter */
 };
 
-void pim_ssmpingd_init(void);
-void pim_ssmpingd_destroy(void);
-int pim_ssmpingd_start(struct in_addr source_addr);
-int pim_ssmpingd_stop(struct in_addr source_addr);
+void pim_ssmpingd_init(struct pim_instance *pim);
+void pim_ssmpingd_destroy(struct pim_instance *pim);
+int pim_ssmpingd_start(struct pim_instance *pim, struct in_addr source_addr);
+int pim_ssmpingd_stop(struct pim_instance *pim, struct in_addr source_addr);
 
 #endif /* PIM_SSMPINGD_H */
index 0bc0eb589a6cf2e6b5c60412a2ba1c9d8a591973..30589f6e17445c525414bae79c8878c551e03cda 100644 (file)
@@ -198,12 +198,12 @@ static int pim_global_config_write_worker(struct pim_instance *pim,
                vty_out(vty, "ip pim ecmp\n");
                ++writes;
        }
-       if (qpim_ssmpingd_list) {
+       if (pim->ssmpingd_list) {
                struct listnode *node;
                struct ssmpingd_sock *ss;
                vty_out(vty, "!\n");
                ++writes;
-               for (ALL_LIST_ELEMENTS_RO(qpim_ssmpingd_list, node, ss)) {
+               for (ALL_LIST_ELEMENTS_RO(pim->ssmpingd_list, node, ss)) {
                        char source_str[INET_ADDRSTRLEN];
                        pim_inet4_dump("<src?>", ss->source_addr, source_str,
                                       sizeof(source_str));
index 465ab73fcdc6d6549f96a23b6919c1f93bc7ac87..f218b9a79455122cf97b3d635b23d8c513ed0f7b 100644 (file)
@@ -56,8 +56,6 @@ struct thread *qpim_rpf_cache_refresher = NULL;
 int64_t qpim_rpf_cache_refresh_requests = 0;
 int64_t qpim_rpf_cache_refresh_events = 0;
 int64_t qpim_rpf_cache_refresh_last = 0;
-struct list *qpim_ssmpingd_list = NULL;
-struct in_addr qpim_ssmpingd_group_addr;
 int64_t qpim_scan_oil_events = 0;
 int64_t qpim_scan_oil_last = 0;
 unsigned int qpim_keep_alive_time = PIM_KEEPALIVE_PERIOD;
@@ -90,8 +88,6 @@ void pim_prefix_list_update(struct prefix_list *plist)
 
 static void pim_free()
 {
-       pim_ssmpingd_destroy();
-
        pim_route_map_terminate();
 
        zclient_lookup_free();
@@ -127,7 +123,6 @@ void pim_init()
        qpim_infinite_assert_metric.ip_address.s_addr = INADDR_ANY;
 
        pim_cmd_init();
-       pim_ssmpingd_init();
 }
 
 void pim_terminate()
index 8bb04ba65179bf19ce5c3dc1ab3b2e9ac16208fd..05689d30c85915f07380129c69b804353810e19a 100644 (file)
@@ -137,8 +137,6 @@ struct thread *qpim_rpf_cache_refresher;
 int64_t qpim_rpf_cache_refresh_requests;
 int64_t qpim_rpf_cache_refresh_events;
 int64_t qpim_rpf_cache_refresh_last;
-struct list *qpim_ssmpingd_list; /* list of struct ssmpingd_sock */
-struct in_addr qpim_ssmpingd_group_addr;
 int64_t qpim_scan_oil_events;
 int64_t qpim_scan_oil_last;
 int64_t qpim_nexthop_lookups;