From 129296682ff184e9a9057d434e3ea4cc20a18558 Mon Sep 17 00:00:00 2001 From: Don Slice Date: Wed, 7 Jun 2017 13:11:23 -0700 Subject: [PATCH 01/18] zebra: define default segment routing global block values Standard define the default SRGB range from 16000 to 23999. This commit defines these default values for frr. Ticket: CM-16737 Signed-off-by: Don Slice Reviewed-by: CCR-6347 --- lib/mpls.h | 4 ++++ zebra/zebra_mpls.c | 39 +++++++++++++++++++-------------------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/lib/mpls.h b/lib/mpls.h index 6cf0142755..c963e55087 100644 --- a/lib/mpls.h +++ b/lib/mpls.h @@ -40,6 +40,10 @@ #define MPLS_MIN_UNRESERVED_LABEL 16 #define MPLS_MAX_UNRESERVED_LABEL 1048575 +/* Default min and max SRGB label range */ +#define MPLS_DEFAULT_MIN_SRGB_LABEL 16000 +#define MPLS_DEFAULT_MAX_SRGB_LABEL 23999 + #define IS_MPLS_RESERVED_LABEL(label) \ (label >= MPLS_MIN_RESERVED_LABEL && label <= MPLS_MAX_RESERVED_LABEL) diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c index fb46184b62..8987d0b272 100644 --- a/zebra/zebra_mpls.c +++ b/zebra/zebra_mpls.c @@ -60,7 +60,7 @@ extern struct zebra_t zebrad; /* static function declarations */ static void -fec_evaluate (struct zebra_vrf *zvrf, int add); +fec_evaluate (struct zebra_vrf *zvrf); static u_int32_t fec_derive_label_from_index (struct zebra_vrf *vrf, zebra_fec_t *fec); static int @@ -357,7 +357,7 @@ lsp_uninstall (struct zebra_vrf *zvrf, mpls_label_t label) * their local labels and trigger client updates. */ static void -fec_evaluate (struct zebra_vrf *zvrf, int add) +fec_evaluate (struct zebra_vrf *zvrf) { struct route_node *rn; zebra_fec_t *fec; @@ -385,13 +385,8 @@ fec_evaluate (struct zebra_vrf *zvrf, int add) /* Save old label, determine new label. */ old_label = fec->label; - if (add) - { - new_label = zvrf->mpls_srgb.start_label + fec->label_index; - if (new_label >= zvrf->mpls_srgb.end_label) - new_label = MPLS_INVALID_LABEL; - } - else + new_label = zvrf->mpls_srgb.start_label + fec->label_index; + if (new_label >= zvrf->mpls_srgb.end_label) new_label = MPLS_INVALID_LABEL; /* If label has changed, update FEC and clients. */ @@ -399,8 +394,8 @@ fec_evaluate (struct zebra_vrf *zvrf, int add) continue; if (IS_ZEBRA_DEBUG_MPLS) - zlog_debug ("Update fec %s new label %u upon label block %s", - buf, new_label, add ? "ADD" : "DEL"); + zlog_debug ("Update fec %s new label %u upon label block", + buf, new_label); fec->label = new_label; fec_update_clients (fec); @@ -2937,7 +2932,7 @@ zebra_mpls_label_block_add (struct zebra_vrf *zvrf, u_int32_t start_label, zvrf->mpls_srgb.end_label = end_label; /* Evaluate registered FECs to see if any get a label or not. */ - fec_evaluate (zvrf, 1); + fec_evaluate (zvrf); return 0; } @@ -2947,11 +2942,11 @@ zebra_mpls_label_block_add (struct zebra_vrf *zvrf, u_int32_t start_label, int zebra_mpls_label_block_del (struct zebra_vrf *zvrf) { - zvrf->mpls_srgb.start_label = 0; - zvrf->mpls_srgb.end_label = 0; + zvrf->mpls_srgb.start_label = MPLS_DEFAULT_MIN_SRGB_LABEL; + zvrf->mpls_srgb.end_label = MPLS_DEFAULT_MAX_SRGB_LABEL; /* Process registered FECs to clear their local label, if needed. */ - fec_evaluate (zvrf, 0); + fec_evaluate (zvrf); return 0; } @@ -2964,9 +2959,13 @@ zebra_mpls_write_label_block_config (struct vty *vty, struct zebra_vrf *zvrf) if (zvrf->mpls_srgb.start_label == 0) return 0; - vty_out(vty, "mpls label global-block %u %u%s", - zvrf->mpls_srgb.start_label, zvrf->mpls_srgb.end_label, - VTY_NEWLINE); + if ((zvrf->mpls_srgb.start_label != MPLS_DEFAULT_MIN_SRGB_LABEL) || + (zvrf->mpls_srgb.end_label != MPLS_DEFAULT_MAX_SRGB_LABEL)) + { + vty_out(vty, "mpls label global-block %u %u%s", + zvrf->mpls_srgb.start_label, zvrf->mpls_srgb.end_label, + VTY_NEWLINE); + } return 1; } @@ -3000,8 +2999,8 @@ zebra_mpls_init_tables (struct zebra_vrf *zvrf) zvrf->fec_table[AFI_IP] = route_table_init(); zvrf->fec_table[AFI_IP6] = route_table_init(); zvrf->mpls_flags = 0; - zvrf->mpls_srgb.start_label = 0; - zvrf->mpls_srgb.end_label = 0; + zvrf->mpls_srgb.start_label = MPLS_DEFAULT_MIN_SRGB_LABEL; + zvrf->mpls_srgb.end_label = MPLS_DEFAULT_MAX_SRGB_LABEL; } /* From 97f653d0e273819e10b7604b34886f38612268a7 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 13 Jun 2017 10:43:20 -0400 Subject: [PATCH 02/18] tools: Fix startup to include babel Signed-off-by: Donald Sharp --- tools/etc/frr/daemons | 1 + tools/etc/frr/daemons.conf | 1 + 2 files changed, 2 insertions(+) diff --git a/tools/etc/frr/daemons b/tools/etc/frr/daemons index eb7a5c9a96..a460827924 100644 --- a/tools/etc/frr/daemons +++ b/tools/etc/frr/daemons @@ -32,3 +32,4 @@ pimd=no ldpd=no nhrpd=no eigrpd=no +babeld=no diff --git a/tools/etc/frr/daemons.conf b/tools/etc/frr/daemons.conf index 21ae29d4c0..3f734eef02 100644 --- a/tools/etc/frr/daemons.conf +++ b/tools/etc/frr/daemons.conf @@ -15,6 +15,7 @@ pimd_options=" --daemon -A 127.0.0.1" ldpd_options=" --daemon -A 127.0.0.1" nhrpd_options=" --daemon -A 127.0.0.1" eigrpd_options=" --daemon -A 127.0.0.1" +babeld_options=" --daemon -A 127.0.0.1" # The list of daemons to watch is automatically generated by the init script. watchfrr_enable=yes From 6dc556447b50a31cdfcba1fd311b5e66731be241 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 15 Jun 2017 21:34:19 -0400 Subject: [PATCH 03/18] bgpd: Remove unset table.owner Signed-off-by: Donald Sharp --- bgpd/bgp_route.c | 4 ---- bgpd/bgp_table.c | 6 ------ bgpd/bgp_table.h | 3 --- 3 files changed, 13 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 31c1dd8c10..d35e9a03cc 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -3532,10 +3532,6 @@ bgp_cleanup_table(struct bgp_table *table, safi_t safi) && (ri->sub_type == BGP_ROUTE_NORMAL || ri->sub_type == BGP_ROUTE_AGGREGATE)) { -#if ENABLE_BGP_VNC - if (table->owner && table->owner->bgp) - vnc_import_bgp_del_route(table->owner->bgp, &rn->p, ri); -#endif bgp_zebra_withdraw (&rn->p, ri, safi); bgp_info_reap (rn, ri); } diff --git a/bgpd/bgp_table.c b/bgpd/bgp_table.c index ff0cfdd658..642807e7ab 100644 --- a/bgpd/bgp_table.c +++ b/bgpd/bgp_table.c @@ -50,12 +50,6 @@ bgp_table_unlock (struct bgp_table *rt) route_table_finish (rt->route_table); rt->route_table = NULL; - if (rt->owner) - { - peer_unlock (rt->owner); - rt->owner = NULL; - } - XFREE (MTYPE_BGP_TABLE, rt); } diff --git a/bgpd/bgp_table.h b/bgpd/bgp_table.h index cff270ebb9..7b22872628 100644 --- a/bgpd/bgp_table.h +++ b/bgpd/bgp_table.h @@ -31,9 +31,6 @@ struct bgp_table int lock; - /* The owner of this 'bgp_table' structure. */ - struct peer *owner; - struct route_table *route_table; uint64_t version; }; From 45926e58749924a6ff207cf211de3e6457578ecc Mon Sep 17 00:00:00 2001 From: Rafael Zalamena Date: Fri, 16 Jun 2017 10:44:31 -0300 Subject: [PATCH 04/18] lib: improve the RB implementation Switch the RB tree implementation completely to the new dlg@'s version that uses pre-declared functions instead of macros for tree functions. Original e-mail/diff: https://marc.info/?l=openbsd-tech&m=147087487111068&w=2 Pros: * Reduces the amount of code that the usage of those macros generate * Allows the compiler to do a better compile-time check job * Might have better i-cache utilization since the tree code is shared Con: * dlg@ benchmarks shows it has 'very slightly slower' insertions * imported RB_* code must adapt the following calls: RB_INIT(), RB_GENERATE(), RB_ROOT(), RB_EMPTY(), make compare functions use 'const' (if not already) and maybe others. --- ldpd/adjacency.c | 8 +- ldpd/interface.c | 10 +- ldpd/l2vpn.c | 27 +- ldpd/lde.c | 27 +- ldpd/lde_lib.c | 27 +- ldpd/ldp_vty_conf.c | 7 +- ldpd/ldpd.c | 36 +-- ldpd/ldpe.c | 22 +- ldpd/neighbor.c | 22 +- lib/Makefile.am | 2 +- lib/ns.c | 6 +- lib/openbsd-tree.c | 640 ++++++++++++++++++++++++++++++++++++++++ lib/openbsd-tree.h | 692 ++++++++++++++++---------------------------- lib/vrf.c | 16 +- zebra/zebra_rib.c | 2 +- 15 files changed, 998 insertions(+), 546 deletions(-) create mode 100644 lib/openbsd-tree.c diff --git a/ldpd/adjacency.c b/ldpd/adjacency.c index 52e2776654..8a2252e722 100644 --- a/ldpd/adjacency.c +++ b/ldpd/adjacency.c @@ -25,9 +25,9 @@ #include "ldpe.h" #include "log.h" -static __inline int adj_compare(struct adj *, struct adj *); +static __inline int adj_compare(const struct adj *, const struct adj *); static int adj_itimer(struct thread *); -static __inline int tnbr_compare(struct tnbr *, struct tnbr *); +static __inline int tnbr_compare(const struct tnbr *, const struct tnbr *); static void tnbr_del(struct ldpd_conf *, struct tnbr *); static void tnbr_start(struct tnbr *); static void tnbr_stop(struct tnbr *); @@ -41,7 +41,7 @@ RB_GENERATE(ia_adj_head, adj, ia_entry, adj_compare) RB_GENERATE(tnbr_head, tnbr, entry, tnbr_compare) static __inline int -adj_compare(struct adj *a, struct adj *b) +adj_compare(const struct adj *a, const struct adj *b) { if (adj_get_af(a) < adj_get_af(b)) return (-1); @@ -220,7 +220,7 @@ adj_stop_itimer(struct adj *adj) /* targeted neighbors */ static __inline int -tnbr_compare(struct tnbr *a, struct tnbr *b) +tnbr_compare(const struct tnbr *a, const struct tnbr *b) { if (a->af < b->af) return (-1); diff --git a/ldpd/interface.c b/ldpd/interface.c index a064a58b2e..527a6bc963 100644 --- a/ldpd/interface.c +++ b/ldpd/interface.c @@ -26,7 +26,7 @@ #include "sockopt.h" -static __inline int iface_compare(struct iface *, struct iface *); +static __inline int iface_compare(const struct iface *, const struct iface *); static struct if_addr *if_addr_new(struct kaddr *); static struct if_addr *if_addr_lookup(struct if_addr_head *, struct kaddr *); static int if_start(struct iface *, int); @@ -43,7 +43,7 @@ static int if_leave_ipv6_group(struct iface *, struct in6_addr *); RB_GENERATE(iface_head, iface, entry, iface_compare) static __inline int -iface_compare(struct iface *a, struct iface *b) +iface_compare(const struct iface *a, const struct iface *b) { return (strcmp(a->name, b->name)); } @@ -81,12 +81,12 @@ ldpe_if_init(struct iface *iface) /* ipv4 */ iface->ipv4.iface = iface; iface->ipv4.state = IF_STA_DOWN; - RB_INIT(&iface->ipv4.adj_tree); + RB_INIT(iface_head, &iface->ipv4.adj_tree); /* ipv6 */ iface->ipv6.iface = iface; iface->ipv6.state = IF_STA_DOWN; - RB_INIT(&iface->ipv6.adj_tree); + RB_INIT(iface_head, &iface->ipv6.adj_tree); } void @@ -305,7 +305,7 @@ if_reset(struct iface *iface, int af) ia = iface_af_get(iface, af); if_stop_hello_timer(ia); - while ((adj = RB_ROOT(&ia->adj_tree)) != NULL) + while ((adj = RB_ROOT(iface_head, &ia->adj_tree)) != NULL) adj_del(adj, S_SHUTDOWN); /* try to cleanup */ diff --git a/ldpd/l2vpn.c b/ldpd/l2vpn.c index 27948f5a1a..f15461d3d2 100644 --- a/ldpd/l2vpn.c +++ b/ldpd/l2vpn.c @@ -27,16 +27,16 @@ #include "log.h" static void l2vpn_pw_fec(struct l2vpn_pw *, struct fec *); -static __inline int l2vpn_compare(struct l2vpn *, struct l2vpn *); -static __inline int l2vpn_if_compare(struct l2vpn_if *, struct l2vpn_if *); -static __inline int l2vpn_pw_compare(struct l2vpn_pw *, struct l2vpn_pw *); +static __inline int l2vpn_compare(const struct l2vpn *, const struct l2vpn *); +static __inline int l2vpn_if_compare(const struct l2vpn_if *, const struct l2vpn_if *); +static __inline int l2vpn_pw_compare(const struct l2vpn_pw *, const struct l2vpn_pw *); RB_GENERATE(l2vpn_head, l2vpn, entry, l2vpn_compare) RB_GENERATE(l2vpn_if_head, l2vpn_if, entry, l2vpn_if_compare) RB_GENERATE(l2vpn_pw_head, l2vpn_pw, entry, l2vpn_pw_compare) static __inline int -l2vpn_compare(struct l2vpn *a, struct l2vpn *b) +l2vpn_compare(const struct l2vpn *a, const struct l2vpn *b) { return (strcmp(a->name, b->name)); } @@ -55,9 +55,9 @@ l2vpn_new(const char *name) l2vpn->mtu = DEFAULT_L2VPN_MTU; l2vpn->pw_type = DEFAULT_PW_TYPE; - RB_INIT(&l2vpn->if_tree); - RB_INIT(&l2vpn->pw_tree); - RB_INIT(&l2vpn->pw_inactive_tree); + RB_INIT(l2vpn_if_head, &l2vpn->if_tree); + RB_INIT(l2vpn_pw_head, &l2vpn->pw_tree); + RB_INIT(l2vpn_pw_head, &l2vpn->pw_inactive_tree); return (l2vpn); } @@ -76,15 +76,16 @@ l2vpn_del(struct l2vpn *l2vpn) struct l2vpn_if *lif; struct l2vpn_pw *pw; - while ((lif = RB_ROOT(&l2vpn->if_tree)) != NULL) { + while ((lif = RB_ROOT(l2vpn_if_head, &l2vpn->if_tree)) != NULL) { RB_REMOVE(l2vpn_if_head, &l2vpn->if_tree, lif); free(lif); } - while ((pw = RB_ROOT(&l2vpn->pw_tree)) != NULL) { + while ((pw = RB_ROOT(l2vpn_pw_head, &l2vpn->pw_tree)) != NULL) { RB_REMOVE(l2vpn_pw_head, &l2vpn->pw_tree, pw); free(pw); } - while ((pw = RB_ROOT(&l2vpn->pw_inactive_tree)) != NULL) { + while ((pw = RB_ROOT(l2vpn_pw_head, + &l2vpn->pw_inactive_tree)) != NULL) { RB_REMOVE(l2vpn_pw_head, &l2vpn->pw_inactive_tree, pw); free(pw); } @@ -111,7 +112,7 @@ l2vpn_exit(struct l2vpn *l2vpn) } static __inline int -l2vpn_if_compare(struct l2vpn_if *a, struct l2vpn_if *b) +l2vpn_if_compare(const struct l2vpn_if *a, const struct l2vpn_if *b) { return (strcmp(a->ifname, b->ifname)); } @@ -174,7 +175,7 @@ l2vpn_if_update(struct l2vpn_if *lif) } static __inline int -l2vpn_pw_compare(struct l2vpn_pw *a, struct l2vpn_pw *b) +l2vpn_pw_compare(const struct l2vpn_pw *a, const struct l2vpn_pw *b) { return (strcmp(a->ifname, b->ifname)); } @@ -512,7 +513,7 @@ l2vpn_binding_ctl(pid_t pid) fn = (struct fec_node *)f; if (fn->local_label == NO_LABEL && - RB_EMPTY(&fn->downstream)) + RB_EMPTY(lde_map_head, &fn->downstream)) continue; memset(&pwctl, 0, sizeof(pwctl)); diff --git a/ldpd/lde.c b/ldpd/lde.c index 4b1ad63d64..0ef46dab3d 100644 --- a/ldpd/lde.c +++ b/ldpd/lde.c @@ -41,15 +41,16 @@ static void lde_shutdown(void); static int lde_dispatch_imsg(struct thread *); static int lde_dispatch_parent(struct thread *); -static __inline int lde_nbr_compare(struct lde_nbr *, - struct lde_nbr *); +static __inline int lde_nbr_compare(const struct lde_nbr *, + const struct lde_nbr *); static struct lde_nbr *lde_nbr_new(uint32_t, struct lde_nbr *); static void lde_nbr_del(struct lde_nbr *); static struct lde_nbr *lde_nbr_find(uint32_t); static void lde_nbr_clear(void); static void lde_nbr_addr_update(struct lde_nbr *, struct lde_addr *, int); -static __inline int lde_map_compare(struct lde_map *, struct lde_map *); +static __inline int lde_map_compare(const struct lde_map *, + const struct lde_map *); static void lde_map_free(void *); static int lde_address_add(struct lde_nbr *, struct lde_addr *); static int lde_address_del(struct lde_nbr *, struct lde_addr *); @@ -542,10 +543,10 @@ lde_dispatch_parent(struct thread *thread) fatal(NULL); memcpy(nconf, imsg.data, sizeof(struct ldpd_conf)); - RB_INIT(&nconf->iface_tree); - RB_INIT(&nconf->tnbr_tree); - RB_INIT(&nconf->nbrp_tree); - RB_INIT(&nconf->l2vpn_tree); + RB_INIT(iface_head, &nconf->iface_tree); + RB_INIT(tnbr_head, &nconf->tnbr_tree); + RB_INIT(nbrp_head, &nconf->nbrp_tree); + RB_INIT(l2vpn_head, &nconf->l2vpn_tree); break; case IMSG_RECONF_IFACE: if ((niface = malloc(sizeof(struct iface))) == NULL) @@ -573,9 +574,9 @@ lde_dispatch_parent(struct thread *thread) fatal(NULL); memcpy(nl2vpn, imsg.data, sizeof(struct l2vpn)); - RB_INIT(&nl2vpn->if_tree); - RB_INIT(&nl2vpn->pw_tree); - RB_INIT(&nl2vpn->pw_inactive_tree); + RB_INIT(l2vpn_if_head, &nl2vpn->if_tree); + RB_INIT(l2vpn_pw_head, &nl2vpn->pw_tree); + RB_INIT(l2vpn_pw_head, &nl2vpn->pw_inactive_tree); RB_INSERT(l2vpn_head, &nconf->l2vpn_tree, nl2vpn); break; @@ -1189,7 +1190,7 @@ lde_send_notification_eol_pwid(struct lde_nbr *ln, uint16_t pw_type) } static __inline int -lde_nbr_compare(struct lde_nbr *a, struct lde_nbr *b) +lde_nbr_compare(const struct lde_nbr *a, const struct lde_nbr *b) { return (a->peerid - b->peerid); } @@ -1314,7 +1315,7 @@ lde_nbr_clear(void) { struct lde_nbr *ln; - while ((ln = RB_ROOT(&lde_nbrs)) != NULL) + while ((ln = RB_ROOT(nbr_tree, &lde_nbrs)) != NULL) lde_nbr_del(ln); } @@ -1360,7 +1361,7 @@ lde_nbr_addr_update(struct lde_nbr *ln, struct lde_addr *lde_addr, int removed) } static __inline int -lde_map_compare(struct lde_map *a, struct lde_map *b) +lde_map_compare(const struct lde_map *a, const struct lde_map *b) { return (ldp_addrcmp(AF_INET, (union ldpd_addr *)&a->nexthop->id, (union ldpd_addr *)&b->nexthop->id)); diff --git a/ldpd/lde_lib.c b/ldpd/lde_lib.c index 8dc305cac1..edf686537f 100644 --- a/ldpd/lde_lib.c +++ b/ldpd/lde_lib.c @@ -25,7 +25,7 @@ #include "mpls.h" -static __inline int fec_compare(struct fec *, struct fec *); +static __inline int fec_compare(const struct fec *, const struct fec *); static int lde_nbr_is_nexthop(struct fec_node *, struct lde_nbr *); static void fec_free(void *); @@ -43,11 +43,11 @@ struct thread *gc_timer; void fec_init(struct fec_tree *fh) { - RB_INIT(fh); + RB_INIT(fec_tree, fh); } static __inline int -fec_compare(struct fec *a, struct fec *b) +fec_compare(const struct fec *a, const struct fec *b) { if (a->type < b->type) return (-1); @@ -129,7 +129,7 @@ fec_clear(struct fec_tree *fh, void (*free_cb)(void *)) { struct fec *f; - while ((f = RB_ROOT(fh)) != NULL) { + while ((f = RB_ROOT(fec_tree, fh)) != NULL) { fec_remove(fh, f); free_cb(f); } @@ -159,7 +159,7 @@ rt_dump(pid_t pid) RB_FOREACH(f, fec_tree, &ft) { fn = (struct fec_node *)f; if (fn->local_label == NO_LABEL && - RB_EMPTY(&fn->downstream)) + RB_EMPTY(lde_map_head, &fn->downstream)) continue; memset(&rtctl, 0, sizeof(rtctl)); @@ -179,7 +179,7 @@ rt_dump(pid_t pid) } rtctl.local_label = fn->local_label; - if (RB_EMPTY(&fn->downstream)) { + if (RB_EMPTY(lde_map_head, &fn->downstream)) { rtctl.in_use = 0; rtctl.nexthop.s_addr = INADDR_ANY; rtctl.remote_label = NO_LABEL; @@ -231,10 +231,10 @@ fec_free(void *arg) while ((fnh = LIST_FIRST(&fn->nexthops))) fec_nh_del(fnh); - if (!RB_EMPTY(&fn->downstream)) + if (!RB_EMPTY(lde_map_head, &fn->downstream)) log_warnx("%s: fec %s downstream list not empty", __func__, log_fec(&fn->fec)); - if (!RB_EMPTY(&fn->upstream)) + if (!RB_EMPTY(lde_map_head, &fn->upstream)) log_warnx("%s: fec %s upstream list not empty", __func__, log_fec(&fn->fec)); @@ -258,8 +258,8 @@ fec_add(struct fec *fec) fn->fec = *fec; fn->local_label = NO_LABEL; - RB_INIT(&fn->upstream); - RB_INIT(&fn->downstream); + RB_INIT(lde_map_head, &fn->upstream); + RB_INIT(lde_map_head, &fn->downstream); LIST_INIT(&fn->nexthops); if (fec_insert(&ft, &fn->fec)) @@ -396,7 +396,8 @@ lde_kernel_update(struct fec *fec) lde_gc_start_timer(); } else { fn->local_label = lde_update_label(fn); - if (fn->local_label != NO_LABEL && RB_EMPTY(&fn->upstream)) + if (fn->local_label != NO_LABEL && + RB_EMPTY(lde_map_head, &fn->upstream)) /* FEC.1: perform lsr label distribution procedure */ RB_FOREACH(ln, nbr_tree, &lde_nbrs) lde_send_labelmapping(ln, fn, 1); @@ -904,8 +905,8 @@ lde_gc_timer(struct thread *thread) fn = (struct fec_node *) fec; if (!LIST_EMPTY(&fn->nexthops) || - !RB_EMPTY(&fn->downstream) || - !RB_EMPTY(&fn->upstream)) + !RB_EMPTY(lde_map_head, &fn->downstream) || + !RB_EMPTY(lde_map_head, &fn->upstream)) continue; fec_remove(&ft, &fn->fec); diff --git a/ldpd/ldp_vty_conf.c b/ldpd/ldp_vty_conf.c index 8394907142..87f76d3d0c 100644 --- a/ldpd/ldp_vty_conf.c +++ b/ldpd/ldp_vty_conf.c @@ -1725,17 +1725,18 @@ l2vpn_del_api(struct ldpd_conf *conf, struct l2vpn *l2vpn) struct l2vpn_if *lif; struct l2vpn_pw *pw; - while ((lif = RB_ROOT(&l2vpn->if_tree)) != NULL) { + while ((lif = RB_ROOT(l2vpn_if_head, &l2vpn->if_tree)) != NULL) { QOBJ_UNREG(lif); RB_REMOVE(l2vpn_if_head, &l2vpn->if_tree, lif); free(lif); } - while ((pw = RB_ROOT(&l2vpn->pw_tree)) != NULL) { + while ((pw = RB_ROOT(l2vpn_pw_head, &l2vpn->pw_tree)) != NULL) { QOBJ_UNREG(pw); RB_REMOVE(l2vpn_pw_head, &l2vpn->pw_tree, pw); free(pw); } - while ((pw = RB_ROOT(&l2vpn->pw_inactive_tree)) != NULL) { + while ((pw = RB_ROOT(l2vpn_pw_head, + &l2vpn->pw_inactive_tree)) != NULL) { QOBJ_UNREG(pw); RB_REMOVE(l2vpn_pw_head, &l2vpn->pw_inactive_tree, pw); free(pw); diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c index 6993ad15cc..abcad79d67 100644 --- a/ldpd/ldpd.c +++ b/ldpd/ldpd.c @@ -1043,13 +1043,13 @@ ldp_config_reset_main(struct ldpd_conf *conf) struct iface *iface; struct nbr_params *nbrp; - while ((iface = RB_ROOT(&conf->iface_tree)) != NULL) { + while ((iface = RB_ROOT(iface_head, &conf->iface_tree)) != NULL) { QOBJ_UNREG(iface); RB_REMOVE(iface_head, &conf->iface_tree, iface); free(iface); } - while ((nbrp = RB_ROOT(&conf->nbrp_tree)) != NULL) { + while ((nbrp = RB_ROOT(nbrp_head, &conf->nbrp_tree)) != NULL) { QOBJ_UNREG(nbrp); RB_REMOVE(nbrp_head, &conf->nbrp_tree, nbrp); free(nbrp); @@ -1105,18 +1105,20 @@ ldp_config_reset_l2vpns(struct ldpd_conf *conf) struct l2vpn_if *lif; struct l2vpn_pw *pw; - while ((l2vpn = RB_ROOT(&conf->l2vpn_tree)) != NULL) { - while ((lif = RB_ROOT(&l2vpn->if_tree)) != NULL) { + while ((l2vpn = RB_ROOT(l2vpn_head, &conf->l2vpn_tree)) != NULL) { + while ((lif = RB_ROOT(l2vpn_if_head, + &l2vpn->if_tree)) != NULL) { QOBJ_UNREG(lif); RB_REMOVE(l2vpn_if_head, &l2vpn->if_tree, lif); free(lif); } - while ((pw = RB_ROOT(&l2vpn->pw_tree)) != NULL) { + while ((pw = RB_ROOT(l2vpn_pw_head, &l2vpn->pw_tree)) != NULL) { QOBJ_UNREG(pw); RB_REMOVE(l2vpn_pw_head, &l2vpn->pw_tree, pw); free(pw); } - while ((pw = RB_ROOT(&l2vpn->pw_inactive_tree)) != NULL) { + while ((pw = RB_ROOT(l2vpn_pw_head, + &l2vpn->pw_inactive_tree)) != NULL) { QOBJ_UNREG(pw); RB_REMOVE(l2vpn_pw_head, &l2vpn->pw_inactive_tree, pw); free(pw); @@ -1135,19 +1137,19 @@ ldp_clear_config(struct ldpd_conf *xconf) struct nbr_params *nbrp; struct l2vpn *l2vpn; - while ((iface = RB_ROOT(&xconf->iface_tree)) != NULL) { + while ((iface = RB_ROOT(iface_head, &xconf->iface_tree)) != NULL) { RB_REMOVE(iface_head, &xconf->iface_tree, iface); free(iface); } - while ((tnbr = RB_ROOT(&xconf->tnbr_tree)) != NULL) { + while ((tnbr = RB_ROOT(tnbr_head, &xconf->tnbr_tree)) != NULL) { RB_REMOVE(tnbr_head, &xconf->tnbr_tree, tnbr); free(tnbr); } - while ((nbrp = RB_ROOT(&xconf->nbrp_tree)) != NULL) { + while ((nbrp = RB_ROOT(nbrp_head, &xconf->nbrp_tree)) != NULL) { RB_REMOVE(nbrp_head, &xconf->nbrp_tree, nbrp); free(nbrp); } - while ((l2vpn = RB_ROOT(&xconf->l2vpn_tree)) != NULL) { + while ((l2vpn = RB_ROOT(l2vpn_head, &xconf->l2vpn_tree)) != NULL) { RB_REMOVE(l2vpn_head, &xconf->l2vpn_tree, l2vpn); l2vpn_del(l2vpn); } @@ -1550,9 +1552,9 @@ merge_l2vpns(struct ldpd_conf *conf, struct ldpd_conf *xconf) if ((l2vpn = l2vpn_find(conf, xl->name)) == NULL) { COPY(l2vpn, xl); RB_INSERT(l2vpn_head, &conf->l2vpn_tree, l2vpn); - RB_INIT(&l2vpn->if_tree); - RB_INIT(&l2vpn->pw_tree); - RB_INIT(&l2vpn->pw_inactive_tree); + RB_INIT(l2vpn_if_head, &l2vpn->if_tree); + RB_INIT(l2vpn_pw_head, &l2vpn->pw_tree); + RB_INIT(l2vpn_pw_head, &l2vpn->pw_inactive_tree); switch (ldpd_process) { case PROC_LDE_ENGINE: @@ -1761,10 +1763,10 @@ config_new_empty(void) if (xconf == NULL) fatal(NULL); - RB_INIT(&xconf->iface_tree); - RB_INIT(&xconf->tnbr_tree); - RB_INIT(&xconf->nbrp_tree); - RB_INIT(&xconf->l2vpn_tree); + RB_INIT(iface_head, &xconf->iface_tree); + RB_INIT(tnbr_head, &xconf->tnbr_tree); + RB_INIT(nbrp_head, &xconf->nbrp_tree); + RB_INIT(l2vpn_head, &xconf->l2vpn_tree); /* set default values */ ldp_config_reset(xconf); diff --git a/ldpd/ldpe.c b/ldpd/ldpe.c index 451d637bcf..ba153dfde2 100644 --- a/ldpd/ldpe.c +++ b/ldpd/ldpe.c @@ -152,7 +152,7 @@ ldpe_init(struct ldpd_init *init) control_listen(); LIST_INIT(&global.addr_list); - RB_INIT(&global.adj_tree); + RB_INIT(global_adj_head, &global.adj_tree); TAILQ_INIT(&global.pending_conns); if (inet_pton(AF_INET, AllRouters_v4, &global.mcast_addr_v4) != 1) fatal("inet_pton"); @@ -216,7 +216,7 @@ ldpe_shutdown(void) LIST_REMOVE(if_addr, entry); free(if_addr); } - while ((adj = RB_ROOT(&global.adj_tree)) != NULL) + while ((adj = RB_ROOT(global_adj_head, &global.adj_tree)) != NULL) adj_del(adj, S_SHUTDOWN); /* clean up */ @@ -456,10 +456,10 @@ ldpe_dispatch_main(struct thread *thread) fatal(NULL); memcpy(nconf, imsg.data, sizeof(struct ldpd_conf)); - RB_INIT(&nconf->iface_tree); - RB_INIT(&nconf->tnbr_tree); - RB_INIT(&nconf->nbrp_tree); - RB_INIT(&nconf->l2vpn_tree); + RB_INIT(iface_head, &nconf->iface_tree); + RB_INIT(tnbr_head, &nconf->tnbr_tree); + RB_INIT(nbrp_head, &nconf->nbrp_tree); + RB_INIT(l2vpn_head, &nconf->l2vpn_tree); break; case IMSG_RECONF_IFACE: if ((niface = malloc(sizeof(struct iface))) == NULL) @@ -487,9 +487,9 @@ ldpe_dispatch_main(struct thread *thread) fatal(NULL); memcpy(nl2vpn, imsg.data, sizeof(struct l2vpn)); - RB_INIT(&nl2vpn->if_tree); - RB_INIT(&nl2vpn->pw_tree); - RB_INIT(&nl2vpn->pw_inactive_tree); + RB_INIT(l2vpn_if_head, &nl2vpn->if_tree); + RB_INIT(l2vpn_pw_head, &nl2vpn->pw_tree); + RB_INIT(l2vpn_pw_head, &nl2vpn->pw_inactive_tree); RB_INSERT(l2vpn_head, &nconf->l2vpn_tree, nl2vpn); break; @@ -876,8 +876,8 @@ ldpe_adj_detail_ctl(struct ctl_conn *c) continue; strlcpy(ictl.name, iface->name, sizeof(ictl.name)); - if (RB_EMPTY(&iface->ipv4.adj_tree) && - RB_EMPTY(&iface->ipv6.adj_tree)) + if (RB_EMPTY(ia_adj_head, &iface->ipv4.adj_tree) && + RB_EMPTY(ia_adj_head, &iface->ipv6.adj_tree)) ictl.no_adj = 1; imsg_compose_event(&c->iev, IMSG_CTL_SHOW_DISC_IFACE, 0, 0, -1, &ictl, sizeof(ictl)); diff --git a/ldpd/neighbor.c b/ldpd/neighbor.c index f867db228d..f8d4b5f5fd 100644 --- a/ldpd/neighbor.c +++ b/ldpd/neighbor.c @@ -26,9 +26,11 @@ #include "lde.h" #include "log.h" -static __inline int nbr_id_compare(struct nbr *, struct nbr *); -static __inline int nbr_addr_compare(struct nbr *, struct nbr *); -static __inline int nbr_pid_compare(struct nbr *, struct nbr *); +static __inline int nbr_id_compare(const struct nbr *, const struct nbr *); +static __inline int nbr_addr_compare(const struct nbr *, + const struct nbr *); +static __inline int nbr_pid_compare(const struct nbr *, + const struct nbr *); static void nbr_update_peerid(struct nbr *); static int nbr_ktimer(struct thread *); static void nbr_start_ktimer(struct nbr *); @@ -39,8 +41,8 @@ static void nbr_start_itimeout(struct nbr *); static int nbr_idtimer(struct thread *); static int nbr_act_session_operational(struct nbr *); static void nbr_send_labelmappings(struct nbr *); -static __inline int nbr_params_compare(struct nbr_params *, - struct nbr_params *); +static __inline int nbr_params_compare(const struct nbr_params *, + const struct nbr_params *); RB_GENERATE(nbr_id_head, nbr, id_tree, nbr_id_compare) RB_GENERATE(nbr_addr_head, nbr, addr_tree, nbr_addr_compare) @@ -101,13 +103,13 @@ struct nbr_addr_head nbrs_by_addr = RB_INITIALIZER(&nbrs_by_addr); struct nbr_pid_head nbrs_by_pid = RB_INITIALIZER(&nbrs_by_pid); static __inline int -nbr_id_compare(struct nbr *a, struct nbr *b) +nbr_id_compare(const struct nbr *a, const struct nbr *b) { return (ntohl(a->id.s_addr) - ntohl(b->id.s_addr)); } static __inline int -nbr_addr_compare(struct nbr *a, struct nbr *b) +nbr_addr_compare(const struct nbr *a, const struct nbr *b) { if (a->af < b->af) return (-1); @@ -118,7 +120,7 @@ nbr_addr_compare(struct nbr *a, struct nbr *b) } static __inline int -nbr_pid_compare(struct nbr *a, struct nbr *b) +nbr_pid_compare(const struct nbr *a, const struct nbr *b) { return (a->peerid - b->peerid); } @@ -229,7 +231,7 @@ nbr_new(struct in_addr id, int af, int ds_tlv, union ldpd_addr *addr, if ((nbr = calloc(1, sizeof(*nbr))) == NULL) fatal(__func__); - RB_INIT(&nbr->adj_tree); + RB_INIT(nbr_adj_head, &nbr->adj_tree); nbr->state = NBR_STA_PRESENT; nbr->peerid = 0; nbr->af = af; @@ -764,7 +766,7 @@ nbr_send_labelmappings(struct nbr *nbr) } static __inline int -nbr_params_compare(struct nbr_params *a, struct nbr_params *b) +nbr_params_compare(const struct nbr_params *a, const struct nbr_params *b) { return (ntohl(a->lsr_id.s_addr) - ntohl(b->lsr_id.s_addr)); } diff --git a/lib/Makefile.am b/lib/Makefile.am index a1b78d3c4d..4a8b4290ae 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -15,7 +15,7 @@ libfrr_la_LDFLAGS = -version-info 0:0:0 libfrr_la_SOURCES = \ network.c pid_output.c getopt.c getopt1.c \ - checksum.c vector.c linklist.c vty.c \ + checksum.c vector.c linklist.c vty.c openbsd-tree.c \ graph.c command_parse.y command_lex.l command_match.c \ command_graph.c \ command.c \ diff --git a/lib/ns.c b/lib/ns.c index 8c489d68fd..68dc3fa340 100644 --- a/lib/ns.c +++ b/lib/ns.c @@ -39,7 +39,7 @@ DEFINE_MTYPE_STATIC(LIB, NS, "Logical-Router") DEFINE_MTYPE_STATIC(LIB, NS_NAME, "Logical-Router Name") -static __inline int ns_compare (struct ns *, struct ns *); +static __inline int ns_compare (const struct ns *, const struct ns *); static struct ns *ns_lookup (ns_id_t); RB_GENERATE (ns_head, ns, entry, ns_compare) @@ -108,7 +108,7 @@ static int ns_enable (struct ns *ns); static void ns_disable (struct ns *ns); static __inline int -ns_compare(struct ns *a, struct ns *b) +ns_compare(const struct ns *a, const struct ns *b) { return (a->ns_id - b->ns_id); } @@ -453,7 +453,7 @@ ns_terminate (void) { struct ns *ns; - while ((ns = RB_ROOT (&ns_tree)) != NULL) + while ((ns = RB_ROOT (ns_head, &ns_tree)) != NULL) ns_delete (ns); } diff --git a/lib/openbsd-tree.c b/lib/openbsd-tree.c new file mode 100644 index 0000000000..37762abc1f --- /dev/null +++ b/lib/openbsd-tree.c @@ -0,0 +1,640 @@ +/* $OpenBSD: subr_tree.c,v 1.9 2017/06/08 03:30:52 dlg Exp $ */ + +/* + * Copyright 2002 Niels Provos + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Copyright (c) 2016 David Gwynne + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include + +static inline struct rb_entry * +rb_n2e(const struct rb_type *t, void *node) +{ + unsigned long addr = (unsigned long)node; + + return ((struct rb_entry *)(addr + t->t_offset)); +} + +static inline void * +rb_e2n(const struct rb_type *t, struct rb_entry *rbe) +{ + unsigned long addr = (unsigned long)rbe; + + return ((void *)(addr - t->t_offset)); +} + +#define RBE_LEFT(_rbe) (_rbe)->rbt_left +#define RBE_RIGHT(_rbe) (_rbe)->rbt_right +#define RBE_PARENT(_rbe) (_rbe)->rbt_parent +#define RBE_COLOR(_rbe) (_rbe)->rbt_color + +#define RBH_ROOT(_rbt) (_rbt)->rbt_root + +static inline void +rbe_set(struct rb_entry *rbe, struct rb_entry *parent) +{ + RBE_PARENT(rbe) = parent; + RBE_LEFT(rbe) = RBE_RIGHT(rbe) = NULL; + RBE_COLOR(rbe) = RB_RED; +} + +static inline void +rbe_set_blackred(struct rb_entry *black, struct rb_entry *red) +{ + RBE_COLOR(black) = RB_BLACK; + RBE_COLOR(red) = RB_RED; +} + +static inline void +rbe_augment(const struct rb_type *t, struct rb_entry *rbe) +{ + (*t->t_augment)(rb_e2n(t, rbe)); +} + +static inline void +rbe_if_augment(const struct rb_type *t, struct rb_entry *rbe) +{ + if (t->t_augment != NULL) + rbe_augment(t, rbe); +} + +static inline void +rbe_rotate_left(const struct rb_type *t, struct rb_tree *rbt, + struct rb_entry *rbe) +{ + struct rb_entry *parent; + struct rb_entry *tmp; + + tmp = RBE_RIGHT(rbe); + RBE_RIGHT(rbe) = RBE_LEFT(tmp); + if (RBE_RIGHT(rbe) != NULL) + RBE_PARENT(RBE_LEFT(tmp)) = rbe; + + parent = RBE_PARENT(rbe); + RBE_PARENT(tmp) = parent; + if (parent != NULL) { + if (rbe == RBE_LEFT(parent)) + RBE_LEFT(parent) = tmp; + else + RBE_RIGHT(parent) = tmp; + } else + RBH_ROOT(rbt) = tmp; + + RBE_LEFT(tmp) = rbe; + RBE_PARENT(rbe) = tmp; + + if (t->t_augment != NULL) { + rbe_augment(t, rbe); + rbe_augment(t, tmp); + parent = RBE_PARENT(tmp); + if (parent != NULL) + rbe_augment(t, parent); + } +} + +static inline void +rbe_rotate_right(const struct rb_type *t, struct rb_tree *rbt, + struct rb_entry *rbe) +{ + struct rb_entry *parent; + struct rb_entry *tmp; + + tmp = RBE_LEFT(rbe); + RBE_LEFT(rbe) = RBE_RIGHT(tmp); + if (RBE_LEFT(rbe) != NULL) + RBE_PARENT(RBE_RIGHT(tmp)) = rbe; + + parent = RBE_PARENT(rbe); + RBE_PARENT(tmp) = parent; + if (parent != NULL) { + if (rbe == RBE_LEFT(parent)) + RBE_LEFT(parent) = tmp; + else + RBE_RIGHT(parent) = tmp; + } else + RBH_ROOT(rbt) = tmp; + + RBE_RIGHT(tmp) = rbe; + RBE_PARENT(rbe) = tmp; + + if (t->t_augment != NULL) { + rbe_augment(t, rbe); + rbe_augment(t, tmp); + parent = RBE_PARENT(tmp); + if (parent != NULL) + rbe_augment(t, parent); + } +} + +static inline void +rbe_insert_color(const struct rb_type *t, struct rb_tree *rbt, + struct rb_entry *rbe) +{ + struct rb_entry *parent, *gparent, *tmp; + + while ((parent = RBE_PARENT(rbe)) != NULL && + RBE_COLOR(parent) == RB_RED) { + gparent = RBE_PARENT(parent); + + if (parent == RBE_LEFT(gparent)) { + tmp = RBE_RIGHT(gparent); + if (tmp != NULL && RBE_COLOR(tmp) == RB_RED) { + RBE_COLOR(tmp) = RB_BLACK; + rbe_set_blackred(parent, gparent); + rbe = gparent; + continue; + } + + if (RBE_RIGHT(parent) == rbe) { + rbe_rotate_left(t, rbt, parent); + tmp = parent; + parent = rbe; + rbe = tmp; + } + + rbe_set_blackred(parent, gparent); + rbe_rotate_right(t, rbt, gparent); + } else { + tmp = RBE_LEFT(gparent); + if (tmp != NULL && RBE_COLOR(tmp) == RB_RED) { + RBE_COLOR(tmp) = RB_BLACK; + rbe_set_blackred(parent, gparent); + rbe = gparent; + continue; + } + + if (RBE_LEFT(parent) == rbe) { + rbe_rotate_right(t, rbt, parent); + tmp = parent; + parent = rbe; + rbe = tmp; + } + + rbe_set_blackred(parent, gparent); + rbe_rotate_left(t, rbt, gparent); + } + } + + RBE_COLOR(RBH_ROOT(rbt)) = RB_BLACK; +} + +static inline void +rbe_remove_color(const struct rb_type *t, struct rb_tree *rbt, + struct rb_entry *parent, struct rb_entry *rbe) +{ + struct rb_entry *tmp; + + while ((rbe == NULL || RBE_COLOR(rbe) == RB_BLACK) && + rbe != RBH_ROOT(rbt)) { + if (RBE_LEFT(parent) == rbe) { + tmp = RBE_RIGHT(parent); + if (RBE_COLOR(tmp) == RB_RED) { + rbe_set_blackred(tmp, parent); + rbe_rotate_left(t, rbt, parent); + tmp = RBE_RIGHT(parent); + } + if ((RBE_LEFT(tmp) == NULL || + RBE_COLOR(RBE_LEFT(tmp)) == RB_BLACK) && + (RBE_RIGHT(tmp) == NULL || + RBE_COLOR(RBE_RIGHT(tmp)) == RB_BLACK)) { + RBE_COLOR(tmp) = RB_RED; + rbe = parent; + parent = RBE_PARENT(rbe); + } else { + if (RBE_RIGHT(tmp) == NULL || + RBE_COLOR(RBE_RIGHT(tmp)) == RB_BLACK) { + struct rb_entry *oleft; + + oleft = RBE_LEFT(tmp); + if (oleft != NULL) + RBE_COLOR(oleft) = RB_BLACK; + + RBE_COLOR(tmp) = RB_RED; + rbe_rotate_right(t, rbt, tmp); + tmp = RBE_RIGHT(parent); + } + + RBE_COLOR(tmp) = RBE_COLOR(parent); + RBE_COLOR(parent) = RB_BLACK; + if (RBE_RIGHT(tmp)) + RBE_COLOR(RBE_RIGHT(tmp)) = RB_BLACK; + + rbe_rotate_left(t, rbt, parent); + rbe = RBH_ROOT(rbt); + break; + } + } else { + tmp = RBE_LEFT(parent); + if (RBE_COLOR(tmp) == RB_RED) { + rbe_set_blackred(tmp, parent); + rbe_rotate_right(t, rbt, parent); + tmp = RBE_LEFT(parent); + } + + if ((RBE_LEFT(tmp) == NULL || + RBE_COLOR(RBE_LEFT(tmp)) == RB_BLACK) && + (RBE_RIGHT(tmp) == NULL || + RBE_COLOR(RBE_RIGHT(tmp)) == RB_BLACK)) { + RBE_COLOR(tmp) = RB_RED; + rbe = parent; + parent = RBE_PARENT(rbe); + } else { + if (RBE_LEFT(tmp) == NULL || + RBE_COLOR(RBE_LEFT(tmp)) == RB_BLACK) { + struct rb_entry *oright; + + oright = RBE_RIGHT(tmp); + if (oright != NULL) + RBE_COLOR(oright) = RB_BLACK; + + RBE_COLOR(tmp) = RB_RED; + rbe_rotate_left(t, rbt, tmp); + tmp = RBE_LEFT(parent); + } + + RBE_COLOR(tmp) = RBE_COLOR(parent); + RBE_COLOR(parent) = RB_BLACK; + if (RBE_LEFT(tmp) != NULL) + RBE_COLOR(RBE_LEFT(tmp)) = RB_BLACK; + + rbe_rotate_right(t, rbt, parent); + rbe = RBH_ROOT(rbt); + break; + } + } + } + + if (rbe != NULL) + RBE_COLOR(rbe) = RB_BLACK; +} + +static inline struct rb_entry * +rbe_remove(const struct rb_type *t, struct rb_tree *rbt, struct rb_entry *rbe) +{ + struct rb_entry *child, *parent, *old = rbe; + unsigned int color; + + if (RBE_LEFT(rbe) == NULL) + child = RBE_RIGHT(rbe); + else if (RBE_RIGHT(rbe) == NULL) + child = RBE_LEFT(rbe); + else { + struct rb_entry *tmp; + + rbe = RBE_RIGHT(rbe); + while ((tmp = RBE_LEFT(rbe)) != NULL) + rbe = tmp; + + child = RBE_RIGHT(rbe); + parent = RBE_PARENT(rbe); + color = RBE_COLOR(rbe); + if (child != NULL) + RBE_PARENT(child) = parent; + if (parent != NULL) { + if (RBE_LEFT(parent) == rbe) + RBE_LEFT(parent) = child; + else + RBE_RIGHT(parent) = child; + + rbe_if_augment(t, parent); + } else + RBH_ROOT(rbt) = child; + if (RBE_PARENT(rbe) == old) + parent = rbe; + *rbe = *old; + + tmp = RBE_PARENT(old); + if (tmp != NULL) { + if (RBE_LEFT(tmp) == old) + RBE_LEFT(tmp) = rbe; + else + RBE_RIGHT(tmp) = rbe; + + rbe_if_augment(t, parent); + } else + RBH_ROOT(rbt) = rbe; + + RBE_PARENT(RBE_LEFT(old)) = rbe; + if (RBE_RIGHT(old)) + RBE_PARENT(RBE_RIGHT(old)) = rbe; + + if (t->t_augment != NULL && parent != NULL) { + tmp = parent; + do { + rbe_augment(t, tmp); + tmp = RBE_PARENT(tmp); + } while (tmp != NULL); + } + + goto color; + } + + parent = RBE_PARENT(rbe); + color = RBE_COLOR(rbe); + + if (child != NULL) + RBE_PARENT(child) = parent; + if (parent != NULL) { + if (RBE_LEFT(parent) == rbe) + RBE_LEFT(parent) = child; + else + RBE_RIGHT(parent) = child; + + rbe_if_augment(t, parent); + } else + RBH_ROOT(rbt) = child; +color: + if (color == RB_BLACK) + rbe_remove_color(t, rbt, parent, child); + + return (old); +} + +void * +_rb_remove(const struct rb_type *t, struct rb_tree *rbt, void *elm) +{ + struct rb_entry *rbe = rb_n2e(t, elm); + struct rb_entry *old; + + old = rbe_remove(t, rbt, rbe); + + return (old == NULL ? NULL : rb_e2n(t, old)); +} + +void * +_rb_insert(const struct rb_type *t, struct rb_tree *rbt, void *elm) +{ + struct rb_entry *rbe = rb_n2e(t, elm); + struct rb_entry *tmp; + struct rb_entry *parent = NULL; + void *node; + int comp = 0; + + tmp = RBH_ROOT(rbt); + while (tmp != NULL) { + parent = tmp; + + node = rb_e2n(t, tmp); + comp = (*t->t_compare)(elm, node); + if (comp < 0) + tmp = RBE_LEFT(tmp); + else if (comp > 0) + tmp = RBE_RIGHT(tmp); + else + return (node); + } + + rbe_set(rbe, parent); + + if (parent != NULL) { + if (comp < 0) + RBE_LEFT(parent) = rbe; + else + RBE_RIGHT(parent) = rbe; + + rbe_if_augment(t, parent); + } else + RBH_ROOT(rbt) = rbe; + + rbe_insert_color(t, rbt, rbe); + + return (NULL); +} + +/* Finds the node with the same key as elm */ +void * +_rb_find(const struct rb_type *t, struct rb_tree *rbt, const void *key) +{ + struct rb_entry *tmp = RBH_ROOT(rbt); + void *node; + int comp; + + while (tmp != NULL) { + node = rb_e2n(t, tmp); + comp = (*t->t_compare)(key, node); + if (comp < 0) + tmp = RBE_LEFT(tmp); + else if (comp > 0) + tmp = RBE_RIGHT(tmp); + else + return (node); + } + + return (NULL); +} + +/* Finds the first node greater than or equal to the search key */ +void * +_rb_nfind(const struct rb_type *t, struct rb_tree *rbt, const void *key) +{ + struct rb_entry *tmp = RBH_ROOT(rbt); + void *node; + void *res = NULL; + int comp; + + while (tmp != NULL) { + node = rb_e2n(t, tmp); + comp = (*t->t_compare)(key, node); + if (comp < 0) { + res = node; + tmp = RBE_LEFT(tmp); + } else if (comp > 0) + tmp = RBE_RIGHT(tmp); + else + return (node); + } + + return (res); +} + +void * +_rb_next(const struct rb_type *t, void *elm) +{ + struct rb_entry *rbe = rb_n2e(t, elm); + + if (RBE_RIGHT(rbe) != NULL) { + rbe = RBE_RIGHT(rbe); + while (RBE_LEFT(rbe) != NULL) + rbe = RBE_LEFT(rbe); + } else { + if (RBE_PARENT(rbe) && + (rbe == RBE_LEFT(RBE_PARENT(rbe)))) + rbe = RBE_PARENT(rbe); + else { + while (RBE_PARENT(rbe) && + (rbe == RBE_RIGHT(RBE_PARENT(rbe)))) + rbe = RBE_PARENT(rbe); + rbe = RBE_PARENT(rbe); + } + } + + return (rbe == NULL ? NULL : rb_e2n(t, rbe)); +} + +void * +_rb_prev(const struct rb_type *t, void *elm) +{ + struct rb_entry *rbe = rb_n2e(t, elm); + + if (RBE_LEFT(rbe)) { + rbe = RBE_LEFT(rbe); + while (RBE_RIGHT(rbe)) + rbe = RBE_RIGHT(rbe); + } else { + if (RBE_PARENT(rbe) && + (rbe == RBE_RIGHT(RBE_PARENT(rbe)))) + rbe = RBE_PARENT(rbe); + else { + while (RBE_PARENT(rbe) && + (rbe == RBE_LEFT(RBE_PARENT(rbe)))) + rbe = RBE_PARENT(rbe); + rbe = RBE_PARENT(rbe); + } + } + + return (rbe == NULL ? NULL : rb_e2n(t, rbe)); +} + +void * +_rb_root(const struct rb_type *t, struct rb_tree *rbt) +{ + struct rb_entry *rbe = RBH_ROOT(rbt); + + return (rbe == NULL ? rbe : rb_e2n(t, rbe)); +} + +void * +_rb_min(const struct rb_type *t, struct rb_tree *rbt) +{ + struct rb_entry *rbe = RBH_ROOT(rbt); + struct rb_entry *parent = NULL; + + while (rbe != NULL) { + parent = rbe; + rbe = RBE_LEFT(rbe); + } + + return (parent == NULL ? NULL : rb_e2n(t, parent)); +} + +void * +_rb_max(const struct rb_type *t, struct rb_tree *rbt) +{ + struct rb_entry *rbe = RBH_ROOT(rbt); + struct rb_entry *parent = NULL; + + while (rbe != NULL) { + parent = rbe; + rbe = RBE_RIGHT(rbe); + } + + return (parent == NULL ? NULL : rb_e2n(t, parent)); +} + +void * +_rb_left(const struct rb_type *t, void *node) +{ + struct rb_entry *rbe = rb_n2e(t, node); + rbe = RBE_LEFT(rbe); + return (rbe == NULL ? NULL : rb_e2n(t, rbe)); +} + +void * +_rb_right(const struct rb_type *t, void *node) +{ + struct rb_entry *rbe = rb_n2e(t, node); + rbe = RBE_RIGHT(rbe); + return (rbe == NULL ? NULL : rb_e2n(t, rbe)); +} + +void * +_rb_parent(const struct rb_type *t, void *node) +{ + struct rb_entry *rbe = rb_n2e(t, node); + rbe = RBE_PARENT(rbe); + return (rbe == NULL ? NULL : rb_e2n(t, rbe)); +} + +void +_rb_set_left(const struct rb_type *t, void *node, void *left) +{ + struct rb_entry *rbe = rb_n2e(t, node); + struct rb_entry *rbl = (left == NULL) ? NULL : rb_n2e(t, left); + + RBE_LEFT(rbe) = rbl; +} + +void +_rb_set_right(const struct rb_type *t, void *node, void *right) +{ + struct rb_entry *rbe = rb_n2e(t, node); + struct rb_entry *rbr = (right == NULL) ? NULL : rb_n2e(t, right); + + RBE_RIGHT(rbe) = rbr; +} + +void +_rb_set_parent(const struct rb_type *t, void *node, void *parent) +{ + struct rb_entry *rbe = rb_n2e(t, node); + struct rb_entry *rbp = (parent == NULL) ? NULL : rb_n2e(t, parent); + + RBE_PARENT(rbe) = rbp; +} + +void +_rb_poison(const struct rb_type *t, void *node, unsigned long poison) +{ + struct rb_entry *rbe = rb_n2e(t, node); + + RBE_PARENT(rbe) = RBE_LEFT(rbe) = RBE_RIGHT(rbe) = + (struct rb_entry *)poison; +} + +int +_rb_check(const struct rb_type *t, void *node, unsigned long poison) +{ + struct rb_entry *rbe = rb_n2e(t, node); + + return ((unsigned long)RBE_PARENT(rbe) == poison && + (unsigned long)RBE_LEFT(rbe) == poison && + (unsigned long)RBE_RIGHT(rbe) == poison); +} diff --git a/lib/openbsd-tree.h b/lib/openbsd-tree.h index e6502b1e74..8cf1a3df7f 100644 --- a/lib/openbsd-tree.h +++ b/lib/openbsd-tree.h @@ -287,462 +287,266 @@ void name##_SPLAY_MINMAX(struct name *head, int __comp) \ (x) != NULL; \ (x) = SPLAY_NEXT(name, head, x)) -/* Macros that define a red-black tree */ -#define RB_HEAD(name, type) \ -struct name { \ - struct type *rbh_root; /* root of the tree */ \ -} - -#define RB_INITIALIZER(root) \ - { NULL } - -#define RB_INIT(root) do { \ - (root)->rbh_root = NULL; \ -} while (0) +/* + * Copyright (c) 2016 David Gwynne + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ #define RB_BLACK 0 #define RB_RED 1 -#define RB_ENTRY(type) \ -struct { \ - struct type *rbe_left; /* left element */ \ - struct type *rbe_right; /* right element */ \ - struct type *rbe_parent; /* parent element */ \ - int rbe_color; /* node color */ \ + +struct rb_type { + int (*t_compare)(const void *, const void *); + void (*t_augment)(void *); + unsigned int t_offset; /* offset of rb_entry in type */ +}; + +struct rb_tree { + struct rb_entry *rbt_root; +}; + +struct rb_entry { + struct rb_entry *rbt_parent; + struct rb_entry *rbt_left; + struct rb_entry *rbt_right; + unsigned int rbt_color; +}; + +#define RB_HEAD(_name, _type) \ +struct _name { \ + struct rb_tree rbh_root; \ } -#define RB_LEFT(elm, field) (elm)->field.rbe_left -#define RB_RIGHT(elm, field) (elm)->field.rbe_right -#define RB_PARENT(elm, field) (elm)->field.rbe_parent -#define RB_COLOR(elm, field) (elm)->field.rbe_color -#define RB_ROOT(head) (head)->rbh_root -#define RB_EMPTY(head) (RB_ROOT(head) == NULL) +#define RB_ENTRY(_type) struct rb_entry -#define RB_SET(elm, parent, field) do { \ - RB_PARENT(elm, field) = parent; \ - RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ - RB_COLOR(elm, field) = RB_RED; \ -} while (0) - -#define RB_SET_BLACKRED(black, red, field) do { \ - RB_COLOR(black, field) = RB_BLACK; \ - RB_COLOR(red, field) = RB_RED; \ -} while (0) - -#ifndef RB_AUGMENT -#define RB_AUGMENT(x) do {} while (0) -#endif - -#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ - (tmp) = RB_RIGHT(elm, field); \ - if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field))) { \ - RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \ - } \ - RB_AUGMENT(elm); \ - if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \ - if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ - RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ - else \ - RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ - } else \ - (head)->rbh_root = (tmp); \ - RB_LEFT(tmp, field) = (elm); \ - RB_PARENT(elm, field) = (tmp); \ - RB_AUGMENT(tmp); \ - if ((RB_PARENT(tmp, field))) \ - RB_AUGMENT(RB_PARENT(tmp, field)); \ -} while (0) - -#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ - (tmp) = RB_LEFT(elm, field); \ - if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field))) { \ - RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \ - } \ - RB_AUGMENT(elm); \ - if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \ - if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ - RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ - else \ - RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ - } else \ - (head)->rbh_root = (tmp); \ - RB_RIGHT(tmp, field) = (elm); \ - RB_PARENT(elm, field) = (tmp); \ - RB_AUGMENT(tmp); \ - if ((RB_PARENT(tmp, field))) \ - RB_AUGMENT(RB_PARENT(tmp, field)); \ -} while (0) - -/* Generates prototypes and inline functions */ -#define RB_PROTOTYPE(name, type, field, cmp) \ - RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) -#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ - RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __attribute__((__unused__)) static) -#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ -attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \ -attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\ -attr struct type *name##_RB_REMOVE(struct name *, struct type *); \ -attr struct type *name##_RB_INSERT(struct name *, struct type *); \ -attr struct type *name##_RB_FIND(struct name *, struct type *); \ -attr struct type *name##_RB_NFIND(struct name *, struct type *); \ -attr struct type *name##_RB_NEXT(struct type *); \ -attr struct type *name##_RB_PREV(struct type *); \ -attr struct type *name##_RB_MINMAX(struct name *, int); \ - \ - -/* Main rb operation. - * Moves node close to the key of elm to top - */ -#define RB_GENERATE(name, type, field, cmp) \ - RB_GENERATE_INTERNAL(name, type, field, cmp,) -#define RB_GENERATE_STATIC(name, type, field, cmp) \ - RB_GENERATE_INTERNAL(name, type, field, cmp, __attribute__((__unused__)) static) -#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ -attr void \ -name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ -{ \ - struct type *parent, *gparent, *tmp; \ - while ((parent = RB_PARENT(elm, field)) && \ - RB_COLOR(parent, field) == RB_RED) { \ - gparent = RB_PARENT(parent, field); \ - if (parent == RB_LEFT(gparent, field)) { \ - tmp = RB_RIGHT(gparent, field); \ - if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ - RB_COLOR(tmp, field) = RB_BLACK; \ - RB_SET_BLACKRED(parent, gparent, field);\ - elm = gparent; \ - continue; \ - } \ - if (RB_RIGHT(parent, field) == elm) { \ - RB_ROTATE_LEFT(head, parent, tmp, field);\ - tmp = parent; \ - parent = elm; \ - elm = tmp; \ - } \ - RB_SET_BLACKRED(parent, gparent, field); \ - RB_ROTATE_RIGHT(head, gparent, tmp, field); \ - } else { \ - tmp = RB_LEFT(gparent, field); \ - if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ - RB_COLOR(tmp, field) = RB_BLACK; \ - RB_SET_BLACKRED(parent, gparent, field);\ - elm = gparent; \ - continue; \ - } \ - if (RB_LEFT(parent, field) == elm) { \ - RB_ROTATE_RIGHT(head, parent, tmp, field);\ - tmp = parent; \ - parent = elm; \ - elm = tmp; \ - } \ - RB_SET_BLACKRED(parent, gparent, field); \ - RB_ROTATE_LEFT(head, gparent, tmp, field); \ - } \ - } \ - RB_COLOR(head->rbh_root, field) = RB_BLACK; \ -} \ - \ -attr void \ -name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \ -{ \ - struct type *tmp; \ - while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \ - elm != RB_ROOT(head)) { \ - if (RB_LEFT(parent, field) == elm) { \ - tmp = RB_RIGHT(parent, field); \ - if (RB_COLOR(tmp, field) == RB_RED) { \ - RB_SET_BLACKRED(tmp, parent, field); \ - RB_ROTATE_LEFT(head, parent, tmp, field);\ - tmp = RB_RIGHT(parent, field); \ - } \ - if ((RB_LEFT(tmp, field) == NULL || \ - RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ - (RB_RIGHT(tmp, field) == NULL || \ - RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ - RB_COLOR(tmp, field) = RB_RED; \ - elm = parent; \ - parent = RB_PARENT(elm, field); \ - } else { \ - if (RB_RIGHT(tmp, field) == NULL || \ - RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\ - struct type *oleft; \ - if ((oleft = RB_LEFT(tmp, field)))\ - RB_COLOR(oleft, field) = RB_BLACK;\ - RB_COLOR(tmp, field) = RB_RED; \ - RB_ROTATE_RIGHT(head, tmp, oleft, field);\ - tmp = RB_RIGHT(parent, field); \ - } \ - RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ - RB_COLOR(parent, field) = RB_BLACK; \ - if (RB_RIGHT(tmp, field)) \ - RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK;\ - RB_ROTATE_LEFT(head, parent, tmp, field);\ - elm = RB_ROOT(head); \ - break; \ - } \ - } else { \ - tmp = RB_LEFT(parent, field); \ - if (RB_COLOR(tmp, field) == RB_RED) { \ - RB_SET_BLACKRED(tmp, parent, field); \ - RB_ROTATE_RIGHT(head, parent, tmp, field);\ - tmp = RB_LEFT(parent, field); \ - } \ - if ((RB_LEFT(tmp, field) == NULL || \ - RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ - (RB_RIGHT(tmp, field) == NULL || \ - RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ - RB_COLOR(tmp, field) = RB_RED; \ - elm = parent; \ - parent = RB_PARENT(elm, field); \ - } else { \ - if (RB_LEFT(tmp, field) == NULL || \ - RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\ - struct type *oright; \ - if ((oright = RB_RIGHT(tmp, field)))\ - RB_COLOR(oright, field) = RB_BLACK;\ - RB_COLOR(tmp, field) = RB_RED; \ - RB_ROTATE_LEFT(head, tmp, oright, field);\ - tmp = RB_LEFT(parent, field); \ - } \ - RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ - RB_COLOR(parent, field) = RB_BLACK; \ - if (RB_LEFT(tmp, field)) \ - RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK;\ - RB_ROTATE_RIGHT(head, parent, tmp, field);\ - elm = RB_ROOT(head); \ - break; \ - } \ - } \ - } \ - if (elm) \ - RB_COLOR(elm, field) = RB_BLACK; \ -} \ - \ -attr struct type * \ -name##_RB_REMOVE(struct name *head, struct type *elm) \ -{ \ - struct type *child, *parent, *old = elm; \ - int color; \ - if (RB_LEFT(elm, field) == NULL) \ - child = RB_RIGHT(elm, field); \ - else if (RB_RIGHT(elm, field) == NULL) \ - child = RB_LEFT(elm, field); \ - else { \ - struct type *left; \ - elm = RB_RIGHT(elm, field); \ - while ((left = RB_LEFT(elm, field))) \ - elm = left; \ - child = RB_RIGHT(elm, field); \ - parent = RB_PARENT(elm, field); \ - color = RB_COLOR(elm, field); \ - if (child) \ - RB_PARENT(child, field) = parent; \ - if (parent) { \ - if (RB_LEFT(parent, field) == elm) \ - RB_LEFT(parent, field) = child; \ - else \ - RB_RIGHT(parent, field) = child; \ - RB_AUGMENT(parent); \ - } else \ - RB_ROOT(head) = child; \ - if (RB_PARENT(elm, field) == old) \ - parent = elm; \ - (elm)->field = (old)->field; \ - if (RB_PARENT(old, field)) { \ - if (RB_LEFT(RB_PARENT(old, field), field) == old)\ - RB_LEFT(RB_PARENT(old, field), field) = elm;\ - else \ - RB_RIGHT(RB_PARENT(old, field), field) = elm;\ - RB_AUGMENT(RB_PARENT(old, field)); \ - } else \ - RB_ROOT(head) = elm; \ - RB_PARENT(RB_LEFT(old, field), field) = elm; \ - if (RB_RIGHT(old, field)) \ - RB_PARENT(RB_RIGHT(old, field), field) = elm; \ - if (parent) { \ - left = parent; \ - do { \ - RB_AUGMENT(left); \ - } while ((left = RB_PARENT(left, field))); \ - } \ - goto color; \ - } \ - parent = RB_PARENT(elm, field); \ - color = RB_COLOR(elm, field); \ - if (child) \ - RB_PARENT(child, field) = parent; \ - if (parent) { \ - if (RB_LEFT(parent, field) == elm) \ - RB_LEFT(parent, field) = child; \ - else \ - RB_RIGHT(parent, field) = child; \ - RB_AUGMENT(parent); \ - } else \ - RB_ROOT(head) = child; \ -color: \ - if (color == RB_BLACK) \ - name##_RB_REMOVE_COLOR(head, parent, child); \ - return (old); \ -} \ - \ -/* Inserts a node into the RB tree */ \ -attr struct type * \ -name##_RB_INSERT(struct name *head, struct type *elm) \ -{ \ - struct type *tmp; \ - struct type *parent = NULL; \ - int comp = 0; \ - tmp = RB_ROOT(head); \ - while (tmp) { \ - parent = tmp; \ - comp = (cmp)(elm, parent); \ - if (comp < 0) \ - tmp = RB_LEFT(tmp, field); \ - else if (comp > 0) \ - tmp = RB_RIGHT(tmp, field); \ - else \ - return (tmp); \ - } \ - RB_SET(elm, parent, field); \ - if (parent != NULL) { \ - if (comp < 0) \ - RB_LEFT(parent, field) = elm; \ - else \ - RB_RIGHT(parent, field) = elm; \ - RB_AUGMENT(parent); \ - } else \ - RB_ROOT(head) = elm; \ - name##_RB_INSERT_COLOR(head, elm); \ - return (NULL); \ -} \ - \ -/* Finds the node with the same key as elm */ \ -attr struct type * \ -name##_RB_FIND(struct name *head, struct type *elm) \ -{ \ - struct type *tmp = RB_ROOT(head); \ - int comp; \ - while (tmp) { \ - comp = cmp(elm, tmp); \ - if (comp < 0) \ - tmp = RB_LEFT(tmp, field); \ - else if (comp > 0) \ - tmp = RB_RIGHT(tmp, field); \ - else \ - return (tmp); \ - } \ - return (NULL); \ -} \ - \ -/* Finds the first node greater than or equal to the search key */ \ -attr struct type * \ -name##_RB_NFIND(struct name *head, struct type *elm) \ -{ \ - struct type *tmp = RB_ROOT(head); \ - struct type *res = NULL; \ - int comp; \ - while (tmp) { \ - comp = cmp(elm, tmp); \ - if (comp < 0) { \ - res = tmp; \ - tmp = RB_LEFT(tmp, field); \ - } \ - else if (comp > 0) \ - tmp = RB_RIGHT(tmp, field); \ - else \ - return (tmp); \ - } \ - return (res); \ -} \ - \ -/* ARGSUSED */ \ -attr struct type * \ -name##_RB_NEXT(struct type *elm) \ -{ \ - if (RB_RIGHT(elm, field)) { \ - elm = RB_RIGHT(elm, field); \ - while (RB_LEFT(elm, field)) \ - elm = RB_LEFT(elm, field); \ - } else { \ - if (RB_PARENT(elm, field) && \ - (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ - elm = RB_PARENT(elm, field); \ - else { \ - while (RB_PARENT(elm, field) && \ - (elm == RB_RIGHT(RB_PARENT(elm, field), field)))\ - elm = RB_PARENT(elm, field); \ - elm = RB_PARENT(elm, field); \ - } \ - } \ - return (elm); \ -} \ - \ -/* ARGSUSED */ \ -attr struct type * \ -name##_RB_PREV(struct type *elm) \ -{ \ - if (RB_LEFT(elm, field)) { \ - elm = RB_LEFT(elm, field); \ - while (RB_RIGHT(elm, field)) \ - elm = RB_RIGHT(elm, field); \ - } else { \ - if (RB_PARENT(elm, field) && \ - (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ - elm = RB_PARENT(elm, field); \ - else { \ - while (RB_PARENT(elm, field) && \ - (elm == RB_LEFT(RB_PARENT(elm, field), field)))\ - elm = RB_PARENT(elm, field); \ - elm = RB_PARENT(elm, field); \ - } \ - } \ - return (elm); \ -} \ - \ -attr struct type * \ -name##_RB_MINMAX(struct name *head, int val) \ -{ \ - struct type *tmp = RB_ROOT(head); \ - struct type *parent = NULL; \ - while (tmp) { \ - parent = tmp; \ - if (val < 0) \ - tmp = RB_LEFT(tmp, field); \ - else \ - tmp = RB_RIGHT(tmp, field); \ - } \ - return (parent); \ +static inline void +_rb_init(struct rb_tree *rbt) +{ + rbt->rbt_root = NULL; } -#define RB_NEGINF -1 -#define RB_INF 1 +static inline int +_rb_empty(struct rb_tree *rbt) +{ + return (rbt->rbt_root == NULL); +} -#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) -#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) -#define RB_FIND(name, x, y) name##_RB_FIND(x, y) -#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y) -#define RB_NEXT(name, x, y) name##_RB_NEXT(y) -#define RB_PREV(name, x, y) name##_RB_PREV(y) -#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) -#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) +void *_rb_insert(const struct rb_type *, struct rb_tree *, void *); +void *_rb_remove(const struct rb_type *, struct rb_tree *, void *); +void *_rb_find(const struct rb_type *, struct rb_tree *, const void *); +void *_rb_nfind(const struct rb_type *, struct rb_tree *, const void *); +void *_rb_root(const struct rb_type *, struct rb_tree *); +void *_rb_min(const struct rb_type *, struct rb_tree *); +void *_rb_max(const struct rb_type *, struct rb_tree *); +void *_rb_next(const struct rb_type *, void *); +void *_rb_prev(const struct rb_type *, void *); +void *_rb_left(const struct rb_type *, void *); +void *_rb_right(const struct rb_type *, void *); +void *_rb_parent(const struct rb_type *, void *); +void _rb_set_left(const struct rb_type *, void *, void *); +void _rb_set_right(const struct rb_type *, void *, void *); +void _rb_set_parent(const struct rb_type *, void *, void *); +void _rb_poison(const struct rb_type *, void *, unsigned long); +int _rb_check(const struct rb_type *, void *, unsigned long); -#define RB_FOREACH(x, name, head) \ - for ((x) = RB_MIN(name, head); \ - (x) != NULL; \ - (x) = name##_RB_NEXT(x)) +#define RB_INITIALIZER(_head) { { NULL } } -#define RB_FOREACH_SAFE(x, name, head, y) \ - for ((x) = RB_MIN(name, head); \ - ((x) != NULL) && ((y) = name##_RB_NEXT(x), 1); \ - (x) = (y)) +#ifndef __unused +#define __unused __attribute__((__unused__)) +#endif /* __unused */ -#define RB_FOREACH_REVERSE(x, name, head) \ - for ((x) = RB_MAX(name, head); \ - (x) != NULL; \ - (x) = name##_RB_PREV(x)) +#define RB_PROTOTYPE(_name, _type, _field, _cmp) \ +extern const struct rb_type *const _name##_RB_TYPE; \ + \ +__unused static inline void \ +_name##_RB_INIT(struct _name *head) \ +{ \ + _rb_init(&head->rbh_root); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_INSERT(struct _name *head, struct _type *elm) \ +{ \ + return _rb_insert(_name##_RB_TYPE, &head->rbh_root, elm); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_REMOVE(struct _name *head, struct _type *elm) \ +{ \ + return _rb_remove(_name##_RB_TYPE, &head->rbh_root, elm); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_FIND(struct _name *head, const struct _type *key) \ +{ \ + return _rb_find(_name##_RB_TYPE, &head->rbh_root, key); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_NFIND(struct _name *head, const struct _type *key) \ +{ \ + return _rb_nfind(_name##_RB_TYPE, &head->rbh_root, key); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_ROOT(struct _name *head) \ +{ \ + return _rb_root(_name##_RB_TYPE, &head->rbh_root); \ +} \ + \ +__unused static inline int \ +_name##_RB_EMPTY(struct _name *head) \ +{ \ + return _rb_empty(&head->rbh_root); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_MIN(struct _name *head) \ +{ \ + return _rb_min(_name##_RB_TYPE, &head->rbh_root); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_MAX(struct _name *head) \ +{ \ + return _rb_max(_name##_RB_TYPE, &head->rbh_root); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_NEXT(struct _type *elm) \ +{ \ + return _rb_next(_name##_RB_TYPE, elm); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_PREV(struct _type *elm) \ +{ \ + return _rb_prev(_name##_RB_TYPE, elm); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_LEFT(struct _type *elm) \ +{ \ + return _rb_left(_name##_RB_TYPE, elm); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_RIGHT(struct _type *elm) \ +{ \ + return _rb_right(_name##_RB_TYPE, elm); \ +} \ + \ +__unused static inline struct _type * \ +_name##_RB_PARENT(struct _type *elm) \ +{ \ + return _rb_parent(_name##_RB_TYPE, elm); \ +} \ + \ +__unused static inline void \ +_name##_RB_SET_LEFT(struct _type *elm, struct _type *left) \ +{ \ + return _rb_set_left(_name##_RB_TYPE, elm, left); \ +} \ + \ +__unused static inline void \ +_name##_RB_SET_RIGHT(struct _type *elm, struct _type *right) \ +{ \ + return _rb_set_right(_name##_RB_TYPE, elm, right); \ +} \ + \ +__unused static inline void \ +_name##_RB_SET_PARENT(struct _type *elm, struct _type *parent) \ +{ \ + return _rb_set_parent(_name##_RB_TYPE, elm, parent); \ +} \ + \ +__unused static inline void \ +_name##_RB_POISON(struct _type *elm, unsigned long poison) \ +{ \ + return _rb_poison(_name##_RB_TYPE, elm, poison); \ +} \ + \ +__unused static inline int \ +_name##_RB_CHECK(struct _type *elm, unsigned long poison) \ +{ \ + return _rb_check(_name##_RB_TYPE, elm, poison); \ +} -#define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \ - for ((x) = RB_MAX(name, head); \ - ((x) != NULL) && ((y) = name##_RB_PREV(x), 1); \ - (x) = (y)) +#define RB_GENERATE_INTERNAL(_name, _type, _field, _cmp, _aug) \ +static int \ +_name##_RB_COMPARE(const void *lptr, const void *rptr) \ +{ \ + const struct _type *l = lptr, *r = rptr; \ + return _cmp(l, r); \ +} \ +static const struct rb_type _name##_RB_INFO = { \ + _name##_RB_COMPARE, \ + _aug, \ + offsetof(struct _type, _field), \ +}; \ +const struct rb_type *const _name##_RB_TYPE = &_name##_RB_INFO; + +#define RB_GENERATE_AUGMENT(_name, _type, _field, _cmp, _aug) \ +static void \ +_name##_RB_AUGMENT(void *ptr) \ +{ \ + struct _type *p = ptr; \ + return _aug(p); \ +} \ +RB_GENERATE_INTERNAL(_name, _type, _field, _cmp, _name##_RB_AUGMENT) + +#define RB_GENERATE(_name, _type, _field, _cmp) \ + RB_GENERATE_INTERNAL(_name, _type, _field, _cmp, NULL) + +#define RB_INIT(_name, _head) _name##_RB_INIT(_head) +#define RB_INSERT(_name, _head, _elm) _name##_RB_INSERT(_head, _elm) +#define RB_REMOVE(_name, _head, _elm) _name##_RB_REMOVE(_head, _elm) +#define RB_FIND(_name, _head, _key) _name##_RB_FIND(_head, _key) +#define RB_NFIND(_name, _head, _key) _name##_RB_NFIND(_head, _key) +#define RB_ROOT(_name, _head) _name##_RB_ROOT(_head) +#define RB_EMPTY(_name, _head) _name##_RB_EMPTY(_head) +#define RB_MIN(_name, _head) _name##_RB_MIN(_head) +#define RB_MAX(_name, _head) _name##_RB_MAX(_head) +#define RB_NEXT(_name, _elm) _name##_RB_NEXT(_elm) +#define RB_PREV(_name, _elm) _name##_RB_PREV(_elm) +#define RB_LEFT(_name, _elm) _name##_RB_LEFT(_elm) +#define RB_RIGHT(_name, _elm) _name##_RB_RIGHT(_elm) +#define RB_PARENT(_name, _elm) _name##_RB_PARENT(_elm) +#define RB_SET_LEFT(_name, _elm, _l) _name##_RB_SET_LEFT(_elm, _l) +#define RB_SET_RIGHT(_name, _elm, _r) _name##_RB_SET_RIGHT(_elm, _r) +#define RB_SET_PARENT(_name, _elm, _p) _name##_RB_SET_PARENT(_elm, _p) +#define RB_POISON(_name, _elm, _p) _name##_RB_POISON(_elm, _p) +#define RB_CHECK(_name, _elm, _p) _name##_RB_CHECK(_elm, _p) + +#define RB_FOREACH(_e, _name, _head) \ + for ((_e) = RB_MIN(_name, (_head)); \ + (_e) != NULL; \ + (_e) = RB_NEXT(_name, (_e))) + +#define RB_FOREACH_SAFE(_e, _name, _head, _n) \ + for ((_e) = RB_MIN(_name, (_head)); \ + (_e) != NULL && ((_n) = RB_NEXT(_name, (_e)), 1); \ + (_e) = (_n)) + +#define RB_FOREACH_REVERSE(_e, _name, _head) \ + for ((_e) = RB_MAX(_name, (_head)); \ + (_e) != NULL; \ + (_e) = RB_PREV(_name, (_e))) + +#define RB_FOREACH_REVERSE_SAFE(_e, _name, _head, _n) \ + for ((_e) = RB_MAX(_name, (_head)); \ + (_e) != NULL && ((_n) = RB_PREV(_name, (_e)), 1); \ + (_e) = (_n)) #endif /* _SYS_TREE_H_ */ diff --git a/lib/vrf.c b/lib/vrf.c index c4e527db5b..42debe5f1f 100644 --- a/lib/vrf.c +++ b/lib/vrf.c @@ -35,11 +35,11 @@ DEFINE_MTYPE_STATIC(LIB, VRF_BITMAP, "VRF bit-map") DEFINE_QOBJ_TYPE(vrf) -static __inline int vrf_id_compare (struct vrf *, struct vrf *); -static __inline int vrf_name_compare (struct vrf *, struct vrf *); +static __inline int vrf_id_compare (const struct vrf *, const struct vrf *); +static __inline int vrf_name_compare (const struct vrf *, const struct vrf *); -RB_GENERATE (vrf_id_head, vrf, id_entry, vrf_id_compare) -RB_GENERATE (vrf_name_head, vrf, name_entry, vrf_name_compare) +RB_GENERATE (vrf_id_head, vrf, id_entry, vrf_id_compare); +RB_GENERATE (vrf_name_head, vrf, name_entry, vrf_name_compare); struct vrf_id_head vrfs_by_id = RB_INITIALIZER (&vrfs_by_id); struct vrf_name_head vrfs_by_name = RB_INITIALIZER (&vrfs_by_name); @@ -72,13 +72,13 @@ vrf_lookup_by_name (const char *name) } static __inline int -vrf_id_compare (struct vrf *a, struct vrf *b) +vrf_id_compare (const struct vrf *a, const struct vrf *b) { return (a->vrf_id - b->vrf_id); } static int -vrf_name_compare (struct vrf *a, struct vrf *b) +vrf_name_compare (const struct vrf *a, const struct vrf *b) { return strcmp (a->name, b->name); } @@ -419,9 +419,9 @@ vrf_terminate (void) if (debug_vrf) zlog_debug ("%s: Shutting down vrf subsystem", __PRETTY_FUNCTION__); - while ((vrf = RB_ROOT (&vrfs_by_id)) != NULL) + while ((vrf = RB_ROOT (vrf_id_head, &vrfs_by_id)) != NULL) vrf_delete (vrf); - while ((vrf = RB_ROOT (&vrfs_by_name)) != NULL) + while ((vrf = RB_ROOT (vrf_name_head, &vrfs_by_name)) != NULL) vrf_delete (vrf); } diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index e9ccac1c92..c2af0a0d22 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -2897,7 +2897,7 @@ vrf_id_get_next (vrf_id_t vrf_id, vrf_id_t *next_id_p) vrf = vrf_lookup_by_id (vrf_id); if (vrf) { - vrf = RB_NEXT (vrf_id_head, &vrfs_by_id, vrf); + vrf = RB_NEXT (vrf_id_head, vrf); if (vrf) { *next_id_p = vrf->vrf_id; return 1; From 8f942af9026f306e2eeca322b019e2c3c17d8000 Mon Sep 17 00:00:00 2001 From: Rafael Zalamena Date: Fri, 16 Jun 2017 11:08:43 -0300 Subject: [PATCH 05/18] lib: fix a possible NULL deference Silences a warning generated by clang. --- lib/openbsd-tree.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/openbsd-tree.c b/lib/openbsd-tree.c index 37762abc1f..9f17f2946a 100644 --- a/lib/openbsd-tree.c +++ b/lib/openbsd-tree.c @@ -222,6 +222,10 @@ rbe_remove_color(const struct rb_type *t, struct rb_tree *rbt, { struct rb_entry *tmp; + /* Silence clang possible NULL deference warning. */ + if (parent == NULL) + return; + while ((rbe == NULL || RBE_COLOR(rbe) == RB_BLACK) && rbe != RBH_ROOT(rbt)) { if (RBE_LEFT(parent) == rbe) { From d617d5febfbba2b986206e250f1bb3ccf0f23d10 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 15 Jun 2017 13:43:26 -0400 Subject: [PATCH 06/18] *: Add vrf autocompletion for commands Switch NAME to VRFNAME and add vrf autocompletion to commands that have them Signed-off-by: Donald Sharp --- lib/if.c | 6 ++--- lib/vrf.c | 29 ++++++++++++++++++++++-- vtysh/vtysh.c | 8 +++---- zebra/interface.c | 6 ++--- zebra/router-id.c | 4 ++-- zebra/zebra_vty.c | 58 +++++++++++++++++++++++------------------------ 6 files changed, 68 insertions(+), 43 deletions(-) diff --git a/lib/if.c b/lib/if.c index dc417f8e3c..d4b3d3f7a4 100644 --- a/lib/if.c +++ b/lib/if.c @@ -678,7 +678,7 @@ if_sunwzebra_get (const char *name, size_t nlen, vrf_id_t vrf_id) DEFUN (interface, interface_cmd, - "interface IFNAME [vrf NAME]", + "interface IFNAME [vrf VRFNAME]", "Select an interface to configure\n" "Interface's name\n" VRF_CMD_HELP_STR) @@ -723,7 +723,7 @@ DEFUN (interface, DEFUN_NOSH (no_interface, no_interface_cmd, - "no interface IFNAME [vrf NAME]", + "no interface IFNAME [vrf VRFNAME]", NO_STR "Delete a pseudo interface's configuration\n" "Interface's name\n" @@ -774,7 +774,7 @@ if_cmd_init (void) /* For debug purpose. */ DEFUN (show_address, show_address_cmd, - "show address [vrf NAME]", + "show address [vrf VRFNAME]", SHOW_STR "address\n" VRF_CMD_HELP_STR) diff --git a/lib/vrf.c b/lib/vrf.c index c4e527db5b..dbba67164f 100644 --- a/lib/vrf.c +++ b/lib/vrf.c @@ -377,6 +377,29 @@ vrf_bitmap_check (vrf_bitmap_t bmap, vrf_id_t vrf_id) VRF_BITMAP_FLAG (offset)) ? 1 : 0; } +static void +vrf_autocomplete (vector comps, struct cmd_token *token) +{ + struct vrf *vrf = NULL; + + RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) + { + if (vrf->vrf_id != 0) + vector_set (comps, XSTRDUP (MTYPE_COMPLETION, vrf->name)); + } +} + +static const struct cmd_variable_handler vrf_var_handlers[] = { + { + .tokenname = "VRFNAME", + .completions = vrf_autocomplete, + }, + { + .completions = NULL + }, +}; + + /* Initialize VRF module. */ void vrf_init (int (*create)(struct vrf *), @@ -408,6 +431,8 @@ vrf_init (int (*create)(struct vrf *), zlog_err ("vrf_init: failed to enable the default VRF!"); exit (1); } + + cmd_variable_handler_register (vrf_var_handlers); } /* Terminate VRF module. */ @@ -439,7 +464,7 @@ vrf_socket (int domain, int type, int protocol, vrf_id_t vrf_id) /* vrf CLI commands */ DEFUN_NOSH (vrf, vrf_cmd, - "vrf NAME", + "vrf VRFNAME", "Select a VRF to configure\n" "VRF's name\n") { @@ -464,7 +489,7 @@ DEFUN_NOSH (vrf, DEFUN_NOSH (no_vrf, no_vrf_cmd, - "no vrf NAME", + "no vrf VRFNAME", NO_STR "Delete a pseudo VRF's configuration\n" "VRF's name\n") diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index ffdfd5d725..27077951b0 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -1902,7 +1902,7 @@ DEFUNSH (VTYSH_ALL, DEFUNSH (VTYSH_INTERFACE, vtysh_interface, vtysh_interface_cmd, - "interface IFNAME [vrf NAME]", + "interface IFNAME vrf VRFNAME", "Select an interface to configure\n" "Interface's name\n" VRF_CMD_HELP_STR) @@ -1921,7 +1921,7 @@ DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_EIGRPD DEFSH (VTYSH_ZEBRA, vtysh_no_interface_vrf_cmd, - "no interface IFNAME vrf NAME", + "no interface IFNAME vrf VRFNAME", NO_STR "Delete a pseudo interface's configuration\n" "Interface's name\n" @@ -1943,7 +1943,7 @@ DEFUNSH (VTYSH_NS, DEFUNSH (VTYSH_VRF, vtysh_vrf, vtysh_vrf_cmd, - "vrf NAME", + "vrf VRFNAME", "Select a VRF to configure\n" "VRF's name\n") { @@ -1953,7 +1953,7 @@ DEFUNSH (VTYSH_VRF, DEFSH (VTYSH_ZEBRA, vtysh_no_vrf_cmd, - "no vrf NAME", + "no vrf VRFNAME", NO_STR "Delete a pseudo vrf's configuration\n" "VRF's name\n") diff --git a/zebra/interface.c b/zebra/interface.c index 9393305f06..39476c6119 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -1282,7 +1282,7 @@ struct cmd_node interface_node = /* Show all interfaces to vty. */ DEFUN (show_interface, show_interface_cmd, - "show interface [vrf NAME]", + "show interface [vrf VRFNAME]", SHOW_STR "Interface status and configuration\n" VRF_CMD_HELP_STR) @@ -1330,7 +1330,7 @@ DEFUN (show_interface_vrf_all, DEFUN (show_interface_name_vrf, show_interface_name_vrf_cmd, - "show interface IFNAME vrf NAME", + "show interface IFNAME vrf VRFNAME", SHOW_STR "Interface status and configuration\n" "Interface name\n" @@ -1438,7 +1438,7 @@ if_show_description (struct vty *vty, vrf_id_t vrf_id) DEFUN (show_interface_desc, show_interface_desc_cmd, - "show interface description [vrf NAME]", + "show interface description [vrf VRFNAME]", SHOW_STR "Interface status and configuration\n" "Interface description\n" diff --git a/zebra/router-id.c b/zebra/router-id.c index 318986c1b7..f4306ba21e 100644 --- a/zebra/router-id.c +++ b/zebra/router-id.c @@ -215,7 +215,7 @@ router_id_write (struct vty *vty) DEFUN (router_id, router_id_cmd, - "router-id A.B.C.D [vrf NAME]", + "router-id A.B.C.D [vrf VRFNAME]", "Manually set the router-id\n" "IP address to use for router-id\n" VRF_CMD_HELP_STR) @@ -243,7 +243,7 @@ DEFUN (router_id, DEFUN (no_router_id, no_router_id_cmd, - "no router-id [A.B.C.D [vrf NAME]]", + "no router-id [A.B.C.D [vrf VRFNAME]]", NO_STR "Remove the manually configured router-id\n" "IP address to use for router-id\n" diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 88778e491b..d1ca6d0a39 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -395,7 +395,7 @@ zebra_vty_ip_route_tdv_helper (int argc, struct cmd_token *argv[], /* Static route configuration. */ DEFUN (ip_route, ip_route_cmd, - "ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", IP_STR "Establish static routes\n" "IP destination prefix (e.g. 10.0.0.0/8)\n" @@ -425,7 +425,7 @@ DEFUN (ip_route, DEFUN (ip_route_flags, ip_route_flags_cmd, - "ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", IP_STR "Establish static routes\n" "IP destination prefix (e.g. 10.0.0.0/8)\n" @@ -456,7 +456,7 @@ DEFUN (ip_route_flags, /* Mask as A.B.C.D format. */ DEFUN (ip_route_mask, ip_route_mask_cmd, - "ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", IP_STR "Establish static routes\n" "IP destination prefix\n" @@ -488,7 +488,7 @@ DEFUN (ip_route_mask, DEFUN (ip_route_mask_flags, ip_route_mask_flags_cmd, - "ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", IP_STR "Establish static routes\n" "IP destination prefix\n" @@ -520,7 +520,7 @@ DEFUN (ip_route_mask_flags, DEFUN (no_ip_route, no_ip_route_cmd, - "no ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "no ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", NO_STR IP_STR "Establish static routes\n" @@ -552,7 +552,7 @@ DEFUN (no_ip_route, DEFUN (no_ip_route_flags, no_ip_route_flags_cmd, - "no ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "no ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", NO_STR IP_STR "Establish static routes\n" @@ -580,7 +580,7 @@ DEFUN (no_ip_route_flags, DEFUN (no_ip_route_mask, no_ip_route_mask_cmd, - "no ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "no ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", NO_STR IP_STR "Establish static routes\n" @@ -614,7 +614,7 @@ DEFUN (no_ip_route_mask, DEFUN (no_ip_route_mask_flags, no_ip_route_mask_flags_cmd, - "no ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "no ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", NO_STR IP_STR "Establish static routes\n" @@ -1219,7 +1219,7 @@ do_show_ip_route (struct vty *vty, const char *vrf_name, afi_t afi, safi_t safi, DEFUN (show_ip_nht, show_ip_nht_cmd, - "show ip nht [vrf NAME]", + "show ip nht [vrf VRFNAME]", SHOW_STR IP_STR "IP nexthop tracking table\n" @@ -1259,7 +1259,7 @@ DEFUN (show_ip_nht_vrf_all, DEFUN (show_ipv6_nht, show_ipv6_nht_cmd, - "show ipv6 nht [vrf NAME]", + "show ipv6 nht [vrf VRFNAME]", SHOW_STR IPV6_STR "IPv6 nexthop tracking table\n" @@ -1362,7 +1362,7 @@ DEFUN (no_ipv6_nht_default_route, // dwalton one "show ip route" to rule them all DEFUN (show_ip_route, show_ip_route_cmd, - "show ip [vrf NAME] [tag (1-4294967295)|A.B.C.D/M longer-prefixes|supernets-only|" FRR_IP_REDIST_STR_ZEBRA "|ospf (1-65535)] [json]", + "show ip [vrf VRFNAME] [tag (1-4294967295)|A.B.C.D/M longer-prefixes|supernets-only|" FRR_IP_REDIST_STR_ZEBRA "|ospf (1-65535)] [json]", SHOW_STR IP_STR "IP forwarding table\n" @@ -1475,7 +1475,7 @@ DEFUN (show_ip_route, DEFUN (show_ip_route_addr, show_ip_route_addr_cmd, - "show ip route [vrf NAME] A.B.C.D", + "show ip route [vrf VRFNAME] A.B.C.D", SHOW_STR IP_STR "IP routing table\n" @@ -1524,7 +1524,7 @@ DEFUN (show_ip_route_addr, DEFUN (show_ip_route_prefix, show_ip_route_prefix_cmd, - "show ip route [vrf NAME] A.B.C.D/M", + "show ip route [vrf VRFNAME] A.B.C.D/M", SHOW_STR IP_STR "IP routing table\n" @@ -1724,7 +1724,7 @@ vty_show_ip_route_summary_prefix (struct vty *vty, struct route_table *table) /* Show route summary. */ DEFUN (show_ip_route_summary, show_ip_route_summary_cmd, - "show ip route [vrf NAME] summary", + "show ip route [vrf VRFNAME] summary", SHOW_STR IP_STR "IP routing table\n" @@ -1749,7 +1749,7 @@ DEFUN (show_ip_route_summary, /* Show route summary prefix. */ DEFUN (show_ip_route_summary_prefix, show_ip_route_summary_prefix_cmd, - "show ip route [vrf NAME] summary prefix", + "show ip route [vrf VRFNAME] summary prefix", SHOW_STR IP_STR "IP routing table\n" @@ -2165,7 +2165,7 @@ static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str, DEFUN (ipv6_route, ipv6_route_cmd, - "ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", IP_STR "Establish static routes\n" "IPv6 destination prefix (e.g. 3ffe:506::/32)\n" @@ -2211,7 +2211,7 @@ DEFUN (ipv6_route, DEFUN (ipv6_route_flags, ipv6_route_flags_cmd, - "ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", IP_STR "Establish static routes\n" "IPv6 destination prefix (e.g. 3ffe:506::/32)\n" @@ -2263,7 +2263,7 @@ DEFUN (ipv6_route_flags, DEFUN (ipv6_route_ifname, ipv6_route_ifname_cmd, - "ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", IP_STR "Establish static routes\n" "IPv6 destination prefix (e.g. 3ffe:506::/32)\n" @@ -2312,7 +2312,7 @@ DEFUN (ipv6_route_ifname, DEFUN (ipv6_route_ifname_flags, ipv6_route_ifname_flags_cmd, - "ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", IP_STR "Establish static routes\n" "IPv6 destination prefix (e.g. 3ffe:506::/32)\n" @@ -2366,7 +2366,7 @@ DEFUN (ipv6_route_ifname_flags, DEFUN (no_ipv6_route, no_ipv6_route_cmd, - "no ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "no ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", NO_STR IP_STR "Establish static routes\n" @@ -2413,7 +2413,7 @@ DEFUN (no_ipv6_route, DEFUN (no_ipv6_route_flags, no_ipv6_route_flags_cmd, - "no ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "no ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", NO_STR IP_STR "Establish static routes\n" @@ -2465,7 +2465,7 @@ DEFUN (no_ipv6_route_flags, DEFUN (no_ipv6_route_ifname, no_ipv6_route_ifname_cmd, - "no ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "no ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", NO_STR IP_STR "Establish static routes\n" @@ -2515,7 +2515,7 @@ DEFUN (no_ipv6_route_ifname, DEFUN (no_ipv6_route_ifname_flags, no_ipv6_route_ifname_flags_cmd, - "no ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf NAME]", + "no ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", NO_STR IP_STR "Establish static routes\n" @@ -2571,7 +2571,7 @@ DEFUN (no_ipv6_route_ifname_flags, // dwalton duplicate to here DEFUN (show_ipv6_route, show_ipv6_route_cmd, - "show ipv6 [vrf NAME] [tag (1-4294967295)|X:X::X:X/M longer-prefixes|" FRR_IP6_REDIST_STR_ZEBRA "] [json]", + "show ipv6 [vrf VRFNAME] [tag (1-4294967295)|X:X::X:X/M longer-prefixes|" FRR_IP6_REDIST_STR_ZEBRA "] [json]", SHOW_STR IP_STR "IP forwarding table\n" @@ -2670,7 +2670,7 @@ DEFUN (show_ipv6_route, DEFUN (show_ipv6_route_addr, show_ipv6_route_addr_cmd, - "show ipv6 route [vrf NAME] X:X::X:X", + "show ipv6 route [vrf VRFNAME] X:X::X:X", SHOW_STR IP_STR "IPv6 routing table\n" @@ -2719,7 +2719,7 @@ DEFUN (show_ipv6_route_addr, DEFUN (show_ipv6_route_prefix, show_ipv6_route_prefix_cmd, - "show ipv6 route [vrf NAME] X:X::X:X/M", + "show ipv6 route [vrf VRFNAME] X:X::X:X/M", SHOW_STR IP_STR "IPv6 routing table\n" @@ -2768,7 +2768,7 @@ DEFUN (show_ipv6_route_prefix, /* Show route summary. */ DEFUN (show_ipv6_route_summary, show_ipv6_route_summary_cmd, - "show ipv6 route [vrf NAME] summary", + "show ipv6 route [vrf VRFNAME] summary", SHOW_STR IP_STR "IPv6 routing table\n" @@ -2794,7 +2794,7 @@ DEFUN (show_ipv6_route_summary, /* Show ipv6 route summary prefix. */ DEFUN (show_ipv6_route_summary_prefix, show_ipv6_route_summary_prefix_cmd, - "show ipv6 route [vrf NAME] summary prefix", + "show ipv6 route [vrf VRFNAME] summary prefix", SHOW_STR IP_STR "IPv6 routing table\n" @@ -2824,7 +2824,7 @@ DEFUN (show_ipv6_route_summary_prefix, */ DEFUN (show_ipv6_mroute, show_ipv6_mroute_cmd, - "show ipv6 mroute [vrf NAME]", + "show ipv6 mroute [vrf VRFNAME]", SHOW_STR IP_STR "IPv6 Multicast routing table\n" From 18c57037100955cd6588ccc62d0d63923bed7d07 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 15 Jun 2017 13:48:06 -0400 Subject: [PATCH 07/18] bgpd: Add view/vrf auto completion to commands Modify the ' NAME' commands to allow auto-completion of available choices. Signed-off-by: Donald Sharp --- bgpd/bgp_nexthop.c | 2 +- bgpd/bgp_route.c | 16 ++++++++-------- bgpd/bgp_vty.c | 40 ++++++++++++++++++++-------------------- bgpd/bgpd.c | 31 +++++++++++++++++++++++++++++++ bgpd/rfapi/rfapi_vty.c | 6 +++--- 5 files changed, 63 insertions(+), 32 deletions(-) diff --git a/bgpd/bgp_nexthop.c b/bgpd/bgp_nexthop.c index 132b754104..e35f9752f1 100644 --- a/bgpd/bgp_nexthop.c +++ b/bgpd/bgp_nexthop.c @@ -492,7 +492,7 @@ bgp_show_all_instances_nexthops_vty (struct vty *vty) DEFUN (show_ip_bgp_nexthop, show_ip_bgp_nexthop_cmd, - "show [ip] bgp [ WORD] nexthop [detail]", + "show [ip] bgp [ VIEWVRFNAME] nexthop [detail]", SHOW_STR IP_STR BGP_STR diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 31c1dd8c10..979e7bda35 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -8438,7 +8438,7 @@ bgp_show_lcommunity_list (struct vty *vty, struct bgp *bgp, const char *lcom, DEFUN (show_ip_bgp_large_community_list, show_ip_bgp_large_community_list_cmd, - "show [ip] bgp [ WORD] [ []] large-community-list <(1-500)|WORD> [json]", + "show [ip] bgp [ VIEWVRFNAME] [ []] large-community-list <(1-500)|WORD> [json]", SHOW_STR IP_STR BGP_STR @@ -8484,7 +8484,7 @@ DEFUN (show_ip_bgp_large_community_list, } DEFUN (show_ip_bgp_large_community, show_ip_bgp_large_community_cmd, - "show [ip] bgp [ WORD] [ []] large-community [AA:BB:CC] [json]", + "show [ip] bgp [ VIEWVRFNAME] [ []] large-community [AA:BB:CC] [json]", SHOW_STR IP_STR BGP_STR @@ -8535,7 +8535,7 @@ static int bgp_table_stats (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t /* BGP route print out function. */ DEFUN (show_ip_bgp, show_ip_bgp_cmd, - "show [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]]\ + "show [ip] bgp [ VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]]\ [<\ cidr-only\ |dampening \ @@ -8656,7 +8656,7 @@ DEFUN (show_ip_bgp, DEFUN (show_ip_bgp_route, show_ip_bgp_route_cmd, - "show [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]]" + "show [ip] bgp [ VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]]" " [] [json]", SHOW_STR IP_STR @@ -8725,7 +8725,7 @@ DEFUN (show_ip_bgp_route, DEFUN (show_ip_bgp_regexp, show_ip_bgp_regexp_cmd, - "show [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] regexp REGEX...", + "show [ip] bgp [ VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] regexp REGEX...", SHOW_STR IP_STR BGP_STR @@ -9437,7 +9437,7 @@ bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, u_c DEFUN (show_ip_bgp_instance_neighbor_prefix_counts, show_ip_bgp_instance_neighbor_prefix_counts_cmd, - "show [ip] bgp [ WORD] [ []] " + "show [ip] bgp [ VIEWVRFNAME] [ []] " "neighbors prefix-counts [json]", SHOW_STR IP_STR @@ -9810,7 +9810,7 @@ peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, DEFUN (show_ip_bgp_instance_neighbor_advertised_route, show_ip_bgp_instance_neighbor_advertised_route_cmd, - "show [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] " + "show [ip] bgp [ VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] " "neighbors [route-map WORD] [json]", SHOW_STR IP_STR @@ -9974,7 +9974,7 @@ bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi, DEFUN (show_ip_bgp_neighbor_routes, show_ip_bgp_neighbor_routes_cmd, - "show [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] " + "show [ip] bgp [ VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] " "neighbors [json]", SHOW_STR IP_STR diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index f5f538de95..702427a9c4 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -275,11 +275,11 @@ argv_find_and_parse_safi (struct cmd_token **argv, int argc, int *index, safi_t * that is being parsed. * * The show commands are generally of the form: - * "show [ip] bgp [ WORD] [ []] ..." + * "show [ip] bgp [ VIEWVRFNAME] [ []] ..." * * Since we use argv_find if the show command in particular doesn't have: * [ip] - * [ WORD] + * [ VIEWVRFNAME] * [ []] * The command parsing should still be ok. * @@ -859,7 +859,7 @@ DEFUN (no_auto_summary, /* "router bgp" commands. */ DEFUN_NOSH (router_bgp, router_bgp_cmd, - "router bgp [(1-4294967295) [ WORD]]", + "router bgp [(1-4294967295) [ VIEWVRFNAME]]", ROUTER_STR BGP_STR AS_STR @@ -937,7 +937,7 @@ DEFUN_NOSH (router_bgp, /* "no router bgp" commands. */ DEFUN (no_router_bgp, no_router_bgp_cmd, - "no router bgp [(1-4294967295) [ WORD]]", + "no router bgp [(1-4294967295) [ VIEWVRFNAME]]", NO_STR ROUTER_STR BGP_STR @@ -6499,7 +6499,7 @@ bgp_clear_prefix (struct vty *vty, const char *view_name, const char *ip_str, /* one clear bgp command to rule them all */ DEFUN (clear_ip_bgp_all, clear_ip_bgp_all_cmd, - "clear [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> []|in [prefix-filter]|out>]", + "clear [ip] bgp [ VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> []|in [prefix-filter]|out>]", CLEAR_STR IP_STR BGP_STR @@ -6534,7 +6534,7 @@ DEFUN (clear_ip_bgp_all, /* clear [ip] bgp */ if (argv_find (argv, argc, "ip", &idx)) afi = AFI_IP; - /* [ WORD] */ + /* [ VIEWVRFNAME] */ if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx)) { vrf = argv[idx + 1]->arg; @@ -6604,7 +6604,7 @@ DEFUN (clear_ip_bgp_all, DEFUN (clear_ip_bgp_prefix, clear_ip_bgp_prefix_cmd, - "clear [ip] bgp [ WORD] prefix A.B.C.D/M", + "clear [ip] bgp [ VIEWVRFNAME] prefix A.B.C.D/M", CLEAR_STR IP_STR BGP_STR @@ -6617,7 +6617,7 @@ DEFUN (clear_ip_bgp_prefix, int idx = 0; - /* [ WORD] */ + /* [ VIEWVRFNAME] */ if (argv_find (argv, argc, "WORD", &idx)) vrf = argv[idx]->arg; @@ -6645,7 +6645,7 @@ DEFUN (clear_bgp_ipv6_safi_prefix, DEFUN (clear_bgp_instance_ipv6_safi_prefix, clear_bgp_instance_ipv6_safi_prefix_cmd, - "clear [ip] bgp WORD ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M", + "clear [ip] bgp VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M", CLEAR_STR IP_STR BGP_STR @@ -7474,7 +7474,7 @@ bgp_show_summary_vty (struct vty *vty, const char *name, /* `show [ip] bgp summary' commands. */ DEFUN (show_ip_bgp_summary, show_ip_bgp_summary_cmd, - "show [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] summary [json]", + "show [ip] bgp [ VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] summary [json]", SHOW_STR IP_STR BGP_STR @@ -7493,7 +7493,7 @@ DEFUN (show_ip_bgp_summary, /* show [ip] bgp */ if (argv_find (argv, argc, "ip", &idx)) afi = AFI_IP; - /* [ WORD] */ + /* [ VIEWVRFNAME] */ if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx)) vrf = argv[++idx]->arg; /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */ @@ -9430,7 +9430,7 @@ bgp_show_neighbor_vty (struct vty *vty, const char *name, /* "show [ip] bgp neighbors" commands. */ DEFUN (show_ip_bgp_neighbors, show_ip_bgp_neighbors_cmd, - "show [ip] bgp [ WORD] [>] neighbors [] [json]", + "show [ip] bgp [ VIEWVRFNAME] [>] neighbors [] [json]", SHOW_STR IP_STR BGP_STR @@ -9610,7 +9610,7 @@ bgp_show_update_groups(struct vty *vty, const char *name, DEFUN (show_ip_bgp_updgrps, show_ip_bgp_updgrps_cmd, - "show [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] update-groups [SUBGROUP-ID]", + "show [ip] bgp [ VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] update-groups [SUBGROUP-ID]", SHOW_STR IP_STR BGP_STR @@ -9630,7 +9630,7 @@ DEFUN (show_ip_bgp_updgrps, /* show [ip] bgp */ if (argv_find (argv, argc, "ip", &idx)) afi = AFI_IP; - /* [ WORD] */ + /* [ VIEWVRFNAME] */ if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx)) vrf = argv[++idx]->arg; /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */ @@ -9680,7 +9680,7 @@ DEFUN (show_bgp_updgrps_stats, DEFUN (show_bgp_instance_updgrps_stats, show_bgp_instance_updgrps_stats_cmd, - "show [ip] bgp WORD update-groups statistics", + "show [ip] bgp VIEWVRFNAME update-groups statistics", SHOW_STR IP_STR BGP_STR @@ -9740,7 +9740,7 @@ DEFUN (show_ip_bgp_updgrps_adj, DEFUN (show_ip_bgp_instance_updgrps_adj, show_ip_bgp_instance_updgrps_adj_cmd, - "show [ip] bgp WORD update-groups ", + "show [ip] bgp VIEWVRFNAME update-groups ", SHOW_STR IP_STR BGP_STR @@ -9798,7 +9798,7 @@ DEFUN (show_bgp_updgrps_adj, DEFUN (show_bgp_instance_updgrps_adj, show_bgp_instance_updgrps_adj_cmd, - "show [ip] bgp WORD update-groups ", + "show [ip] bgp VIEWVRFNAME update-groups ", SHOW_STR IP_STR BGP_STR @@ -9839,7 +9839,7 @@ DEFUN (show_ip_bgp_updgrps_adj_s, DEFUN (show_ip_bgp_instance_updgrps_adj_s, show_ip_bgp_instance_updgrps_adj_s_cmd, - "show [ip] bgp WORD update-groups SUBGROUP-ID ", + "show [ip] bgp VIEWVRFNAME update-groups SUBGROUP-ID ", SHOW_STR IP_STR BGP_STR @@ -9915,7 +9915,7 @@ DEFUN (show_bgp_updgrps_adj_s, DEFUN (show_bgp_instance_updgrps_adj_s, show_bgp_instance_updgrps_adj_s_cmd, - "show [ip] bgp WORD update-groups SUBGROUP-ID ", + "show [ip] bgp VIEWVRFNAME update-groups SUBGROUP-ID ", SHOW_STR IP_STR BGP_STR @@ -10102,7 +10102,7 @@ bgp_show_peer_group_vty (struct vty *vty, const char *name, DEFUN (show_ip_bgp_peer_groups, show_ip_bgp_peer_groups_cmd, - "show [ip] bgp [ WORD] peer-group [PGNAME]", + "show [ip] bgp [ VIEWVRFNAME] peer-group [PGNAME]", SHOW_STR IP_STR BGP_STR diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index cf6c00ae52..080c4e2dc7 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -7681,6 +7681,35 @@ bgp_if_finish (struct bgp *bgp) extern void bgp_snmp_init (void); +static void +bgp_viewvrf_autocomplete (vector comps, struct cmd_token *token) +{ + struct vrf *vrf = NULL; + struct listnode *next; + struct bgp *bgp; + + RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) + { + if (vrf->vrf_id != VRF_DEFAULT) + vector_set (comps, XSTRDUP (MTYPE_COMPLETION, vrf->name)); + } + + for (ALL_LIST_ELEMENTS_RO (bm->bgp, next, bgp)) + { + if (bgp->inst_type != BGP_INSTANCE_TYPE_VIEW) + continue; + + vector_set (comps, XSTRDUP (MTYPE_COMPLETION, bgp->name)); + } +} + +static const struct cmd_variable_handler bgp_viewvrf_var_handlers[] = { + { + .tokenname = "VIEWVRFNAME", + .completions = bgp_viewvrf_autocomplete + }, +}; + void bgp_init (void) { @@ -7730,6 +7759,8 @@ bgp_init (void) /* BFD init */ bgp_bfd_init(); + + cmd_variable_handler_register (bgp_viewvrf_var_handlers); } void diff --git a/bgpd/rfapi/rfapi_vty.c b/bgpd/rfapi/rfapi_vty.c index 7c5d6ce3fa..71443ebec5 100644 --- a/bgpd/rfapi/rfapi_vty.c +++ b/bgpd/rfapi/rfapi_vty.c @@ -5177,7 +5177,7 @@ vnc_add_vrf_prefix (struct vty *vty, DEFUN (add_vrf_prefix_rd_label_pref, add_vrf_prefix_rd_label_pref_cmd, - "add vrf NAME prefix [{rd ASN:nn_or_IP-address|label (0-1048575)|preference (0-4294967295)}]", + "add vrf VRFNAME prefix [{rd ASN:nn_or_IP-address|label (0-1048575)|preference (0-4294967295)}]", "Add\n" "To a VRF\n" "VRF name\n" @@ -5312,7 +5312,7 @@ vnc_clear_vrf (struct vty *vty, DEFUN (clear_vrf_prefix_rd, clear_vrf_prefix_rd_cmd, - "clear vrf NAME [prefix ] [rd ASN:nn_or_IP-address]", + "clear vrf VRFNAME [prefix ] [rd ASN:nn_or_IP-address]", "Clear stored data\n" "From a VRF\n" "VRF name\n" @@ -5347,7 +5347,7 @@ DEFUN (clear_vrf_prefix_rd, DEFUN (clear_vrf_all, clear_vrf_all_cmd, - "clear vrf NAME all", + "clear vrf VRFNAME all", "Clear stored data\n" "From a VRF\n" "VRF name\n" From d7a75a6ca6739e5bdbf23fa8f732bb29a3913df6 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 16 Jun 2017 13:09:37 -0400 Subject: [PATCH 08/18] lib, vtysh, zebra: Fix per CR comments Signed-off-by: Donald Sharp --- lib/if.c | 6 ++--- lib/vrf.c | 7 +++--- vtysh/vtysh.c | 8 +++---- zebra/interface.c | 6 ++--- zebra/router-id.c | 4 ++-- zebra/zebra_vty.c | 58 +++++++++++++++++++++++------------------------ 6 files changed, 44 insertions(+), 45 deletions(-) diff --git a/lib/if.c b/lib/if.c index d4b3d3f7a4..dc417f8e3c 100644 --- a/lib/if.c +++ b/lib/if.c @@ -678,7 +678,7 @@ if_sunwzebra_get (const char *name, size_t nlen, vrf_id_t vrf_id) DEFUN (interface, interface_cmd, - "interface IFNAME [vrf VRFNAME]", + "interface IFNAME [vrf NAME]", "Select an interface to configure\n" "Interface's name\n" VRF_CMD_HELP_STR) @@ -723,7 +723,7 @@ DEFUN (interface, DEFUN_NOSH (no_interface, no_interface_cmd, - "no interface IFNAME [vrf VRFNAME]", + "no interface IFNAME [vrf NAME]", NO_STR "Delete a pseudo interface's configuration\n" "Interface's name\n" @@ -774,7 +774,7 @@ if_cmd_init (void) /* For debug purpose. */ DEFUN (show_address, show_address_cmd, - "show address [vrf VRFNAME]", + "show address [vrf NAME]", SHOW_STR "address\n" VRF_CMD_HELP_STR) diff --git a/lib/vrf.c b/lib/vrf.c index dbba67164f..5199795fdf 100644 --- a/lib/vrf.c +++ b/lib/vrf.c @@ -391,7 +391,7 @@ vrf_autocomplete (vector comps, struct cmd_token *token) static const struct cmd_variable_handler vrf_var_handlers[] = { { - .tokenname = "VRFNAME", + .varname = "vrf", .completions = vrf_autocomplete, }, { @@ -399,7 +399,6 @@ static const struct cmd_variable_handler vrf_var_handlers[] = { }, }; - /* Initialize VRF module. */ void vrf_init (int (*create)(struct vrf *), @@ -464,7 +463,7 @@ vrf_socket (int domain, int type, int protocol, vrf_id_t vrf_id) /* vrf CLI commands */ DEFUN_NOSH (vrf, vrf_cmd, - "vrf VRFNAME", + "vrf NAME", "Select a VRF to configure\n" "VRF's name\n") { @@ -489,7 +488,7 @@ DEFUN_NOSH (vrf, DEFUN_NOSH (no_vrf, no_vrf_cmd, - "no vrf VRFNAME", + "no vrf NAME", NO_STR "Delete a pseudo VRF's configuration\n" "VRF's name\n") diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index 27077951b0..ffdfd5d725 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -1902,7 +1902,7 @@ DEFUNSH (VTYSH_ALL, DEFUNSH (VTYSH_INTERFACE, vtysh_interface, vtysh_interface_cmd, - "interface IFNAME vrf VRFNAME", + "interface IFNAME [vrf NAME]", "Select an interface to configure\n" "Interface's name\n" VRF_CMD_HELP_STR) @@ -1921,7 +1921,7 @@ DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_EIGRPD DEFSH (VTYSH_ZEBRA, vtysh_no_interface_vrf_cmd, - "no interface IFNAME vrf VRFNAME", + "no interface IFNAME vrf NAME", NO_STR "Delete a pseudo interface's configuration\n" "Interface's name\n" @@ -1943,7 +1943,7 @@ DEFUNSH (VTYSH_NS, DEFUNSH (VTYSH_VRF, vtysh_vrf, vtysh_vrf_cmd, - "vrf VRFNAME", + "vrf NAME", "Select a VRF to configure\n" "VRF's name\n") { @@ -1953,7 +1953,7 @@ DEFUNSH (VTYSH_VRF, DEFSH (VTYSH_ZEBRA, vtysh_no_vrf_cmd, - "no vrf VRFNAME", + "no vrf NAME", NO_STR "Delete a pseudo vrf's configuration\n" "VRF's name\n") diff --git a/zebra/interface.c b/zebra/interface.c index 39476c6119..9393305f06 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -1282,7 +1282,7 @@ struct cmd_node interface_node = /* Show all interfaces to vty. */ DEFUN (show_interface, show_interface_cmd, - "show interface [vrf VRFNAME]", + "show interface [vrf NAME]", SHOW_STR "Interface status and configuration\n" VRF_CMD_HELP_STR) @@ -1330,7 +1330,7 @@ DEFUN (show_interface_vrf_all, DEFUN (show_interface_name_vrf, show_interface_name_vrf_cmd, - "show interface IFNAME vrf VRFNAME", + "show interface IFNAME vrf NAME", SHOW_STR "Interface status and configuration\n" "Interface name\n" @@ -1438,7 +1438,7 @@ if_show_description (struct vty *vty, vrf_id_t vrf_id) DEFUN (show_interface_desc, show_interface_desc_cmd, - "show interface description [vrf VRFNAME]", + "show interface description [vrf NAME]", SHOW_STR "Interface status and configuration\n" "Interface description\n" diff --git a/zebra/router-id.c b/zebra/router-id.c index f4306ba21e..318986c1b7 100644 --- a/zebra/router-id.c +++ b/zebra/router-id.c @@ -215,7 +215,7 @@ router_id_write (struct vty *vty) DEFUN (router_id, router_id_cmd, - "router-id A.B.C.D [vrf VRFNAME]", + "router-id A.B.C.D [vrf NAME]", "Manually set the router-id\n" "IP address to use for router-id\n" VRF_CMD_HELP_STR) @@ -243,7 +243,7 @@ DEFUN (router_id, DEFUN (no_router_id, no_router_id_cmd, - "no router-id [A.B.C.D [vrf VRFNAME]]", + "no router-id [A.B.C.D [vrf NAME]]", NO_STR "Remove the manually configured router-id\n" "IP address to use for router-id\n" diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index d1ca6d0a39..88778e491b 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -395,7 +395,7 @@ zebra_vty_ip_route_tdv_helper (int argc, struct cmd_token *argv[], /* Static route configuration. */ DEFUN (ip_route, ip_route_cmd, - "ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf NAME]", IP_STR "Establish static routes\n" "IP destination prefix (e.g. 10.0.0.0/8)\n" @@ -425,7 +425,7 @@ DEFUN (ip_route, DEFUN (ip_route_flags, ip_route_flags_cmd, - "ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf NAME]", IP_STR "Establish static routes\n" "IP destination prefix (e.g. 10.0.0.0/8)\n" @@ -456,7 +456,7 @@ DEFUN (ip_route_flags, /* Mask as A.B.C.D format. */ DEFUN (ip_route_mask, ip_route_mask_cmd, - "ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf NAME]", IP_STR "Establish static routes\n" "IP destination prefix\n" @@ -488,7 +488,7 @@ DEFUN (ip_route_mask, DEFUN (ip_route_mask_flags, ip_route_mask_flags_cmd, - "ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf NAME]", IP_STR "Establish static routes\n" "IP destination prefix\n" @@ -520,7 +520,7 @@ DEFUN (ip_route_mask_flags, DEFUN (no_ip_route, no_ip_route_cmd, - "no ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "no ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf NAME]", NO_STR IP_STR "Establish static routes\n" @@ -552,7 +552,7 @@ DEFUN (no_ip_route, DEFUN (no_ip_route_flags, no_ip_route_flags_cmd, - "no ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "no ip route A.B.C.D/M [tag (1-4294967295)] [(1-255)] [vrf NAME]", NO_STR IP_STR "Establish static routes\n" @@ -580,7 +580,7 @@ DEFUN (no_ip_route_flags, DEFUN (no_ip_route_mask, no_ip_route_mask_cmd, - "no ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "no ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf NAME]", NO_STR IP_STR "Establish static routes\n" @@ -614,7 +614,7 @@ DEFUN (no_ip_route_mask, DEFUN (no_ip_route_mask_flags, no_ip_route_mask_flags_cmd, - "no ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "no ip route A.B.C.D A.B.C.D [tag (1-4294967295)] [(1-255)] [vrf NAME]", NO_STR IP_STR "Establish static routes\n" @@ -1219,7 +1219,7 @@ do_show_ip_route (struct vty *vty, const char *vrf_name, afi_t afi, safi_t safi, DEFUN (show_ip_nht, show_ip_nht_cmd, - "show ip nht [vrf VRFNAME]", + "show ip nht [vrf NAME]", SHOW_STR IP_STR "IP nexthop tracking table\n" @@ -1259,7 +1259,7 @@ DEFUN (show_ip_nht_vrf_all, DEFUN (show_ipv6_nht, show_ipv6_nht_cmd, - "show ipv6 nht [vrf VRFNAME]", + "show ipv6 nht [vrf NAME]", SHOW_STR IPV6_STR "IPv6 nexthop tracking table\n" @@ -1362,7 +1362,7 @@ DEFUN (no_ipv6_nht_default_route, // dwalton one "show ip route" to rule them all DEFUN (show_ip_route, show_ip_route_cmd, - "show ip [vrf VRFNAME] [tag (1-4294967295)|A.B.C.D/M longer-prefixes|supernets-only|" FRR_IP_REDIST_STR_ZEBRA "|ospf (1-65535)] [json]", + "show ip [vrf NAME] [tag (1-4294967295)|A.B.C.D/M longer-prefixes|supernets-only|" FRR_IP_REDIST_STR_ZEBRA "|ospf (1-65535)] [json]", SHOW_STR IP_STR "IP forwarding table\n" @@ -1475,7 +1475,7 @@ DEFUN (show_ip_route, DEFUN (show_ip_route_addr, show_ip_route_addr_cmd, - "show ip route [vrf VRFNAME] A.B.C.D", + "show ip route [vrf NAME] A.B.C.D", SHOW_STR IP_STR "IP routing table\n" @@ -1524,7 +1524,7 @@ DEFUN (show_ip_route_addr, DEFUN (show_ip_route_prefix, show_ip_route_prefix_cmd, - "show ip route [vrf VRFNAME] A.B.C.D/M", + "show ip route [vrf NAME] A.B.C.D/M", SHOW_STR IP_STR "IP routing table\n" @@ -1724,7 +1724,7 @@ vty_show_ip_route_summary_prefix (struct vty *vty, struct route_table *table) /* Show route summary. */ DEFUN (show_ip_route_summary, show_ip_route_summary_cmd, - "show ip route [vrf VRFNAME] summary", + "show ip route [vrf NAME] summary", SHOW_STR IP_STR "IP routing table\n" @@ -1749,7 +1749,7 @@ DEFUN (show_ip_route_summary, /* Show route summary prefix. */ DEFUN (show_ip_route_summary_prefix, show_ip_route_summary_prefix_cmd, - "show ip route [vrf VRFNAME] summary prefix", + "show ip route [vrf NAME] summary prefix", SHOW_STR IP_STR "IP routing table\n" @@ -2165,7 +2165,7 @@ static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str, DEFUN (ipv6_route, ipv6_route_cmd, - "ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf NAME]", IP_STR "Establish static routes\n" "IPv6 destination prefix (e.g. 3ffe:506::/32)\n" @@ -2211,7 +2211,7 @@ DEFUN (ipv6_route, DEFUN (ipv6_route_flags, ipv6_route_flags_cmd, - "ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf NAME]", IP_STR "Establish static routes\n" "IPv6 destination prefix (e.g. 3ffe:506::/32)\n" @@ -2263,7 +2263,7 @@ DEFUN (ipv6_route_flags, DEFUN (ipv6_route_ifname, ipv6_route_ifname_cmd, - "ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf NAME]", IP_STR "Establish static routes\n" "IPv6 destination prefix (e.g. 3ffe:506::/32)\n" @@ -2312,7 +2312,7 @@ DEFUN (ipv6_route_ifname, DEFUN (ipv6_route_ifname_flags, ipv6_route_ifname_flags_cmd, - "ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf NAME]", IP_STR "Establish static routes\n" "IPv6 destination prefix (e.g. 3ffe:506::/32)\n" @@ -2366,7 +2366,7 @@ DEFUN (ipv6_route_ifname_flags, DEFUN (no_ipv6_route, no_ipv6_route_cmd, - "no ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "no ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf NAME]", NO_STR IP_STR "Establish static routes\n" @@ -2413,7 +2413,7 @@ DEFUN (no_ipv6_route, DEFUN (no_ipv6_route_flags, no_ipv6_route_flags_cmd, - "no ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "no ipv6 route X:X::X:X/M [from X:X::X:X/M] [tag (1-4294967295)] [(1-255)] [vrf NAME]", NO_STR IP_STR "Establish static routes\n" @@ -2465,7 +2465,7 @@ DEFUN (no_ipv6_route_flags, DEFUN (no_ipv6_route_ifname, no_ipv6_route_ifname_cmd, - "no ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "no ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf NAME]", NO_STR IP_STR "Establish static routes\n" @@ -2515,7 +2515,7 @@ DEFUN (no_ipv6_route_ifname, DEFUN (no_ipv6_route_ifname_flags, no_ipv6_route_ifname_flags_cmd, - "no ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf VRFNAME]", + "no ipv6 route X:X::X:X/M [from X:X::X:X/M] X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf NAME]", NO_STR IP_STR "Establish static routes\n" @@ -2571,7 +2571,7 @@ DEFUN (no_ipv6_route_ifname_flags, // dwalton duplicate to here DEFUN (show_ipv6_route, show_ipv6_route_cmd, - "show ipv6 [vrf VRFNAME] [tag (1-4294967295)|X:X::X:X/M longer-prefixes|" FRR_IP6_REDIST_STR_ZEBRA "] [json]", + "show ipv6 [vrf NAME] [tag (1-4294967295)|X:X::X:X/M longer-prefixes|" FRR_IP6_REDIST_STR_ZEBRA "] [json]", SHOW_STR IP_STR "IP forwarding table\n" @@ -2670,7 +2670,7 @@ DEFUN (show_ipv6_route, DEFUN (show_ipv6_route_addr, show_ipv6_route_addr_cmd, - "show ipv6 route [vrf VRFNAME] X:X::X:X", + "show ipv6 route [vrf NAME] X:X::X:X", SHOW_STR IP_STR "IPv6 routing table\n" @@ -2719,7 +2719,7 @@ DEFUN (show_ipv6_route_addr, DEFUN (show_ipv6_route_prefix, show_ipv6_route_prefix_cmd, - "show ipv6 route [vrf VRFNAME] X:X::X:X/M", + "show ipv6 route [vrf NAME] X:X::X:X/M", SHOW_STR IP_STR "IPv6 routing table\n" @@ -2768,7 +2768,7 @@ DEFUN (show_ipv6_route_prefix, /* Show route summary. */ DEFUN (show_ipv6_route_summary, show_ipv6_route_summary_cmd, - "show ipv6 route [vrf VRFNAME] summary", + "show ipv6 route [vrf NAME] summary", SHOW_STR IP_STR "IPv6 routing table\n" @@ -2794,7 +2794,7 @@ DEFUN (show_ipv6_route_summary, /* Show ipv6 route summary prefix. */ DEFUN (show_ipv6_route_summary_prefix, show_ipv6_route_summary_prefix_cmd, - "show ipv6 route [vrf VRFNAME] summary prefix", + "show ipv6 route [vrf NAME] summary prefix", SHOW_STR IP_STR "IPv6 routing table\n" @@ -2824,7 +2824,7 @@ DEFUN (show_ipv6_route_summary_prefix, */ DEFUN (show_ipv6_mroute, show_ipv6_mroute_cmd, - "show ipv6 mroute [vrf VRFNAME]", + "show ipv6 mroute [vrf NAME]", SHOW_STR IP_STR "IPv6 Multicast routing table\n" From 23312e71732980f3f549d648a18ee1535bd57c2f Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 16 Jun 2017 13:11:12 -0400 Subject: [PATCH 09/18] bgpd: Fix as per Code Review comment Add ending value in the array. Signed-off-by: Donald Sharp --- bgpd/bgpd.c | 3 +++ bgpd/rfapi/rfapi_vty.c | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 080c4e2dc7..99db69b7c5 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -7708,6 +7708,9 @@ static const struct cmd_variable_handler bgp_viewvrf_var_handlers[] = { .tokenname = "VIEWVRFNAME", .completions = bgp_viewvrf_autocomplete }, + { + .completions = NULL + }, }; void diff --git a/bgpd/rfapi/rfapi_vty.c b/bgpd/rfapi/rfapi_vty.c index 71443ebec5..7c5d6ce3fa 100644 --- a/bgpd/rfapi/rfapi_vty.c +++ b/bgpd/rfapi/rfapi_vty.c @@ -5177,7 +5177,7 @@ vnc_add_vrf_prefix (struct vty *vty, DEFUN (add_vrf_prefix_rd_label_pref, add_vrf_prefix_rd_label_pref_cmd, - "add vrf VRFNAME prefix [{rd ASN:nn_or_IP-address|label (0-1048575)|preference (0-4294967295)}]", + "add vrf NAME prefix [{rd ASN:nn_or_IP-address|label (0-1048575)|preference (0-4294967295)}]", "Add\n" "To a VRF\n" "VRF name\n" @@ -5312,7 +5312,7 @@ vnc_clear_vrf (struct vty *vty, DEFUN (clear_vrf_prefix_rd, clear_vrf_prefix_rd_cmd, - "clear vrf VRFNAME [prefix ] [rd ASN:nn_or_IP-address]", + "clear vrf NAME [prefix ] [rd ASN:nn_or_IP-address]", "Clear stored data\n" "From a VRF\n" "VRF name\n" @@ -5347,7 +5347,7 @@ DEFUN (clear_vrf_prefix_rd, DEFUN (clear_vrf_all, clear_vrf_all_cmd, - "clear vrf VRFNAME all", + "clear vrf NAME all", "Clear stored data\n" "From a VRF\n" "VRF name\n" From c740f7d3678a8ea2c70a062c1207157e999bd6e8 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Mon, 12 Jun 2017 11:39:12 -0300 Subject: [PATCH 10/18] ldpd: convert cli and get rid of the xml interface The xml2cli.pl script was useful years ago when the vty code was very rudimentary. This is not the case anymore, so convert all ldpd CLI commands to use DEFUNs directly and get rid of the XML interface. The benefits are: * Consistency with the other daemons; * One less build dependency (the LibXML perl module); * Easier to add new commands. Signed-off-by: Renato Westphal --- configure.ac | 8 - doc/Building_FRR_on_Fedora24.md | 3 +- doc/Building_FRR_on_NetBSD6.md | 2 +- doc/Building_FRR_on_NetBSD7.md | 2 +- doc/Building_FRR_on_OmniOS.md | 6 - doc/Building_FRR_on_OpenBSD6.md | 2 +- doc/Building_FRR_on_Ubuntu1204.md | 7 +- ldpd/.gitignore | 1 - ldpd/Makefile.am | 9 - ldpd/ldp_debug.c | 14 +- ldpd/ldp_vty.h | 81 ++- ldpd/ldp_vty.xml | 466 ------------ ldpd/ldp_vty_cmds.c | 1133 +++++++++++++++++++++++++++++ ldpd/ldp_vty_conf.c | 259 ++----- ldpd/ldp_vty_exec.c | 48 +- lib/vty.c | 26 - lib/vty.h | 3 - tools/Makefile.am | 2 - tools/xml2cli.pl | 446 ------------ vtysh/Makefile.am | 25 +- 20 files changed, 1252 insertions(+), 1291 deletions(-) delete mode 100644 ldpd/ldp_vty.xml create mode 100644 ldpd/ldp_vty_cmds.c delete mode 100755 tools/xml2cli.pl diff --git a/configure.ac b/configure.ac index 65ba26d5f8..43e1625b90 100755 --- a/configure.ac +++ b/configure.ac @@ -1284,14 +1284,6 @@ AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd") if test "${enable_ldpd}" = "no";then LDPD="" else - AX_PROG_PERL_MODULES(XML::LibXML, , [ - if test -f "${srcdir}/ldpd/ldp_vty_cmds.c"; then - AC_MSG_WARN([XML::LibXML perl module not found, using pregenerated ldp_vty_cmds.c]) - else - AC_MSG_ERROR([XML::LibXML perl module not found and pregenerated ldp_vty_cmds.c missing]) - fi - ]) - LDPD="ldpd" AC_DEFINE(HAVE_LDPD, 1, ldpd) fi diff --git a/doc/Building_FRR_on_Fedora24.md b/doc/Building_FRR_on_Fedora24.md index 1f5f12b9cc..bb5b52c62b 100644 --- a/doc/Building_FRR_on_Fedora24.md +++ b/doc/Building_FRR_on_Fedora24.md @@ -8,8 +8,7 @@ Add packages: sudo dnf install git autoconf automake libtool make gawk \ readline-devel texinfo net-snmp-devel groff pkgconfig \ - json-c-devel pam-devel perl-XML-LibXML c-ares-devel \ - python3-devel + json-c-devel pam-devel c-ares-devel python3-devel Get FRR, compile it and install it (from Git) --------------------------------------------- diff --git a/doc/Building_FRR_on_NetBSD6.md b/doc/Building_FRR_on_NetBSD6.md index 542a7f489e..2e453da66c 100644 --- a/doc/Building_FRR_on_NetBSD6.md +++ b/doc/Building_FRR_on_NetBSD6.md @@ -18,7 +18,7 @@ Configure Package location: Add packages: sudo pkg_add git autoconf automake libtool gmake gawk openssl \ - pkg-config json-c p5-XML-LibXML python27 py27-test python35 + pkg-config json-c python27 py27-test python35 Install SSL Root Certificates (for git https access): diff --git a/doc/Building_FRR_on_NetBSD7.md b/doc/Building_FRR_on_NetBSD7.md index 821a6109f2..f5f99d9ba0 100644 --- a/doc/Building_FRR_on_NetBSD7.md +++ b/doc/Building_FRR_on_NetBSD7.md @@ -12,7 +12,7 @@ Install required packages ------------------------- sudo pkgin install git autoconf automake libtool gmake gawk openssl \ - pkg-config json-c p5-XML-LibXML python27 py27-test python35 + pkg-config json-c python27 py27-test python35 Install SSL Root Certificates (for git https access): diff --git a/doc/Building_FRR_on_OmniOS.md b/doc/Building_FRR_on_OmniOS.md index 2e9871467b..7e75bda9e9 100644 --- a/doc/Building_FRR_on_OmniOS.md +++ b/doc/Building_FRR_on_OmniOS.md @@ -47,12 +47,6 @@ Add libjson to Solaris equivalent of ld.so.conf crle -l /opt/csw/lib -u -Add Perl packages: - - cpan - cpan[1]> install XML::LibXML - cpan[2]> exit - Add pytest: pip install pytest diff --git a/doc/Building_FRR_on_OpenBSD6.md b/doc/Building_FRR_on_OpenBSD6.md index 1c07b41ad5..e9e1030515 100644 --- a/doc/Building_FRR_on_OpenBSD6.md +++ b/doc/Building_FRR_on_OpenBSD6.md @@ -11,7 +11,7 @@ Configure PKG_PATH Add packages: pkg_add git autoconf-2.69p2 automake-1.15p0 libtool bison - pkg_add gmake gawk dejagnu openssl json-c p5-XML-LibXML py-test + pkg_add gmake gawk dejagnu openssl json-c py-test Select Python2.7 as default (required for pytest) diff --git a/doc/Building_FRR_on_Ubuntu1204.md b/doc/Building_FRR_on_Ubuntu1204.md index e79614a57e..033e05bcdb 100644 --- a/doc/Building_FRR_on_Ubuntu1204.md +++ b/doc/Building_FRR_on_Ubuntu1204.md @@ -13,7 +13,7 @@ Add packages: apt-get install git autoconf automake libtool make gawk libreadline-dev \ texinfo libpam0g-dev dejagnu libjson0-dev pkg-config libpam0g-dev \ - libjson0-dev flex python-pip libc-ares-dev python3-dev libxml2 libxml2-dev + libjson0-dev flex python-pip libc-ares-dev python3-dev Install newer bison from 14.04 package source (Ubuntu 12.04 package source is too old) @@ -51,11 +51,6 @@ Install newer version of autoconf and automake: sudo make install cd .. -Install XML::LibXML - - sudo cpan - install XML::LibXML - Install pytest: pip install pytest diff --git a/ldpd/.gitignore b/ldpd/.gitignore index e4ee82587a..35f7740d11 100644 --- a/ldpd/.gitignore +++ b/ldpd/.gitignore @@ -15,4 +15,3 @@ TAGS .arch-ids *~ *.loT -ldp_vty_cmds.c diff --git a/ldpd/Makefile.am b/ldpd/Makefile.am index b760b44573..6074b53a33 100644 --- a/ldpd/Makefile.am +++ b/ldpd/Makefile.am @@ -3,16 +3,12 @@ AM_CPPFLAGS = -I.. -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_builddir)/lib DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\" INSTALL_SDATA=@INSTALL@ -m 600 -EXTRA_DIST= AM_CFLAGS = $(WERROR) noinst_LIBRARIES = libldp.a sbin_PROGRAMS = ldpd -BUILT_SOURCES = ldp_vty_cmds.c -EXTRA_DIST += ldp_vty.xml - libldp_a_SOURCES = \ accept.c address.c adjacency.c control.c hello.c init.c interface.c \ keepalive.c l2vpn.c labelmapping.c lde.c lde_lib.c ldpd.c \ @@ -23,11 +19,6 @@ libldp_a_SOURCES = \ noinst_HEADERS = \ control.h lde.h ldpd.h ldpe.h ldp.h log.h ldp_debug.h ldp_vty.h -ldp_vty_cmds.c: $(srcdir)/ldp_vty.xml $(srcdir)/../tools/xml2cli.pl - @PERL@ $(srcdir)/../tools/xml2cli.pl $(srcdir)/ldp_vty.xml | \ - sed -e 's%DEFUN \((ldp_\(interface_\|mpls_ldp\|address_family\|l2vpn_word\|member_pseudo\)\)%DEFUN_NOSH \1%' \ - > $@ - ldpd_SOURCES = ldpd.c ldpd_LDADD = libldp.a ../lib/libfrr.la @LIBCAP@ diff --git a/ldpd/ldp_debug.c b/ldpd/ldp_debug.c index 4419f853b4..4fc4a3cce0 100644 --- a/ldpd/ldp_debug.c +++ b/ldpd/ldp_debug.c @@ -39,16 +39,10 @@ struct cmd_node ldp_debug_node = }; int -ldp_vty_debug(struct vty *vty, struct vty_arg *args[]) +ldp_vty_debug(struct vty *vty, int disable, const char *type_str, + const char *dir_str, int all) { - const char *type_str, *dir_str; - int disable, all; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - type_str = vty_get_arg_value(args, "type"); - if (strcmp(type_str, "discovery") == 0) { - dir_str = vty_get_arg_value(args, "dir"); if (dir_str == NULL) return (CMD_WARNING); @@ -74,8 +68,6 @@ ldp_vty_debug(struct vty *vty, struct vty_arg *args[]) else DEBUG_ON(event, EVENT); } else if (strcmp(type_str, "messages") == 0) { - all = (vty_get_arg_value(args, "all")) ? 1 : 0; - dir_str = vty_get_arg_value(args, "dir"); if (dir_str == NULL) return (CMD_WARNING); @@ -112,7 +104,7 @@ ldp_vty_debug(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_debugging(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_debugging(struct vty *vty) { vty_out(vty, "LDP debugging status:%s", VTY_NEWLINE); diff --git a/ldpd/ldp_vty.h b/ldpd/ldp_vty.h index 21a486ff65..1375c3c798 100644 --- a/ldpd/ldp_vty.h +++ b/ldpd/ldp_vty.h @@ -37,46 +37,47 @@ int ldp_get_address(const char *, int *, union ldpd_addr *); int ldp_config_write(struct vty *); int ldp_l2vpn_config_write(struct vty *); int ldp_debug_config_write(struct vty *); -int ldp_vty_mpls_ldp (struct vty *, struct vty_arg *[]); -int ldp_vty_address_family (struct vty *, struct vty_arg *[]); -int ldp_vty_disc_holdtime(struct vty *, struct vty_arg *[]); -int ldp_vty_disc_interval(struct vty *, struct vty_arg *[]); -int ldp_vty_targeted_hello_accept(struct vty *, struct vty_arg *[]); -int ldp_vty_session_holdtime(struct vty *, struct vty_arg *[]); -int ldp_vty_interface(struct vty *, struct vty_arg *[]); -int ldp_vty_trans_addr(struct vty *, struct vty_arg *[]); -int ldp_vty_neighbor_targeted(struct vty *, struct vty_arg *[]); -int ldp_vty_label_advertise(struct vty *, struct vty_arg *[]); -int ldp_vty_label_allocate(struct vty *, struct vty_arg *[]); -int ldp_vty_label_expnull(struct vty *, struct vty_arg *[]); -int ldp_vty_label_accept(struct vty *, struct vty_arg *[]); -int ldp_vty_ttl_security(struct vty *, struct vty_arg *[]); -int ldp_vty_router_id(struct vty *, struct vty_arg *[]); -int ldp_vty_ds_cisco_interop(struct vty *, struct vty_arg *[]); -int ldp_vty_trans_pref_ipv4(struct vty *, struct vty_arg *[]); -int ldp_vty_neighbor_password(struct vty *, struct vty_arg *[]); -int ldp_vty_neighbor_ttl_security(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_bridge(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_mtu(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_pwtype(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_interface(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_pseudowire(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_pw_cword(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_pw_nbr_addr(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_pw_nbr_id(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_pw_pwid(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_pw_pwstatus(struct vty *, struct vty_arg *[]); -int ldp_vty_show_binding(struct vty *, struct vty_arg *[]); -int ldp_vty_show_discovery(struct vty *, struct vty_arg *[]); -int ldp_vty_show_interface(struct vty *, struct vty_arg *[]); -int ldp_vty_show_capabilities(struct vty *, struct vty_arg *[]); -int ldp_vty_show_neighbor(struct vty *, struct vty_arg *[]); -int ldp_vty_show_atom_binding(struct vty *, struct vty_arg *[]); -int ldp_vty_show_atom_vc(struct vty *, struct vty_arg *[]); -int ldp_vty_clear_nbr(struct vty *, struct vty_arg *[]); -int ldp_vty_debug(struct vty *, struct vty_arg *[]); -int ldp_vty_show_debugging(struct vty *, struct vty_arg *[]); +int ldp_vty_mpls_ldp (struct vty *, int); +int ldp_vty_address_family (struct vty *, int, const char *); +int ldp_vty_disc_holdtime(struct vty *, int, const char *, const char *); +int ldp_vty_disc_interval(struct vty *, int, const char *, const char *); +int ldp_vty_targeted_hello_accept(struct vty *, int, const char *); +int ldp_vty_nbr_session_holdtime(struct vty *, int, const char *, const char *); +int ldp_vty_af_session_holdtime(struct vty *, int, const char *); +int ldp_vty_interface(struct vty *, int, const char *); +int ldp_vty_trans_addr(struct vty *, int, const char *); +int ldp_vty_neighbor_targeted(struct vty *, int, const char *); +int ldp_vty_label_advertise(struct vty *, int, const char *, const char *); +int ldp_vty_label_allocate(struct vty *, int, int, const char *); +int ldp_vty_label_expnull(struct vty *, int, const char *); +int ldp_vty_label_accept(struct vty *, int, const char *, const char *); +int ldp_vty_ttl_security(struct vty *, int); +int ldp_vty_router_id(struct vty *, int, const char *); +int ldp_vty_ds_cisco_interop(struct vty *, int); +int ldp_vty_trans_pref_ipv4(struct vty *, int); +int ldp_vty_neighbor_password(struct vty *, int, const char *, const char *); +int ldp_vty_neighbor_ttl_security(struct vty *, int, const char *, const char *); +int ldp_vty_l2vpn(struct vty *, int, const char *); +int ldp_vty_l2vpn_bridge(struct vty *, int, const char *); +int ldp_vty_l2vpn_mtu(struct vty *, int, const char *); +int ldp_vty_l2vpn_pwtype(struct vty *, int, const char *); +int ldp_vty_l2vpn_interface(struct vty *, int, const char *); +int ldp_vty_l2vpn_pseudowire(struct vty *, int, const char *); +int ldp_vty_l2vpn_pw_cword(struct vty *, int, const char *); +int ldp_vty_l2vpn_pw_nbr_addr(struct vty *, int, const char *); +int ldp_vty_l2vpn_pw_nbr_id(struct vty *, int, const char *); +int ldp_vty_l2vpn_pw_pwid(struct vty *, int, const char *); +int ldp_vty_l2vpn_pw_pwstatus(struct vty *, int); +int ldp_vty_clear_nbr(struct vty *, const char *); +int ldp_vty_debug(struct vty *, int, const char *, const char *, int); +int ldp_vty_show_binding(struct vty *, const char *, int, int); +int ldp_vty_show_discovery(struct vty *, const char *, int, int); +int ldp_vty_show_interface(struct vty *, const char *, int); +int ldp_vty_show_capabilities(struct vty *, int); +int ldp_vty_show_neighbor(struct vty *, int, int, int); +int ldp_vty_show_atom_binding(struct vty *, int); +int ldp_vty_show_atom_vc(struct vty *, int); +int ldp_vty_show_debugging(struct vty *); void ldp_vty_init(void); diff --git a/ldpd/ldp_vty.xml b/ldpd/ldp_vty.xml deleted file mode 100644 index cd5c92c7b1..0000000000 --- a/ldpd/ldp_vty.xml +++ /dev/null @@ -1,466 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ldpd/ldp_vty_cmds.c b/ldpd/ldp_vty_cmds.c new file mode 100644 index 0000000000..9f737fa1b2 --- /dev/null +++ b/ldpd/ldp_vty_cmds.c @@ -0,0 +1,1133 @@ +/* + * Copyright (C) 2016 by Open Source Routing. + * + * This file is part of GNU Zebra. + * + * GNU Zebra is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * GNU Zebra is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "command.h" +#include "vty.h" +#include "ldpd/ldp_vty.h" + +DEFUN_NOSH(ldp_mpls_ldp, + ldp_mpls_ldp_cmd, + "[no] mpls ldp", + "Negate a command or set its defaults\n" + "Global MPLS configuration subcommands\n" + "Label Distribution Protocol\n") +{ + int idx = 0; + int negate = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + return (ldp_vty_mpls_ldp(vty, negate)); +} + +DEFUN_NOSH(ldp_l2vpn, + ldp_l2vpn_cmd, + "[no] l2vpn WORD type vpls", + "Negate a command or set its defaults\n" + "Configure l2vpn commands\n" + "L2VPN name\n" + "L2VPN type\n" + "Virtual Private LAN Service\n") +{ + int idx = 0; + int negate = 0; + const char *name; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "WORD", &idx); + name = argv[idx]->arg; + + return (ldp_vty_l2vpn(vty, negate, name)); +} + +DEFUN_NOSH(ldp_address_family, + ldp_address_family_cmd, + "[no] address-family ", + "Negate a command or set its defaults\n" + "Configure Address Family and its parameters\n" + "IPv4\n" + "IPv6\n") +{ + int idx = 0; + int negate = 0; + const char *af; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "address-family", &idx); + af = argv[idx + 1]->text; + + return (ldp_vty_address_family(vty, negate, af)); +} + +DEFUN (ldp_discovery_holdtime, + ldp_discovery_holdtime_cmd, + "[no] discovery holdtime (1-65535)", + "Negate a command or set its defaults\n" + "Configure discovery parameters\n" + "LDP Link Hellos\n" + "LDP Targeted Hellos\n" + "Hello holdtime\n" + "Time (seconds) - 65535 implies infinite\n") +{ + int idx = 0; + int negate = 0; + const char *hello_type; + const char *holdtime; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "discovery", &idx); + hello_type = argv[idx + 1]->text; + argv_find(argv, argc, "(1-65535)", &idx); + holdtime = argv[idx]->arg; + + return (ldp_vty_disc_holdtime(vty, negate, hello_type, holdtime)); +} + +DEFUN (ldp_discovery_interval, + ldp_discovery_interval_cmd, + "[no] discovery interval (1-65535)", + "Negate a command or set its defaults\n" + "Configure discovery parameters\n" + "LDP Link Hellos\n" + "LDP Targeted Hellos\n" + "Hello interval\n" + "Time (seconds)\n") +{ + int idx = 0; + int negate = 0; + const char *hello_type; + const char *interval; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "discovery", &idx); + hello_type = argv[idx + 1]->text; + argv_find(argv, argc, "(1-65535)", &idx); + interval = argv[idx]->arg; + + return (ldp_vty_disc_interval(vty, negate, hello_type, interval)); +} + +DEFUN (ldp_dual_stack_transport_connection_prefer_ipv4, + ldp_dual_stack_transport_connection_prefer_ipv4_cmd, + "[no] dual-stack transport-connection prefer ipv4", + "Negate a command or set its defaults\n" + "Configure dual stack parameters\n" + "Configure TCP transport parameters\n" + "Configure prefered address family for TCP transport connection with neighbor\n" + "IPv4\n") +{ + int idx = 0; + int negate = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + return (ldp_vty_trans_pref_ipv4(vty, negate)); +} + +DEFUN (ldp_dual_stack_cisco_interop, + ldp_dual_stack_cisco_interop_cmd, + "[no] dual-stack cisco-interop", + "Negate a command or set its defaults\n" + "Configure dual stack parameters\n" + "Use Cisco non-compliant format to send and interpret the Dual-Stack capability TLV\n") +{ + int idx = 0; + int negate = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + return (ldp_vty_ds_cisco_interop(vty, negate)); +} + +DEFUN (ldp_neighbor_password, + ldp_neighbor_password_cmd, + "[no] neighbor A.B.C.D password WORD", + "Negate a command or set its defaults\n" + "Configure neighbor parameters\n" + "LDP Id of neighbor\n" + "Configure password for MD5 authentication\n" + "The password\n") +{ + int idx = 0; + int negate = 0; + const char *neighbor; + const char *password; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + neighbor = argv[idx]->arg; + argv_find(argv, argc, "WORD", &idx); + password = argv[idx]->arg; + + return (ldp_vty_neighbor_password(vty, negate, neighbor, password)); +} + +DEFUN (ldp_neighbor_session_holdtime, + ldp_neighbor_session_holdtime_cmd, + "[no] neighbor A.B.C.D session holdtime (15-65535)", + "Negate a command or set its defaults\n" + "Configure neighbor parameters\n" + "LDP Id of neighbor\n" + "Configure session parameters\n" + "Configure session holdtime\n" + "Time (seconds)\n") +{ + int idx = 0; + int negate = 0; + const char *neighbor; + const char *holdtime; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + neighbor = argv[idx]->arg; + argv_find(argv, argc, "(15-65535)", &idx); + holdtime = argv[idx]->arg; + + return (ldp_vty_nbr_session_holdtime(vty, negate, neighbor, holdtime)); +} + +DEFUN (ldp_neighbor_ttl_security, + ldp_neighbor_ttl_security_cmd, + "[no] neighbor A.B.C.D ttl-security ", + "Negate a command or set its defaults\n" + "Configure neighbor parameters\n" + "LDP Id of neighbor\n" + "LDP ttl security check\n" + "Disable ttl security\n" + "IP hops\n" + "maximum number of hops\n") +{ + int idx = 0; + int negate = 0; + const char *neighbor; + const char *hops = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + neighbor = argv[idx]->arg; + if (argv_find(argv, argc, "(1-254)", &idx)) + hops = argv[idx]->arg; + + return (ldp_vty_neighbor_ttl_security(vty, negate, neighbor, hops)); +} + +DEFUN (ldp_router_id, + ldp_router_id_cmd, + "[no] router-id A.B.C.D", + "Negate a command or set its defaults\n" + "Configure router Id\n" + "LSR Id (in form of an IPv4 address)\n") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + address = argv[idx]->arg; + + return (ldp_vty_router_id(vty, negate, address)); +} + +DEFUN (ldp_discovery_targeted_hello_accept, + ldp_discovery_targeted_hello_accept_cmd, + "[no] discovery targeted-hello accept [from <(1-199)|(1300-2699)|WORD>]", + "Negate a command or set its defaults\n" + "Configure discovery parameters\n" + "LDP Targeted Hellos\n" + "Accept and respond to targeted hellos\n" + "Access list to specify acceptable targeted hello source\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n") +{ + int idx = 0; + int negate = 0; + const char *from_acl = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + if (argv_find(argv, argc, "from", &idx)) + from_acl = argv[idx + 1]->arg; + + return (ldp_vty_targeted_hello_accept(vty, negate, from_acl)); +} + +DEFUN (ldp_discovery_transport_address_ipv4, + ldp_discovery_transport_address_ipv4_cmd, + "[no] discovery transport-address A.B.C.D", + "Negate a command or set its defaults\n" + "Configure discovery parameters\n" + "Specify transport address for TCP connection\n" + "IP address to be used as transport address\n") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + address = argv[idx]->arg; + + return (ldp_vty_trans_addr(vty, negate, address)); +} + +DEFUN (ldp_discovery_transport_address_ipv6, + ldp_discovery_transport_address_ipv6_cmd, + "[no] discovery transport-address X:X::X:X", + "Negate a command or set its defaults\n" + "Configure discovery parameters\n" + "Specify transport address for TCP connection\n" + "IPv6 address to be used as transport address\n") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "X:X::X:X", &idx); + address = argv[idx]->arg; + + return (ldp_vty_trans_addr(vty, negate, address)); +} + +DEFUN (ldp_label_local_advertise, + ldp_label_local_advertise_cmd, + "[no] label local advertise [{to <(1-199)|(1300-2699)|WORD>|for <(1-199)|(1300-2699)|WORD>}]", + "Negate a command or set its defaults\n" + "Configure label control and policies\n" + "Configure local label control and policies\n" + "Configure outbound label advertisement control\n" + "IP Access-list specifying controls on LDP Peers\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n" + "IP access-list for destination prefixes\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n") +{ + int idx = 0; + int negate = 0; + const char *to_acl = NULL; + const char *for_acl = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + /* arguments within curly braces may be provided in any order */ + if (argv_find(argv, argc, "to", &idx)) + to_acl = argv[idx + 1]->arg; + idx = 0; + if (argv_find(argv, argc, "for", &idx)) + for_acl = argv[idx + 1]->arg; + + return (ldp_vty_label_advertise(vty, negate, to_acl, for_acl)); +} + +DEFUN (ldp_label_local_advertise_explicit_null, + ldp_label_local_advertise_explicit_null_cmd, + "[no] label local advertise explicit-null [for <(1-199)|(1300-2699)|WORD>]", + "Negate a command or set its defaults\n" + "Configure label control and policies\n" + "Configure local label control and policies\n" + "Configure outbound label advertisement control\n" + "Configure explicit-null advertisement\n" + "IP access-list for destination prefixes\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n") +{ + int idx = 0; + int negate = 0; + const char *for_acl = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + if (argv_find(argv, argc, "for", &idx)) + for_acl = argv[idx + 1]->arg; + + return (ldp_vty_label_expnull(vty, negate, for_acl)); +} + +DEFUN (ldp_label_local_allocate, + ldp_label_local_allocate_cmd, + "[no] label local allocate >", + "Negate a command or set its defaults\n" + "Configure label control and policies\n" + "Configure local label control and policies\n" + "Configure label allocation control\n" + "allocate local label for host routes only\n" + "IP access-list\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n") +{ + int idx = 0; + int negate = 0; + int host_routes = 0; + const char *for_acl = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + /* arguments within curly braces may be provided in any order */ + if (argv_find(argv, argc, "host-routes", &idx)) + host_routes = 1; + idx = 0; + if (argv_find(argv, argc, "for", &idx)) + for_acl = argv[idx + 1]->arg; + + return (ldp_vty_label_allocate(vty, negate, host_routes, for_acl)); +} + +DEFUN (ldp_label_remote_accept, + ldp_label_remote_accept_cmd, + "[no] label remote accept {from <(1-199)|(1300-2699)|WORD>|for <(1-199)|(1300-2699)|WORD>}", + "Negate a command or set its defaults\n" + "Configure label control and policies\n" + "Configure remote/peer label control and policies\n" + "Configure inbound label acceptance control\n" + "Neighbor from whom to accept label advertisement\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n" + "IP access-list for destination prefixes\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n") +{ + int idx = 0; + int negate = 0; + const char *from_acl = NULL; + const char *for_acl = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + /* arguments within curly braces may be provided in any order */ + if (argv_find(argv, argc, "from", &idx)) + from_acl = argv[idx + 1]->arg; + idx = 0; + if (argv_find(argv, argc, "for", &idx)) + for_acl = argv[idx + 1]->arg; + + return (ldp_vty_label_accept(vty, negate, from_acl, for_acl)); +} + +DEFUN (ldp_ttl_security_disable, + ldp_ttl_security_disable_cmd, + "[no] ttl-security disable", + "Negate a command or set its defaults\n" + "LDP ttl security check\n" + "Disable ttl security\n") +{ + int idx = 0; + int negate = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + return (ldp_vty_ttl_security(vty, negate)); +} + +DEFUN (ldp_session_holdtime, + ldp_session_holdtime_cmd, + "[no] session holdtime (15-65535)", + "Negate a command or set its defaults\n" + "Configure session parameters\n" + "Configure session holdtime\n" + "Time (seconds)\n") +{ + int idx = 0; + int negate = 0; + const char *holdtime; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "(15-65535)", &idx); + holdtime = argv[idx]->arg; + + return (ldp_vty_af_session_holdtime(vty, negate, holdtime)); +} + +DEFUN_NOSH(ldp_interface, + ldp_interface_cmd, + "[no] interface IFNAME", + "Negate a command or set its defaults\n" + "Enable LDP on an interface and enter interface submode\n" + "Interface's name\n") +{ + int idx = 0; + int negate = 0; + const char *ifname; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "IFNAME", &idx); + ifname = argv[idx]->arg; + + return (ldp_vty_interface(vty, negate, ifname)); +} + +DEFUN (ldp_neighbor_ipv4_targeted, + ldp_neighbor_ipv4_targeted_cmd, + "[no] neighbor A.B.C.D targeted", + "Negate a command or set its defaults\n" + "Configure neighbor parameters\n" + "IP address of neighbor\n" + "Establish targeted session\n") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + address = argv[idx]->arg; + + return (ldp_vty_neighbor_targeted(vty, negate, address)); +} + +DEFUN (ldp_neighbor_ipv6_targeted, + ldp_neighbor_ipv6_targeted_cmd, + "[no] neighbor X:X::X:X targeted", + "Negate a command or set its defaults\n" + "Configure neighbor parameters\n" + "IPv6 address of neighbor\n" + "Establish targeted session\n") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "X:X::X:X", &idx); + address = argv[idx]->arg; + + return (ldp_vty_neighbor_targeted(vty, negate, address)); +} + +DEFUN (ldp_bridge, + ldp_bridge_cmd, + "[no] bridge IFNAME", + "Negate a command or set its defaults\n" + "Bridge interface\n" + "Interface's name\n") +{ + int idx = 0; + int negate = 0; + const char *ifname; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "IFNAME", &idx); + ifname = argv[idx]->arg; + + return (ldp_vty_l2vpn_bridge(vty, negate, ifname)); +} + +DEFUN (ldp_mtu, + ldp_mtu_cmd, + "[no] mtu (1500-9180)", + "Negate a command or set its defaults\n" + "Set Maximum Transmission Unit\n" + "Maximum Transmission Unit value\n") +{ + int idx = 0; + int negate = 0; + const char *mtu; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "(1500-9180)", &idx); + mtu = argv[idx]->arg; + + return (ldp_vty_l2vpn_mtu(vty, negate, mtu)); +} + +DEFUN (ldp_member_interface, + ldp_member_interface_cmd, + "[no] member interface IFNAME", + "Negate a command or set its defaults\n" + "L2VPN member configuration\n" + "Local interface\n" + "Interface's name\n") +{ + int idx = 0; + int negate = 0; + const char *ifname; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "IFNAME", &idx); + ifname = argv[idx]->arg; + + return (ldp_vty_l2vpn_interface(vty, negate, ifname)); +} + +DEFUN_NOSH(ldp_member_pseudowire, + ldp_member_pseudowire_cmd, + "[no] member pseudowire IFNAME", + "Negate a command or set its defaults\n" + "L2VPN member configuration\n" + "Pseudowire interface\n" + "Interface's name\n") +{ + int idx = 0; + int negate = 0; + const char *ifname; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "IFNAME", &idx); + ifname = argv[idx]->arg; + + return (ldp_vty_l2vpn_pseudowire(vty, negate, ifname)); +} + +DEFUN (ldp_vc_type, + ldp_vc_type_cmd, + "[no] vc type ", + "Negate a command or set its defaults\n" + "Virtual Circuit options\n" + "Virtual Circuit type to use\n" + "Ethernet (type 5)\n" + "Ethernet-tagged (type 4)\n") +{ + int idx = 0; + int negate = 0; + const char *vc_type; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "type", &idx); + vc_type = argv[idx + 1]->text; + + return (ldp_vty_l2vpn_pwtype(vty, negate, vc_type)); +} + +DEFUN (ldp_control_word, + ldp_control_word_cmd, + "[no] control-word ", + "Negate a command or set its defaults\n" + "Control-word options\n" + "Exclude control-word in pseudowire packets\n" + "Include control-word in pseudowire packets\n") +{ + int idx = 0; + int negate = 0; + const char *preference; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "control-word", &idx); + preference = argv[idx + 1]->text; + + return (ldp_vty_l2vpn_pw_cword(vty, negate, preference)); +} + +DEFUN (ldp_neighbor_address, + ldp_neighbor_address_cmd, + "[no] neighbor address ", + "Negate a command or set its defaults\n" + "Remote endpoint configuration\n" + "Specify the IPv4 or IPv6 address of the remote endpoint\n" + "IPv4 address\n" + "IPv6 address\n") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "address", &idx); + address = argv[idx + 1]->arg; + + return (ldp_vty_l2vpn_pw_nbr_addr(vty, negate, address)); +} + +DEFUN (ldp_neighbor_lsr_id, + ldp_neighbor_lsr_id_cmd, + "[no] neighbor lsr-id A.B.C.D", + "Negate a command or set its defaults\n" + "Remote endpoint configuration\n" + "Specify the LSR-ID of the remote endpoint\n" + "IPv4 address\n") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + address = argv[idx]->arg; + + return (ldp_vty_l2vpn_pw_nbr_id(vty, negate, address)); +} + +DEFUN (ldp_pw_id, + ldp_pw_id_cmd, + "[no] pw-id (1-4294967295)", + "Negate a command or set its defaults\n" + "Set the Virtual Circuit ID\n" + "Virtual Circuit ID value\n") +{ + int idx = 0; + int negate = 0; + const char *pwid; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "(1-4294967295)", &idx); + pwid = argv[idx]->arg; + + return (ldp_vty_l2vpn_pw_pwid(vty, negate, pwid)); +} + +DEFUN (ldp_pw_status_disable, + ldp_pw_status_disable_cmd, + "[no] pw-status disable", + "Negate a command or set its defaults\n" + "Configure PW status\n" + "Disable PW status\n") +{ + int idx = 0; + int negate = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + return (ldp_vty_l2vpn_pw_pwstatus(vty, negate)); +} + +DEFUN (ldp_clear_mpls_ldp_neighbor, + ldp_clear_mpls_ldp_neighbor_cmd, + "clear mpls ldp neighbor []", + "Reset functions\n" + "Reset MPLS statistical information\n" + "Clear LDP state\n" + "Clear LDP neighbor sessions\n" + "IPv4 address\n" + "IPv6 address\n") +{ + int idx = 0; + const char *address = NULL; + + if (argv_find(argv, argc, "neighbor", &idx)) + address = argv[idx + 1]->arg; + + return (ldp_vty_clear_nbr(vty, address)); +} + +DEFUN (ldp_debug_mpls_ldp_discovery_hello, + ldp_debug_mpls_ldp_discovery_hello_cmd, + "[no] debug mpls ldp discovery hello ", + "Negate a command or set its defaults\n" + "Debugging functions\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "Discovery messages\n" + "Discovery hello message\n" + "Received messages\n" + "Sent messages\n") +{ + int idx = 0; + int negate = 0; + const char *dir; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "hello", &idx); + dir = argv[idx + 1]->text; + + return (ldp_vty_debug(vty, negate, "discovery", dir, 0)); +} + +DEFUN (ldp_debug_mpls_ldp_type, + ldp_debug_mpls_ldp_type_cmd, + "[no] debug mpls ldp ", + "Negate a command or set its defaults\n" + "Debugging functions\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "Errors\n" + "LDP event information\n" + "LDP zebra information\n") +{ + int idx = 0; + int negate = 0; + const char *type; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "ldp", &idx); + type = argv[idx + 1]->text; + + return (ldp_vty_debug(vty, negate, type, NULL, 0)); +} + +DEFUN (ldp_debug_mpls_ldp_messages_recv, + ldp_debug_mpls_ldp_messages_recv_cmd, + "[no] debug mpls ldp messages recv [all]", + "Negate a command or set its defaults\n" + "Debugging functions\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "Messages\n" + "Received messages, excluding periodic Keep Alives\n" + "Received messages, including periodic Keep Alives\n") +{ + int idx = 0; + int negate = 0; + int all = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + if (argv_find(argv, argc, "all", &idx)) + all = 1; + + return (ldp_vty_debug(vty, negate, "messages", "recv", all)); +} + +DEFUN (ldp_debug_mpls_ldp_messages_sent, + ldp_debug_mpls_ldp_messages_sent_cmd, + "[no] debug mpls ldp messages sent [all]", + "Negate a command or set its defaults\n" + "Debugging functions\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "Messages\n" + "Sent messages, excluding periodic Keep Alives\n" + "Sent messages, including periodic Keep Alives\n") +{ + int idx = 0; + int negate = 0; + int all = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + if (argv_find(argv, argc, "all", &idx)) + all = 1; + + return (ldp_vty_debug(vty, negate, "messages", "sent", all)); +} + +DEFUN (ldp_show_mpls_ldp_binding, + ldp_show_mpls_ldp_binding_cmd, + "show mpls ldp [] binding [detail] [json]", + "Show running system information\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "IPv4 Address Family\n" + "IPv6 Address Family\n" + "Label Information Base (LIB) information\n" + "Show detailed information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + const char *af = NULL; + int detail = 0; + int json = 0; + + if (argv_find(argv, argc, "ipv4", &idx) || + argv_find(argv, argc, "ipv6", &idx)) + af = argv[idx]->text; + if (argv_find(argv, argc, "detail", &idx)) + detail = 1; + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_binding(vty, af, detail, json)); +} + +DEFUN (ldp_show_mpls_ldp_discovery, + ldp_show_mpls_ldp_discovery_cmd, + "show mpls ldp [] discovery [detail] [json]", + "Show running system information\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "IPv4 Address Family\n" + "IPv6 Address Family\n" + "Discovery Hello Information\n" + "Show detailed information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + const char *af = NULL; + int detail = 0; + int json = 0; + + if (argv_find(argv, argc, "ipv4", &idx) || + argv_find(argv, argc, "ipv6", &idx)) + af = argv[idx]->text; + if (argv_find(argv, argc, "detail", &idx)) + detail = 1; + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_discovery(vty, af, detail, json)); +} + +DEFUN (ldp_show_mpls_ldp_interface, + ldp_show_mpls_ldp_interface_cmd, + "show mpls ldp [] interface [json]", + "Show running system information\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "IPv4 Address Family\n" + "IPv6 Address Family\n" + "interface information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + const char *af = NULL; + int json = 0; + + if (argv_find(argv, argc, "ipv4", &idx) || + argv_find(argv, argc, "ipv6", &idx)) + af = argv[idx]->text; + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_interface(vty, af, json)); +} + +DEFUN (ldp_show_mpls_ldp_capabilities, + ldp_show_mpls_ldp_capabilities_cmd, + "show mpls ldp capabilities [json]", + "Show running system information\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "Display LDP Capabilities information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + int json = 0; + + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_capabilities(vty, json)); +} + +DEFUN (ldp_show_mpls_ldp_neighbor, + ldp_show_mpls_ldp_neighbor_cmd, + "show mpls ldp neighbor [detail] [json]", + "Show running system information\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "Neighbor information\n" + "Show detailed information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + int detail = 0; + int json = 0; + + if (argv_find(argv, argc, "detail", &idx)) + detail = 1; + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_neighbor(vty, 0, detail, json)); +} + +DEFUN (ldp_show_mpls_ldp_neighbor_capabilities, + ldp_show_mpls_ldp_neighbor_capabilities_cmd, + "show mpls ldp neighbor capabilities [json]", + "Show running system information\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "Neighbor information\n" + "Display neighbor capability information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + int json = 0; + + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_neighbor(vty, 1, 0, json)); +} + +DEFUN (ldp_show_l2vpn_atom_binding, + ldp_show_l2vpn_atom_binding_cmd, + "show l2vpn atom binding [json]", + "Show running system information\n" + "Show information about Layer2 VPN\n" + "Show Any Transport over MPLS information\n" + "Show AToM label binding information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + int json = 0; + + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_atom_binding(vty, json)); +} + +DEFUN (ldp_show_l2vpn_atom_vc, + ldp_show_l2vpn_atom_vc_cmd, + "show l2vpn atom vc [json]", + "Show running system information\n" + "Show information about Layer2 VPN\n" + "Show Any Transport over MPLS information\n" + "Show AToM virtual circuit information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + int json = 0; + + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_atom_vc(vty, json)); +} + +DEFUN (ldp_show_debugging_mpls_ldp, + ldp_show_debugging_mpls_ldp_cmd, + "show debugging mpls ldp", + "Show running system information\n" + "Debugging functions\n" + "MPLS information\n" + "Label Distribution Protocol\n") +{ + return (ldp_vty_show_debugging(vty)); +} + +void +ldp_vty_init (void) +{ + install_node(&ldp_node, ldp_config_write); + install_node(&ldp_ipv4_node, NULL); + install_node(&ldp_ipv6_node, NULL); + install_node(&ldp_ipv4_iface_node, NULL); + install_node(&ldp_ipv6_iface_node, NULL); + install_node(&ldp_l2vpn_node, ldp_l2vpn_config_write); + install_node(&ldp_pseudowire_node, NULL); + install_node(&ldp_debug_node, ldp_debug_config_write); + install_default(LDP_NODE); + install_default(LDP_IPV4_NODE); + install_default(LDP_IPV6_NODE); + install_default(LDP_IPV4_IFACE_NODE); + install_default(LDP_IPV6_IFACE_NODE); + install_default(LDP_L2VPN_NODE); + install_default(LDP_PSEUDOWIRE_NODE); + + install_element(CONFIG_NODE, &ldp_mpls_ldp_cmd); + install_element(CONFIG_NODE, &ldp_l2vpn_cmd); + install_element(CONFIG_NODE, &ldp_debug_mpls_ldp_discovery_hello_cmd); + install_element(CONFIG_NODE, &ldp_debug_mpls_ldp_type_cmd); + install_element(CONFIG_NODE, &ldp_debug_mpls_ldp_messages_recv_cmd); + install_element(CONFIG_NODE, &ldp_debug_mpls_ldp_messages_sent_cmd); + + install_element(LDP_NODE, &ldp_address_family_cmd); + install_element(LDP_NODE, &ldp_discovery_holdtime_cmd); + install_element(LDP_NODE, &ldp_discovery_interval_cmd); + install_element(LDP_NODE, &ldp_dual_stack_transport_connection_prefer_ipv4_cmd); + install_element(LDP_NODE, &ldp_dual_stack_cisco_interop_cmd); + install_element(LDP_NODE, &ldp_neighbor_password_cmd); + install_element(LDP_NODE, &ldp_neighbor_session_holdtime_cmd); + install_element(LDP_NODE, &ldp_neighbor_ttl_security_cmd); + install_element(LDP_NODE, &ldp_router_id_cmd); + + install_element(LDP_IPV4_NODE, &ldp_discovery_holdtime_cmd); + install_element(LDP_IPV4_NODE, &ldp_discovery_interval_cmd); + install_element(LDP_IPV4_NODE, &ldp_discovery_targeted_hello_accept_cmd); + install_element(LDP_IPV4_NODE, &ldp_discovery_transport_address_ipv4_cmd); + install_element(LDP_IPV4_NODE, &ldp_label_local_advertise_cmd); + install_element(LDP_IPV4_NODE, &ldp_label_local_advertise_explicit_null_cmd); + install_element(LDP_IPV4_NODE, &ldp_label_local_allocate_cmd); + install_element(LDP_IPV4_NODE, &ldp_label_remote_accept_cmd); + install_element(LDP_IPV4_NODE, &ldp_ttl_security_disable_cmd); + install_element(LDP_IPV4_NODE, &ldp_interface_cmd); + install_element(LDP_IPV4_NODE, &ldp_session_holdtime_cmd); + install_element(LDP_IPV4_NODE, &ldp_neighbor_ipv4_targeted_cmd); + + install_element(LDP_IPV6_NODE, &ldp_discovery_holdtime_cmd); + install_element(LDP_IPV6_NODE, &ldp_discovery_interval_cmd); + install_element(LDP_IPV6_NODE, &ldp_discovery_targeted_hello_accept_cmd); + install_element(LDP_IPV6_NODE, &ldp_discovery_transport_address_ipv6_cmd); + install_element(LDP_IPV6_NODE, &ldp_label_local_advertise_cmd); + install_element(LDP_IPV6_NODE, &ldp_label_local_advertise_explicit_null_cmd); + install_element(LDP_IPV6_NODE, &ldp_label_local_allocate_cmd); + install_element(LDP_IPV6_NODE, &ldp_label_remote_accept_cmd); + install_element(LDP_IPV6_NODE, &ldp_ttl_security_disable_cmd); + install_element(LDP_IPV6_NODE, &ldp_interface_cmd); + install_element(LDP_IPV6_NODE, &ldp_session_holdtime_cmd); + install_element(LDP_IPV6_NODE, &ldp_neighbor_ipv6_targeted_cmd); + + install_element(LDP_IPV4_IFACE_NODE, &ldp_discovery_holdtime_cmd); + install_element(LDP_IPV4_IFACE_NODE, &ldp_discovery_interval_cmd); + + install_element(LDP_IPV6_IFACE_NODE, &ldp_discovery_holdtime_cmd); + install_element(LDP_IPV6_IFACE_NODE, &ldp_discovery_interval_cmd); + + install_element(LDP_L2VPN_NODE, &ldp_bridge_cmd); + install_element(LDP_L2VPN_NODE, &ldp_mtu_cmd); + install_element(LDP_L2VPN_NODE, &ldp_member_interface_cmd); + install_element(LDP_L2VPN_NODE, &ldp_member_pseudowire_cmd); + install_element(LDP_L2VPN_NODE, &ldp_vc_type_cmd); + + install_element(LDP_PSEUDOWIRE_NODE, &ldp_control_word_cmd); + install_element(LDP_PSEUDOWIRE_NODE, &ldp_neighbor_address_cmd); + install_element(LDP_PSEUDOWIRE_NODE, &ldp_neighbor_lsr_id_cmd); + install_element(LDP_PSEUDOWIRE_NODE, &ldp_pw_id_cmd); + install_element(LDP_PSEUDOWIRE_NODE, &ldp_pw_status_disable_cmd); + + install_element(ENABLE_NODE, &ldp_clear_mpls_ldp_neighbor_cmd); + install_element(ENABLE_NODE, &ldp_debug_mpls_ldp_discovery_hello_cmd); + install_element(ENABLE_NODE, &ldp_debug_mpls_ldp_type_cmd); + install_element(ENABLE_NODE, &ldp_debug_mpls_ldp_messages_recv_cmd); + install_element(ENABLE_NODE, &ldp_debug_mpls_ldp_messages_sent_cmd); + + install_element(VIEW_NODE, &ldp_show_mpls_ldp_binding_cmd); + install_element(VIEW_NODE, &ldp_show_mpls_ldp_discovery_cmd); + install_element(VIEW_NODE, &ldp_show_mpls_ldp_interface_cmd); + install_element(VIEW_NODE, &ldp_show_mpls_ldp_capabilities_cmd); + install_element(VIEW_NODE, &ldp_show_mpls_ldp_neighbor_cmd); + install_element(VIEW_NODE, &ldp_show_mpls_ldp_neighbor_capabilities_cmd); + install_element(VIEW_NODE, &ldp_show_l2vpn_atom_binding_cmd); + install_element(VIEW_NODE, &ldp_show_l2vpn_atom_vc_cmd); + install_element(VIEW_NODE, &ldp_show_debugging_mpls_ldp_cmd); +} diff --git a/ldpd/ldp_vty_conf.c b/ldpd/ldp_vty_conf.c index 8394907142..5154371f43 100644 --- a/ldpd/ldp_vty_conf.c +++ b/ldpd/ldp_vty_conf.c @@ -37,8 +37,6 @@ static void ldp_af_config_write(struct vty *, int, struct ldpd_conf *, static void ldp_l2vpn_pw_config_write(struct vty *, struct l2vpn_pw *); static int ldp_vty_get_af(struct vty *); static int ldp_iface_is_configured(struct ldpd_conf *, const char *); -static int ldp_vty_nbr_session_holdtime(struct vty *, struct vty_arg *[]); -static int ldp_vty_af_session_holdtime(struct vty *, struct vty_arg *[]); struct cmd_node ldp_node = { @@ -418,12 +416,8 @@ ldp_iface_is_configured(struct ldpd_conf *xconf, const char *ifname) } int -ldp_vty_mpls_ldp(struct vty *vty, struct vty_arg *args[]) +ldp_vty_mpls_ldp(struct vty *vty, int disable) { - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - if (disable) vty_conf->flags &= ~F_LDPD_ENABLED; else { @@ -437,15 +431,10 @@ ldp_vty_mpls_ldp(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_address_family(struct vty *vty, struct vty_arg *args[]) +ldp_vty_address_family(struct vty *vty, int disable, const char *af_str) { struct ldpd_af_conf *af_conf; int af; - const char *af_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - af_str = vty_get_arg_value(args, "address-family"); if (strcmp(af_str, "ipv4") == 0) { af = AF_INET; @@ -480,7 +469,8 @@ ldp_vty_address_family(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_disc_holdtime(struct vty *vty, struct vty_arg *args[]) +ldp_vty_disc_holdtime(struct vty *vty, int disable, const char *hello_type_str, + const char *seconds_str) { struct ldpd_af_conf *af_conf; struct iface *iface; @@ -489,13 +479,6 @@ ldp_vty_disc_holdtime(struct vty *vty, struct vty_arg *args[]) char *ep; long int secs; enum hello_type hello_type; - const char *seconds_str; - const char *hello_type_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - seconds_str = vty_get_arg_value(args, "seconds"); - hello_type_str = vty_get_arg_value(args, "hello_type"); secs = strtol(seconds_str, &ep, 10); if (*ep != '\0' || secs < MIN_HOLDTIME || secs > MAX_HOLDTIME) { @@ -580,7 +563,8 @@ ldp_vty_disc_holdtime(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_disc_interval(struct vty *vty, struct vty_arg *args[]) +ldp_vty_disc_interval(struct vty *vty, int disable, const char *hello_type_str, + const char *seconds_str) { struct ldpd_af_conf *af_conf; struct iface *iface; @@ -589,13 +573,6 @@ ldp_vty_disc_interval(struct vty *vty, struct vty_arg *args[]) char *ep; long int secs; enum hello_type hello_type; - const char *seconds_str; - const char *hello_type_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - seconds_str = vty_get_arg_value(args, "seconds"); - hello_type_str = vty_get_arg_value(args, "hello_type"); secs = strtol(seconds_str, &ep, 10); if (*ep != '\0' || secs < MIN_HELLO_INTERVAL || @@ -681,15 +658,11 @@ ldp_vty_disc_interval(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_targeted_hello_accept(struct vty *vty, struct vty_arg *args[]) +ldp_vty_targeted_hello_accept(struct vty *vty, int disable, + const char *acl_from_str) { struct ldpd_af_conf *af_conf; int af; - const char *acl_from_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - acl_from_str = vty_get_arg_value(args, "from_acl"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -711,20 +684,14 @@ ldp_vty_targeted_hello_accept(struct vty *vty, struct vty_arg *args[]) return (CMD_SUCCESS); } -static int -ldp_vty_nbr_session_holdtime(struct vty *vty, struct vty_arg *args[]) +int +ldp_vty_nbr_session_holdtime(struct vty *vty, int disable, + const char *lsr_id_str, const char *seconds_str) { char *ep; long int secs; struct in_addr lsr_id; struct nbr_params *nbrp; - const char *seconds_str; - const char *lsr_id_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - seconds_str = vty_get_arg_value(args, "seconds"); - lsr_id_str = vty_get_arg_value(args, "lsr_id"); if (inet_pton(AF_INET, lsr_id_str, &lsr_id) != 1 || bad_addr_v4(lsr_id)) { @@ -763,18 +730,14 @@ ldp_vty_nbr_session_holdtime(struct vty *vty, struct vty_arg *args[]) return (CMD_SUCCESS); } -static int -ldp_vty_af_session_holdtime(struct vty *vty, struct vty_arg *args[]) +int +ldp_vty_af_session_holdtime(struct vty *vty, int disable, + const char *seconds_str) { struct ldpd_af_conf *af_conf; int af; char *ep; long int secs; - const char *seconds_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - seconds_str = vty_get_arg_value(args, "seconds"); secs = strtol(seconds_str, &ep, 10); if (*ep != '\0' || secs < MIN_KEEPALIVE || secs > MAX_KEEPALIVE) { @@ -796,30 +759,11 @@ ldp_vty_af_session_holdtime(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_session_holdtime(struct vty *vty, struct vty_arg *args[]) -{ - switch (vty->node) { - case LDP_NODE: - return (ldp_vty_nbr_session_holdtime(vty, args)); - case LDP_IPV4_NODE: - case LDP_IPV6_NODE: - return (ldp_vty_af_session_holdtime(vty, args)); - default: - fatalx("ldp_vty_session_holdtime: unexpected node"); - } -} - -int -ldp_vty_interface(struct vty *vty, struct vty_arg *args[]) +ldp_vty_interface(struct vty *vty, int disable, const char *ifname) { int af; struct iface *iface; struct iface_af *ia; - const char *ifname; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - ifname = vty_get_arg_value(args, "ifname"); af = ldp_vty_get_af(vty); iface = if_lookup_name(vty_conf, ifname); @@ -878,15 +822,10 @@ ldp_vty_interface(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_trans_addr(struct vty *vty, struct vty_arg *args[]) +ldp_vty_trans_addr(struct vty *vty, int disable, const char *addr_str) { struct ldpd_af_conf *af_conf; int af; - const char *addr_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - addr_str = vty_get_arg_value(args, "addr"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -907,16 +846,11 @@ ldp_vty_trans_addr(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_neighbor_targeted(struct vty *vty, struct vty_arg *args[]) +ldp_vty_neighbor_targeted(struct vty *vty, int disable, const char *addr_str) { int af; union ldpd_addr addr; struct tnbr *tnbr; - const char *addr_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - addr_str = vty_get_arg_value(args, "addr"); af = ldp_vty_get_af(vty); @@ -959,17 +893,11 @@ ldp_vty_neighbor_targeted(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_label_advertise(struct vty *vty, struct vty_arg *args[]) +ldp_vty_label_advertise(struct vty *vty, int disable, const char *acl_to_str, + const char *acl_for_str) { struct ldpd_af_conf *af_conf; int af; - const char *acl_to_str; - const char *acl_for_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - acl_to_str = vty_get_arg_value(args, "to_acl"); - acl_for_str = vty_get_arg_value(args, "for_acl"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -996,17 +924,11 @@ ldp_vty_label_advertise(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_label_allocate(struct vty *vty, struct vty_arg *args[]) +ldp_vty_label_allocate(struct vty *vty, int disable, int host_routes, + const char *acl_for_str) { struct ldpd_af_conf *af_conf; int af; - const char *acl_for_str; - const char *host_routes_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - acl_for_str = vty_get_arg_value(args, "for_acl"); - host_routes_str = vty_get_arg_value(args, "host-routes"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1014,7 +936,7 @@ ldp_vty_label_allocate(struct vty *vty, struct vty_arg *args[]) af_conf->flags &= ~F_LDPD_AF_ALLOCHOSTONLY; af_conf->acl_label_allocate_for[0] = '\0'; if (!disable) { - if (host_routes_str) + if (host_routes) af_conf->flags |= F_LDPD_AF_ALLOCHOSTONLY; else strlcpy(af_conf->acl_label_allocate_for, acl_for_str, @@ -1027,15 +949,10 @@ ldp_vty_label_allocate(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_label_expnull(struct vty *vty, struct vty_arg *args[]) +ldp_vty_label_expnull(struct vty *vty, int disable, const char *acl_for_str) { struct ldpd_af_conf *af_conf; int af; - const char *acl_for_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - acl_for_str = vty_get_arg_value(args, "for_acl"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1058,17 +975,11 @@ ldp_vty_label_expnull(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_label_accept(struct vty *vty, struct vty_arg *args[]) +ldp_vty_label_accept(struct vty *vty, int disable, const char *acl_from_str, + const char *acl_for_str) { struct ldpd_af_conf *af_conf; int af; - const char *acl_from_str; - const char *acl_for_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - acl_from_str = vty_get_arg_value(args, "from_acl"); - acl_for_str = vty_get_arg_value(args, "for_acl"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1095,13 +1006,10 @@ ldp_vty_label_accept(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_ttl_security(struct vty *vty, struct vty_arg *args[]) +ldp_vty_ttl_security(struct vty *vty, int disable) { struct ldpd_af_conf *af_conf; int af; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1117,14 +1025,8 @@ ldp_vty_ttl_security(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_router_id(struct vty *vty, struct vty_arg *args[]) +ldp_vty_router_id(struct vty *vty, int disable, const char *addr_str) { - const char *addr_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - addr_str = vty_get_arg_value(args, "addr"); - if (disable) vty_conf->rtr_id.s_addr = INADDR_ANY; else { @@ -1141,12 +1043,8 @@ ldp_vty_router_id(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_ds_cisco_interop(struct vty *vty, struct vty_arg *args[]) +ldp_vty_ds_cisco_interop(struct vty *vty, int disable) { - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - if (disable) vty_conf->flags &= ~F_LDPD_DS_CISCO_INTEROP; else @@ -1158,12 +1056,8 @@ ldp_vty_ds_cisco_interop(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_trans_pref_ipv4(struct vty *vty, struct vty_arg *args[]) +ldp_vty_trans_pref_ipv4(struct vty *vty, int disable) { - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - if (disable) vty_conf->trans_pref = DUAL_STACK_LDPOV6; else @@ -1175,18 +1069,12 @@ ldp_vty_trans_pref_ipv4(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_neighbor_password(struct vty *vty, struct vty_arg *args[]) +ldp_vty_neighbor_password(struct vty *vty, int disable, const char *lsr_id_str, + const char *password_str) { struct in_addr lsr_id; size_t password_len; struct nbr_params *nbrp; - const char *lsr_id_str; - const char *password_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - lsr_id_str = vty_get_arg_value(args, "lsr_id"); - password_str = vty_get_arg_value(args, "password"); if (inet_pton(AF_INET, lsr_id_str, &lsr_id) != 1 || bad_addr_v4(lsr_id)) { @@ -1226,19 +1114,13 @@ ldp_vty_neighbor_password(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_neighbor_ttl_security(struct vty *vty, struct vty_arg *args[]) +ldp_vty_neighbor_ttl_security(struct vty *vty, int disable, + const char *lsr_id_str, const char *hops_str) { struct in_addr lsr_id; struct nbr_params *nbrp; long int hops = 0; char *ep; - const char *lsr_id_str; - const char *hops_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - lsr_id_str = vty_get_arg_value(args, "lsr_id"); - hops_str = vty_get_arg_value(args, "hops"); if (inet_pton(AF_INET, lsr_id_str, &lsr_id) != 1 || bad_addr_v4(lsr_id)) { @@ -1286,16 +1168,11 @@ ldp_vty_neighbor_ttl_security(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn(struct vty *vty, int disable, const char *name_str) { struct l2vpn *l2vpn; struct l2vpn_if *lif; struct l2vpn_pw *pw; - const char *name_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - name_str = vty_get_arg_value(args, "name"); l2vpn = l2vpn_find(vty_conf, name_str); @@ -1336,14 +1213,9 @@ ldp_vty_l2vpn(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_bridge(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_bridge(struct vty *vty, int disable, const char *ifname) { VTY_DECLVAR_CONTEXT(l2vpn, l2vpn); - const char *ifname; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - ifname = vty_get_arg_value(args, "ifname"); if (disable) memset(l2vpn->br_ifname, 0, sizeof(l2vpn->br_ifname)); @@ -1356,16 +1228,11 @@ ldp_vty_l2vpn_bridge(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_mtu(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_mtu(struct vty *vty, int disable, const char *mtu_str) { VTY_DECLVAR_CONTEXT(l2vpn, l2vpn); char *ep; int mtu; - const char *mtu_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - mtu_str = vty_get_arg_value(args, "mtu"); mtu = strtol(mtu_str, &ep, 10); if (*ep != '\0' || mtu < MIN_L2VPN_MTU || mtu > MAX_L2VPN_MTU) { @@ -1384,15 +1251,10 @@ ldp_vty_l2vpn_mtu(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pwtype(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pwtype(struct vty *vty, int disable, const char *type_str) { VTY_DECLVAR_CONTEXT(l2vpn, l2vpn); int pw_type; - const char *type_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - type_str = vty_get_arg_value(args, "type"); if (strcmp(type_str, "ethernet") == 0) pw_type = PW_TYPE_ETHERNET; @@ -1410,15 +1272,10 @@ ldp_vty_l2vpn_pwtype(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_interface(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_interface(struct vty *vty, int disable, const char *ifname) { VTY_DECLVAR_CONTEXT(l2vpn, l2vpn); struct l2vpn_if *lif; - const char *ifname; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - ifname = vty_get_arg_value(args, "ifname"); lif = l2vpn_if_find(l2vpn, ifname); @@ -1453,15 +1310,10 @@ ldp_vty_l2vpn_interface(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pseudowire(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pseudowire(struct vty *vty, int disable, const char *ifname) { VTY_DECLVAR_CONTEXT(l2vpn, l2vpn); struct l2vpn_pw *pw; - const char *ifname; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - ifname = vty_get_arg_value(args, "ifname"); pw = l2vpn_pw_find(l2vpn, ifname); @@ -1504,14 +1356,9 @@ ldp_vty_l2vpn_pseudowire(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pw_cword(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pw_cword(struct vty *vty, int disable, const char *preference_str) { VTY_DECLVAR_CONTEXT_SUB(l2vpn_pw, pw); - const char *preference_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - preference_str = vty_get_arg_value(args, "preference"); if (disable) pw->flags |= F_PW_CWORD_CONF; @@ -1528,16 +1375,11 @@ ldp_vty_l2vpn_pw_cword(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pw_nbr_addr(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pw_nbr_addr(struct vty *vty, int disable, const char *addr_str) { VTY_DECLVAR_CONTEXT_SUB(l2vpn_pw, pw); int af; union ldpd_addr addr; - const char *addr_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - addr_str = vty_get_arg_value(args, "addr"); if (ldp_get_address(addr_str, &af, &addr) == -1 || bad_addr(af, &addr)) { @@ -1561,15 +1403,10 @@ ldp_vty_l2vpn_pw_nbr_addr(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pw_nbr_id(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pw_nbr_id(struct vty *vty, int disable, const char *lsr_id_str) { VTY_DECLVAR_CONTEXT_SUB(l2vpn_pw, pw); struct in_addr lsr_id; - const char *lsr_id_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - lsr_id_str = vty_get_arg_value(args, "lsr-id"); if (inet_pton(AF_INET, lsr_id_str, &lsr_id) != 1 || bad_addr_v4(lsr_id)) { @@ -1588,16 +1425,11 @@ ldp_vty_l2vpn_pw_nbr_id(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pw_pwid(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pw_pwid(struct vty *vty, int disable, const char *pwid_str) { VTY_DECLVAR_CONTEXT_SUB(l2vpn_pw, pw); char *ep; uint32_t pwid; - const char *pwid_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - pwid_str = vty_get_arg_value(args, "pwid"); pwid = strtol(pwid_str, &ep, 10); if (*ep != '\0' || pwid < MIN_PWID_ID || pwid > MAX_PWID_ID) { @@ -1616,12 +1448,9 @@ ldp_vty_l2vpn_pw_pwid(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pw_pwstatus(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pw_pwstatus(struct vty *vty, int disable) { VTY_DECLVAR_CONTEXT_SUB(l2vpn_pw, pw); - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; if (disable) pw->flags |= F_PW_STATUSTLV_CONF; diff --git a/ldpd/ldp_vty_exec.c b/ldpd/ldp_vty_exec.c index 3463fb6c63..5ea3ec6452 100644 --- a/ldpd/ldp_vty_exec.c +++ b/ldpd/ldp_vty_exec.c @@ -1582,24 +1582,22 @@ ldp_vty_get_af(const char *str, int *af) } int -ldp_vty_show_binding(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_binding(struct vty *vty, const char *af_str, int detail, int json) { struct imsgbuf ibuf; struct show_params params; - const char *af_str; int af; if (ldp_vty_connect(&ibuf) < 0) return (CMD_WARNING); - af_str = vty_get_arg_value(args, "address-family"); if (ldp_vty_get_af(af_str, &af) < 0) return (CMD_ERR_NO_MATCH); memset(¶ms, 0, sizeof(params)); params.family = af; - params.detail = vty_get_arg_value(args, "detail") ? 1 : 0; - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.detail = detail; + params.json = json; if (!params.detail && !params.json) vty_out(vty, "%-4s %-20s %-15s %-11s %-13s %6s%s", "AF", @@ -1611,24 +1609,23 @@ ldp_vty_show_binding(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_discovery(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_discovery(struct vty *vty, const char *af_str, int detail, + int json) { struct imsgbuf ibuf; struct show_params params; - const char *af_str; int af; if (ldp_vty_connect(&ibuf) < 0) return (CMD_WARNING); - af_str = vty_get_arg_value(args, "address-family"); if (ldp_vty_get_af(af_str, &af) < 0) return (CMD_ERR_NO_MATCH); memset(¶ms, 0, sizeof(params)); params.family = af; - params.detail = vty_get_arg_value(args, "detail") ? 1 : 0; - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.detail = detail; + params.json = json; if (!params.detail && !params.json) vty_out(vty, "%-4s %-15s %-8s %-15s %9s%s", @@ -1643,24 +1640,22 @@ ldp_vty_show_discovery(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_interface(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_interface(struct vty *vty, const char *af_str, int json) { struct imsgbuf ibuf; struct show_params params; unsigned int ifidx = 0; - const char *af_str; int af; if (ldp_vty_connect(&ibuf) < 0) return (CMD_WARNING); - af_str = vty_get_arg_value(args, "address-family"); if (ldp_vty_get_af(af_str, &af) < 0) return (CMD_ERR_NO_MATCH); memset(¶ms, 0, sizeof(params)); params.family = af; - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.json = json; /* header */ if (!params.json) { @@ -1675,9 +1670,9 @@ ldp_vty_show_interface(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_capabilities(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_capabilities(struct vty *vty, int json) { - if (vty_get_arg_value(args, "json")) { + if (json) { json_object *json; json_object *json_array; json_object *json_cap; @@ -1727,7 +1722,7 @@ ldp_vty_show_capabilities(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_neighbor(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_neighbor(struct vty *vty, int capabilities, int detail, int json) { struct imsgbuf ibuf; struct show_params params; @@ -1736,9 +1731,9 @@ ldp_vty_show_neighbor(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); memset(¶ms, 0, sizeof(params)); - params.capabilities = vty_get_arg_value(args, "capabilities") ? 1 : 0; - params.detail = vty_get_arg_value(args, "detail") ? 1 : 0; - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.capabilities = capabilities; + params.detail = detail; + params.json = json; if (params.capabilities) params.detail = 1; @@ -1753,7 +1748,7 @@ ldp_vty_show_neighbor(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_atom_binding(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_atom_binding(struct vty *vty, int json) { struct imsgbuf ibuf; struct show_params params; @@ -1762,14 +1757,14 @@ ldp_vty_show_atom_binding(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); memset(¶ms, 0, sizeof(params)); - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.json = json; imsg_compose(&ibuf, IMSG_CTL_SHOW_L2VPN_BINDING, 0, 0, -1, NULL, 0); return (ldp_vty_dispatch(vty, &ibuf, SHOW_L2VPN_BINDING, ¶ms)); } int -ldp_vty_show_atom_vc(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_atom_vc(struct vty *vty, int json) { struct imsgbuf ibuf; struct show_params params; @@ -1778,7 +1773,7 @@ ldp_vty_show_atom_vc(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); memset(¶ms, 0, sizeof(params)); - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.json = json; if (!params.json) { /* header */ @@ -1795,14 +1790,11 @@ ldp_vty_show_atom_vc(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_clear_nbr(struct vty *vty, struct vty_arg *args[]) +ldp_vty_clear_nbr(struct vty *vty, const char *addr_str) { struct imsgbuf ibuf; - const char *addr_str; struct ctl_nbr nbr; - addr_str = vty_get_arg_value(args, "addr"); - memset(&nbr, 0, sizeof(nbr)); if (addr_str && (ldp_get_address(addr_str, &nbr.af, &nbr.raddr) == -1 || diff --git a/lib/vty.c b/lib/vty.c index c500a45194..19f9223d37 100644 --- a/lib/vty.c +++ b/lib/vty.c @@ -3151,29 +3151,3 @@ vty_terminate (void) Vvty_serv_thread = NULL; } } - -/* Utility functions to get arguments from commands generated - by the xml2cli.pl script. */ -const char * -vty_get_arg_value (struct vty_arg *args[], const char *arg) -{ - while (*args) - { - if (strcmp ((*args)->name, arg) == 0) - return (*args)->value; - args++; - } - return NULL; -} - -struct vty_arg * -vty_get_arg (struct vty_arg *args[], const char *arg) -{ - while (*args) - { - if (strcmp ((*args)->name, arg) == 0) - return *args; - args++; - } - return NULL; -} diff --git a/lib/vty.h b/lib/vty.h index 77edc7173a..7dc9e339f1 100644 --- a/lib/vty.h +++ b/lib/vty.h @@ -342,7 +342,4 @@ extern void vty_hello (struct vty *); an async-signal-safe function. */ extern void vty_log_fixed (char *buf, size_t len); -extern const char *vty_get_arg_value (struct vty_arg **, const char *); -extern struct vty_arg *vty_get_arg (struct vty_arg **, const char *); - #endif /* _ZEBRA_VTY_H */ diff --git a/tools/Makefile.am b/tools/Makefile.am index de81919cdd..dd32d0dab0 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -13,6 +13,4 @@ sbin_SCRIPTS = frr-reload.py frr EXTRA_DIST += frr.service frr-reload.py frr -EXTRA_DIST += xml2cli.pl - ssd_SOURCES = start-stop-daemon.c diff --git a/tools/xml2cli.pl b/tools/xml2cli.pl deleted file mode 100755 index 40f905bcde..0000000000 --- a/tools/xml2cli.pl +++ /dev/null @@ -1,446 +0,0 @@ -#!/usr/bin/perl -## -## Parse a XML file containing a tree-like representation of Quagga CLI -## commands and generate a file with: -## -## - a DEFUN function for each command; -## - an initialization function. -## -## -## Copyright (C) 2012 Renato Westphal -## This file is part of GNU Zebra. -## -## GNU Zebra is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by the -## Free Software Foundation; either version 2, or (at your option) any -## later version. -## -## GNU Zebra is distributed in the hope that it will be useful, but -## WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -## General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with GNU Zebra; see the file COPYING. If not, write to the Free -## Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -## 02111-1307, USA. -## - -use strict; -use warnings; -use Getopt::Std; -use vars qw($opt_d); -use File::Basename qw(fileparse); -use XML::LibXML; - -%::input_strs = ( - "ifname" => "IFNAME", - "word" => "WORD", - "line" => ".LINE", - "ipv4" => "A.B.C.D", - "ipv4m" => "A.B.C.D/M", - "ipv6" => "X:X::X:X", - "ipv6m" => "X:X::X:X/M", - "mtu" => "(1500-9180)", - "acl_range" => "(1-199)", - "acl_expanded_range" => "(1300-2699)", - # BGP specific - "rd" => "ASN:nn_or_IP-address:nn", - "asn" => "(1-4294967295)", - "community" => "AA:NN", - "clist" => "(1-500)", - # LDP specific - "disc_time" => "(1-65535)", - "session_time" => "(15-65535)", - "pwid" => "(1-4294967295)", - "hops" => "(1-254)" - ); - -# parse options node and store the corresponding information -# into a global hash of hashes -sub parse_options { - my $xml_node = $_[0]; - my @cmdstr; - - my $options_name = $xml_node->findvalue('./@name'); - if (not $options_name) { - die('error: "options" node without "name" attribute'); - } - - # initialize hash - $::options{$options_name}{'cmdstr'} = ""; - $::options{$options_name}{'help'} = ""; - - my @children = $xml_node->getChildnodes(); - foreach my $child(@children) { - # skip comments, random text, etc - if ($child->getType() != XML_ELEMENT_NODE) { - next; - } - - # check for error/special conditions - if ($child->getName() ne "option") { - die('error: invalid node type: "' . $child->getName() . '"'); - } - - my $name = $child->findvalue('./@name'); - my $input = $child->findvalue('./@input'); - my $help = $child->findvalue('./@help'); - if ($input) { - $name = $::input_strs{$input}; - } - - push (@cmdstr, $name); - $::options{$options_name}{'help'} .= "\n \"" . $help . "\\n\""; - } - $::options{$options_name}{'cmdstr'} = "<" . join('|', @cmdstr) . ">"; -} - -# given a subtree, replace all the corresponding include nodes by -# this subtree -sub subtree_replace_includes { - my $subtree = $_[0]; - - my $subtree_name = $subtree->findvalue('./@name'); - if (not $subtree_name) { - die("subtree without \"name\" attribute"); - } - - my $query = "//include[\@subtree='$subtree_name']"; - foreach my $include_node($::xml->findnodes($query)) { - my @children = $subtree->getChildnodes(); - foreach my $child(reverse @children) { - my $include_node_parent = $include_node->getParentNode(); - $include_node_parent->insertAfter($child->cloneNode(1), - $include_node); - } - $include_node->unbindNode(); - } - $subtree->unbindNode(); -} - -# generate arguments for a given command -sub generate_arguments { - my @nodes = @_; - my $arguments; - my $no_args = 1; - my $argc = -1; - - $arguments .= " struct vty_arg *args[] =\n"; - $arguments .= " {\n"; - for (my $i = 0; $i < @nodes; $i++) { - my %node = %{$nodes[$i]}; - my $arg_value; - - $argc++; - if (not $node{'arg'}) { - next; - } - $no_args = 0; - - # for input and select nodes, the value of the argument is an - # argv[] element. for the other types of nodes, the value of the - # argument is the name of the node - if ($node{'input'} or $node{'type'} eq "select") { - $arg_value = "argv[" . $argc . "]->arg"; - } elsif ($node{'optional'}) { - $arg_value = "(argc > " . $argc . " ? argv[" . $argc. "]->arg : NULL)"; - } else { - $arg_value = '"' . $node{'name'} . '"'; - } - - if ($node{'input'} and $node{'input'} eq "line") { - # arguments of the type 'line' may have multiple spaces (i.e - # they don't fit into a single argv[] element). to properly - # handle these arguments, we need to provide direct access - # to the argv[] array and the argc variable. - my $argc_str = "argc" . (($argc > 1) ? " - " . ($argc - 1) : ""); - my $argv_str = "argv" . (($argc > 1) ? " + " . ($argc - 1) : ""); - $arguments .= " &(struct vty_arg) { " - . ".name = \"" . $node{'arg'} . "\", " - . ".argc = $argc_str, " - . ".argv = $argv_str },\n"; - } else { - # common case - each argument has a name and a single value - $arguments .= " &(struct vty_arg) { " - . ".name = \"" . $node{'arg'} . "\", " - . ".value = " . $arg_value . " },\n"; - } - } - $arguments .= " NULL\n"; - $arguments .= " };\n"; - - # handle special case - if ($no_args) { - return " struct vty_arg *args[] = { NULL };\n"; - } - - return $arguments; -} - -# generate C code -sub generate_code { - my @nodes = @_; - my $funcname = ''; - my $cmdstr = ''; - my $cmdname = ''; - my $helpstr = ''; - my $function = ''; - - for (my $i = 0; $i < @nodes; $i++) { - my %node = %{$nodes[$i]}; - if ($node{'input'}) { - $funcname .= $node{'input'} . " "; - $cmdstr .= $::input_strs{$node{'input'}} . " "; - $helpstr .= "\n \"" . $node{'help'} . "\\n\""; - } elsif ($node{'type'} eq "select") { - my $options_name = $node{'options'}; - $funcname .= $options_name . " "; - $cmdstr .= $::options{$options_name}{'cmdstr'} . " "; - $helpstr .= $::options{$options_name}{'help'}; - } else { - $funcname .= $node{'name'} . " "; - if ($node{'optional'}) { - $cmdstr .= "[" . $node{'name'} . "] "; - } else { - $cmdstr .= $node{'name'} . " "; - } - $helpstr .= "\n \"" . $node{'help'} . "\\n\""; - } - - # update the command string - if ($node{'function'} ne "inherited" and $node{'function'}) { - $function = $node{'function'}; - } - } - - # rtrim - $funcname =~ s/\s+$//; - $cmdstr =~ s/\s+$//; - # lowercase - $funcname = lc($funcname); - # replace " " by "_" - $funcname =~ tr/ /_/; - # replace "-" by "_" - $funcname =~ tr/-/_/; - # add prefix - $funcname = $::cmdprefix . '_' . $funcname; - - # generate DEFUN - $cmdname = $funcname . "_cmd"; - - # don't generate same command more than once - if ($::commands{$cmdname}) { - return $cmdname; - } - $::commands{$cmdname} = "1"; - - print STDOUT "DEFUN (" . $funcname . ",\n" - . " " . $cmdname . ",\n" - . " \"" . $cmdstr . "\"," - . $helpstr . ")\n" - . "{\n" - . generate_arguments(@nodes) - . " return " . $function . " (vty, args);\n" - . "}\n\n"; - - return $cmdname; -} - -# parse tree node (recursive function) -sub parse_tree { - # get args - my $xml_node = $_[0]; - my @nodes = @{$_[1]}; - my $tree_name = $_[2]; - - # hash containing all the node attributes - my %node; - $node{'type'} = $xml_node->getName(); - - # check for error/special conditions - if ($node{'type'} eq "tree") { - goto end; - } - if ($node{'type'} eq "include") { - die('error: can not include "' - . $xml_node->findvalue('./@subtree') . '"'); - } - if (not $node{'type'} ~~ [qw(option select)]) { - die('error: invalid node type: "' . $node{'type'} . '"'); - } - if ($node{'type'} eq "select") { - my $options_name = $xml_node->findvalue('./@options'); - if (not $options_name) { - die('error: "select" node without "name" attribute'); - } - if (not $::options{$options_name}) { - die('error: can not find options'); - } - $node{'options'} = $options_name; - } - - # get node attributes - $node{'name'} = $xml_node->findvalue('./@name'); - $node{'input'} = $xml_node->findvalue('./@input'); - $node{'arg'} = $xml_node->findvalue('./@arg'); - $node{'help'} = $xml_node->findvalue('./@help'); - $node{'function'} = $xml_node->findvalue('./@function'); - $node{'ifdef'} = $xml_node->findvalue('./@ifdef'); - $node{'optional'} = $xml_node->findvalue('./@optional'); - - # push node to stack - push (@nodes, \%node); - - # generate C code - if ($node{'function'}) { - my $cmdname = generate_code(@nodes); - push (@{$::trees{$tree_name}}, [0, $cmdname, 0]); - } - - if ($node{'ifdef'}) { - push (@{$::trees{$tree_name}}, [$node{'ifdef'}, 0, 0]); - } - -end: - # recursively process child nodes - my @children = $xml_node->getChildnodes(); - foreach my $child(@children) { - # skip comments, random text, etc - if ($child->getType() != XML_ELEMENT_NODE) { - next; - } - parse_tree($child, \@nodes, $tree_name); - } - - if ($node{'ifdef'}) { - push (@{$::trees{$tree_name}}, [0, 0, $node{'ifdef'}]); - } -} - -sub parse_node { - # get args - my $xml_node = $_[0]; - - my $node_name = $xml_node->findvalue('./@name'); - if (not $node_name) { - die('missing the "name" attribute'); - } - - my $install = $xml_node->findvalue('./@install'); - my $config_write = $xml_node->findvalue('./@config_write'); - if ($install and $install eq "1") { - print " install_node (&" .lc( $node_name) . "_node, " . $config_write . ");\n"; - } - - my $install_default = $xml_node->findvalue('./@install_default'); - if ($install_default and $install_default eq "1") { - print " install_default (" . $node_name . "_NODE);\n"; - } - - my @children = $xml_node->getChildnodes(); - foreach my $child(@children) { - # skip comments, random text, etc - if ($child->getType() != XML_ELEMENT_NODE) { - next; - } - - if ($child->getName() ne "include") { - die('error: invalid node type: "' . $child->getName() . '"'); - } - my $tree_name = $child->findvalue('./@tree'); - if (not $tree_name) { - die('missing the "tree" attribute'); - } - - foreach my $entry (@{$::trees{$tree_name}}) { - my ($ifdef, $cmdname, $endif) = @{$entry}; - - if ($ifdef) { - print ("#ifdef " . $ifdef . "\n"); - } - - if ($cmdname) { - print " install_element (" . $node_name . "_NODE, &" . $cmdname . ");\n"; - } - - if ($endif) { - print ("#endif /* " . $endif . " */\n"); - } - } - } -} - -# parse command-line arguments -if (not getopts('d')) { - die("Usage: xml2cli.pl [-d] FILE\n"); -} -my $file = shift; - -# initialize the XML parser -my $parser = new XML::LibXML; -$parser->keep_blanks(0); - -# parse XML file -$::xml = $parser->parse_file($file); -my $xmlroot = $::xml->getDocumentElement(); -if ($xmlroot->getName() ne "file") { - die('XML root element name must be "file"'); -} - -# read file attributes -my $init_function = $xmlroot->findvalue('./@init'); -if (not $init_function) { - die('missing the "init" attribute in the "file" node'); -} -$::cmdprefix = $xmlroot->findvalue('./@cmdprefix'); -if (not $::cmdprefix) { - die('missing the "cmdprefix" attribute in the "file" node'); -} -my $header = $xmlroot->findvalue('./@header'); -if (not $header) { - die('missing the "header" attribute in the "file" node'); -} - -# generate source header -print STDOUT "/* Auto-generated from " . fileparse($file) . ". */\n" - . "/* Do not edit! */\n\n" - . "#include \n\n" - . "#include \"command.h\"\n" - . "#include \"vty.h\"\n" - . "#include \"$header\"\n\n"; - -# Parse options -foreach my $options($::xml->findnodes("/file/options")) { - parse_options($options); -} - -# replace include nodes by the corresponding subtrees -foreach my $subtree(reverse $::xml->findnodes("/file/subtree")) { - subtree_replace_includes($subtree); -} - -# Parse trees -foreach my $tree($::xml->findnodes("/file/tree")) { - my @nodes = (); - my $tree_name = $tree->findvalue('./@name'); - parse_tree($tree, \@nodes, $tree_name); -} - -# install function header -print STDOUT "void\n" - . $init_function . " (void)\n" - . "{\n"; - -# Parse nodes -foreach my $node($::xml->findnodes("/file/node")) { - parse_node($node); -} - -# closing braces for the install function -print STDOUT "}"; - -# print to stderr the expanded XML file if the debug flag (-d) is given -if ($opt_d) { - print STDERR $::xml->toString(1); -} diff --git a/vtysh/Makefile.am b/vtysh/Makefile.am index 587f72c809..8b66ba2564 100644 --- a/vtysh/Makefile.am +++ b/vtysh/Makefile.am @@ -108,6 +108,10 @@ vtysh_scan += $(top_srcdir)/ripngd/ripng_zebra.c vtysh_scan += $(top_srcdir)/ripngd/ripngd.c endif +if LDPD +vtysh_scan += $(top_srcdir)/ldpd/ldp_vty_cmds.c +endif + if NHRPD vtysh_scan += $(top_srcdir)/nhrpd/nhrp_vty.c endif @@ -146,22 +150,5 @@ vtysh_cmd_FILES = $(vtysh_scan) \ $(top_srcdir)/watchfrr/watchfrr_vty.c \ $(BGP_VNC_RFAPI_SRC) $(BGP_VNC_RFP_SRC) -# this is slightly iffy... ldp_vty_cmds.c can be located in either -# $srcdir or $builddir depending on whether it's coming pre-built from a -# dist tarball or being built. automake uses VPATH to find it, but that -# doesn't work here... -# so after running "make ldp_vty_cmds.c", the file can be in either of the -# two directories. we need to do some magic to find out which. -vtysh_cmd_DEPS = $(vtysh_cmd_FILES) -if LDPD -$(top_builddir)/ldpd/ldp_vty_cmds.c: - make -C "$(top_builddir)/ldpd" ldp_vty_cmds.c -vtysh_cmd_DEPS += $(top_builddir)/ldpd/ldp_vty_cmds.c -endif - -vtysh_cmd.c: $(vtysh_cmd_DEPS) extract.pl - if test -n "${LDPD}"; then \ - ldpcmds="$(top_srcdir)/ldpd/ldp_vty_cmds.c"; \ - test -f "$(top_builddir)/ldpd/ldp_vty_cmds.c" && ldpcmds="$(top_builddir)/ldpd/ldp_vty_cmds.c"; \ - fi; \ - ./extract.pl $(vtysh_cmd_FILES) $${ldpcmds} > vtysh_cmd.c +vtysh_cmd.c: $(vtysh_cmd_FILES) extract.pl + ./extract.pl $(vtysh_cmd_FILES) > vtysh_cmd.c From 180fc2cd704708442d3a7fcf555dcbc1a5f1831f Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Mon, 12 Jun 2017 16:30:54 -0300 Subject: [PATCH 11/18] ldpd: update copyright information Signed-off-by: Renato Westphal --- ldpd/ldp_debug.c | 19 +++++++++---------- ldpd/ldp_debug.h | 19 +++++++++---------- ldpd/ldp_vty.h | 19 +++++++++---------- ldpd/ldp_vty_cmds.c | 19 +++++++++---------- ldpd/ldp_vty_conf.c | 19 +++++++++---------- ldpd/ldp_vty_exec.c | 19 +++++++++---------- ldpd/ldp_zebra.c | 19 +++++++++---------- 7 files changed, 63 insertions(+), 70 deletions(-) diff --git a/ldpd/ldp_debug.c b/ldpd/ldp_debug.c index 4fc4a3cce0..7915fb709d 100644 --- a/ldpd/ldp_debug.c +++ b/ldpd/ldp_debug.c @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #include diff --git a/ldpd/ldp_debug.h b/ldpd/ldp_debug.h index 6366d3f6ac..4b91656851 100644 --- a/ldpd/ldp_debug.h +++ b/ldpd/ldp_debug.h @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #ifndef _LDP_DEBUG_H_ diff --git a/ldpd/ldp_vty.h b/ldpd/ldp_vty.h index 1375c3c798..93713166f4 100644 --- a/ldpd/ldp_vty.h +++ b/ldpd/ldp_vty.h @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #ifndef _LDP_VTY_H_ diff --git a/ldpd/ldp_vty_cmds.c b/ldpd/ldp_vty_cmds.c index 9f737fa1b2..d28424cbb7 100644 --- a/ldpd/ldp_vty_cmds.c +++ b/ldpd/ldp_vty_cmds.c @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #include diff --git a/ldpd/ldp_vty_conf.c b/ldpd/ldp_vty_conf.c index 5154371f43..c96e69a6c5 100644 --- a/ldpd/ldp_vty_conf.c +++ b/ldpd/ldp_vty_conf.c @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #include diff --git a/ldpd/ldp_vty_exec.c b/ldpd/ldp_vty_exec.c index 5ea3ec6452..252abd17fd 100644 --- a/ldpd/ldp_vty_exec.c +++ b/ldpd/ldp_vty_exec.c @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #include diff --git a/ldpd/ldp_zebra.c b/ldpd/ldp_zebra.c index 1a93f5a86f..79fff01c4c 100644 --- a/ldpd/ldp_zebra.c +++ b/ldpd/ldp_zebra.c @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #include From 94b989402f6a4f4ea00c3a044deb7d910c4e3f45 Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Fri, 16 Jun 2017 19:04:57 +0000 Subject: [PATCH 12/18] lib: termtable coverity warnings Signed-off-by: Quentin Young --- lib/termtable.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/termtable.c b/lib/termtable.c index fb16e5dba1..283fa173d8 100644 --- a/lib/termtable.c +++ b/lib/termtable.c @@ -123,15 +123,13 @@ static struct ttable_cell *ttable_insert_row_va(struct ttable *tt, int i, assert(i >= -1 && i < tt->nrows); char *res, *orig, *section; - const char *f; struct ttable_cell *row; int col = 0; int ncols = 0; /* count how many columns we have */ - f = format; - for (; f[ncols]; f[ncols] == '|' ? ncols++ : *f++) - ; + for (int i = 0; format[i]; i++) + ncols += !!(format[i] == '|'); ncols++; if (tt->ncols == 0) @@ -338,7 +336,7 @@ char *ttable_dump(struct ttable *tt, const char *newline) /* calculate number of lines en total */ nlines = tt->nrows; nlines += tt->style.border.top_on ? 1 : 0; - nlines += tt->style.border.bottom_on ? 1 : 1; // makes life easier + nlines += 1; // tt->style.border.bottom_on ? 1 : 1; makes life easier for (int i = 0; i < tt->nrows; i++) { /* if leftmost cell has top / bottom border, whole row does */ nlines += tt->table[i][0].style.border.top_on ? 1 : 0; From 4668a15109d6aaeaf31bd12c7511f9da28ee341c Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Fri, 16 Jun 2017 18:03:34 +0000 Subject: [PATCH 13/18] bgpd: fix misc cli ranges & config writes * Ranges for some MED were 2^32 - 2 instead of 2^32 - 1 * Use correct printf specifiers for unsigned values * Some drive-by CLI collapsing and simplification Signed-off-by: Quentin Young --- bgpd/bgp_vty.c | 71 ++++++++++++++++++-------------------------------- bgpd/bgpd.c | 30 ++++++++++----------- 2 files changed, 40 insertions(+), 61 deletions(-) diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index f5f538de95..5400515e2f 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -1249,7 +1249,7 @@ DEFUN (bgp_maxmed_admin, DEFUN (bgp_maxmed_admin_medv, bgp_maxmed_admin_medv_cmd, - "bgp max-med administrative (0-4294967294)", + "bgp max-med administrative (0-4294967295)", BGP_STR "Advertise routes with max-med\n" "Administratively applied, for an indefinite period\n" @@ -1259,7 +1259,7 @@ DEFUN (bgp_maxmed_admin_medv, int idx_number = 3; bgp->v_maxmed_admin = 1; - VTY_GET_INTEGER ("max-med admin med-value", bgp->maxmed_admin_value, argv[idx_number]->arg); + bgp->maxmed_admin_value = strtoul (argv[idx_number]->arg, NULL, 10); bgp_maxmed_update(bgp); @@ -1268,7 +1268,7 @@ DEFUN (bgp_maxmed_admin_medv, DEFUN (no_bgp_maxmed_admin, no_bgp_maxmed_admin_cmd, - "no bgp max-med administrative [(0-4294967294)]", + "no bgp max-med administrative [(0-4294967295)]", NO_STR BGP_STR "Advertise routes with max-med\n" @@ -1285,24 +1285,7 @@ DEFUN (no_bgp_maxmed_admin, DEFUN (bgp_maxmed_onstartup, bgp_maxmed_onstartup_cmd, - "bgp max-med on-startup (5-86400)", - BGP_STR - "Advertise routes with max-med\n" - "Effective on a startup\n" - "Time (seconds) period for max-med\n") -{ - VTY_DECLVAR_CONTEXT(bgp, bgp); - int idx_number = 3; - VTY_GET_INTEGER ("max-med on-startup period", bgp->v_maxmed_onstartup, argv[idx_number]->arg); - bgp->maxmed_onstartup_value = BGP_MAXMED_VALUE_DEFAULT; - bgp_maxmed_update(bgp); - - return CMD_SUCCESS; -} - -DEFUN (bgp_maxmed_onstartup_medv, - bgp_maxmed_onstartup_medv_cmd, - "bgp max-med on-startup (5-86400) (0-4294967294)", + "bgp max-med on-startup (5-86400) [(0-4294967295)]", BGP_STR "Advertise routes with max-med\n" "Effective on a startup\n" @@ -1310,10 +1293,15 @@ DEFUN (bgp_maxmed_onstartup_medv, "Max MED value to be used\n") { VTY_DECLVAR_CONTEXT(bgp, bgp); - int idx_number = 3; - int idx_number_2 = 4; - VTY_GET_INTEGER ("max-med on-startup period", bgp->v_maxmed_onstartup, argv[idx_number]->arg); - VTY_GET_INTEGER ("max-med on-startup med-value", bgp->maxmed_onstartup_value, argv[idx_number_2]->arg); + int idx = 0; + + argv_find (argv, argc, "(5-86400)", &idx); + bgp->v_maxmed_onstartup = strtoul (argv[idx]->arg, NULL, 10); + if (argv_find (argv, argc, "(0-4294967295)", &idx)) + bgp->maxmed_onstartup_value = strtoul (argv[idx]->arg, NULL, 10); + else + bgp->maxmed_onstartup_value = BGP_MAXMED_VALUE_DEFAULT; + bgp_maxmed_update(bgp); return CMD_SUCCESS; @@ -1321,7 +1309,7 @@ DEFUN (bgp_maxmed_onstartup_medv, DEFUN (no_bgp_maxmed_onstartup, no_bgp_maxmed_onstartup_cmd, - "no bgp max-med on-startup [(5-86400) [(0-4294967294)]]", + "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]", NO_STR BGP_STR "Advertise routes with max-med\n" @@ -1490,25 +1478,11 @@ DEFUN (no_bgp_wpkt_quanta, return bgp_wpkt_quanta_config_vty(vty, argv[idx_number]->arg, 0); } -static int -bgp_coalesce_config_vty (struct vty *vty, const char *num, char set) -{ - VTY_DECLVAR_CONTEXT(bgp, bgp); - - if (set) - VTY_GET_INTEGER_RANGE ("coalesce-time", bgp->coalesce_time, num, - 0, 4294967295); - else - bgp->coalesce_time = BGP_DEFAULT_SUBGROUP_COALESCE_TIME; - - return CMD_SUCCESS; -} - int bgp_config_write_coalesce_time (struct vty *vty, struct bgp *bgp) { if (bgp->coalesce_time != BGP_DEFAULT_SUBGROUP_COALESCE_TIME) - vty_out (vty, " coalesce-time %d%s", + vty_out (vty, " coalesce-time %u%s", bgp->coalesce_time, VTY_NEWLINE); return 0; @@ -1521,8 +1495,12 @@ DEFUN (bgp_coalesce_time, "Subgroup coalesce timer\n" "Subgroup coalesce timer value (in ms)\n") { - int idx_number = 1; - return bgp_coalesce_config_vty(vty, argv[idx_number]->arg, 1); + VTY_DECLVAR_CONTEXT(bgp, bgp); + + int idx = 0; + argv_find (argv, argc, "(0-4294967295)", &idx); + bgp->coalesce_time = strtoul (argv[idx]->arg, NULL, 10); + return CMD_SUCCESS; } DEFUN (no_bgp_coalesce_time, @@ -1532,8 +1510,10 @@ DEFUN (no_bgp_coalesce_time, "Subgroup coalesce timer\n" "Subgroup coalesce timer value (in ms)\n") { - int idx_number = 2; - return bgp_coalesce_config_vty(vty, argv[idx_number]->arg, 0); + VTY_DECLVAR_CONTEXT(bgp, bgp); + + bgp->coalesce_time = BGP_DEFAULT_SUBGROUP_COALESCE_TIME; + return CMD_SUCCESS; } /* Maximum-paths configuration */ @@ -10993,7 +10973,6 @@ bgp_vty_init (void) install_element (BGP_NODE, &bgp_maxmed_admin_medv_cmd); install_element (BGP_NODE, &bgp_maxmed_onstartup_cmd); install_element (BGP_NODE, &no_bgp_maxmed_onstartup_cmd); - install_element (BGP_NODE, &bgp_maxmed_onstartup_medv_cmd); /* bgp disable-ebgp-connected-nh-check */ install_element (BGP_NODE, &bgp_disable_connected_route_check_cmd); diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index cf6c00ae52..117205b57b 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -6798,7 +6798,7 @@ bgp_config_write_peer_global (struct vty *vty, struct bgp *bgp, ((! peer_group_active (peer) && peer->v_routeadv != BGP_DEFAULT_EBGP_ROUTEADV) || (peer_group_active (peer) && peer->v_routeadv != g_peer->v_routeadv))) { - vty_out (vty, " neighbor %s advertisement-interval %d%s", + vty_out (vty, " neighbor %s advertisement-interval %u%s", addr, peer->v_routeadv, VTY_NEWLINE); } @@ -6807,7 +6807,7 @@ bgp_config_write_peer_global (struct vty *vty, struct bgp *bgp, ((! peer_group_active (peer) && (peer->keepalive != BGP_DEFAULT_KEEPALIVE || peer->holdtime != BGP_DEFAULT_HOLDTIME)) || (peer_group_active (peer) && (peer->keepalive != g_peer->keepalive || peer->holdtime != g_peer->holdtime)))) { - vty_out (vty, " neighbor %s timers %d %d%s", addr, + vty_out (vty, " neighbor %s timers %u %u%s", addr, peer->keepalive, peer->holdtime, VTY_NEWLINE); } @@ -6816,7 +6816,7 @@ bgp_config_write_peer_global (struct vty *vty, struct bgp *bgp, (peer_group_active (peer) && peer->connect != g_peer->connect))) { - vty_out (vty, " neighbor %s timers connect %d%s", addr, + vty_out (vty, " neighbor %s timers connect %u%s", addr, peer->connect, VTY_NEWLINE); } @@ -7159,11 +7159,11 @@ bgp_config_write_peer_af (struct vty *vty, struct bgp *bgp, " neighbor %s maximum-prefix %lu", addr, peer->pmax[afi][safi]); if (peer->pmax_threshold[afi][safi] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT) - vty_out (vty, " %d", peer->pmax_threshold[afi][safi]); + vty_out (vty, " %u", peer->pmax_threshold[afi][safi]); if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING)) vty_out (vty, " warning-only"); if (peer->pmax_restart[afi][safi]) - vty_out (vty, " restart %d", peer->pmax_restart[afi][safi]); + vty_out (vty, " restart %u", peer->pmax_restart[afi][safi]); vty_out (vty, "%s", VTY_NEWLINE); } @@ -7226,7 +7226,7 @@ bgp_config_write_peer_af (struct vty *vty, struct bgp *bgp, if (peer->weight[afi][safi]) { afi_header_vty_out (vty, afi, safi, write, - " neighbor %s weight %d%s", + " neighbor %s weight %lu%s", addr, peer->weight[afi][safi], VTY_NEWLINE); } } @@ -7371,7 +7371,7 @@ bgp_config_write (struct vty *vty) } if (bm->rmap_update_timer != RMAP_DEFAULT_UPDATE_TIMER) - vty_out (vty, "bgp route-map delay-timer %d%s", bm->rmap_update_timer, + vty_out (vty, "bgp route-map delay-timer %u%s", bm->rmap_update_timer, VTY_NEWLINE); /* BGP configuration. */ @@ -7422,7 +7422,7 @@ bgp_config_write (struct vty *vty) /* BGP default local-preference. */ if (bgp->default_local_pref != BGP_DEFAULT_LOCAL_PREF) - vty_out (vty, " bgp default local-preference %d%s", + vty_out (vty, " bgp default local-preference %u%s", bgp->default_local_pref, VTY_NEWLINE); /* BGP default show-hostname */ @@ -7434,7 +7434,7 @@ bgp_config_write (struct vty *vty) /* BGP default subgroup-pkt-queue-max. */ if (bgp->default_subgroup_pkt_queue_max != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX) - vty_out (vty, " bgp default subgroup-pkt-queue-max %d%s", + vty_out (vty, " bgp default subgroup-pkt-queue-max %u%s", bgp->default_subgroup_pkt_queue_max, VTY_NEWLINE); /* BGP client-to-client reflection. */ @@ -7484,16 +7484,16 @@ bgp_config_write (struct vty *vty) if (bgp->v_maxmed_onstartup != BGP_MAXMED_ONSTARTUP_UNCONFIGURED) { - vty_out (vty, " bgp max-med on-startup %d", bgp->v_maxmed_onstartup); + vty_out (vty, " bgp max-med on-startup %u", bgp->v_maxmed_onstartup); if (bgp->maxmed_onstartup_value != BGP_MAXMED_VALUE_DEFAULT) - vty_out (vty, " %d", bgp->maxmed_onstartup_value); + vty_out (vty, " %u", bgp->maxmed_onstartup_value); vty_out (vty, "%s", VTY_NEWLINE); } if (bgp->v_maxmed_admin != BGP_MAXMED_ADMIN_UNCONFIGURED) { vty_out (vty, " bgp max-med administrative"); if (bgp->maxmed_admin_value != BGP_MAXMED_VALUE_DEFAULT) - vty_out (vty, " %d", bgp->maxmed_admin_value); + vty_out (vty, " %u", bgp->maxmed_admin_value); vty_out (vty, "%s", VTY_NEWLINE); } @@ -7505,10 +7505,10 @@ bgp_config_write (struct vty *vty) /* BGP graceful-restart. */ if (bgp->stalepath_time != BGP_DEFAULT_STALEPATH_TIME) - vty_out (vty, " bgp graceful-restart stalepath-time %d%s", + vty_out (vty, " bgp graceful-restart stalepath-time %u%s", bgp->stalepath_time, VTY_NEWLINE); if (bgp->restart_time != BGP_DEFAULT_RESTART_TIME) - vty_out (vty, " bgp graceful-restart restart-time %d%s", + vty_out (vty, " bgp graceful-restart restart-time %u%s", bgp->restart_time, VTY_NEWLINE); if (bgp_flag_check (bgp, BGP_FLAG_GRACEFUL_RESTART)) vty_out (vty, " bgp graceful-restart%s", VTY_NEWLINE); @@ -7567,7 +7567,7 @@ bgp_config_write (struct vty *vty) /* BGP timers configuration. */ if (bgp->default_keepalive != BGP_DEFAULT_KEEPALIVE && bgp->default_holdtime != BGP_DEFAULT_HOLDTIME) - vty_out (vty, " timers bgp %d %d%s", bgp->default_keepalive, + vty_out (vty, " timers bgp %u %u%s", bgp->default_keepalive, bgp->default_holdtime, VTY_NEWLINE); /* peer-group */ From 522faa1f8be658c18284e3e9e5dcaefdf92c4c57 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Fri, 16 Jun 2017 17:30:35 -0300 Subject: [PATCH 14/18] ldpd: fix fallouts from the rb-tree conversion Signed-off-by: Renato Westphal --- ldpd/adjacency.c | 2 +- ldpd/interface.c | 6 +++--- ldpd/ldpe.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ldpd/adjacency.c b/ldpd/adjacency.c index 8a2252e722..e73d1b51a2 100644 --- a/ldpd/adjacency.c +++ b/ldpd/adjacency.c @@ -163,7 +163,7 @@ adj_find(struct in_addr lsr_id, struct hello_source *source) } int -adj_get_af(struct adj *adj) +adj_get_af(const struct adj *adj) { switch (adj->source.type) { case HELLO_LINK: diff --git a/ldpd/interface.c b/ldpd/interface.c index 527a6bc963..ac48520f7b 100644 --- a/ldpd/interface.c +++ b/ldpd/interface.c @@ -81,12 +81,12 @@ ldpe_if_init(struct iface *iface) /* ipv4 */ iface->ipv4.iface = iface; iface->ipv4.state = IF_STA_DOWN; - RB_INIT(iface_head, &iface->ipv4.adj_tree); + RB_INIT(ia_adj_head, &iface->ipv4.adj_tree); /* ipv6 */ iface->ipv6.iface = iface; iface->ipv6.state = IF_STA_DOWN; - RB_INIT(iface_head, &iface->ipv6.adj_tree); + RB_INIT(ia_adj_head, &iface->ipv6.adj_tree); } void @@ -305,7 +305,7 @@ if_reset(struct iface *iface, int af) ia = iface_af_get(iface, af); if_stop_hello_timer(ia); - while ((adj = RB_ROOT(iface_head, &ia->adj_tree)) != NULL) + while ((adj = RB_ROOT(ia_adj_head, &ia->adj_tree)) != NULL) adj_del(adj, S_SHUTDOWN); /* try to cleanup */ diff --git a/ldpd/ldpe.h b/ldpd/ldpe.h index d34ca4dc24..74f6b852b0 100644 --- a/ldpd/ldpe.h +++ b/ldpd/ldpe.h @@ -237,7 +237,7 @@ struct adj *adj_new(struct in_addr, struct hello_source *, union ldpd_addr *); void adj_del(struct adj *, uint32_t); struct adj *adj_find(struct in_addr, struct hello_source *); -int adj_get_af(struct adj *adj); +int adj_get_af(const struct adj *adj); void adj_start_itimer(struct adj *); void adj_stop_itimer(struct adj *); struct tnbr *tnbr_new(int, union ldpd_addr *); From 6021c8d38268ca67b58f1f5d29440782ee8826aa Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 16 Jun 2017 17:40:17 -0400 Subject: [PATCH 15/18] lib: Fix ordering of RB Tree So the *bsd implementations of RB Tree's for older platforms use a macro implementation. New platforms have converted to a function implementation that uses a different calling parameter list. So when we attempt to build FRR on older *bsd implementations the macro's and functions do not interact too well. As a workaround put the openbsd-tree.h #include inside of zebra.h at a point before the particular platforms version is included. Since we use the same #if guard for the header we should be ok. Signed-off-by: Donald Sharp --- lib/zebra.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/zebra.h b/lib/zebra.h index 0a61c433d9..2cc433a863 100644 --- a/lib/zebra.h +++ b/lib/zebra.h @@ -126,6 +126,8 @@ typedef unsigned char u_int8_t; #define __APPLE_USE_RFC_3542 #endif +#include "lib/openbsd-tree.h" + #include #include #include From 55087642701608628168205df671608727c91d25 Mon Sep 17 00:00:00 2001 From: Rafael Zalamena Date: Mon, 19 Jun 2017 13:17:35 -0300 Subject: [PATCH 16/18] lib: rename rb_tree to fix NetBSD compilation Change rb_tree struct name to rbt_tree to avoid conflicts with NetBSD. --- lib/openbsd-tree.c | 24 ++++++++++++------------ lib/openbsd-tree.h | 22 +++++++++++----------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/openbsd-tree.c b/lib/openbsd-tree.c index 9f17f2946a..7e753554c9 100644 --- a/lib/openbsd-tree.c +++ b/lib/openbsd-tree.c @@ -97,7 +97,7 @@ rbe_if_augment(const struct rb_type *t, struct rb_entry *rbe) } static inline void -rbe_rotate_left(const struct rb_type *t, struct rb_tree *rbt, +rbe_rotate_left(const struct rb_type *t, struct rbt_tree *rbt, struct rb_entry *rbe) { struct rb_entry *parent; @@ -131,7 +131,7 @@ rbe_rotate_left(const struct rb_type *t, struct rb_tree *rbt, } static inline void -rbe_rotate_right(const struct rb_type *t, struct rb_tree *rbt, +rbe_rotate_right(const struct rb_type *t, struct rbt_tree *rbt, struct rb_entry *rbe) { struct rb_entry *parent; @@ -165,7 +165,7 @@ rbe_rotate_right(const struct rb_type *t, struct rb_tree *rbt, } static inline void -rbe_insert_color(const struct rb_type *t, struct rb_tree *rbt, +rbe_insert_color(const struct rb_type *t, struct rbt_tree *rbt, struct rb_entry *rbe) { struct rb_entry *parent, *gparent, *tmp; @@ -217,7 +217,7 @@ rbe_insert_color(const struct rb_type *t, struct rb_tree *rbt, } static inline void -rbe_remove_color(const struct rb_type *t, struct rb_tree *rbt, +rbe_remove_color(const struct rb_type *t, struct rbt_tree *rbt, struct rb_entry *parent, struct rb_entry *rbe) { struct rb_entry *tmp; @@ -311,7 +311,7 @@ rbe_remove_color(const struct rb_type *t, struct rb_tree *rbt, } static inline struct rb_entry * -rbe_remove(const struct rb_type *t, struct rb_tree *rbt, struct rb_entry *rbe) +rbe_remove(const struct rb_type *t, struct rbt_tree *rbt, struct rb_entry *rbe) { struct rb_entry *child, *parent, *old = rbe; unsigned int color; @@ -393,7 +393,7 @@ color: } void * -_rb_remove(const struct rb_type *t, struct rb_tree *rbt, void *elm) +_rb_remove(const struct rb_type *t, struct rbt_tree *rbt, void *elm) { struct rb_entry *rbe = rb_n2e(t, elm); struct rb_entry *old; @@ -404,7 +404,7 @@ _rb_remove(const struct rb_type *t, struct rb_tree *rbt, void *elm) } void * -_rb_insert(const struct rb_type *t, struct rb_tree *rbt, void *elm) +_rb_insert(const struct rb_type *t, struct rbt_tree *rbt, void *elm) { struct rb_entry *rbe = rb_n2e(t, elm); struct rb_entry *tmp; @@ -445,7 +445,7 @@ _rb_insert(const struct rb_type *t, struct rb_tree *rbt, void *elm) /* Finds the node with the same key as elm */ void * -_rb_find(const struct rb_type *t, struct rb_tree *rbt, const void *key) +_rb_find(const struct rb_type *t, struct rbt_tree *rbt, const void *key) { struct rb_entry *tmp = RBH_ROOT(rbt); void *node; @@ -467,7 +467,7 @@ _rb_find(const struct rb_type *t, struct rb_tree *rbt, const void *key) /* Finds the first node greater than or equal to the search key */ void * -_rb_nfind(const struct rb_type *t, struct rb_tree *rbt, const void *key) +_rb_nfind(const struct rb_type *t, struct rbt_tree *rbt, const void *key) { struct rb_entry *tmp = RBH_ROOT(rbt); void *node; @@ -538,7 +538,7 @@ _rb_prev(const struct rb_type *t, void *elm) } void * -_rb_root(const struct rb_type *t, struct rb_tree *rbt) +_rb_root(const struct rb_type *t, struct rbt_tree *rbt) { struct rb_entry *rbe = RBH_ROOT(rbt); @@ -546,7 +546,7 @@ _rb_root(const struct rb_type *t, struct rb_tree *rbt) } void * -_rb_min(const struct rb_type *t, struct rb_tree *rbt) +_rb_min(const struct rb_type *t, struct rbt_tree *rbt) { struct rb_entry *rbe = RBH_ROOT(rbt); struct rb_entry *parent = NULL; @@ -560,7 +560,7 @@ _rb_min(const struct rb_type *t, struct rb_tree *rbt) } void * -_rb_max(const struct rb_type *t, struct rb_tree *rbt) +_rb_max(const struct rb_type *t, struct rbt_tree *rbt) { struct rb_entry *rbe = RBH_ROOT(rbt); struct rb_entry *parent = NULL; diff --git a/lib/openbsd-tree.h b/lib/openbsd-tree.h index 8cf1a3df7f..8436615c27 100644 --- a/lib/openbsd-tree.h +++ b/lib/openbsd-tree.h @@ -312,7 +312,7 @@ struct rb_type { unsigned int t_offset; /* offset of rb_entry in type */ }; -struct rb_tree { +struct rbt_tree { struct rb_entry *rbt_root; }; @@ -325,30 +325,30 @@ struct rb_entry { #define RB_HEAD(_name, _type) \ struct _name { \ - struct rb_tree rbh_root; \ + struct rbt_tree rbh_root; \ } #define RB_ENTRY(_type) struct rb_entry static inline void -_rb_init(struct rb_tree *rbt) +_rb_init(struct rbt_tree *rbt) { rbt->rbt_root = NULL; } static inline int -_rb_empty(struct rb_tree *rbt) +_rb_empty(struct rbt_tree *rbt) { return (rbt->rbt_root == NULL); } -void *_rb_insert(const struct rb_type *, struct rb_tree *, void *); -void *_rb_remove(const struct rb_type *, struct rb_tree *, void *); -void *_rb_find(const struct rb_type *, struct rb_tree *, const void *); -void *_rb_nfind(const struct rb_type *, struct rb_tree *, const void *); -void *_rb_root(const struct rb_type *, struct rb_tree *); -void *_rb_min(const struct rb_type *, struct rb_tree *); -void *_rb_max(const struct rb_type *, struct rb_tree *); +void *_rb_insert(const struct rb_type *, struct rbt_tree *, void *); +void *_rb_remove(const struct rb_type *, struct rbt_tree *, void *); +void *_rb_find(const struct rb_type *, struct rbt_tree *, const void *); +void *_rb_nfind(const struct rb_type *, struct rbt_tree *, const void *); +void *_rb_root(const struct rb_type *, struct rbt_tree *); +void *_rb_min(const struct rb_type *, struct rbt_tree *); +void *_rb_max(const struct rb_type *, struct rbt_tree *); void *_rb_next(const struct rb_type *, void *); void *_rb_prev(const struct rb_type *, void *); void *_rb_left(const struct rb_type *, void *); From b19ad86195435f6ef84ebf0303ba03d8f79cd7fc Mon Sep 17 00:00:00 2001 From: Rafael Zalamena Date: Mon, 19 Jun 2017 13:24:04 -0300 Subject: [PATCH 17/18] lib: fix __unused compilation on old platforms Expand the macro __attribute__ to avoid problem with old platforms that do not define this. --- lib/openbsd-tree.h | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/lib/openbsd-tree.h b/lib/openbsd-tree.h index 8436615c27..22cb9252f5 100644 --- a/lib/openbsd-tree.h +++ b/lib/openbsd-tree.h @@ -362,122 +362,118 @@ int _rb_check(const struct rb_type *, void *, unsigned long); #define RB_INITIALIZER(_head) { { NULL } } -#ifndef __unused -#define __unused __attribute__((__unused__)) -#endif /* __unused */ - #define RB_PROTOTYPE(_name, _type, _field, _cmp) \ extern const struct rb_type *const _name##_RB_TYPE; \ \ -__unused static inline void \ +__attribute__((__unused__)) static inline void \ _name##_RB_INIT(struct _name *head) \ { \ _rb_init(&head->rbh_root); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_INSERT(struct _name *head, struct _type *elm) \ { \ return _rb_insert(_name##_RB_TYPE, &head->rbh_root, elm); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_REMOVE(struct _name *head, struct _type *elm) \ { \ return _rb_remove(_name##_RB_TYPE, &head->rbh_root, elm); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_FIND(struct _name *head, const struct _type *key) \ { \ return _rb_find(_name##_RB_TYPE, &head->rbh_root, key); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_NFIND(struct _name *head, const struct _type *key) \ { \ return _rb_nfind(_name##_RB_TYPE, &head->rbh_root, key); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_ROOT(struct _name *head) \ { \ return _rb_root(_name##_RB_TYPE, &head->rbh_root); \ } \ \ -__unused static inline int \ +__attribute__((__unused__)) static inline int \ _name##_RB_EMPTY(struct _name *head) \ { \ return _rb_empty(&head->rbh_root); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_MIN(struct _name *head) \ { \ return _rb_min(_name##_RB_TYPE, &head->rbh_root); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_MAX(struct _name *head) \ { \ return _rb_max(_name##_RB_TYPE, &head->rbh_root); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_NEXT(struct _type *elm) \ { \ return _rb_next(_name##_RB_TYPE, elm); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_PREV(struct _type *elm) \ { \ return _rb_prev(_name##_RB_TYPE, elm); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_LEFT(struct _type *elm) \ { \ return _rb_left(_name##_RB_TYPE, elm); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_RIGHT(struct _type *elm) \ { \ return _rb_right(_name##_RB_TYPE, elm); \ } \ \ -__unused static inline struct _type * \ +__attribute__((__unused__)) static inline struct _type * \ _name##_RB_PARENT(struct _type *elm) \ { \ return _rb_parent(_name##_RB_TYPE, elm); \ } \ \ -__unused static inline void \ +__attribute__((__unused__)) static inline void \ _name##_RB_SET_LEFT(struct _type *elm, struct _type *left) \ { \ return _rb_set_left(_name##_RB_TYPE, elm, left); \ } \ \ -__unused static inline void \ +__attribute__((__unused__)) static inline void \ _name##_RB_SET_RIGHT(struct _type *elm, struct _type *right) \ { \ return _rb_set_right(_name##_RB_TYPE, elm, right); \ } \ \ -__unused static inline void \ +__attribute__((__unused__)) static inline void \ _name##_RB_SET_PARENT(struct _type *elm, struct _type *parent) \ { \ return _rb_set_parent(_name##_RB_TYPE, elm, parent); \ } \ \ -__unused static inline void \ +__attribute__((__unused__)) static inline void \ _name##_RB_POISON(struct _type *elm, unsigned long poison) \ { \ return _rb_poison(_name##_RB_TYPE, elm, poison); \ } \ \ -__unused static inline int \ +__attribute__((__unused__)) static inline int \ _name##_RB_CHECK(struct _type *elm, unsigned long poison) \ { \ return _rb_check(_name##_RB_TYPE, elm, poison); \ From c25c61370f6f1a3dc55b821bf271db73bd89f69f Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Mon, 19 Jun 2017 20:34:22 +0000 Subject: [PATCH 18/18] vtysh: fix stack buffer overflow VARIABLE accepts arbitrary input Signed-off-by: Quentin Young --- vtysh/vtysh.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index ffdfd5d725..76c7702fa0 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -2029,17 +2029,19 @@ DEFUNSH (VTYSH_INTERFACE, DEFUN (vtysh_show_thread, vtysh_show_thread_cmd, "show thread cpu [FILTER]", - SHOW_STR - "Thread information\n" - "Thread CPU usage\n" - "Display filter (rwtexb)\n") + SHOW_STR + "Thread information\n" + "Thread CPU usage\n" + "Display filter (rwtexb)\n") { - int idx_filter = 3; unsigned int i; + int idx = 0; int ret = CMD_SUCCESS; char line[100]; - sprintf(line, "show thread cpu %s\n", (argc == 4) ? argv[idx_filter]->arg : ""); + const char *filter = argv_find (argv, argc, "FILTER", &idx) ? argv[idx]->arg : ""; + + snprintf(line, sizeof(line), "do show thread cpu %s\n", filter); for (i = 0; i < array_size(vtysh_client); i++) if ( vtysh_client[i].fd >= 0 ) {