]> git.proxmox.com Git - mirror_frr.git/blob - sharpd/sharp_vty.c
Merge pull request #3790 from qlyoung/doc-add-buildessential-libsystemdev-docs
[mirror_frr.git] / sharpd / sharp_vty.c
1 /*
2 * SHARP - vty code
3 * Copyright (C) Cumulus Networks, Inc.
4 * Donald Sharp
5 *
6 * This file is part of FRR.
7 *
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
11 * later version.
12 *
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.
17 *
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
21 */
22 #include <zebra.h>
23
24 #include "vty.h"
25 #include "command.h"
26 #include "prefix.h"
27 #include "nexthop.h"
28 #include "log.h"
29 #include "vrf.h"
30 #include "zclient.h"
31 #include "nexthop_group.h"
32
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"
39 #endif
40
41 DEFPY(watch_nexthop_v6, watch_nexthop_v6_cmd,
42 "sharp watch <nexthop$n|import$import> X:X::X:X$nhop [connected$connected]",
43 "Sharp routing Protocol\n"
44 "Watch for changes\n"
45 "Watch for nexthop changes\n"
46 "Watch for import check changes\n"
47 "The v6 nexthop to signal for watching\n"
48 "Should the route be connected\n")
49 {
50 struct prefix p;
51 bool type_import;
52
53
54 if (n)
55 type_import = false;
56 else
57 type_import = true;
58
59 memset(&p, 0, sizeof(p));
60
61 p.prefixlen = 128;
62 memcpy(&p.u.prefix6, &nhop, 16);
63 p.family = AF_INET6;
64
65 sharp_nh_tracker_get(&p);
66 sharp_zebra_nexthop_watch(&p, type_import, true, !!connected);
67
68 return CMD_SUCCESS;
69 }
70
71 DEFPY(watch_nexthop_v4, watch_nexthop_v4_cmd,
72 "sharp watch <nexthop$n|import$import> A.B.C.D$nhop [connected$connected]",
73 "Sharp routing Protocol\n"
74 "Watch for changes\n"
75 "Watch for nexthop changes\n"
76 "Watch for import check changes\n"
77 "The v4 nexthop to signal for watching\n"
78 "Should the route be connected\n")
79 {
80 struct prefix p;
81 bool type_import;
82
83 memset(&p, 0, sizeof(p));
84
85 if (n)
86 type_import = false;
87 else
88 type_import = true;
89
90 p.prefixlen = 32;
91 p.u.prefix4 = nhop;
92 p.family = AF_INET;
93
94 sharp_nh_tracker_get(&p);
95 sharp_zebra_nexthop_watch(&p, type_import, true, !!connected);
96
97 return CMD_SUCCESS;
98 }
99
100 DEFPY(sharp_nht_data_dump,
101 sharp_nht_data_dump_cmd,
102 "sharp data nexthop",
103 "Sharp routing Protocol\n"
104 "Nexthop information\n"
105 "Data Dump\n")
106 {
107 sharp_nh_tracker_dump(vty);
108
109 return CMD_SUCCESS;
110 }
111
112 DEFPY (install_routes_data_dump,
113 install_routes_data_dump_cmd,
114 "sharp data route",
115 "Sharp routing Protocol\n"
116 "Data about what is going on\n"
117 "Route Install/Removal Information\n")
118 {
119 char buf[PREFIX_STRLEN];
120 struct timeval r;
121
122 timersub(&sg.r.t_end, &sg.r.t_start, &r);
123 vty_out(vty, "Prefix: %s Total: %u %u %u Time: %ld.%ld\n",
124 prefix2str(&sg.r.orig_prefix, buf, sizeof(buf)),
125 sg.r.total_routes,
126 sg.r.installed_routes,
127 sg.r.removed_routes,
128 r.tv_sec, r.tv_usec);
129
130 return CMD_SUCCESS;
131 }
132
133 DEFPY (install_routes,
134 install_routes_cmd,
135 "sharp install routes <A.B.C.D$start4|X:X::X:X$start6> <nexthop <A.B.C.D$nexthop4|X:X::X:X$nexthop6>|nexthop-group NAME$nexthop_group> (1-1000000)$routes [instance (0-255)$instance] [repeat (2-1000)$rpt]",
136 "Sharp routing Protocol\n"
137 "install some routes\n"
138 "Routes to install\n"
139 "v4 Address to start /32 generation at\n"
140 "v6 Address to start /32 generation at\n"
141 "Nexthop to use(Can be an IPv4 or IPv6 address)\n"
142 "V4 Nexthop address to use\n"
143 "V6 Nexthop address to use\n"
144 "Nexthop-Group to use\n"
145 "The Name of the nexthop-group\n"
146 "How many to create\n"
147 "Instance to use\n"
148 "Instance\n"
149 "Should we repeat this command\n"
150 "How many times to repeat this command\n")
151 {
152 struct prefix prefix;
153 uint32_t rts;
154
155 sg.r.total_routes = routes;
156 sg.r.installed_routes = 0;
157
158 if (rpt >= 2)
159 sg.r.repeat = rpt * 2;
160 else
161 sg.r.repeat = 0;
162
163 memset(&prefix, 0, sizeof(prefix));
164 memset(&sg.r.orig_prefix, 0, sizeof(sg.r.orig_prefix));
165 memset(&sg.r.nhop, 0, sizeof(sg.r.nhop));
166 memset(&sg.r.nhop_group, 0, sizeof(sg.r.nhop_group));
167
168 if (start4.s_addr != 0) {
169 prefix.family = AF_INET;
170 prefix.prefixlen = 32;
171 prefix.u.prefix4 = start4;
172 } else {
173 prefix.family = AF_INET6;
174 prefix.prefixlen = 128;
175 prefix.u.prefix6 = start6;
176 }
177 sg.r.orig_prefix = prefix;
178
179 if (nexthop_group) {
180 struct nexthop_group_cmd *nhgc = nhgc_find(nexthop_group);
181 if (!nhgc) {
182 vty_out(vty,
183 "Specified Nexthop Group: %s does not exist\n",
184 nexthop_group);
185 return CMD_WARNING;
186 }
187
188 sg.r.nhop_group.nexthop = nhgc->nhg.nexthop;
189 } else {
190 if (nexthop4.s_addr != INADDR_ANY) {
191 sg.r.nhop.gate.ipv4 = nexthop4;
192 sg.r.nhop.type = NEXTHOP_TYPE_IPV4;
193 } else {
194 sg.r.nhop.gate.ipv6 = nexthop6;
195 sg.r.nhop.type = NEXTHOP_TYPE_IPV6;
196 }
197
198 sg.r.nhop_group.nexthop = &sg.r.nhop;
199 }
200
201 sg.r.inst = instance;
202 rts = routes;
203 sharp_install_routes_helper(&prefix, sg.r.inst, &sg.r.nhop_group, rts);
204
205 return CMD_SUCCESS;
206 }
207
208 DEFPY(vrf_label, vrf_label_cmd,
209 "sharp label <ip$ipv4|ipv6$ipv6> vrf NAME$name label (0-100000)$label",
210 "Sharp Routing Protocol\n"
211 "Give a vrf a label\n"
212 "Pop and forward for IPv4\n"
213 "Pop and forward for IPv6\n"
214 VRF_CMD_HELP_STR
215 "The label to use, 0 specifies remove the label installed from previous\n"
216 "Specified range to use\n")
217 {
218 struct vrf *vrf;
219 afi_t afi = (ipv4) ? AFI_IP : AFI_IP6;
220
221 if (strcmp(name, "default") == 0)
222 vrf = vrf_lookup_by_id(VRF_DEFAULT);
223 else
224 vrf = vrf_lookup_by_name(name);
225
226 if (!vrf) {
227 vty_out(vty, "Unable to find vrf you silly head");
228 return CMD_WARNING_CONFIG_FAILED;
229 }
230
231 if (label == 0)
232 label = MPLS_LABEL_NONE;
233
234 vrf_label_add(vrf->vrf_id, afi, label);
235 return CMD_SUCCESS;
236 }
237
238 DEFPY (remove_routes,
239 remove_routes_cmd,
240 "sharp remove routes <A.B.C.D$start4|X:X::X:X$start6> (1-1000000)$routes [instance (0-255)$instance]",
241 "Sharp Routing Protocol\n"
242 "Remove some routes\n"
243 "Routes to remove\n"
244 "v4 Starting spot\n"
245 "v6 Starting spot\n"
246 "Routes to uninstall\n"
247 "instance to use\n"
248 "Value of instance\n")
249 {
250 struct prefix prefix;
251
252 sg.r.total_routes = routes;
253 sg.r.removed_routes = 0;
254 uint32_t rts;
255
256 memset(&prefix, 0, sizeof(prefix));
257
258 if (start4.s_addr != 0) {
259 prefix.family = AF_INET;
260 prefix.prefixlen = 32;
261 prefix.u.prefix4 = start4;
262 } else {
263 prefix.family = AF_INET6;
264 prefix.prefixlen = 128;
265 prefix.u.prefix6 = start6;
266 }
267
268 sg.r.inst = instance;
269 rts = routes;
270 sharp_remove_routes_helper(&prefix, sg.r.inst, rts);
271
272 return CMD_SUCCESS;
273 }
274
275 DEFUN_NOSH (show_debugging_sharpd,
276 show_debugging_sharpd_cmd,
277 "show debugging [sharp]",
278 SHOW_STR
279 DEBUG_STR
280 "Sharp Information\n")
281 {
282 vty_out(vty, "Sharp debugging status\n");
283
284 return CMD_SUCCESS;
285 }
286
287 void sharp_vty_init(void)
288 {
289 install_element(ENABLE_NODE, &install_routes_data_dump_cmd);
290 install_element(ENABLE_NODE, &install_routes_cmd);
291 install_element(ENABLE_NODE, &remove_routes_cmd);
292 install_element(ENABLE_NODE, &vrf_label_cmd);
293 install_element(ENABLE_NODE, &sharp_nht_data_dump_cmd);
294 install_element(ENABLE_NODE, &watch_nexthop_v6_cmd);
295 install_element(ENABLE_NODE, &watch_nexthop_v4_cmd);
296
297 install_element(VIEW_NODE, &show_debugging_sharpd_cmd);
298
299 return;
300 }