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"
33 #include "sharpd/sharp_globals.h"
34 #include "sharpd/sharp_zebra.h"
35 #include "sharpd/sharp_nht.h"
36 #include "sharpd/sharp_vty.h"
37 #ifndef VTYSH_EXTRACT_PL
38 #include "sharpd/sharp_vty_clippy.c"
41 DEFPY(watch_nexthop_v6
, watch_nexthop_v6_cmd
,
42 "sharp watch [vrf NAME$vrf_name] <nexthop$n X:X::X:X$nhop|import$import X:X::X:X/M$inhop> [connected$connected]",
43 "Sharp routing Protocol\n"
45 "The vrf we would like to watch if non-default\n"
46 "The NAME of the vrf\n"
47 "Watch for nexthop changes\n"
48 "The v6 nexthop to signal for watching\n"
49 "Watch for import check changes\n"
50 "The v6 prefix to signal for watching\n"
51 "Should the route be connected\n")
58 vrf_name
= VRF_DEFAULT_NAME
;
59 vrf
= vrf_lookup_by_name(vrf_name
);
61 vty_out(vty
, "The vrf NAME specified: %s does not exist\n",
66 memset(&p
, 0, sizeof(p
));
71 memcpy(&p
.u
.prefix6
, &nhop
, 16);
75 p
= *(const struct prefix
*)inhop
;
78 sharp_nh_tracker_get(&p
);
79 sharp_zebra_nexthop_watch(&p
, vrf
->vrf_id
, type_import
,
85 DEFPY(watch_nexthop_v4
, watch_nexthop_v4_cmd
,
86 "sharp watch [vrf NAME$vrf_name] <nexthop$n A.B.C.D$nhop|import$import A.B.C.D/M$inhop> [connected$connected]",
87 "Sharp routing Protocol\n"
89 "The vrf we would like to watch if non-default\n"
90 "The NAME of the vrf\n"
91 "Watch for nexthop changes\n"
92 "The v4 address to signal for watching\n"
93 "Watch for import check changes\n"
94 "The v4 prefix for import check to watch\n"
95 "Should the route be connected\n")
102 vrf_name
= VRF_DEFAULT_NAME
;
103 vrf
= vrf_lookup_by_name(vrf_name
);
105 vty_out(vty
, "The vrf NAME specified: %s does not exist\n",
110 memset(&p
, 0, sizeof(p
));
120 p
= *(const struct prefix
*)inhop
;
123 sharp_nh_tracker_get(&p
);
124 sharp_zebra_nexthop_watch(&p
, vrf
->vrf_id
, type_import
,
130 DEFPY(sharp_nht_data_dump
,
131 sharp_nht_data_dump_cmd
,
132 "sharp data nexthop",
133 "Sharp routing Protocol\n"
134 "Nexthop information\n"
137 sharp_nh_tracker_dump(vty
);
142 DEFPY (install_routes_data_dump
,
143 install_routes_data_dump_cmd
,
145 "Sharp routing Protocol\n"
146 "Data about what is going on\n"
147 "Route Install/Removal Information\n")
149 char buf
[PREFIX_STRLEN
];
152 timersub(&sg
.r
.t_end
, &sg
.r
.t_start
, &r
);
153 vty_out(vty
, "Prefix: %s Total: %u %u %u Time: %jd.%ld\n",
154 prefix2str(&sg
.r
.orig_prefix
, buf
, sizeof(buf
)),
156 sg
.r
.installed_routes
,
158 (intmax_t)r
.tv_sec
, (long)r
.tv_usec
);
163 DEFPY (install_routes
,
165 "sharp install routes [vrf NAME$vrf_name] <A.B.C.D$start4|X:X::X:X$start6> <nexthop <A.B.C.D$nexthop4|X:X::X:X$nexthop6>|nexthop-group NHGNAME$nexthop_group> (1-1000000)$routes [instance (0-255)$instance] [repeat (2-1000)$rpt]",
166 "Sharp routing Protocol\n"
167 "install some routes\n"
168 "Routes to install\n"
169 "The vrf we would like to install into if non-default\n"
170 "The NAME of the vrf\n"
171 "v4 Address to start /32 generation at\n"
172 "v6 Address to start /32 generation at\n"
173 "Nexthop to use(Can be an IPv4 or IPv6 address)\n"
174 "V4 Nexthop address to use\n"
175 "V6 Nexthop address to use\n"
176 "Nexthop-Group to use\n"
177 "The Name of the nexthop-group\n"
178 "How many to create\n"
181 "Should we repeat this command\n"
182 "How many times to repeat this command\n")
185 struct prefix prefix
;
188 sg
.r
.total_routes
= routes
;
189 sg
.r
.installed_routes
= 0;
192 sg
.r
.repeat
= rpt
* 2;
196 memset(&prefix
, 0, sizeof(prefix
));
197 memset(&sg
.r
.orig_prefix
, 0, sizeof(sg
.r
.orig_prefix
));
198 memset(&sg
.r
.nhop
, 0, sizeof(sg
.r
.nhop
));
199 memset(&sg
.r
.nhop_group
, 0, sizeof(sg
.r
.nhop_group
));
201 if (start4
.s_addr
!= 0) {
202 prefix
.family
= AF_INET
;
203 prefix
.prefixlen
= 32;
204 prefix
.u
.prefix4
= start4
;
206 prefix
.family
= AF_INET6
;
207 prefix
.prefixlen
= 128;
208 prefix
.u
.prefix6
= start6
;
210 sg
.r
.orig_prefix
= prefix
;
213 vrf_name
= VRF_DEFAULT_NAME
;
215 vrf
= vrf_lookup_by_name(vrf_name
);
217 vty_out(vty
, "The vrf NAME specified: %s does not exist\n",
223 struct nexthop_group_cmd
*nhgc
= nhgc_find(nexthop_group
);
226 "Specified Nexthop Group: %s does not exist\n",
231 sg
.r
.nhop_group
.nexthop
= nhgc
->nhg
.nexthop
;
233 if (nexthop4
.s_addr
!= INADDR_ANY
) {
234 sg
.r
.nhop
.gate
.ipv4
= nexthop4
;
235 sg
.r
.nhop
.type
= NEXTHOP_TYPE_IPV4
;
237 sg
.r
.nhop
.gate
.ipv6
= nexthop6
;
238 sg
.r
.nhop
.type
= NEXTHOP_TYPE_IPV6
;
241 sg
.r
.nhop
.vrf_id
= vrf
->vrf_id
;
242 sg
.r
.nhop_group
.nexthop
= &sg
.r
.nhop
;
245 sg
.r
.inst
= instance
;
246 sg
.r
.vrf_id
= vrf
->vrf_id
;
248 sharp_install_routes_helper(&prefix
, sg
.r
.vrf_id
,
249 sg
.r
.inst
, &sg
.r
.nhop_group
, rts
);
254 DEFPY(vrf_label
, vrf_label_cmd
,
255 "sharp label <ip$ipv4|ipv6$ipv6> vrf NAME$vrf_name label (0-100000)$label",
256 "Sharp Routing Protocol\n"
257 "Give a vrf a label\n"
258 "Pop and forward for IPv4\n"
259 "Pop and forward for IPv6\n"
261 "The label to use, 0 specifies remove the label installed from previous\n"
262 "Specified range to use\n")
265 afi_t afi
= (ipv4
) ? AFI_IP
: AFI_IP6
;
267 if (strcmp(vrf_name
, "default") == 0)
268 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
270 vrf
= vrf_lookup_by_name(vrf_name
);
273 vty_out(vty
, "Unable to find vrf you silly head");
274 return CMD_WARNING_CONFIG_FAILED
;
278 label
= MPLS_LABEL_NONE
;
280 vrf_label_add(vrf
->vrf_id
, afi
, label
);
284 DEFPY (remove_routes
,
286 "sharp remove routes [vrf NAME$vrf_name] <A.B.C.D$start4|X:X::X:X$start6> (1-1000000)$routes [instance (0-255)$instance]",
287 "Sharp Routing Protocol\n"
288 "Remove some routes\n"
290 "The vrf we would like to remove from if non-default\n"
291 "The NAME of the vrf\n"
294 "Routes to uninstall\n"
296 "Value of instance\n")
299 struct prefix prefix
;
301 sg
.r
.total_routes
= routes
;
302 sg
.r
.removed_routes
= 0;
305 memset(&prefix
, 0, sizeof(prefix
));
307 if (start4
.s_addr
!= 0) {
308 prefix
.family
= AF_INET
;
309 prefix
.prefixlen
= 32;
310 prefix
.u
.prefix4
= start4
;
312 prefix
.family
= AF_INET6
;
313 prefix
.prefixlen
= 128;
314 prefix
.u
.prefix6
= start6
;
317 vrf
= vrf_lookup_by_name(vrf_name
? vrf_name
: VRF_DEFAULT_NAME
);
319 vty_out(vty
, "The vrf NAME specified: %s does not exist\n",
320 vrf_name
? vrf_name
: VRF_DEFAULT_NAME
);
324 sg
.r
.inst
= instance
;
325 sg
.r
.vrf_id
= vrf
->vrf_id
;
327 sharp_remove_routes_helper(&prefix
, sg
.r
.vrf_id
,
333 DEFUN_NOSH (show_debugging_sharpd
,
334 show_debugging_sharpd_cmd
,
335 "show debugging [sharp]",
338 "Sharp Information\n")
340 vty_out(vty
, "Sharp debugging status\n");
345 void sharp_vty_init(void)
347 install_element(ENABLE_NODE
, &install_routes_data_dump_cmd
);
348 install_element(ENABLE_NODE
, &install_routes_cmd
);
349 install_element(ENABLE_NODE
, &remove_routes_cmd
);
350 install_element(ENABLE_NODE
, &vrf_label_cmd
);
351 install_element(ENABLE_NODE
, &sharp_nht_data_dump_cmd
);
352 install_element(ENABLE_NODE
, &watch_nexthop_v6_cmd
);
353 install_element(ENABLE_NODE
, &watch_nexthop_v4_cmd
);
355 install_element(VIEW_NODE
, &show_debugging_sharpd_cmd
);