mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-05 14:49:09 +00:00
pimd: Make pim_ssmpingd.c 'struct pim_instance' aware
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
472ad3832c
commit
71ad9915e7
@ -4212,7 +4212,7 @@ DEFUN (show_ip_rib,
|
|||||||
return CMD_SUCCESS;
|
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 listnode *node;
|
||||||
struct ssmpingd_sock *ss;
|
struct ssmpingd_sock *ss;
|
||||||
@ -4221,12 +4221,12 @@ static void show_ssmpingd(struct vty *vty)
|
|||||||
vty_out(vty,
|
vty_out(vty,
|
||||||
"Source Socket Address Port Uptime Requests\n");
|
"Source Socket Address Port Uptime Requests\n");
|
||||||
|
|
||||||
if (!qpim_ssmpingd_list)
|
if (!pim->ssmpingd_list)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
now = pim_time_monotonic_sec();
|
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 source_str[INET_ADDRSTRLEN];
|
||||||
char ss_uptime[10];
|
char ss_uptime[10];
|
||||||
struct sockaddr_in bind_addr;
|
struct sockaddr_in bind_addr;
|
||||||
@ -4261,7 +4261,7 @@ DEFUN (show_ip_ssmpingd,
|
|||||||
IP_STR
|
IP_STR
|
||||||
SHOW_SSMPINGD_STR)
|
SHOW_SSMPINGD_STR)
|
||||||
{
|
{
|
||||||
show_ssmpingd(vty);
|
show_ssmpingd(pimg, vty);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4785,7 +4785,7 @@ DEFUN (ip_ssmpingd,
|
|||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = pim_ssmpingd_start(source_addr);
|
result = pim_ssmpingd_start(pimg, source_addr);
|
||||||
if (result) {
|
if (result) {
|
||||||
vty_out(vty, "%% Failure starting ssmpingd for source %s: %d\n",
|
vty_out(vty, "%% Failure starting ssmpingd for source %s: %d\n",
|
||||||
source_str, result);
|
source_str, result);
|
||||||
@ -4815,7 +4815,7 @@ DEFUN (no_ip_ssmpingd,
|
|||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = pim_ssmpingd_stop(source_addr);
|
result = pim_ssmpingd_stop(pimg, source_addr);
|
||||||
if (result) {
|
if (result) {
|
||||||
vty_out(vty, "%% Failure stopping ssmpingd for source %s: %d\n",
|
vty_out(vty, "%% Failure stopping ssmpingd for source %s: %d\n",
|
||||||
source_str, result);
|
source_str, result);
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "pim_mroute.h"
|
#include "pim_mroute.h"
|
||||||
#include "pim_oil.h"
|
#include "pim_oil.h"
|
||||||
#include "pim_static.h"
|
#include "pim_static.h"
|
||||||
|
#include "pim_ssmpingd.h"
|
||||||
|
|
||||||
static void pim_instance_terminate(struct pim_instance *pim)
|
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)
|
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);
|
zlog_debug("VRF Created: %s(%d)", vrf->name, vrf->vrf_id);
|
||||||
|
|
||||||
|
pim_ssmpingd_init(pim);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pim_vrf_delete(struct vrf *vrf)
|
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);
|
zlog_debug("VRF Deletion: %s(%d)", vrf->name, vrf->vrf_id);
|
||||||
|
|
||||||
|
pim_ssmpingd_destroy(pim);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +85,9 @@ struct pim_instance {
|
|||||||
struct hash *channel_oil_hash;
|
struct hash *channel_oil_hash;
|
||||||
|
|
||||||
struct pim_msdp msdp;
|
struct pim_msdp msdp;
|
||||||
|
|
||||||
|
struct list *ssmpingd_list;
|
||||||
|
struct in_addr ssmpingd_group_addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
void pim_vrf_init(void);
|
void pim_vrf_init(void);
|
||||||
|
@ -36,35 +36,36 @@ enum { PIM_SSMPINGD_REQUEST = 'Q', PIM_SSMPINGD_REPLY = 'A' };
|
|||||||
|
|
||||||
static void ssmpingd_read_on(struct ssmpingd_sock *ss);
|
static void ssmpingd_read_on(struct ssmpingd_sock *ss);
|
||||||
|
|
||||||
void pim_ssmpingd_init()
|
void pim_ssmpingd_init(struct pim_instance *pim)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
zassert(!qpim_ssmpingd_list);
|
zassert(!pim->ssmpingd_list);
|
||||||
|
|
||||||
result = inet_pton(AF_INET, PIM_SSMPINGD_REPLY_GROUP,
|
result = inet_pton(AF_INET, PIM_SSMPINGD_REPLY_GROUP,
|
||||||
&qpim_ssmpingd_group_addr);
|
&pim->ssmpingd_group_addr);
|
||||||
|
|
||||||
zassert(result > 0);
|
zassert(result > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pim_ssmpingd_destroy()
|
void pim_ssmpingd_destroy(struct pim_instance *pim)
|
||||||
{
|
{
|
||||||
if (qpim_ssmpingd_list) {
|
if (pim->ssmpingd_list) {
|
||||||
list_free(qpim_ssmpingd_list);
|
list_free(pim->ssmpingd_list);
|
||||||
qpim_ssmpingd_list = 0;
|
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 listnode *node;
|
||||||
struct ssmpingd_sock *ss;
|
struct ssmpingd_sock *ss;
|
||||||
|
|
||||||
if (!qpim_ssmpingd_list)
|
if (!pim->ssmpingd_list)
|
||||||
return 0;
|
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)
|
if (source_addr.s_addr == ss->source_addr.s_addr)
|
||||||
return ss;
|
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)
|
static void ssmpingd_delete(struct ssmpingd_sock *ss)
|
||||||
{
|
{
|
||||||
zassert(ss);
|
zassert(ss);
|
||||||
zassert(qpim_ssmpingd_list);
|
|
||||||
|
|
||||||
THREAD_OFF(ss->t_sock_read);
|
THREAD_OFF(ss->t_sock_read);
|
||||||
|
|
||||||
@ -217,7 +217,7 @@ static void ssmpingd_delete(struct ssmpingd_sock *ss)
|
|||||||
/* warning only */
|
/* warning only */
|
||||||
}
|
}
|
||||||
|
|
||||||
listnode_delete(qpim_ssmpingd_list, ss);
|
listnode_delete(ss->pim->ssmpingd_list, ss);
|
||||||
ssmpingd_free(ss);
|
ssmpingd_free(ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,7 +272,7 @@ static int ssmpingd_read_msg(struct ssmpingd_sock *ss)
|
|||||||
return -1;
|
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) {
|
if (buf[0] != PIM_SSMPINGD_REQUEST) {
|
||||||
char source_str[INET_ADDRSTRLEN];
|
char source_str[INET_ADDRSTRLEN];
|
||||||
@ -315,7 +315,7 @@ static int ssmpingd_read_msg(struct ssmpingd_sock *ss)
|
|||||||
ssmpingd_sendto(ss, buf, len, from);
|
ssmpingd_sendto(ss, buf, len, from);
|
||||||
|
|
||||||
/* multicast reply */
|
/* multicast reply */
|
||||||
from.sin_addr = qpim_ssmpingd_group_addr;
|
from.sin_addr = ss->pim->ssmpingd_group_addr;
|
||||||
ssmpingd_sendto(ss, buf, len, from);
|
ssmpingd_sendto(ss, buf, len, from);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -342,20 +342,21 @@ static void ssmpingd_read_on(struct ssmpingd_sock *ss)
|
|||||||
&ss->t_sock_read);
|
&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;
|
struct ssmpingd_sock *ss;
|
||||||
int sock_fd;
|
int sock_fd;
|
||||||
|
|
||||||
if (!qpim_ssmpingd_list) {
|
if (!pim->ssmpingd_list) {
|
||||||
qpim_ssmpingd_list = list_new();
|
pim->ssmpingd_list = list_new();
|
||||||
if (!qpim_ssmpingd_list) {
|
if (!pim->ssmpingd_list) {
|
||||||
zlog_err(
|
zlog_err(
|
||||||
"%s %s: failure: qpim_ssmpingd_list=list_new()",
|
"%s %s: failure: qpim_ssmpingd_list=list_new()",
|
||||||
__FILE__, __PRETTY_FUNCTION__);
|
__FILE__, __PRETTY_FUNCTION__);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
qpim_ssmpingd_list->del = (void (*)(void *))ssmpingd_free;
|
pim->ssmpingd_list->del = (void (*)(void *))ssmpingd_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
sock_fd =
|
sock_fd =
|
||||||
@ -380,24 +381,25 @@ static struct ssmpingd_sock *ssmpingd_new(struct in_addr source_addr)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ss->pim = pim;
|
||||||
ss->sock_fd = sock_fd;
|
ss->sock_fd = sock_fd;
|
||||||
ss->t_sock_read = NULL;
|
ss->t_sock_read = NULL;
|
||||||
ss->source_addr = source_addr;
|
ss->source_addr = source_addr;
|
||||||
ss->creation = pim_time_monotonic_sec();
|
ss->creation = pim_time_monotonic_sec();
|
||||||
ss->requests = 0;
|
ss->requests = 0;
|
||||||
|
|
||||||
listnode_add(qpim_ssmpingd_list, ss);
|
listnode_add(pim->ssmpingd_list, ss);
|
||||||
|
|
||||||
ssmpingd_read_on(ss);
|
ssmpingd_read_on(ss);
|
||||||
|
|
||||||
return 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;
|
struct ssmpingd_sock *ss;
|
||||||
|
|
||||||
ss = ssmpingd_find(source_addr);
|
ss = ssmpingd_find(pim, source_addr);
|
||||||
if (ss) {
|
if (ss) {
|
||||||
/* silently ignore request to recreate entry */
|
/* silently ignore request to recreate entry */
|
||||||
return 0;
|
return 0;
|
||||||
@ -411,7 +413,7 @@ int pim_ssmpingd_start(struct in_addr source_addr)
|
|||||||
__PRETTY_FUNCTION__, source_str);
|
__PRETTY_FUNCTION__, source_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
ss = ssmpingd_new(source_addr);
|
ss = ssmpingd_new(pim, source_addr);
|
||||||
if (!ss) {
|
if (!ss) {
|
||||||
char source_str[INET_ADDRSTRLEN];
|
char source_str[INET_ADDRSTRLEN];
|
||||||
pim_inet4_dump("<src?>", source_addr, source_str,
|
pim_inet4_dump("<src?>", source_addr, source_str,
|
||||||
@ -424,11 +426,11 @@ int pim_ssmpingd_start(struct in_addr source_addr)
|
|||||||
return 0;
|
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;
|
struct ssmpingd_sock *ss;
|
||||||
|
|
||||||
ss = ssmpingd_find(source_addr);
|
ss = ssmpingd_find(pim, source_addr);
|
||||||
if (!ss) {
|
if (!ss) {
|
||||||
char source_str[INET_ADDRSTRLEN];
|
char source_str[INET_ADDRSTRLEN];
|
||||||
pim_inet4_dump("<src?>", source_addr, source_str,
|
pim_inet4_dump("<src?>", source_addr, source_str,
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
#include "pim_iface.h"
|
#include "pim_iface.h"
|
||||||
|
|
||||||
struct ssmpingd_sock {
|
struct ssmpingd_sock {
|
||||||
|
struct pim_instance *pim;
|
||||||
|
|
||||||
int sock_fd; /* socket */
|
int sock_fd; /* socket */
|
||||||
struct thread *t_sock_read; /* thread for reading socket */
|
struct thread *t_sock_read; /* thread for reading socket */
|
||||||
struct in_addr source_addr; /* source address */
|
struct in_addr source_addr; /* source address */
|
||||||
@ -34,9 +36,9 @@ struct ssmpingd_sock {
|
|||||||
int64_t requests; /* counter */
|
int64_t requests; /* counter */
|
||||||
};
|
};
|
||||||
|
|
||||||
void pim_ssmpingd_init(void);
|
void pim_ssmpingd_init(struct pim_instance *pim);
|
||||||
void pim_ssmpingd_destroy(void);
|
void pim_ssmpingd_destroy(struct pim_instance *pim);
|
||||||
int pim_ssmpingd_start(struct in_addr source_addr);
|
int pim_ssmpingd_start(struct pim_instance *pim, struct in_addr source_addr);
|
||||||
int pim_ssmpingd_stop(struct in_addr source_addr);
|
int pim_ssmpingd_stop(struct pim_instance *pim, struct in_addr source_addr);
|
||||||
|
|
||||||
#endif /* PIM_SSMPINGD_H */
|
#endif /* PIM_SSMPINGD_H */
|
||||||
|
@ -198,12 +198,12 @@ static int pim_global_config_write_worker(struct pim_instance *pim,
|
|||||||
vty_out(vty, "ip pim ecmp\n");
|
vty_out(vty, "ip pim ecmp\n");
|
||||||
++writes;
|
++writes;
|
||||||
}
|
}
|
||||||
if (qpim_ssmpingd_list) {
|
if (pim->ssmpingd_list) {
|
||||||
struct listnode *node;
|
struct listnode *node;
|
||||||
struct ssmpingd_sock *ss;
|
struct ssmpingd_sock *ss;
|
||||||
vty_out(vty, "!\n");
|
vty_out(vty, "!\n");
|
||||||
++writes;
|
++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];
|
char source_str[INET_ADDRSTRLEN];
|
||||||
pim_inet4_dump("<src?>", ss->source_addr, source_str,
|
pim_inet4_dump("<src?>", ss->source_addr, source_str,
|
||||||
sizeof(source_str));
|
sizeof(source_str));
|
||||||
|
@ -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_requests = 0;
|
||||||
int64_t qpim_rpf_cache_refresh_events = 0;
|
int64_t qpim_rpf_cache_refresh_events = 0;
|
||||||
int64_t qpim_rpf_cache_refresh_last = 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_events = 0;
|
||||||
int64_t qpim_scan_oil_last = 0;
|
int64_t qpim_scan_oil_last = 0;
|
||||||
unsigned int qpim_keep_alive_time = PIM_KEEPALIVE_PERIOD;
|
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()
|
static void pim_free()
|
||||||
{
|
{
|
||||||
pim_ssmpingd_destroy();
|
|
||||||
|
|
||||||
pim_route_map_terminate();
|
pim_route_map_terminate();
|
||||||
|
|
||||||
zclient_lookup_free();
|
zclient_lookup_free();
|
||||||
@ -127,7 +123,6 @@ void pim_init()
|
|||||||
qpim_infinite_assert_metric.ip_address.s_addr = INADDR_ANY;
|
qpim_infinite_assert_metric.ip_address.s_addr = INADDR_ANY;
|
||||||
|
|
||||||
pim_cmd_init();
|
pim_cmd_init();
|
||||||
pim_ssmpingd_init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void pim_terminate()
|
void pim_terminate()
|
||||||
|
@ -137,8 +137,6 @@ struct thread *qpim_rpf_cache_refresher;
|
|||||||
int64_t qpim_rpf_cache_refresh_requests;
|
int64_t qpim_rpf_cache_refresh_requests;
|
||||||
int64_t qpim_rpf_cache_refresh_events;
|
int64_t qpim_rpf_cache_refresh_events;
|
||||||
int64_t qpim_rpf_cache_refresh_last;
|
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_events;
|
||||||
int64_t qpim_scan_oil_last;
|
int64_t qpim_scan_oil_last;
|
||||||
int64_t qpim_nexthop_lookups;
|
int64_t qpim_nexthop_lookups;
|
||||||
|
Loading…
Reference in New Issue
Block a user