mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-06-14 23:28:10 +00:00
sharpd: add zclient session create and delete
Add a couple of clis and some simple support that allows sharpd to create extra zapi client sessions. Signed-off-by: Mark Stapp <mjs@voltanet.io>
This commit is contained in:
parent
cba183561b
commit
2be4d61a86
@ -125,3 +125,15 @@ keyword. At present, no sharp commands will be preserved in the config.
|
|||||||
single subtype. The messages must specify a protocol daemon by
|
single subtype. The messages must specify a protocol daemon by
|
||||||
name, and can include optional zapi ``instance`` and ``session``
|
name, and can include optional zapi ``instance`` and ``session``
|
||||||
values.
|
values.
|
||||||
|
|
||||||
|
.. index:: sharp create session
|
||||||
|
.. clicmd:: sharp create session (1-1024)
|
||||||
|
|
||||||
|
Create an additional zapi client session for testing, using the
|
||||||
|
specified session id.
|
||||||
|
|
||||||
|
.. index:: sharp remove session
|
||||||
|
.. clicmd:: sharp remove session (1-1024)
|
||||||
|
|
||||||
|
Remove a test zapi client session that was created with the
|
||||||
|
specified session id.
|
||||||
|
@ -164,7 +164,7 @@ void zclient_stop(struct zclient *zclient)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (zclient_debug)
|
if (zclient_debug)
|
||||||
zlog_debug("zclient stopped");
|
zlog_debug("zclient %p stopped", zclient);
|
||||||
|
|
||||||
/* Stop threads. */
|
/* Stop threads. */
|
||||||
THREAD_OFF(zclient->t_read);
|
THREAD_OFF(zclient->t_read);
|
||||||
|
@ -547,6 +547,34 @@ DEFPY (logpump,
|
|||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFPY (create_session,
|
||||||
|
create_session_cmd,
|
||||||
|
"sharp create session (1-1024)",
|
||||||
|
"Sharp Routing Protocol\n"
|
||||||
|
"Create data\n"
|
||||||
|
"Create a test session\n"
|
||||||
|
"Session ID\n")
|
||||||
|
{
|
||||||
|
if (sharp_zclient_create(session) != 0) {
|
||||||
|
vty_out(vty, "%% Client session error\n");
|
||||||
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFPY (remove_session,
|
||||||
|
remove_session_cmd,
|
||||||
|
"sharp remove session (1-1024)",
|
||||||
|
"Sharp Routing Protocol\n"
|
||||||
|
"Remove data\n"
|
||||||
|
"Remove a test session\n"
|
||||||
|
"Session ID\n")
|
||||||
|
{
|
||||||
|
sharp_zclient_delete(session);
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
DEFPY (send_opaque,
|
DEFPY (send_opaque,
|
||||||
send_opaque_cmd,
|
send_opaque_cmd,
|
||||||
"sharp send opaque type (1-255) (1-1000)$count",
|
"sharp send opaque type (1-255) (1-1000)$count",
|
||||||
@ -626,6 +654,8 @@ void sharp_vty_init(void)
|
|||||||
install_element(ENABLE_NODE, &sharp_lsp_prefix_v4_cmd);
|
install_element(ENABLE_NODE, &sharp_lsp_prefix_v4_cmd);
|
||||||
install_element(ENABLE_NODE, &sharp_remove_lsp_prefix_v4_cmd);
|
install_element(ENABLE_NODE, &sharp_remove_lsp_prefix_v4_cmd);
|
||||||
install_element(ENABLE_NODE, &logpump_cmd);
|
install_element(ENABLE_NODE, &logpump_cmd);
|
||||||
|
install_element(ENABLE_NODE, &create_session_cmd);
|
||||||
|
install_element(ENABLE_NODE, &remove_session_cmd);
|
||||||
install_element(ENABLE_NODE, &send_opaque_cmd);
|
install_element(ENABLE_NODE, &send_opaque_cmd);
|
||||||
install_element(ENABLE_NODE, &send_opaque_unicast_cmd);
|
install_element(ENABLE_NODE, &send_opaque_unicast_cmd);
|
||||||
install_element(ENABLE_NODE, &send_opaque_reg_cmd);
|
install_element(ENABLE_NODE, &send_opaque_reg_cmd);
|
||||||
|
@ -25,14 +25,9 @@
|
|||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "prefix.h"
|
#include "prefix.h"
|
||||||
#include "routemap.h"
|
|
||||||
#include "table.h"
|
|
||||||
#include "stream.h"
|
#include "stream.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "zclient.h"
|
#include "zclient.h"
|
||||||
#include "filter.h"
|
|
||||||
#include "plist.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include "nexthop.h"
|
#include "nexthop.h"
|
||||||
#include "nexthop_group.h"
|
#include "nexthop_group.h"
|
||||||
|
|
||||||
@ -44,9 +39,41 @@
|
|||||||
struct zclient *zclient = NULL;
|
struct zclient *zclient = NULL;
|
||||||
|
|
||||||
/* For registering threads. */
|
/* For registering threads. */
|
||||||
extern struct thread_master *master;
|
struct thread_master *master;
|
||||||
|
|
||||||
/* Inteface addition message from zebra. */
|
/* Privs info */
|
||||||
|
struct zebra_privs_t sharp_privs;
|
||||||
|
|
||||||
|
DEFINE_MTYPE_STATIC(SHARPD, ZC, "Test zclients");
|
||||||
|
|
||||||
|
/* Struct to hold list of test zclients */
|
||||||
|
struct sharp_zclient {
|
||||||
|
struct sharp_zclient *prev;
|
||||||
|
struct sharp_zclient *next;
|
||||||
|
struct zclient *client;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Head of test zclient list */
|
||||||
|
static struct sharp_zclient *sharp_clients_head;
|
||||||
|
|
||||||
|
static int sharp_opaque_handler(ZAPI_CALLBACK_ARGS);
|
||||||
|
|
||||||
|
/* Utility to add a test zclient struct to the list */
|
||||||
|
static void add_zclient(struct zclient *client)
|
||||||
|
{
|
||||||
|
struct sharp_zclient *node;
|
||||||
|
|
||||||
|
node = XCALLOC(MTYPE_ZC, sizeof(struct sharp_zclient));
|
||||||
|
|
||||||
|
node->client = client;
|
||||||
|
|
||||||
|
node->next = sharp_clients_head;
|
||||||
|
if (sharp_clients_head)
|
||||||
|
sharp_clients_head->prev = node;
|
||||||
|
sharp_clients_head = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Interface addition message from zebra. */
|
||||||
static int sharp_ifp_create(struct interface *ifp)
|
static int sharp_ifp_create(struct interface *ifp)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -480,6 +507,62 @@ static int sharp_redistribute_route(ZAPI_CALLBACK_ARGS)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add a zclient with a specified session id, for testing. */
|
||||||
|
int sharp_zclient_create(uint32_t session_id)
|
||||||
|
{
|
||||||
|
struct zclient *client;
|
||||||
|
struct sharp_zclient *node;
|
||||||
|
|
||||||
|
/* Check for duplicates */
|
||||||
|
for (node = sharp_clients_head; node != NULL; node = node->next) {
|
||||||
|
if (node->client->session_id == session_id)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
client = zclient_new(master, &zclient_options_default);
|
||||||
|
client->sock = -1;
|
||||||
|
client->session_id = session_id;
|
||||||
|
|
||||||
|
zclient_init(client, ZEBRA_ROUTE_SHARP, 0, &sharp_privs);
|
||||||
|
|
||||||
|
/* Register handlers for messages we expect this session to see */
|
||||||
|
client->opaque_msg_handler = sharp_opaque_handler;
|
||||||
|
|
||||||
|
/* Enqueue on the list of test clients */
|
||||||
|
add_zclient(client);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Delete one of the extra test zclients */
|
||||||
|
int sharp_zclient_delete(uint32_t session_id)
|
||||||
|
{
|
||||||
|
struct sharp_zclient *node;
|
||||||
|
|
||||||
|
/* Search for session */
|
||||||
|
for (node = sharp_clients_head; node != NULL; node = node->next) {
|
||||||
|
if (node->client->session_id == session_id) {
|
||||||
|
/* Dequeue from list */
|
||||||
|
if (node->next)
|
||||||
|
node->next->prev = node->prev;
|
||||||
|
if (node->prev)
|
||||||
|
node->prev->next = node->next;
|
||||||
|
if (node == sharp_clients_head)
|
||||||
|
sharp_clients_head = node->next;
|
||||||
|
|
||||||
|
/* Clean up zclient */
|
||||||
|
zclient_stop(node->client);
|
||||||
|
zclient_free(node->client);
|
||||||
|
|
||||||
|
/* Free memory */
|
||||||
|
XFREE(MTYPE_ZC, node);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Handler for opaque messages */
|
/* Handler for opaque messages */
|
||||||
static int sharp_opaque_handler(ZAPI_CALLBACK_ARGS)
|
static int sharp_opaque_handler(ZAPI_CALLBACK_ARGS)
|
||||||
{
|
{
|
||||||
@ -491,7 +574,7 @@ static int sharp_opaque_handler(ZAPI_CALLBACK_ARGS)
|
|||||||
if (zclient_opaque_decode(s, &info) != 0)
|
if (zclient_opaque_decode(s, &info) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
zlog_debug("%s: [%d] received opaque type %u", __func__,
|
zlog_debug("%s: [%u] received opaque type %u", __func__,
|
||||||
zclient->session_id, info.type);
|
zclient->session_id, info.type);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -564,8 +647,6 @@ void sharp_opaque_reg_send(bool is_reg, uint32_t proto, uint32_t instance,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern struct zebra_privs_t sharp_privs;
|
|
||||||
|
|
||||||
void sharp_zebra_init(void)
|
void sharp_zebra_init(void)
|
||||||
{
|
{
|
||||||
struct zclient_options opt = {.receive_notify = true};
|
struct zclient_options opt = {.receive_notify = true};
|
||||||
|
@ -24,6 +24,10 @@
|
|||||||
|
|
||||||
extern void sharp_zebra_init(void);
|
extern void sharp_zebra_init(void);
|
||||||
|
|
||||||
|
/* Add and delete extra zapi client sessions, for testing */
|
||||||
|
int sharp_zclient_create(uint32_t session_id);
|
||||||
|
int sharp_zclient_delete(uint32_t session_id);
|
||||||
|
|
||||||
extern void vrf_label_add(vrf_id_t vrf_id, afi_t afi, mpls_label_t label);
|
extern void vrf_label_add(vrf_id_t vrf_id, afi_t afi, mpls_label_t label);
|
||||||
extern void route_add(const struct prefix *p, vrf_id_t, uint8_t instance,
|
extern void route_add(const struct prefix *p, vrf_id_t, uint8_t instance,
|
||||||
const struct nexthop_group *nhg,
|
const struct nexthop_group *nhg,
|
||||||
|
Loading…
Reference in New Issue
Block a user