summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2017-05-22 11:09:13 -0400
committerDonald Sharp <sharpd@cumulusnetworks.com>2017-07-24 13:51:37 -0400
commit71ad9915e7e5bc224fb1dd84ac709776465720f6 (patch)
treedfa82cf9cc8f8e95d1054c7ff9cd2e8e3e199529
parent472ad3832c1db4802a604e44e049ada8f04b53fa (diff)
pimd: Make pim_ssmpingd.c 'struct pim_instance' aware
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
-rw-r--r--pimd/pim_cmd.c12
-rw-r--r--pimd/pim_instance.c9
-rw-r--r--pimd/pim_instance.h3
-rw-r--r--pimd/pim_ssmpingd.c52
-rw-r--r--pimd/pim_ssmpingd.h10
-rw-r--r--pimd/pim_vty.c4
-rw-r--r--pimd/pimd.c5
-rw-r--r--pimd/pimd.h2
8 files changed, 53 insertions, 44 deletions
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index a65e4a4159..de87c39bc8 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -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);
diff --git a/pimd/pim_instance.c b/pimd/pim_instance.c
index 6b10f14d93..eae05803cc 100644
--- a/pimd/pim_instance.c
+++ b/pimd/pim_instance.c
@@ -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;
}
diff --git a/pimd/pim_instance.h b/pimd/pim_instance.h
index b33ae537cd..44f3b3c097 100644
--- a/pimd/pim_instance.h
+++ b/pimd/pim_instance.h
@@ -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);
diff --git a/pimd/pim_ssmpingd.c b/pimd/pim_ssmpingd.c
index d7ff71f9aa..f83a585a8d 100644
--- a/pimd/pim_ssmpingd.c
+++ b/pimd/pim_ssmpingd.c
@@ -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,
diff --git a/pimd/pim_ssmpingd.h b/pimd/pim_ssmpingd.h
index 89fb320a76..fafdd7ade1 100644
--- a/pimd/pim_ssmpingd.h
+++ b/pimd/pim_ssmpingd.h
@@ -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 */
diff --git a/pimd/pim_vty.c b/pimd/pim_vty.c
index 0bc0eb589a..30589f6e17 100644
--- a/pimd/pim_vty.c
+++ b/pimd/pim_vty.c
@@ -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));
diff --git a/pimd/pimd.c b/pimd/pimd.c
index 465ab73fcd..f218b9a794 100644
--- a/pimd/pimd.c
+++ b/pimd/pimd.c
@@ -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()
diff --git a/pimd/pimd.h b/pimd/pimd.h
index 8bb04ba651..05689d30c8 100644
--- a/pimd/pimd.h
+++ b/pimd/pimd.h
@@ -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;