From faa75dfa6cb503ebaf4f8b034e2c6468b7b0120e Mon Sep 17 00:00:00 2001 From: Mark Stapp Date: Tue, 4 Aug 2020 09:34:37 -0400 Subject: [PATCH] sharpd: support 'update lsp' zapi testing Add 'update' support so that sharpd can exercise add, update, and delete zapi exchanges for LSPs. Signed-off-by: Mark Stapp --- doc/user/sharp.rst | 10 +++++----- sharpd/sharp_vty.c | 34 ++++++++++++++++++++-------------- sharpd/sharp_zebra.c | 24 +++++++++++++++--------- sharpd/sharp_zebra.h | 5 +++-- 4 files changed, 43 insertions(+), 30 deletions(-) diff --git a/doc/user/sharp.rst b/doc/user/sharp.rst index 1c474193f2..76bdc48dc0 100644 --- a/doc/user/sharp.rst +++ b/doc/user/sharp.rst @@ -88,13 +88,13 @@ keyword. At present, no sharp commands will be preserved in the config. may have been turned on. .. index:: sharp lsp -.. clicmd:: sharp lsp (0-100000) nexthop-group NAME [prefix A.B.C.D/M TYPE [instance (0-255)]] +.. clicmd:: sharp lsp [update] (0-100000) nexthop-group NAME [prefix A.B.C.D/M TYPE [instance (0-255)]] Install an LSP using the specified in-label, with nexthops as - listed in nexthop-group ``NAME``. The LSP is installed as type - ZEBRA_LSP_SHARP. If ``prefix`` is specified, an existing route with - type ``TYPE`` (and optional ``instance`` id) will be updated to use - the LSP. + listed in nexthop-group ``NAME``. If ``update`` is included, the + update path is used. The LSP is installed as type ZEBRA_LSP_SHARP. + If ``prefix`` is specified, an existing route with type ``TYPE`` + (and optional ``instance`` id) will be updated to use the LSP. .. index:: sharp remove lsp .. clicmd:: sharp remove lsp (0-100000) nexthop-group NAME [prefix A.B.C.D/M TYPE [instance (0-255)]] diff --git a/sharpd/sharp_vty.c b/sharpd/sharp_vty.c index 1d2b87b9ba..6a120c8eff 100644 --- a/sharpd/sharp_vty.c +++ b/sharpd/sharp_vty.c @@ -394,27 +394,31 @@ DEFUN_NOSH (show_debugging_sharpd, return CMD_SUCCESS; } -DEFPY(sharp_lsp_prefix_v4, sharp_lsp_prefix_v4_cmd, - "sharp lsp (0-100000)$inlabel\ +DEFPY (sharp_lsp_prefix_v4, sharp_lsp_prefix_v4_cmd, + "sharp lsp [update]$update (0-100000)$inlabel\ nexthop-group NHGNAME$nhgname\ [prefix A.B.C.D/M$pfx\ " FRR_IP_REDIST_STR_ZEBRA "$type_str [instance (0-255)$instance]]", - "Sharp Routing Protocol\n" - "Add an LSP\n" - "The ingress label to use\n" - "Use nexthops from a nexthop-group\n" - "The nexthop-group name\n" - "Label a prefix\n" - "The v4 prefix to label\n" - FRR_IP_REDIST_HELP_STR_ZEBRA - "Instance to use\n" - "Instance\n") + "Sharp Routing Protocol\n" + "Add an LSP\n" + "Update an LSP\n" + "The ingress label to use\n" + "Use nexthops from a nexthop-group\n" + "The nexthop-group name\n" + "Label a prefix\n" + "The v4 prefix to label\n" + FRR_IP_REDIST_HELP_STR_ZEBRA + "Instance to use\n" + "Instance\n") { struct nexthop_group_cmd *nhgc = NULL; struct nexthop_group_cmd *backup_nhgc = NULL; struct nexthop_group *backup_nhg = NULL; struct prefix p = {}; int type = 0; + bool update_p; + + update_p = (update != NULL); /* We're offered a v4 prefix */ if (pfx->family > 0 && type_str) { @@ -458,7 +462,8 @@ DEFPY(sharp_lsp_prefix_v4, sharp_lsp_prefix_v4_cmd, backup_nhg = &(backup_nhgc->nhg); } - if (sharp_install_lsps_helper(true, pfx->family > 0 ? &p : NULL, + if (sharp_install_lsps_helper(true /*install*/, update_p, + pfx->family > 0 ? &p : NULL, type, instance, inlabel, &(nhgc->nhg), backup_nhg) == 0) return CMD_SUCCESS; @@ -523,7 +528,8 @@ DEFPY(sharp_remove_lsp_prefix_v4, sharp_remove_lsp_prefix_v4_cmd, nhg = &(nhgc->nhg); } - if (sharp_install_lsps_helper(false, pfx->family > 0 ? &p : NULL, + if (sharp_install_lsps_helper(false /*!install*/, false, + pfx->family > 0 ? &p : NULL, type, instance, inlabel, nhg, NULL) == 0) return CMD_SUCCESS; else { diff --git a/sharpd/sharp_zebra.c b/sharpd/sharp_zebra.c index 74e44014a9..e0f16d71f5 100644 --- a/sharpd/sharp_zebra.c +++ b/sharpd/sharp_zebra.c @@ -114,15 +114,16 @@ static int sharp_ifp_down(struct interface *ifp) return 0; } -int sharp_install_lsps_helper(bool install_p, const struct prefix *p, - uint8_t type, int instance, uint32_t in_label, +int sharp_install_lsps_helper(bool install_p, bool update_p, + const struct prefix *p, uint8_t type, + int instance, uint32_t in_label, const struct nexthop_group *nhg, const struct nexthop_group *backup_nhg) { struct zapi_labels zl = {}; struct zapi_nexthop *znh; const struct nexthop *nh; - int i, ret; + int i, cmd, ret; zl.type = ZEBRA_LSP_SHARP; zl.local_label = in_label; @@ -200,12 +201,17 @@ int sharp_install_lsps_helper(bool install_p, const struct prefix *p, zl.backup_nexthop_num = i; } - if (install_p) - ret = zebra_send_mpls_labels(zclient, ZEBRA_MPLS_LABELS_ADD, - &zl); - else - ret = zebra_send_mpls_labels(zclient, ZEBRA_MPLS_LABELS_DELETE, - &zl); + + if (install_p) { + if (update_p) + cmd = ZEBRA_MPLS_LABELS_REPLACE; + else + cmd = ZEBRA_MPLS_LABELS_ADD; + } else { + cmd = ZEBRA_MPLS_LABELS_DELETE; + } + + ret = zebra_send_mpls_labels(zclient, cmd, &zl); return ret; } diff --git a/sharpd/sharp_zebra.h b/sharpd/sharp_zebra.h index cb2f38a6ab..e40585aa6a 100644 --- a/sharpd/sharp_zebra.h +++ b/sharpd/sharp_zebra.h @@ -44,8 +44,9 @@ extern void sharp_install_routes_helper(struct prefix *p, vrf_id_t vrf_id, extern void sharp_remove_routes_helper(struct prefix *p, vrf_id_t vrf_id, uint8_t instance, uint32_t routes); -int sharp_install_lsps_helper(bool install_p, const struct prefix *p, - uint8_t type, int instance, uint32_t in_label, +int sharp_install_lsps_helper(bool install_p, bool update_p, + const struct prefix *p, uint8_t type, + int instance, uint32_t in_label, const struct nexthop_group *nhg, const struct nexthop_group *backup_nhg); -- 2.39.5