3 * Copyright (C) Cumulus Networks, Inc.
6 * This file is part of FRR.
8 * FRR is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2, or (at your option) any
13 * FRR is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with this program; see the file COPYING; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "nexthop_group.h"
32 #include "link_state.h"
34 #include "sharpd/sharp_globals.h"
35 #include "sharpd/sharp_zebra.h"
36 #include "sharpd/sharp_nht.h"
37 #include "sharpd/sharp_vty.h"
38 #ifndef VTYSH_EXTRACT_PL
39 #include "sharpd/sharp_vty_clippy.c"
42 DEFPY(watch_nexthop_v6
, watch_nexthop_v6_cmd
,
43 "sharp watch [vrf NAME$vrf_name] <nexthop$n X:X::X:X$nhop|import$import X:X::X:X/M$inhop> [connected$connected]",
44 "Sharp routing Protocol\n"
46 "The vrf we would like to watch if non-default\n"
47 "The NAME of the vrf\n"
48 "Watch for nexthop changes\n"
49 "The v6 nexthop to signal for watching\n"
50 "Watch for import check changes\n"
51 "The v6 prefix to signal for watching\n"
52 "Should the route be connected\n")
59 vrf_name
= VRF_DEFAULT_NAME
;
60 vrf
= vrf_lookup_by_name(vrf_name
);
62 vty_out(vty
, "The vrf NAME specified: %s does not exist\n",
67 memset(&p
, 0, sizeof(p
));
72 memcpy(&p
.u
.prefix6
, &nhop
, 16);
76 p
= *(const struct prefix
*)inhop
;
79 sharp_nh_tracker_get(&p
);
80 sharp_zebra_nexthop_watch(&p
, vrf
->vrf_id
, type_import
,
86 DEFPY(watch_nexthop_v4
, watch_nexthop_v4_cmd
,
87 "sharp watch [vrf NAME$vrf_name] <nexthop$n A.B.C.D$nhop|import$import A.B.C.D/M$inhop> [connected$connected]",
88 "Sharp routing Protocol\n"
90 "The vrf we would like to watch if non-default\n"
91 "The NAME of the vrf\n"
92 "Watch for nexthop changes\n"
93 "The v4 address to signal for watching\n"
94 "Watch for import check changes\n"
95 "The v4 prefix for import check to watch\n"
96 "Should the route be connected\n")
103 vrf_name
= VRF_DEFAULT_NAME
;
104 vrf
= vrf_lookup_by_name(vrf_name
);
106 vty_out(vty
, "The vrf NAME specified: %s does not exist\n",
111 memset(&p
, 0, sizeof(p
));
121 p
= *(const struct prefix
*)inhop
;
124 sharp_nh_tracker_get(&p
);
125 sharp_zebra_nexthop_watch(&p
, vrf
->vrf_id
, type_import
,
131 DEFPY(sharp_nht_data_dump
,
132 sharp_nht_data_dump_cmd
,
133 "sharp data nexthop",
134 "Sharp routing Protocol\n"
135 "Data about what is going on\n"
136 "Nexthop information\n")
138 sharp_nh_tracker_dump(vty
);
143 DEFPY (install_routes_data_dump
,
144 install_routes_data_dump_cmd
,
146 "Sharp routing Protocol\n"
147 "Data about what is going on\n"
148 "Route Install/Removal Information\n")
152 timersub(&sg
.r
.t_end
, &sg
.r
.t_start
, &r
);
153 vty_out(vty
, "Prefix: %pFX Total: %u %u %u Time: %jd.%ld\n",
154 &sg
.r
.orig_prefix
, sg
.r
.total_routes
, sg
.r
.installed_routes
,
155 sg
.r
.removed_routes
, (intmax_t)r
.tv_sec
, (long)r
.tv_usec
);
160 DEFPY (install_routes
,
162 "sharp install routes [vrf NAME$vrf_name]\
163 <A.B.C.D$start4|X:X::X:X$start6>\
164 <nexthop <A.B.C.D$nexthop4|X:X::X:X$nexthop6>|\
165 nexthop-group NHGNAME$nexthop_group>\
166 [backup$backup <A.B.C.D$backup_nexthop4|X:X::X:X$backup_nexthop6>] \
167 (1-1000000)$routes [instance (0-255)$instance] [repeat (2-1000)$rpt] [opaque WORD]",
168 "Sharp routing Protocol\n"
169 "install some routes\n"
170 "Routes to install\n"
171 "The vrf we would like to install into if non-default\n"
172 "The NAME of the vrf\n"
173 "v4 Address to start /32 generation at\n"
174 "v6 Address to start /32 generation at\n"
175 "Nexthop to use(Can be an IPv4 or IPv6 address)\n"
176 "V4 Nexthop address to use\n"
177 "V6 Nexthop address to use\n"
178 "Nexthop-Group to use\n"
179 "The Name of the nexthop-group\n"
180 "Backup nexthop to use(Can be an IPv4 or IPv6 address)\n"
181 "Backup V4 Nexthop address to use\n"
182 "Backup V6 Nexthop address to use\n"
183 "How many to create\n"
186 "Should we repeat this command\n"
187 "How many times to repeat this command\n"
188 "What opaque data to send down\n"
192 struct prefix prefix
;
196 sg
.r
.total_routes
= routes
;
197 sg
.r
.installed_routes
= 0;
200 sg
.r
.repeat
= rpt
* 2;
204 memset(&prefix
, 0, sizeof(prefix
));
205 memset(&sg
.r
.orig_prefix
, 0, sizeof(sg
.r
.orig_prefix
));
206 memset(&sg
.r
.nhop
, 0, sizeof(sg
.r
.nhop
));
207 memset(&sg
.r
.nhop_group
, 0, sizeof(sg
.r
.nhop_group
));
208 memset(&sg
.r
.backup_nhop
, 0, sizeof(sg
.r
.nhop
));
209 memset(&sg
.r
.backup_nhop_group
, 0, sizeof(sg
.r
.nhop_group
));
211 if (start4
.s_addr
!= INADDR_ANY
) {
212 prefix
.family
= AF_INET
;
213 prefix
.prefixlen
= 32;
214 prefix
.u
.prefix4
= start4
;
216 prefix
.family
= AF_INET6
;
217 prefix
.prefixlen
= 128;
218 prefix
.u
.prefix6
= start6
;
220 sg
.r
.orig_prefix
= prefix
;
223 vrf_name
= VRF_DEFAULT_NAME
;
225 vrf
= vrf_lookup_by_name(vrf_name
);
227 vty_out(vty
, "The vrf NAME specified: %s does not exist\n",
232 /* Explicit backup not available with named nexthop-group */
233 if (backup
&& nexthop_group
) {
234 vty_out(vty
, "%% Invalid: cannot specify both nexthop-group and backup\n");
239 struct nexthop_group_cmd
*nhgc
= nhgc_find(nexthop_group
);
242 "Specified Nexthop Group: %s does not exist\n",
247 nhgid
= sharp_nhgroup_get_id(nexthop_group
);
249 sg
.r
.nhop_group
.nexthop
= nhgc
->nhg
.nexthop
;
251 /* Use group's backup nexthop info if present */
252 if (nhgc
->backup_list_name
[0]) {
253 struct nexthop_group_cmd
*bnhgc
=
254 nhgc_find(nhgc
->backup_list_name
);
257 vty_out(vty
, "%% Backup group %s not found for group %s\n",
258 nhgc
->backup_list_name
,
263 sg
.r
.backup_nhop
.vrf_id
= vrf
->vrf_id
;
264 sg
.r
.backup_nhop_group
.nexthop
= bnhgc
->nhg
.nexthop
;
267 if (nexthop4
.s_addr
!= INADDR_ANY
) {
268 sg
.r
.nhop
.gate
.ipv4
= nexthop4
;
269 sg
.r
.nhop
.type
= NEXTHOP_TYPE_IPV4
;
271 sg
.r
.nhop
.gate
.ipv6
= nexthop6
;
272 sg
.r
.nhop
.type
= NEXTHOP_TYPE_IPV6
;
275 sg
.r
.nhop
.vrf_id
= vrf
->vrf_id
;
276 sg
.r
.nhop_group
.nexthop
= &sg
.r
.nhop
;
279 /* Use single backup nexthop if specified */
281 /* Set flag and index in primary nexthop */
282 SET_FLAG(sg
.r
.nhop
.flags
, NEXTHOP_FLAG_HAS_BACKUP
);
283 sg
.r
.nhop
.backup_num
= 1;
284 sg
.r
.nhop
.backup_idx
[0] = 0;
286 if (backup_nexthop4
.s_addr
!= INADDR_ANY
) {
287 sg
.r
.backup_nhop
.gate
.ipv4
= backup_nexthop4
;
288 sg
.r
.backup_nhop
.type
= NEXTHOP_TYPE_IPV4
;
290 sg
.r
.backup_nhop
.gate
.ipv6
= backup_nexthop6
;
291 sg
.r
.backup_nhop
.type
= NEXTHOP_TYPE_IPV6
;
294 sg
.r
.backup_nhop
.vrf_id
= vrf
->vrf_id
;
295 sg
.r
.backup_nhop_group
.nexthop
= &sg
.r
.backup_nhop
;
299 strlcpy(sg
.r
.opaque
, opaque
, ZAPI_MESSAGE_OPAQUE_LENGTH
);
301 sg
.r
.opaque
[0] = '\0';
303 sg
.r
.inst
= instance
;
304 sg
.r
.vrf_id
= vrf
->vrf_id
;
306 sharp_install_routes_helper(&prefix
, sg
.r
.vrf_id
, sg
.r
.inst
, nhgid
,
307 &sg
.r
.nhop_group
, &sg
.r
.backup_nhop_group
,
313 DEFPY(vrf_label
, vrf_label_cmd
,
314 "sharp label <ip$ipv4|ipv6$ipv6> vrf NAME$vrf_name label (0-100000)$label",
315 "Sharp Routing Protocol\n"
316 "Give a vrf a label\n"
317 "Pop and forward for IPv4\n"
318 "Pop and forward for IPv6\n"
320 "The label to use, 0 specifies remove the label installed from previous\n"
321 "Specified range to use\n")
324 afi_t afi
= (ipv4
) ? AFI_IP
: AFI_IP6
;
326 if (strcmp(vrf_name
, "default") == 0)
327 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
329 vrf
= vrf_lookup_by_name(vrf_name
);
332 vty_out(vty
, "Unable to find vrf you silly head");
333 return CMD_WARNING_CONFIG_FAILED
;
337 label
= MPLS_LABEL_NONE
;
339 vrf_label_add(vrf
->vrf_id
, afi
, label
);
343 DEFPY (remove_routes
,
345 "sharp remove routes [vrf NAME$vrf_name] <A.B.C.D$start4|X:X::X:X$start6> (1-1000000)$routes [instance (0-255)$instance]",
346 "Sharp Routing Protocol\n"
347 "Remove some routes\n"
349 "The vrf we would like to remove from if non-default\n"
350 "The NAME of the vrf\n"
353 "Routes to uninstall\n"
355 "Value of instance\n")
358 struct prefix prefix
;
360 sg
.r
.total_routes
= routes
;
361 sg
.r
.removed_routes
= 0;
364 memset(&prefix
, 0, sizeof(prefix
));
366 if (start4
.s_addr
!= INADDR_ANY
) {
367 prefix
.family
= AF_INET
;
368 prefix
.prefixlen
= 32;
369 prefix
.u
.prefix4
= start4
;
371 prefix
.family
= AF_INET6
;
372 prefix
.prefixlen
= 128;
373 prefix
.u
.prefix6
= start6
;
376 vrf
= vrf_lookup_by_name(vrf_name
? vrf_name
: VRF_DEFAULT_NAME
);
378 vty_out(vty
, "The vrf NAME specified: %s does not exist\n",
379 vrf_name
? vrf_name
: VRF_DEFAULT_NAME
);
383 sg
.r
.inst
= instance
;
384 sg
.r
.vrf_id
= vrf
->vrf_id
;
386 sharp_remove_routes_helper(&prefix
, sg
.r
.vrf_id
,
392 DEFUN_NOSH (show_debugging_sharpd
,
393 show_debugging_sharpd_cmd
,
394 "show debugging [sharp]",
397 "Sharp Information\n")
399 vty_out(vty
, "Sharp debugging status:\n");
404 DEFPY (sharp_lsp_prefix_v4
, sharp_lsp_prefix_v4_cmd
,
405 "sharp lsp [update]$update (0-100000)$inlabel\
406 nexthop-group NHGNAME$nhgname\
407 [prefix A.B.C.D/M$pfx\
408 " FRR_IP_REDIST_STR_ZEBRA
"$type_str [instance (0-255)$instance]]",
409 "Sharp Routing Protocol\n"
412 "The ingress label to use\n"
413 "Use nexthops from a nexthop-group\n"
414 "The nexthop-group name\n"
416 "The v4 prefix to label\n"
417 FRR_IP_REDIST_HELP_STR_ZEBRA
421 struct nexthop_group_cmd
*nhgc
= NULL
;
422 struct nexthop_group_cmd
*backup_nhgc
= NULL
;
423 struct nexthop_group
*backup_nhg
= NULL
;
424 struct prefix p
= {};
428 update_p
= (update
!= NULL
);
430 /* We're offered a v4 prefix */
431 if (pfx
->family
> 0 && type_str
) {
432 p
.family
= pfx
->family
;
433 p
.prefixlen
= pfx
->prefixlen
;
434 p
.u
.prefix4
= pfx
->prefix
;
436 type
= proto_redistnum(AFI_IP
, type_str
);
438 vty_out(vty
, "%% Unknown route type '%s'\n", type_str
);
441 } else if (pfx
->family
> 0 || type_str
) {
442 vty_out(vty
, "%% Must supply both prefix and type\n");
446 nhgc
= nhgc_find(nhgname
);
448 vty_out(vty
, "%% Nexthop-group '%s' does not exist\n",
453 if (nhgc
->nhg
.nexthop
== NULL
) {
454 vty_out(vty
, "%% Nexthop-group '%s' is empty\n", nhgname
);
458 /* Use group's backup nexthop info if present */
459 if (nhgc
->backup_list_name
[0]) {
460 backup_nhgc
= nhgc_find(nhgc
->backup_list_name
);
464 "%% Backup group %s not found for group %s\n",
465 nhgc
->backup_list_name
,
469 backup_nhg
= &(backup_nhgc
->nhg
);
472 if (sharp_install_lsps_helper(true /*install*/, update_p
,
473 pfx
->family
> 0 ? &p
: NULL
,
474 type
, instance
, inlabel
,
475 &(nhgc
->nhg
), backup_nhg
) == 0)
478 vty_out(vty
, "%% LSP install failed!\n");
483 DEFPY(sharp_remove_lsp_prefix_v4
, sharp_remove_lsp_prefix_v4_cmd
,
486 [nexthop-group NHGNAME$nhgname] \
487 [prefix A.B.C.D/M$pfx\
488 " FRR_IP_REDIST_STR_SHARPD
"$type_str [instance (0-255)$instance]]",
489 "Sharp Routing Protocol\n"
492 "The ingress label\n"
493 "Use nexthops from a nexthop-group\n"
494 "The nexthop-group name\n"
495 "Specify a v4 prefix\n"
496 "The v4 prefix to label\n"
497 FRR_IP_REDIST_HELP_STR_SHARPD
501 struct nexthop_group_cmd
*nhgc
= NULL
;
502 struct prefix p
= {};
504 struct nexthop_group
*nhg
= NULL
;
506 /* We're offered a v4 prefix */
507 if (pfx
->family
> 0 && type_str
) {
508 p
.family
= pfx
->family
;
509 p
.prefixlen
= pfx
->prefixlen
;
510 p
.u
.prefix4
= pfx
->prefix
;
512 type
= proto_redistnum(AFI_IP
, type_str
);
514 vty_out(vty
, "%% Unknown route type '%s'\n", type_str
);
517 } else if (pfx
->family
> 0 || type_str
) {
518 vty_out(vty
, "%% Must supply both prefix and type\n");
523 nhgc
= nhgc_find(nhgname
);
525 vty_out(vty
, "%% Nexthop-group '%s' does not exist\n",
530 if (nhgc
->nhg
.nexthop
== NULL
) {
531 vty_out(vty
, "%% Nexthop-group '%s' is empty\n",
538 if (sharp_install_lsps_helper(false /*!install*/, false,
539 pfx
->family
> 0 ? &p
: NULL
,
540 type
, instance
, inlabel
, nhg
, NULL
) == 0)
543 vty_out(vty
, "%% LSP remove failed!\n");
550 "sharp logpump duration (1-60) frequency (1-1000000) burst (1-1000)",
551 "Sharp Routing Protocol\n"
552 "Generate bulk log messages for testing\n"
553 "Duration of run (s)\n"
554 "Duration of run (s)\n"
555 "Frequency of bursts (s^-1)\n"
556 "Frequency of bursts (s^-1)\n"
557 "Number of log messages per each burst\n"
558 "Number of log messages per each burst\n")
560 sharp_logpump_run(vty
, duration
, frequency
, burst
);
564 DEFPY (create_session
,
566 "sharp create session (1-1024)",
567 "Sharp Routing Protocol\n"
569 "Create a test session\n"
572 if (sharp_zclient_create(session
) != 0) {
573 vty_out(vty
, "%% Client session error\n");
580 DEFPY (remove_session
,
582 "sharp remove session (1-1024)",
583 "Sharp Routing Protocol\n"
585 "Remove a test session\n"
588 sharp_zclient_delete(session
);
594 "sharp send opaque type (1-255) (1-1000)$count",
596 "Send messages for testing\n"
597 "Send opaque messages\n"
598 "Type code to send\n"
599 "Type code to send\n"
600 "Number of messages to send\n")
602 sharp_opaque_send(type
, 0, 0, 0, count
);
606 DEFPY (send_opaque_unicast
,
607 send_opaque_unicast_cmd
,
608 "sharp send opaque unicast type (1-255) \
609 " FRR_IP_REDIST_STR_ZEBRA
"$proto_str \
610 [{instance (0-1000) | session (1-1000)}] (1-1000)$count",
612 "Send messages for testing\n"
613 "Send opaque messages\n"
614 "Send unicast messages\n"
615 "Type code to send\n"
616 "Type code to send\n"
617 FRR_IP_REDIST_HELP_STR_ZEBRA
622 "Number of messages to send\n")
626 proto
= proto_redistnum(AFI_IP
, proto_str
);
628 sharp_opaque_send(type
, proto
, instance
, session
, count
);
633 DEFPY (send_opaque_reg
,
635 "sharp send opaque <reg$reg | unreg> \
636 " FRR_IP_REDIST_STR_ZEBRA
"$proto_str \
637 [{instance (0-1000) | session (1-1000)}] type (1-1000)",
639 "Send messages for testing\n"
640 "Send opaque messages\n"
641 "Send opaque registration\n"
642 "Send opaque unregistration\n"
643 FRR_IP_REDIST_HELP_STR_ZEBRA
648 "Opaque sub-type code\n"
649 "Opaque sub-type code\n")
653 proto
= proto_redistnum(AFI_IP
, proto_str
);
655 sharp_opaque_reg_send((reg
!= NULL
), proto
, instance
, session
, type
);
659 DEFPY (neigh_discover
,
661 "sharp neigh discover [vrf NAME$vrf_name] <A.B.C.D$dst4|X:X::X:X$dst6> IFNAME$ifname",
663 "Discover neighbours\n"
664 "Send an ARP/NDP request\n"
666 "v4 Destination address\n"
667 "v6 Destination address\n"
671 struct interface
*ifp
;
672 struct prefix prefix
;
674 memset(&prefix
, 0, sizeof(prefix
));
676 if (dst4
.s_addr
!= INADDR_ANY
) {
677 prefix
.family
= AF_INET
;
678 prefix
.prefixlen
= 32;
679 prefix
.u
.prefix4
= dst4
;
681 prefix
.family
= AF_INET6
;
682 prefix
.prefixlen
= 128;
683 prefix
.u
.prefix6
= dst6
;
686 vrf
= vrf_lookup_by_name(vrf_name
? vrf_name
: VRF_DEFAULT_NAME
);
688 vty_out(vty
, "The vrf NAME specified: %s does not exist\n",
689 vrf_name
? vrf_name
: VRF_DEFAULT_NAME
);
693 ifp
= if_lookup_by_name_vrf(ifname
, vrf
);
695 vty_out(vty
, "%% Can't find interface %s\n", ifname
);
699 sharp_zebra_send_arp(ifp
, &prefix
);
708 "Import Traffic Engineering\n")
710 sg
.ted
= ls_ted_new(1, "Sharp", 0);
711 sharp_zebra_register_te();
716 DEFUN (show_sharp_ted
,
718 "show sharp ted [<vertex [A.B.C.D]|edge [A.B.C.D]|subnet [A.B.C.D/M]>] [verbose|json]",
721 "Traffic Engineering Database\n"
723 "MPLS-TE router ID (as an IP address)\n"
725 "MPLS-TE Edge ID (as an IP address)\n"
727 "MPLS-TE Subnet ID (as an IP prefix)\n"
732 struct in_addr ip_addr
;
734 struct ls_vertex
*vertex
;
735 struct ls_edge
*edge
;
736 struct ls_subnet
*subnet
;
738 bool verbose
= false;
739 bool uj
= use_json(argc
, argv
);
740 json_object
*json
= NULL
;
742 if (sg
.ted
== NULL
) {
743 vty_out(vty
, "MPLS-TE import is not enabled\n");
748 json
= json_object_new_object();
750 if (argv
[argc
- 1]->arg
&& strmatch(argv
[argc
- 1]->text
, "verbose"))
753 if (argv_find(argv
, argc
, "vertex", &idx
)) {
755 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
756 if (!inet_aton(argv
[idx
+ 1]->arg
, &ip_addr
)) {
758 "Specified Router ID %s is invalid\n",
760 return CMD_WARNING_CONFIG_FAILED
;
762 /* Get the Vertex from the Link State Database */
763 key
= ((uint64_t)ip_addr
.s_addr
) & 0xffffffff;
764 vertex
= ls_find_vertex_by_key(sg
.ted
, key
);
766 vty_out(vty
, "No vertex found for ID %pI4\n",
774 ls_show_vertex(vertex
, vty
, json
, verbose
);
776 ls_show_vertices(sg
.ted
, vty
, json
, verbose
);
778 } else if (argv_find(argv
, argc
, "edge", &idx
)) {
780 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
781 if (!inet_aton(argv
[idx
]->arg
, &ip_addr
)) {
783 "Specified Edge ID %s is invalid\n",
785 return CMD_WARNING_CONFIG_FAILED
;
787 /* Get the Edge from the Link State Database */
788 key
= ((uint64_t)ip_addr
.s_addr
) & 0xffffffff;
789 edge
= ls_find_edge_by_key(sg
.ted
, key
);
791 vty_out(vty
, "No edge found for ID %pI4\n",
799 ls_show_edge(edge
, vty
, json
, verbose
);
801 ls_show_edges(sg
.ted
, vty
, json
, verbose
);
803 } else if (argv_find(argv
, argc
, "subnet", &idx
)) {
805 if (argv_find(argv
, argc
, "A.B.C.D/M", &idx
)) {
806 if (!str2prefix(argv
[idx
]->arg
, &pref
)) {
807 vty_out(vty
, "Invalid prefix format %s\n",
809 return CMD_WARNING_CONFIG_FAILED
;
811 /* Get the Subnet from the Link State Database */
812 subnet
= ls_find_subnet(sg
.ted
, pref
);
814 vty_out(vty
, "No subnet found for ID %pFX\n",
822 ls_show_subnet(subnet
, vty
, json
, verbose
);
824 ls_show_subnets(sg
.ted
, vty
, json
, verbose
);
827 /* Show the complete TED */
828 ls_show_ted(sg
.ted
, vty
, json
, verbose
);
833 json_object_to_json_string_ext(
834 json
, JSON_C_TO_STRING_PRETTY
));
835 json_object_free(json
);
840 void sharp_vty_init(void)
842 install_element(ENABLE_NODE
, &install_routes_data_dump_cmd
);
843 install_element(ENABLE_NODE
, &install_routes_cmd
);
844 install_element(ENABLE_NODE
, &remove_routes_cmd
);
845 install_element(ENABLE_NODE
, &vrf_label_cmd
);
846 install_element(ENABLE_NODE
, &sharp_nht_data_dump_cmd
);
847 install_element(ENABLE_NODE
, &watch_nexthop_v6_cmd
);
848 install_element(ENABLE_NODE
, &watch_nexthop_v4_cmd
);
849 install_element(ENABLE_NODE
, &sharp_lsp_prefix_v4_cmd
);
850 install_element(ENABLE_NODE
, &sharp_remove_lsp_prefix_v4_cmd
);
851 install_element(ENABLE_NODE
, &logpump_cmd
);
852 install_element(ENABLE_NODE
, &create_session_cmd
);
853 install_element(ENABLE_NODE
, &remove_session_cmd
);
854 install_element(ENABLE_NODE
, &send_opaque_cmd
);
855 install_element(ENABLE_NODE
, &send_opaque_unicast_cmd
);
856 install_element(ENABLE_NODE
, &send_opaque_reg_cmd
);
857 install_element(ENABLE_NODE
, &neigh_discover_cmd
);
858 install_element(ENABLE_NODE
, &import_te_cmd
);
860 install_element(ENABLE_NODE
, &show_debugging_sharpd_cmd
);
861 install_element(ENABLE_NODE
, &show_sharp_ted_cmd
);