summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_rpki.c143
-rw-r--r--lib/command.c3
-rw-r--r--lib/command.h1
-rw-r--r--vtysh/vtysh.c17
-rw-r--r--vtysh/vtysh.h2
-rw-r--r--vtysh/vtysh_config.c11
6 files changed, 154 insertions, 23 deletions
diff --git a/bgpd/bgp_rpki.c b/bgpd/bgp_rpki.c
index 0c23e9f535..c9e01ddbf7 100644
--- a/bgpd/bgp_rpki.c
+++ b/bgpd/bgp_rpki.c
@@ -172,6 +172,16 @@ static struct cmd_node rpki_node = {
.config_write = config_write,
.node_exit = config_on_exit,
};
+
+static struct cmd_node rpki_vrf_node = {
+ .name = "rpki",
+ .node = RPKI_VRF_NODE,
+ .parent_node = VRF_NODE,
+ .prompt = "%s(config-vrf-rpki)# ",
+ .config_write = config_write,
+ .node_exit = config_on_exit,
+};
+
static const struct route_map_rule_cmd route_match_rpki_cmd = {
"rpki", route_match, route_match_compile, route_match_free};
@@ -627,7 +637,7 @@ static void rpki_update_cb_sync_rtr(struct pfx_table *p __attribute__((unused)),
{
struct rpki_vrf *rpki_vrf;
const char *msg;
- struct rtr_socket *rtr = rec.socket;
+ const struct rtr_socket *rtr = rec.socket;
struct tr_socket *tr;
const char *ident;
int retval;
@@ -1355,16 +1365,28 @@ DEFUN_NOSH (rpki,
"Enable rpki and enter rpki configuration mode\n")
{
struct rpki_vrf *rpki_vrf;
+ char *vrfname = NULL;
- vty->node = RPKI_NODE;
+ if (vty->node == CONFIG_NODE)
+ vty->node = RPKI_NODE;
+ else {
+ struct vrf *vrf = VTY_GET_CONTEXT(vrf);
+
+ vty->node = RPKI_VRF_NODE;
+ if (vrf->vrf_id != VRF_DEFAULT)
+ vrfname = vrf->name;
+ }
/* assume default vrf */
- rpki_vrf = find_rpki_vrf(NULL);
+ rpki_vrf = find_rpki_vrf(vrfname);
if (!rpki_vrf) {
- rpki_vrf = bgp_rpki_allocate(NULL);
+ rpki_vrf = bgp_rpki_allocate(vrfname);
rpki_init_sync_socket(rpki_vrf);
}
- VTY_PUSH_CONTEXT(RPKI_NODE, rpki_vrf);
+ if (vty->node == RPKI_VRF_NODE)
+ VTY_PUSH_CONTEXT_SUB(vty->node, rpki_vrf);
+ else
+ VTY_PUSH_CONTEXT(vty->node, rpki_vrf);
return CMD_SUCCESS;
}
@@ -1375,9 +1397,16 @@ DEFUN_NOSH (no_rpki,
"Enable rpki and enter rpki configuration mode\n")
{
struct rpki_vrf *rpki_vrf;
+ char *vrfname = NULL;
- /* assume default vrf */
- rpki_vrf = find_rpki_vrf(NULL);
+ if (vty->node == VRF_NODE) {
+ VTY_DECLVAR_CONTEXT(vrf, vrf);
+
+ if (vrf->vrf_id != VRF_DEFAULT)
+ vrfname = vrf->name;
+ }
+
+ rpki_vrf = find_rpki_vrf(vrfname);
if (rpki_vrf)
bgp_rpki_finish(rpki_vrf);
@@ -1454,7 +1483,12 @@ DEFPY (rpki_polling_period,
"Set polling period\n"
"Polling period value\n")
{
- VTY_DECLVAR_CONTEXT(rpki_vrf, rpki_vrf);
+ struct rpki_vrf *rpki_vrf;
+
+ if (vty->node == RPKI_VRF_NODE)
+ rpki_vrf = VTY_GET_CONTEXT_SUB(rpki_vrf);
+ else
+ rpki_vrf = VTY_GET_CONTEXT(rpki_vrf);
rpki_vrf->polling_period = pp;
return CMD_SUCCESS;
@@ -1467,7 +1501,12 @@ DEFUN (no_rpki_polling_period,
RPKI_OUTPUT_STRING
"Set polling period back to default\n")
{
- VTY_DECLVAR_CONTEXT(rpki_vrf, rpki_vrf);
+ struct rpki_vrf *rpki_vrf;
+
+ if (vty->node == RPKI_VRF_NODE)
+ rpki_vrf = VTY_GET_CONTEXT_SUB(rpki_vrf);
+ else
+ rpki_vrf = VTY_GET_CONTEXT(rpki_vrf);
rpki_vrf->polling_period = POLLING_PERIOD_DEFAULT;
return CMD_SUCCESS;
@@ -1480,7 +1519,12 @@ DEFPY (rpki_expire_interval,
"Set expire interval\n"
"Expire interval value\n")
{
- VTY_DECLVAR_CONTEXT(rpki_vrf, rpki_vrf);
+ struct rpki_vrf *rpki_vrf;
+
+ if (vty->node == RPKI_VRF_NODE)
+ rpki_vrf = VTY_GET_CONTEXT_SUB(rpki_vrf);
+ else
+ rpki_vrf = VTY_GET_CONTEXT(rpki_vrf);
if ((unsigned int)tmp >= rpki_vrf->polling_period) {
rpki_vrf->expire_interval = tmp;
@@ -1498,7 +1542,12 @@ DEFUN (no_rpki_expire_interval,
RPKI_OUTPUT_STRING
"Set expire interval back to default\n")
{
- VTY_DECLVAR_CONTEXT(rpki_vrf, rpki_vrf);
+ struct rpki_vrf *rpki_vrf;
+
+ if (vty->node == RPKI_VRF_NODE)
+ rpki_vrf = VTY_GET_CONTEXT_SUB(rpki_vrf);
+ else
+ rpki_vrf = VTY_GET_CONTEXT(rpki_vrf);
rpki_vrf->expire_interval = rpki_vrf->polling_period * 2;
return CMD_SUCCESS;
@@ -1511,7 +1560,12 @@ DEFPY (rpki_retry_interval,
"Set retry interval\n"
"retry interval value\n")
{
- VTY_DECLVAR_CONTEXT(rpki_vrf, rpki_vrf);
+ struct rpki_vrf *rpki_vrf;
+
+ if (vty->node == RPKI_VRF_NODE)
+ rpki_vrf = VTY_GET_CONTEXT_SUB(rpki_vrf);
+ else
+ rpki_vrf = VTY_GET_CONTEXT(rpki_vrf);
rpki_vrf->retry_interval = tmp;
return CMD_SUCCESS;
@@ -1524,7 +1578,12 @@ DEFUN (no_rpki_retry_interval,
RPKI_OUTPUT_STRING
"Set retry interval back to default\n")
{
- VTY_DECLVAR_CONTEXT(rpki_vrf, rpki_vrf);
+ struct rpki_vrf *rpki_vrf;
+
+ if (vty->node == RPKI_VRF_NODE)
+ rpki_vrf = VTY_GET_CONTEXT_SUB(rpki_vrf);
+ else
+ rpki_vrf = VTY_GET_CONTEXT(rpki_vrf);
rpki_vrf->retry_interval = RETRY_INTERVAL_DEFAULT;
return CMD_SUCCESS;
@@ -1612,8 +1671,12 @@ DEFPY (rpki_cache,
struct listnode *cache_node;
struct cache *current_cache;
char *pub = NULL;
+ struct rpki_vrf *rpki_vrf;
- VTY_DECLVAR_CONTEXT(rpki_vrf, rpki_vrf);
+ if (vty->node == RPKI_VRF_NODE)
+ rpki_vrf = VTY_GET_CONTEXT_SUB(rpki_vrf);
+ else
+ rpki_vrf = VTY_GET_CONTEXT(rpki_vrf);
if (!rpki_vrf->cache_list)
return CMD_WARNING;
@@ -1680,8 +1743,12 @@ DEFPY (no_rpki_cache,
{
struct cache *cache_p;
struct list *cache_list = NULL;
+ struct rpki_vrf *rpki_vrf;
- VTY_DECLVAR_CONTEXT(rpki_vrf, rpki_vrf);
+ if (vty->node == RPKI_VRF_NODE)
+ rpki_vrf = VTY_GET_CONTEXT_SUB(rpki_vrf);
+ else
+ rpki_vrf = VTY_GET_CONTEXT(rpki_vrf);
cache_list = rpki_vrf->cache_list;
cache_p = find_cache(preference, cache_list);
@@ -2016,8 +2083,12 @@ DEFUN (show_rpki_configuration,
static int config_on_exit(struct vty *vty)
{
- VTY_DECLVAR_CONTEXT(rpki_vrf, rpki_vrf);
+ struct rpki_vrf *rpki_vrf;
+ if (vty->node == RPKI_VRF_NODE)
+ rpki_vrf = VTY_GET_CONTEXT_SUB(rpki_vrf);
+ else
+ rpki_vrf = VTY_GET_CONTEXT(rpki_vrf);
reset(false, rpki_vrf);
return 1;
}
@@ -2030,10 +2101,10 @@ DEFUN (rpki_reset,
{
struct rpki_vrf *rpki_vrf;
- /* assume default vrf */
- rpki_vrf = find_rpki_vrf(NULL);
- if (!rpki_vrf)
- return CMD_SUCCESS;
+ if (vty->node == RPKI_VRF_NODE)
+ rpki_vrf = VTY_GET_CONTEXT_SUB(rpki_vrf);
+ else
+ rpki_vrf = VTY_GET_CONTEXT(rpki_vrf);
return reset(true, rpki_vrf) == SUCCESS ? CMD_SUCCESS : CMD_WARNING;
}
@@ -2130,6 +2201,8 @@ static void install_cli_commands(void)
// TODO: make config write work
install_node(&rpki_node);
install_default(RPKI_NODE);
+ install_node(&rpki_vrf_node);
+ install_default(RPKI_VRF_NODE);
install_element(CONFIG_NODE, &rpki_cmd);
install_element(CONFIG_NODE, &no_rpki_cmd);
@@ -2163,6 +2236,36 @@ static void install_cli_commands(void)
install_element(RPKI_NODE, &rpki_cache_cmd);
install_element(RPKI_NODE, &no_rpki_cache_cmd);
+ /* RPKI_VRF_NODE commands */
+ install_element(VRF_NODE, &rpki_cmd);
+ install_element(VRF_NODE, &no_rpki_cmd);
+ /* Install rpki reset command */
+ install_element(RPKI_VRF_NODE, &rpki_reset_cmd);
+
+ /* Install rpki polling period commands */
+ install_element(RPKI_VRF_NODE, &rpki_polling_period_cmd);
+ install_element(RPKI_VRF_NODE, &no_rpki_polling_period_cmd);
+
+ /* Install rpki expire interval commands */
+ install_element(RPKI_VRF_NODE, &rpki_expire_interval_cmd);
+ install_element(RPKI_VRF_NODE, &no_rpki_expire_interval_cmd);
+
+ /* Install rpki retry interval commands */
+ install_element(RPKI_VRF_NODE, &rpki_retry_interval_cmd);
+ install_element(RPKI_VRF_NODE, &no_rpki_retry_interval_cmd);
+
+ /* Install rpki timeout commands */
+ install_element(RPKI_VRF_NODE, &rpki_timeout_cmd);
+ install_element(RPKI_VRF_NODE, &no_rpki_timeout_cmd);
+
+ /* Install rpki synchronisation timeout commands */
+ install_element(RPKI_VRF_NODE, &rpki_synchronisation_timeout_cmd);
+ install_element(RPKI_VRF_NODE, &no_rpki_synchronisation_timeout_cmd);
+
+ /* Install rpki cache commands */
+ install_element(RPKI_VRF_NODE, &rpki_cache_cmd);
+ install_element(RPKI_VRF_NODE, &no_rpki_cache_cmd);
+
/* Install show commands */
install_element(VIEW_NODE, &show_rpki_prefix_table_cmd);
install_element(VIEW_NODE, &show_rpki_cache_connection_cmd);
diff --git a/lib/command.c b/lib/command.c
index 80b75d9b23..fc43cce189 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -841,6 +841,9 @@ enum node_type node_parent(enum node_type node)
case BFD_PROFILE_NODE:
ret = BFD_NODE;
break;
+ case RPKI_VRF_NODE:
+ ret = VRF_NODE;
+ break;
default:
ret = CONFIG_NODE;
break;
diff --git a/lib/command.h b/lib/command.h
index 21bb613540..9e0fc783c7 100644
--- a/lib/command.h
+++ b/lib/command.h
@@ -159,6 +159,7 @@ enum node_type {
OPENFABRIC_NODE, /* OpenFabric router configuration node */
VRRP_NODE, /* VRRP node */
BMP_NODE, /* BMP config under router bgp */
+ RPKI_VRF_NODE, /* RPKI node for VRF */
NODE_TYPE_MAX, /* maximum */
};
diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c
index 29e0842daf..aa9306aac9 100644
--- a/vtysh/vtysh.c
+++ b/vtysh/vtysh.c
@@ -1478,6 +1478,13 @@ static struct cmd_node rpki_node = {
.prompt = "%s(config-rpki)# ",
};
+static struct cmd_node rpki_vrf_node = {
+ .name = "rpki",
+ .node = RPKI_VRF_NODE,
+ .parent_node = VRF_NODE,
+ .prompt = "%s(config-vrf-rpki)# ",
+};
+
#if HAVE_BFDD > 0
static struct cmd_node bfd_node = {
.name = "bfd",
@@ -1665,7 +1672,10 @@ DEFUNSH(VTYSH_BGPD,
"rpki",
"Enable rpki and enter rpki configuration mode\n")
{
- vty->node = RPKI_NODE;
+ if (vty->node == CONFIG_NODE)
+ vty->node = RPKI_NODE;
+ else
+ vty->node = RPKI_VRF_NODE;
return CMD_SUCCESS;
}
@@ -3815,6 +3825,7 @@ void vtysh_init_vty(void)
install_node(&vty_node);
install_node(&rpki_node);
install_node(&bmp_node);
+ install_node(&rpki_vrf_node);
#if HAVE_BFDD > 0
install_node(&bfd_node);
install_node(&bfd_peer_node);
@@ -4059,9 +4070,13 @@ void vtysh_init_vty(void)
install_element(BMP_NODE, &vtysh_end_all_cmd);
install_element(CONFIG_NODE, &rpki_cmd);
+ install_element(VRF_NODE, &rpki_cmd);
install_element(RPKI_NODE, &rpki_exit_cmd);
install_element(RPKI_NODE, &rpki_quit_cmd);
install_element(RPKI_NODE, &vtysh_end_all_cmd);
+ install_element(RPKI_VRF_NODE, &rpki_exit_cmd);
+ install_element(RPKI_VRF_NODE, &rpki_quit_cmd);
+ install_element(RPKI_VRF_NODE, &vtysh_end_all_cmd);
/* EVPN commands */
install_element(BGP_EVPN_NODE, &bgp_evpn_vni_cmd);
diff --git a/vtysh/vtysh.h b/vtysh/vtysh.h
index d0edbb2710..97ae8b4890 100644
--- a/vtysh/vtysh.h
+++ b/vtysh/vtysh.h
@@ -54,7 +54,7 @@ DECLARE_MGROUP(MVTYSH)
#define VTYSH_ALL VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_LDPD|VTYSH_BGPD|VTYSH_ISISD|VTYSH_PIMD|VTYSH_NHRPD|VTYSH_EIGRPD|VTYSH_BABELD|VTYSH_SHARPD|VTYSH_PBRD|VTYSH_STATICD|VTYSH_BFDD|VTYSH_FABRICD|VTYSH_VRRPD
#define VTYSH_RMAP VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_BGPD|VTYSH_ISISD|VTYSH_PIMD|VTYSH_EIGRPD|VTYSH_SHARPD|VTYSH_FABRICD
#define VTYSH_INTERFACE VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_ISISD|VTYSH_PIMD|VTYSH_NHRPD|VTYSH_EIGRPD|VTYSH_BABELD|VTYSH_PBRD|VTYSH_FABRICD|VTYSH_VRRPD
-#define VTYSH_VRF VTYSH_ZEBRA|VTYSH_PIMD|VTYSH_STATICD
+#define VTYSH_VRF VTYSH_ZEBRA|VTYSH_PIMD|VTYSH_STATICD|VTYSH_BGPD
#define VTYSH_KEYS VTYSH_RIPD|VTYSH_EIGRPD
/* Daemons who can process nexthop-group configs */
#define VTYSH_NH_GROUP VTYSH_PBRD|VTYSH_SHARPD
diff --git a/vtysh/vtysh_config.c b/vtysh/vtysh_config.c
index 44ec08b61a..afc7a007e2 100644
--- a/vtysh/vtysh_config.c
+++ b/vtysh/vtysh_config.c
@@ -264,13 +264,22 @@ void vtysh_config_parse_line(void *arg, const char *line)
config_add_line(config->line, line);
} else if (!strncmp(line, " ip mroute", strlen(" ip mroute"))) {
config_add_line_uniq_end(config->line, line);
+ } else if ((strncmp(line, " rpki", strlen(" rpki")) == 0)
+ && config->index == VRF_NODE) {
+ config_add_line(config->line, line);
+ config->index = RPKI_VRF_NODE;
} else if (config->index == RMAP_NODE
|| config->index == INTERFACE_NODE
|| config->index == VTY_NODE
|| config->index == VRF_NODE
|| config->index == NH_GROUP_NODE)
config_add_line_uniq(config->line, line);
- else
+ else if (config->index == RPKI_VRF_NODE
+ && strncmp(line, " exit",
+ strlen(" exit")) == 0) {
+ config_add_line(config->line, line);
+ config->index = VRF_NODE;
+ } else
config_add_line(config->line, line);
} else
config_add_line(config_top, line);