Line data Source code
1 : /*
2 : * Copyright (c) 2019 Cisco and/or its affiliates.
3 : * Licensed under the Apache License, Version 2.0 (the "License");
4 : * you may not use this file except in compliance with the License.
5 : * You may obtain a copy of the License at:
6 : *
7 : * http://www.apache.org/licenses/LICENSE-2.0
8 : *
9 : * Unless required by applicable law or agreed to in writing, software
10 : * distributed under the License is distributed on an "AS IS" BASIS,
11 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : * See the License for the specific language governing permissions and
13 : * limitations under the License.
14 : */
15 :
16 : #include <vnet/teib/teib.h>
17 :
18 : static clib_error_t *
19 0 : teib_add (vlib_main_t * vm,
20 : unformat_input_t * input, vlib_cli_command_t * cmd)
21 : {
22 0 : unformat_input_t _line_input, *line_input = &_line_input;
23 0 : ip_address_t peer = ip_address_initializer;
24 0 : ip_address_t nh = ip_address_initializer;
25 : u32 sw_if_index, nh_table_id;
26 0 : clib_error_t *error = NULL;
27 : int rv;
28 :
29 0 : sw_if_index = ~0;
30 0 : nh_table_id = 0;
31 :
32 : /* Get a line of input. */
33 0 : if (!unformat_user (input, unformat_line_input, line_input))
34 0 : return 0;
35 :
36 0 : while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
37 : {
38 0 : if (unformat (line_input, "%U", unformat_vnet_sw_interface,
39 : vnet_get_main (), &sw_if_index))
40 : ;
41 0 : else if (unformat (line_input, "peer %U", unformat_ip_address, &peer))
42 : ;
43 0 : else if (unformat (line_input, "nh-table-id %d", &nh_table_id))
44 : ;
45 0 : else if (unformat (line_input, "nh %U", unformat_ip_address, &nh))
46 : ;
47 : else
48 : {
49 0 : error = clib_error_return (0, "unknown input `%U'",
50 : format_unformat_error, line_input);
51 0 : goto done;
52 : }
53 : }
54 :
55 0 : if (~0 == sw_if_index)
56 : {
57 0 : error = clib_error_return (0, "interface required'",
58 : format_unformat_error, line_input);
59 0 : goto done;
60 : }
61 0 : if (ip_address_is_zero (&peer))
62 : {
63 0 : error = clib_error_return (0, "peer required'",
64 : format_unformat_error, line_input);
65 0 : goto done;
66 : }
67 0 : if (ip_address_is_zero (&nh))
68 : {
69 0 : error = clib_error_return (0, "next-hop required'",
70 : format_unformat_error, line_input);
71 0 : goto done;
72 : }
73 :
74 0 : rv = teib_entry_add (sw_if_index, &peer, nh_table_id, &nh);
75 :
76 0 : if (rv)
77 : {
78 0 : error = clib_error_return_code (NULL, rv, 0, "TEIB error",
79 : format_unformat_error, line_input);
80 : }
81 :
82 0 : done:
83 0 : unformat_free (line_input);
84 :
85 0 : return error;
86 : }
87 :
88 : /* *INDENT-OFF* */
89 272887 : VLIB_CLI_COMMAND (teib_create_command, static) = {
90 : .path = "create teib",
91 : .short_help = "create teib <interface> peer <addr> nh <addr> [nh-table-id <ID>]",
92 : .function = teib_add,
93 : };
94 : /* *INDENT-ON* */
95 :
96 : static clib_error_t *
97 0 : teib_del (vlib_main_t * vm,
98 : unformat_input_t * input, vlib_cli_command_t * cmd)
99 : {
100 0 : unformat_input_t _line_input, *line_input = &_line_input;
101 0 : ip_address_t peer = ip_address_initializer;
102 0 : clib_error_t *error = NULL;
103 : u32 sw_if_index;
104 : int rv;
105 :
106 0 : sw_if_index = ~0;
107 :
108 : /* Get a line of input. */
109 0 : if (!unformat_user (input, unformat_line_input, line_input))
110 0 : return 0;
111 :
112 0 : while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
113 : {
114 0 : if (unformat (line_input, "%U", unformat_vnet_sw_interface,
115 : vnet_get_main (), &sw_if_index))
116 : ;
117 0 : else if (unformat (line_input, "peer %U", unformat_ip_address, &peer))
118 : ;
119 : else
120 : {
121 0 : error = clib_error_return (0, "unknown input `%U'",
122 : format_unformat_error, line_input);
123 0 : goto done;
124 : }
125 : }
126 :
127 0 : if (~0 == sw_if_index)
128 : {
129 0 : error = clib_error_return (0, "interface required'",
130 : format_unformat_error, line_input);
131 : }
132 0 : if (ip_address_is_zero (&peer))
133 : {
134 0 : error = clib_error_return (0, "peer required'",
135 : format_unformat_error, line_input);
136 0 : goto done;
137 : }
138 :
139 0 : rv = teib_entry_del (sw_if_index, &peer);
140 :
141 0 : if (rv)
142 : {
143 0 : error = clib_error_return_code (NULL, rv, 0, "TEIB error",
144 : format_unformat_error, line_input);
145 : }
146 :
147 0 : done:
148 0 : unformat_free (line_input);
149 :
150 0 : return error;
151 : }
152 :
153 : /* *INDENT-OFF* */
154 272887 : VLIB_CLI_COMMAND (teib_delete_command, static) = {
155 : .path = "delete teib",
156 : .short_help = "delete teib <interface> peer <addr>",
157 : .function = teib_del,
158 : };
159 : /* *INDENT-ON* */
160 :
161 : static walk_rc_t
162 0 : teib_show_one (index_t nei, void *ctx)
163 : {
164 0 : vlib_cli_output (ctx, "%U", format_teib_entry, nei);
165 :
166 0 : return (WALK_CONTINUE);
167 : }
168 :
169 :
170 : static clib_error_t *
171 0 : teib_show (vlib_main_t * vm,
172 : unformat_input_t * input, vlib_cli_command_t * cmd)
173 : {
174 0 : teib_walk (teib_show_one, vm);
175 0 : return (NULL);
176 : }
177 :
178 : /* *INDENT-OFF* */
179 272887 : VLIB_CLI_COMMAND (teib_show_command, static) = {
180 : .path = "show teib",
181 : .short_help = "show teib",
182 : .function = teib_show,
183 : };
184 : /* *INDENT-ON* */
185 :
186 : /*
187 : * fd.io coding-style-patch-verification: ON
188 : *
189 : * Local Variables:
190 : * eval: (c-set-style "gnu")
191 : * End:
192 : */
|