Line data Source code
1 : /*
2 : * Copyright (c) 2016 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/vnet.h>
17 : #include <vnet/mpls/mpls.h>
18 :
19 : #include <vnet/bier/bier_table.h>
20 : #include <vnet/bier/bier_types.h>
21 : #include <vnet/bier/bier_update.h>
22 :
23 : clib_error_t *
24 0 : vnet_bier_table_cmd (vlib_main_t * vm,
25 : unformat_input_t * input,
26 : vlib_cli_command_t * cmd)
27 : {
28 : u32 hdr_len, local_label;
29 0 : clib_error_t * error = 0;
30 0 : bier_table_id_t bti = {
31 : .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN,
32 : };
33 0 : u32 is_add = 0;
34 :
35 0 : local_label = MPLS_LABEL_INVALID;
36 :
37 0 : while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
38 0 : if (unformat (input, "del")) {
39 0 : is_add = 0;
40 0 : } else if (unformat (input, "add")) {
41 0 : is_add = 1;
42 0 : } else if (unformat (input, "sd %d", &bti.bti_sub_domain)) {
43 0 : } else if (unformat (input, "set %d", &bti.bti_set)) {
44 0 : } else if (unformat (input, "bsl %d", &hdr_len)) {
45 0 : } else if (unformat (input, "mpls %d", &local_label)) {
46 : } else {
47 0 : error = unformat_parse_error (input);
48 0 : goto done;
49 : }
50 : }
51 :
52 0 : bti.bti_hdr_len = bier_hdr_bit_len_to_id(hdr_len);
53 : // FIXME
54 0 : bti.bti_type = BIER_TABLE_MPLS_SPF;
55 :
56 0 : if (is_add)
57 : {
58 0 : bier_table_add_or_lock(&bti, local_label);
59 : }
60 : else
61 : {
62 0 : bier_table_unlock(&bti);
63 : }
64 :
65 0 : done:
66 0 : return (error);
67 : }
68 :
69 285289 : VLIB_CLI_COMMAND (bier_table_command) = {
70 : .path = "bier table",
71 : .short_help = "bier table [add|del] sd <sub-domain> set <SET> bsl <bit-string-length> [mpls <label>]",
72 : .function = vnet_bier_table_cmd,
73 : };
74 :
75 : clib_error_t *
76 0 : vnet_bier_route_cmd (vlib_main_t * vm,
77 : unformat_input_t * input,
78 : vlib_cli_command_t * cmd)
79 : {
80 0 : clib_error_t * error = NULL;
81 0 : fib_route_path_t *brps = NULL, brp = {
82 : .frp_flags = FIB_ROUTE_PATH_BIER_FMASK,
83 : };
84 : u32 hdr_len, payload_proto;
85 0 : bier_table_id_t bti = {
86 : .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN,
87 : };
88 : bier_bp_t bp;
89 0 : u32 add = 1;
90 :
91 0 : payload_proto = DPO_PROTO_BIER;
92 :
93 0 : while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
94 0 : if (unformat (input, "del")) {
95 0 : add = 0;
96 0 : } else if (unformat (input, "add")) {
97 0 : add = 1;
98 0 : } else if (unformat (input, "sd %d", &bti.bti_sub_domain)) {
99 0 : } else if (unformat (input, "set %d", &bti.bti_set)) {
100 0 : } else if (unformat (input, "bsl %d", &hdr_len)) {
101 0 : } else if (unformat (input, "bp %d", &bp)) {
102 0 : } else if (unformat (input, "via %U",
103 : unformat_fib_route_path,
104 : &brp, &payload_proto)) {
105 : } else {
106 0 : error = unformat_parse_error (input);
107 0 : goto done;
108 : }
109 : }
110 :
111 0 : vec_add1(brps, brp);
112 0 : bti.bti_hdr_len = bier_hdr_bit_len_to_id(hdr_len);
113 : // FIXME
114 0 : bti.bti_type = BIER_TABLE_MPLS_SPF;
115 :
116 0 : if (add)
117 : {
118 0 : bier_table_route_path_add(&bti, bp, brps);
119 : }
120 : else
121 : {
122 0 : bier_table_route_path_remove(&bti, bp, brps);
123 : }
124 :
125 0 : done:
126 0 : vec_free(brps);
127 0 : return (error);
128 : }
129 :
130 285289 : VLIB_CLI_COMMAND (bier_route_command) = {
131 : .path = "bier route",
132 : .short_help = "bier route [add|del] sd <sud-domain> set <set> bsl <bit-string-length> bp <bit-position> via [next-hop-address] [next-hop-interface] [next-hop-table <value>] [weight <value>] [preference <value>] [udp-encap-id <value>] [ip4-lookup-in-table <value>] [ip6-lookup-in-table <value>] [mpls-lookup-in-table <value>] [resolve-via-host] [resolve-via-connected] [rx-ip4 <interface>] [out-labels <value value value>]",
133 : .function = vnet_bier_route_cmd,
134 : };
135 :
136 : static clib_error_t *
137 0 : show_bier_fib_command_fn (vlib_main_t * vm,
138 : unformat_input_t * input,
139 : vlib_cli_command_t * cmd)
140 : {
141 : bier_show_flags_t flags;
142 : index_t bti, bei;
143 : bier_bp_t bp;
144 :
145 0 : bp = BIER_BP_INVALID;
146 0 : bti = bei = INDEX_INVALID;
147 0 : flags = BIER_SHOW_BRIEF;
148 :
149 0 : while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
150 0 : if (unformat (input, "%d %d", &bti, &bp))
151 : {
152 0 : flags = BIER_SHOW_DETAIL;
153 : }
154 0 : else if (unformat (input, "%d", &bti))
155 : {
156 0 : flags = BIER_SHOW_DETAIL;
157 : }
158 : else
159 : {
160 0 : break;
161 : }
162 : }
163 :
164 0 : if (INDEX_INVALID == bti)
165 : {
166 0 : bier_table_show_all(vm, flags);
167 : }
168 : else
169 : {
170 0 : if (!pool_is_free_index(bier_table_pool, bti))
171 : {
172 0 : if (BIER_BP_INVALID == bp)
173 : {
174 0 : vlib_cli_output (vm, "%U", format_bier_table, bti, flags);
175 : }
176 : else
177 : {
178 0 : vlib_cli_output (vm, "%U", format_bier_table_entry, bti, bp);
179 : }
180 : }
181 : }
182 0 : return (NULL);
183 : }
184 :
185 285289 : VLIB_CLI_COMMAND (show_bier_fib_command, static) = {
186 : .path = "show bier fib",
187 : .short_help = "show bier fib [table-index] [bit-position]",
188 : .function = show_bier_fib_command_fn,
189 : };
|