diff options
| -rw-r--r-- | bgpd/bgp_rpki.c | 143 | ||||
| -rw-r--r-- | lib/command.c | 3 | ||||
| -rw-r--r-- | lib/command.h | 1 | ||||
| -rw-r--r-- | vtysh/vtysh.c | 17 | ||||
| -rw-r--r-- | vtysh/vtysh.h | 2 | ||||
| -rw-r--r-- | vtysh/vtysh_config.c | 11 |
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); |
