diff options
| author | Igor Ryzhov <iryzhov@nfware.com> | 2024-01-27 05:00:27 +0200 | 
|---|---|---|
| committer | Igor Ryzhov <iryzhov@nfware.com> | 2024-01-28 23:28:40 +0200 | 
| commit | 86855aed7824d89cfe9829a7ee9ab604ac15d02f (patch) | |
| tree | ace4e861a89c3f1c2cd5df600e3e74f296c2e212 | |
| parent | 2117faf1cf41ef34d0c67a34592a1e5cbbb0f8a8 (diff) | |
zebra: convert table range command to NB
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
| -rw-r--r-- | yang/frr-zebra.yang | 25 | ||||
| -rw-r--r-- | zebra/table_manager.c | 64 | ||||
| -rw-r--r-- | zebra/table_manager.h | 20 | ||||
| -rw-r--r-- | zebra/zebra_nb.c | 19 | ||||
| -rw-r--r-- | zebra/zebra_nb.h | 4 | ||||
| -rw-r--r-- | zebra/zebra_nb_config.c | 120 | ||||
| -rw-r--r-- | zebra/zebra_vty.c | 32 | 
7 files changed, 211 insertions, 73 deletions
diff --git a/yang/frr-zebra.yang b/yang/frr-zebra.yang index 5d539f4bd7..564617103b 100644 --- a/yang/frr-zebra.yang +++ b/yang/frr-zebra.yang @@ -2824,6 +2824,31 @@ module frr-zebra {             Removing the leaf sets it back to the default value for the profile.";        } +      container netns { +        description +          "Configuration for netns VRF backend."; +        container table-range { +          presence "Activates table-range configuration."; +          description +            "The range of tables to use for this netns."; +          leaf start { +            type uint32; +            mandatory true; +            description +              "The first table to use."; +          } +          leaf end { +            type uint32; +            mandatory true; +            must ". >= ../start" { +              error-message "End table must be greater than or equal to start table"; +            } +            description +              "The last table to use."; +          } +        } +      } +        uses ribs;        uses vrf-vni-mapping; diff --git a/zebra/table_manager.c b/zebra/table_manager.c index 512508b79f..3e540fda14 100644 --- a/zebra/table_manager.c +++ b/zebra/table_manager.c @@ -24,21 +24,6 @@  #include "zebra/table_manager.h"  #include "zebra/zebra_errors.h" -/* routing table identifiers - * - */ -#if !defined(GNU_LINUX) -/* BSD systems - */ -#else -/* Linux Systems - */ -#define RT_TABLE_ID_LOCAL                  255 -#define RT_TABLE_ID_MAIN                   254 -#define RT_TABLE_ID_DEFAULT                253 -#define RT_TABLE_ID_COMPAT                 252 -#define RT_TABLE_ID_UNSPEC                 0 -#endif /* !def(GNU_LINUX) */  #define RT_TABLE_ID_UNRESERVED_MIN         1  #define RT_TABLE_ID_UNRESERVED_MAX         0xffffffff @@ -279,52 +264,17 @@ void table_manager_disable(struct zebra_vrf *zvrf)  	zvrf->tbl_mgr = NULL;  } -int table_manager_range(struct vty *vty, bool add, struct zebra_vrf *zvrf, -			const char *start_table_str, const char *end_table_str) +void table_manager_range(bool add, struct zebra_vrf *zvrf, uint32_t start, +			 uint32_t end)  { -	uint32_t start; -	uint32_t end; -  	if (add) { -		if (!start_table_str || !end_table_str) { -			vty_out(vty, "%% Labels not specified\n"); -			return CMD_WARNING_CONFIG_FAILED; -		} -		start = atoi(start_table_str); -		end = atoi(end_table_str); -		if (end < start) { -			vty_out(vty, "%% End table is less than Start table\n"); -			return CMD_WARNING_CONFIG_FAILED; -		} +		if (zvrf->tbl_mgr && +		    ((zvrf->tbl_mgr->start && zvrf->tbl_mgr->start != start) || +		     (zvrf->tbl_mgr->end && zvrf->tbl_mgr->end != end))) +			zlog_info( +				"%% New range will be taken into account at restart"); -#if !defined(GNU_LINUX) -/* BSD systems - */ -#else -		/* Linux Systems -		 */ -		if ((start >= RT_TABLE_ID_COMPAT && start <= RT_TABLE_ID_LOCAL) -		    || (end >= RT_TABLE_ID_COMPAT -			&& end <= RT_TABLE_ID_LOCAL)) { -			vty_out(vty, "%% Values forbidden in range [%u;%u]\n", -				RT_TABLE_ID_COMPAT, RT_TABLE_ID_LOCAL); -			return CMD_WARNING_CONFIG_FAILED; -		} -		if (start < RT_TABLE_ID_COMPAT && end > RT_TABLE_ID_LOCAL) { -			vty_out(vty, -				"%% Range overlaps range [%u;%u] forbidden\n", -				RT_TABLE_ID_COMPAT, RT_TABLE_ID_LOCAL); -			return CMD_WARNING_CONFIG_FAILED; -		} -#endif -		if (zvrf->tbl_mgr -		    && ((zvrf->tbl_mgr->start && zvrf->tbl_mgr->start != start) -			|| (zvrf->tbl_mgr->end && zvrf->tbl_mgr->end != end))) { -			vty_out(vty, -				"%% New range will be taken into account at restart\n"); -		}  		table_range_add(zvrf, start, end);  	} else  		table_range_add(zvrf, 0, 0); -	return CMD_SUCCESS;  } diff --git a/zebra/table_manager.h b/zebra/table_manager.h index f8e99a357d..21691994cb 100644 --- a/zebra/table_manager.h +++ b/zebra/table_manager.h @@ -18,6 +18,22 @@  extern "C" {  #endif +/* routing table identifiers + * + */ +#if !defined(GNU_LINUX) +/* BSD systems + */ +#else +/* Linux Systems + */ +#define RT_TABLE_ID_LOCAL   255 +#define RT_TABLE_ID_MAIN    254 +#define RT_TABLE_ID_DEFAULT 253 +#define RT_TABLE_ID_COMPAT  252 +#define RT_TABLE_ID_UNSPEC  0 +#endif /* !def(GNU_LINUX) */ +  /*   * Table chunk struct   * Client daemon which the chunk belongs to can be identified by either @@ -56,8 +72,8 @@ int release_table_chunk(uint8_t proto, uint16_t instance, uint32_t start,  			uint32_t end, struct zebra_vrf *zvrf);  int release_daemon_table_chunks(struct zserv *client);  void table_manager_disable(struct zebra_vrf *zvrf); -int table_manager_range(struct vty *vty, bool add, struct zebra_vrf *zvrf, -			const char *min, const char *max); +void table_manager_range(bool add, struct zebra_vrf *zvrf, uint32_t start, +			 uint32_t end);  #ifdef __cplusplus  } diff --git a/zebra/zebra_nb.c b/zebra/zebra_nb.c index d3c8d9badf..c90720b749 100644 --- a/zebra/zebra_nb.c +++ b/zebra/zebra_nb.c @@ -894,6 +894,25 @@ const struct frr_yang_module_info frr_zebra_info = {  			}  		},  		{ +			.xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/netns/table-range", +			.cbs = { +				.create = lib_vrf_zebra_netns_table_range_create, +				.destroy = lib_vrf_zebra_netns_table_range_destroy, +			} +		}, +		{ +			.xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/netns/table-range/start", +			.cbs = { +				.modify = lib_vrf_zebra_netns_table_range_start_modify, +			} +		}, +		{ +			.xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/netns/table-range/end", +			.cbs = { +				.modify = lib_vrf_zebra_netns_table_range_end_modify, +			} +		}, +		{  			.xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib",  			.cbs = {  				.get_next = lib_vrf_zebra_ribs_rib_get_next, diff --git a/zebra/zebra_nb.h b/zebra/zebra_nb.h index 1861236121..f60340fe93 100644 --- a/zebra/zebra_nb.h +++ b/zebra/zebra_nb.h @@ -433,6 +433,10 @@ int lib_vrf_zebra_resolve_via_default_destroy(struct nb_cb_destroy_args *args);  int lib_vrf_zebra_ipv6_resolve_via_default_modify(struct nb_cb_modify_args *args);  int lib_vrf_zebra_ipv6_resolve_via_default_destroy(  	struct nb_cb_destroy_args *args); +int lib_vrf_zebra_netns_table_range_create(struct nb_cb_create_args *args); +int lib_vrf_zebra_netns_table_range_destroy(struct nb_cb_destroy_args *args); +int lib_vrf_zebra_netns_table_range_start_modify(struct nb_cb_modify_args *args); +int lib_vrf_zebra_netns_table_range_end_modify(struct nb_cb_modify_args *args);  const void *lib_vrf_zebra_ribs_rib_get_next(struct nb_cb_get_next_args *args);  int lib_vrf_zebra_ribs_rib_get_keys(struct nb_cb_get_keys_args *args);  const void * diff --git a/zebra/zebra_nb_config.c b/zebra/zebra_nb_config.c index 50c116d156..b026f994cd 100644 --- a/zebra/zebra_nb_config.c +++ b/zebra/zebra_nb_config.c @@ -28,6 +28,7 @@  #include "zebra/router-id.h"  #include "zebra/zebra_routemap.h"  #include "zebra/zebra_rnh.h" +#include "zebra/table_manager.h"  /*   * XPath: /frr-zebra:zebra/mcast-rpf-lookup @@ -3631,6 +3632,125 @@ int lib_vrf_zebra_ipv6_resolve_via_default_destroy(struct nb_cb_destroy_args *ar  }  /* + * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/netns/table-range + */ +static int table_range_validate(uint32_t start, uint32_t end, char *errmsg, +				size_t errmsg_len) +{ +#if defined(GNU_LINUX) +	if ((start >= RT_TABLE_ID_COMPAT && start <= RT_TABLE_ID_LOCAL) || +	    (end >= RT_TABLE_ID_COMPAT && end <= RT_TABLE_ID_LOCAL)) { +		snprintfrr(errmsg, errmsg_len, +			   "Values forbidden in range [%u;%u]", +			   RT_TABLE_ID_COMPAT, RT_TABLE_ID_LOCAL); +		return NB_ERR_VALIDATION; +	} +	if (start < RT_TABLE_ID_COMPAT && end > RT_TABLE_ID_LOCAL) { +		snprintfrr(errmsg, errmsg_len, +			   "Range overlaps range [%u;%u] forbidden", +			   RT_TABLE_ID_COMPAT, RT_TABLE_ID_LOCAL); +		return NB_ERR_VALIDATION; +	} +#endif +	return NB_OK; +} + +int lib_vrf_zebra_netns_table_range_create(struct nb_cb_create_args *args) +{ +	struct vrf *vrf; +	uint32_t start, end; +	const char *vrf_name; + +	start = yang_dnode_get_uint32(args->dnode, "start"); +	end = yang_dnode_get_uint32(args->dnode, "end"); + +	if (args->event == NB_EV_VALIDATE) { +		vrf_name = yang_dnode_get_string(args->dnode, "../../../name"); +		if (!vrf_is_backend_netns() && +		    strcmp(vrf_name, VRF_DEFAULT_NAME)) { +			snprintfrr(args->errmsg, args->errmsg_len, +				   "Configuration is not available in non-default VRFs when using VRF-lite backend."); +			return NB_ERR_VALIDATION; +		} +		return table_range_validate(start, end, args->errmsg, +					    args->errmsg_len); +	} + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	vrf = nb_running_get_entry(args->dnode, NULL, true); + +	table_manager_range(true, vrf->info, start, end); + +	return NB_OK; +} + +int lib_vrf_zebra_netns_table_range_destroy(struct nb_cb_destroy_args *args) +{ +	struct vrf *vrf; + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	vrf = nb_running_get_entry(args->dnode, NULL, true); + +	table_manager_range(false, vrf->info, 0, 0); + +	return NB_OK; +} + +/* + * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/netns/table-range/start + */ +int lib_vrf_zebra_netns_table_range_start_modify(struct nb_cb_modify_args *args) +{ +	struct vrf *vrf; +	uint32_t start, end; + +	start = yang_dnode_get_uint32(args->dnode, NULL); +	end = yang_dnode_get_uint32(args->dnode, "../end"); + +	if (args->event == NB_EV_VALIDATE) +		return table_range_validate(start, end, args->errmsg, +					    args->errmsg_len); + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	vrf = nb_running_get_entry(args->dnode, NULL, true); + +	table_manager_range(true, vrf->info, start, end); + +	return NB_OK; +} + +/* + * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/netns/table-range/end + */ +int lib_vrf_zebra_netns_table_range_end_modify(struct nb_cb_modify_args *args) +{ +	struct vrf *vrf; +	uint32_t start, end; + +	start = yang_dnode_get_uint32(args->dnode, "../start"); +	end = yang_dnode_get_uint32(args->dnode, NULL); + +	if (args->event == NB_EV_VALIDATE) +		return table_range_validate(start, end, args->errmsg, +					    args->errmsg_len); + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	vrf = nb_running_get_entry(args->dnode, NULL, true); + +	table_manager_range(true, vrf->info, start, end); + +	return NB_OK; +} + +/*   * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/l3vni-id   */  int lib_vrf_zebra_l3vni_id_modify(struct nb_cb_modify_args *args) diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index bb14e85e7d..352e51afae 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -4394,29 +4394,33 @@ DEFPY (no_zebra_protodown_bit,  #endif /* HAVE_NETLINK */ -DEFUN(ip_table_range, ip_table_range_cmd, -      "[no] ip table range (1-4294967295) (1-4294967295)", +DEFPY_YANG (ip_table_range, ip_table_range_cmd, +      "[no] ip table range ![(1-4294967295)$start (1-4294967295)$end]",        NO_STR IP_STR        "table configuration\n"        "Configure table range\n"        "Start Routing Table\n"        "End Routing Table\n")  { -	ZEBRA_DECLVAR_CONTEXT_VRF(vrf, zvrf); - -	if (!zvrf) -		return CMD_WARNING; - -	if (zvrf_id(zvrf) != VRF_DEFAULT && !vrf_is_backend_netns()) { -		vty_out(vty, -			"VRF subcommand does not make any sense in l3mdev based vrf's\n"); -		return CMD_WARNING; +	if (!no) { +		nb_cli_enqueue_change(vty, "./frr-zebra:zebra/netns/table-range", +				      NB_OP_CREATE, NULL); +		nb_cli_enqueue_change(vty, +				      "./frr-zebra:zebra/netns/table-range/start", +				      NB_OP_MODIFY, start_str); +		nb_cli_enqueue_change(vty, +				      "./frr-zebra:zebra/netns/table-range/end", +				      NB_OP_MODIFY, end_str); +	} else { +		nb_cli_enqueue_change(vty, "./frr-zebra:zebra/netns/table-range", +				      NB_OP_DESTROY, NULL);  	} -	if (strmatch(argv[0]->text, "no")) -		return table_manager_range(vty, false, zvrf, NULL, NULL); +	if (vty->node == CONFIG_NODE) +		return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", +					    VRF_DEFAULT_NAME); -	return table_manager_range(vty, true, zvrf, argv[3]->arg, argv[4]->arg); +	return nb_cli_apply_changes(vty, NULL);  }  #ifdef HAVE_SCRIPTING  | 
