mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-17 19:05:44 +00:00
ripngd: add vrf input parameter to the "clear-ripng-route" RPC
Description of the new parameter (adapted from the ietf-rip module): "VRF name identifying a specific RIPng instance. This leaf is optional for the rpc. If it is specified, the rpc will clear all routes in the specified RIPng instance; if it is not specified, the rpc will clear all routes in all RIPng instances."; Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
This commit is contained in:
parent
80cf4e451d
commit
c5b2b5f65c
@ -478,12 +478,24 @@ void cli_show_ipv6_ripng_split_horizon(struct vty *vty, struct lyd_node *dnode,
|
|||||||
*/
|
*/
|
||||||
DEFPY (clear_ipv6_rip,
|
DEFPY (clear_ipv6_rip,
|
||||||
clear_ipv6_rip_cmd,
|
clear_ipv6_rip_cmd,
|
||||||
"clear ipv6 ripng",
|
"clear ipv6 ripng [vrf WORD]",
|
||||||
CLEAR_STR
|
CLEAR_STR
|
||||||
IPV6_STR
|
IPV6_STR
|
||||||
"Clear IPv6 RIP database\n")
|
"Clear IPv6 RIP database\n"
|
||||||
|
VRF_CMD_HELP_STR)
|
||||||
{
|
{
|
||||||
return nb_cli_rpc("/frr-ripngd:clear-ripng-route", NULL, NULL);
|
struct list *input;
|
||||||
|
|
||||||
|
input = list_new();
|
||||||
|
if (vrf) {
|
||||||
|
struct yang_data *yang_vrf;
|
||||||
|
|
||||||
|
yang_vrf = yang_data_new(
|
||||||
|
"/frr-ripngd:clear-ripng-route/input/vrf", vrf);
|
||||||
|
listnode_add(input, yang_vrf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nb_cli_rpc("/frr-ripngd:clear-ripng-route", input, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ripng_cli_init(void)
|
void ripng_cli_init(void)
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "libfrr.h"
|
#include "libfrr.h"
|
||||||
|
|
||||||
#include "ripngd/ripngd.h"
|
#include "ripngd/ripngd.h"
|
||||||
|
#include "ripngd/ripng_debug.h"
|
||||||
#include "ripngd/ripng_route.h"
|
#include "ripngd/ripng_route.h"
|
||||||
#include "ripngd/ripng_cli.h"
|
#include "ripngd/ripng_cli.h"
|
||||||
|
|
||||||
@ -894,21 +895,20 @@ ripngd_instance_state_routes_route_metric_get_elem(const char *xpath,
|
|||||||
/*
|
/*
|
||||||
* XPath: /frr-ripngd:clear-ripng-route
|
* XPath: /frr-ripngd:clear-ripng-route
|
||||||
*/
|
*/
|
||||||
static int clear_ripng_route_rpc(const char *xpath, const struct list *input,
|
static void clear_ripng_route(struct ripng *ripng)
|
||||||
struct list *output)
|
|
||||||
{
|
{
|
||||||
struct ripng *ripng;
|
|
||||||
struct agg_node *rp;
|
struct agg_node *rp;
|
||||||
struct ripng_info *rinfo;
|
|
||||||
struct list *list;
|
|
||||||
struct listnode *listnode;
|
|
||||||
|
|
||||||
ripng = ripng_lookup_by_vrf_id(VRF_DEFAULT);
|
if (IS_RIPNG_DEBUG_EVENT)
|
||||||
if (!ripng)
|
zlog_debug("Clearing all RIPng routes (VRF %s)",
|
||||||
return NB_OK;
|
ripng->vrf_name);
|
||||||
|
|
||||||
/* Clear received RIPng routes */
|
/* Clear received RIPng routes */
|
||||||
for (rp = agg_route_top(ripng->table); rp; rp = agg_route_next(rp)) {
|
for (rp = agg_route_top(ripng->table); rp; rp = agg_route_next(rp)) {
|
||||||
|
struct list *list;
|
||||||
|
struct listnode *listnode;
|
||||||
|
struct ripng_info *rinfo;
|
||||||
|
|
||||||
list = rp->info;
|
list = rp->info;
|
||||||
if (list == NULL)
|
if (list == NULL)
|
||||||
continue;
|
continue;
|
||||||
@ -935,6 +935,30 @@ static int clear_ripng_route_rpc(const char *xpath, const struct list *input,
|
|||||||
agg_unlock_node(rp);
|
agg_unlock_node(rp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int clear_ripng_route_rpc(const char *xpath, const struct list *input,
|
||||||
|
struct list *output)
|
||||||
|
{
|
||||||
|
struct ripng *ripng;
|
||||||
|
struct yang_data *yang_vrf;
|
||||||
|
|
||||||
|
yang_vrf = yang_data_list_find(input, "%s/%s", xpath, "input/vrf");
|
||||||
|
if (yang_vrf) {
|
||||||
|
ripng = ripng_lookup_by_vrf_name(yang_vrf->value);
|
||||||
|
if (ripng)
|
||||||
|
clear_ripng_route(ripng);
|
||||||
|
} else {
|
||||||
|
struct vrf *vrf;
|
||||||
|
|
||||||
|
RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
|
||||||
|
ripng = vrf->info;
|
||||||
|
if (!ripng)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
clear_ripng_route(ripng);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return NB_OK;
|
return NB_OK;
|
||||||
}
|
}
|
||||||
|
@ -322,5 +322,18 @@ module frr-ripngd {
|
|||||||
description
|
description
|
||||||
"Clears RIPng routes from the IPv6 routing table and routes
|
"Clears RIPng routes from the IPv6 routing table and routes
|
||||||
redistributed into the RIPng protocol.";
|
redistributed into the RIPng protocol.";
|
||||||
|
|
||||||
|
input {
|
||||||
|
leaf vrf {
|
||||||
|
type string;
|
||||||
|
description
|
||||||
|
"VRF name identifying a specific RIPng instance.
|
||||||
|
This leaf is optional for the rpc.
|
||||||
|
If it is specified, the rpc will clear all routes in the
|
||||||
|
specified RIPng instance;
|
||||||
|
if it is not specified, the rpc will clear all routes in
|
||||||
|
all RIPng instances.";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user