diff options
Diffstat (limited to 'ospfd/ospf_sr.c')
| -rw-r--r-- | ospfd/ospf_sr.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/ospfd/ospf_sr.c b/ospfd/ospf_sr.c index 2c7c80686c..8fa5ce77bb 100644 --- a/ospfd/ospf_sr.c +++ b/ospfd/ospf_sr.c @@ -2302,6 +2302,84 @@ DEFUN(no_sr_global_label_range, no_sr_global_label_range_cmd, return CMD_SUCCESS; } +#if CONFDATE > 20220528 +CPP_NOTICE( + "Use of the segment-routing local-block command is deprecated, use the combined global-block command instead") +#endif + +DEFUN_HIDDEN(sr_local_label_range, sr_local_label_range_cmd, + "segment-routing local-block (16-1048575) (16-1048575)", + SR_STR + "Segment Routing Local Block label range\n" + "Lower-bound range in decimal (16-1048575)\n" + "Upper-bound range in decimal (16-1048575)\n") +{ + uint32_t upper; + uint32_t lower; + uint32_t srgb_upper; + int idx_low = 2; + int idx_up = 3; + + /* Get lower and upper bound */ + lower = strtoul(argv[idx_low]->arg, NULL, 10); + upper = strtoul(argv[idx_up]->arg, NULL, 10); + + /* check correctness of SRLB */ + if (!sr_range_is_valid(lower, upper, MIN_SRLB_SIZE)) { + vty_out(vty, "Invalid SRLB range\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + /* Check if values have changed */ + if ((OspfSR.srlb.start == lower) + && (OspfSR.srlb.end == upper)) + return CMD_SUCCESS; + + /* Validate SRLB against SRGB */ + srgb_upper = OspfSR.srgb.start + OspfSR.srgb.size - 1; + + if (ranges_overlap(OspfSR.srgb.start, srgb_upper, lower, upper)) { + vty_out(vty, + "New SR Local Block (%u/%u) conflicts with Global Block (%u/%u)\n", + lower, upper, OspfSR.srgb.start, srgb_upper); + return CMD_WARNING_CONFIG_FAILED; + } + + if (update_sr_blocks(OspfSR.srgb.start, srgb_upper, lower, upper) < 0) + return CMD_WARNING_CONFIG_FAILED; + else + return CMD_SUCCESS; +} + +DEFUN_HIDDEN(no_sr_local_label_range, no_sr_local_label_range_cmd, + "no segment-routing local-block [(16-1048575) (16-1048575)]", + NO_STR SR_STR + "Segment Routing Local Block label range\n" + "Lower-bound range in decimal (16-1048575)\n" + "Upper-bound range in decimal (16-1048575)\n") +{ + + uint32_t srgb_end; + + /* Validate SRLB against SRGB */ + srgb_end = OspfSR.srgb.start + OspfSR.srgb.size - 1; + if (ranges_overlap(OspfSR.srgb.start, srgb_end, DEFAULT_SRLB_LABEL, + DEFAULT_SRLB_END)) { + vty_out(vty, + "New SR Local Block (%u/%u) conflicts with Global Block (%u/%u)\n", + DEFAULT_SRLB_LABEL, DEFAULT_SRLB_END, OspfSR.srgb.start, + srgb_end); + return CMD_WARNING_CONFIG_FAILED; + } + + if (update_sr_blocks(OspfSR.srgb.start, srgb_end, DEFAULT_SRLB_LABEL, + DEFAULT_SRLB_END) + < 0) + return CMD_WARNING_CONFIG_FAILED; + else + return CMD_SUCCESS; +} + DEFUN (sr_node_msd, sr_node_msd_cmd, "segment-routing node-msd (1-16)", @@ -2969,6 +3047,8 @@ void ospf_sr_register_vty(void) install_element(OSPF_NODE, &no_ospf_sr_enable_cmd); install_element(OSPF_NODE, &sr_global_label_range_cmd); install_element(OSPF_NODE, &no_sr_global_label_range_cmd); + install_element(OSPF_NODE, &sr_local_label_range_cmd); + install_element(OSPF_NODE, &no_sr_local_label_range_cmd); install_element(OSPF_NODE, &sr_node_msd_cmd); install_element(OSPF_NODE, &no_sr_node_msd_cmd); install_element(OSPF_NODE, &sr_prefix_sid_cmd); |
