From 71ad9915e7e5bc224fb1dd84ac709776465720f6 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Mon, 22 May 2017 11:09:13 -0400 Subject: [PATCH] pimd: Make pim_ssmpingd.c 'struct pim_instance' aware Signed-off-by: Donald Sharp --- pimd/pim_cmd.c | 12 +++++------ pimd/pim_instance.c | 9 ++++++++ pimd/pim_instance.h | 3 +++ pimd/pim_ssmpingd.c | 52 +++++++++++++++++++++++---------------------- pimd/pim_ssmpingd.h | 10 +++++---- pimd/pim_vty.c | 4 ++-- pimd/pimd.c | 5 ----- pimd/pimd.h | 2 -- 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("", 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("", 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("", 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; -- 2.39.5