Line data Source code
1 : /*
2 : *------------------------------------------------------------------
3 : * Copyright (c) 2018 Cisco and/or its affiliates.
4 : * Licensed under the Apache License, Version 2.0 (the "License");
5 : * you may not use this file except in compliance with the License.
6 : * You may obtain a copy of the License at:
7 : *
8 : * http://www.apache.org/licenses/LICENSE-2.0
9 : *
10 : * Unless required by applicable law or agreed to in writing, software
11 : * distributed under the License is distributed on an "AS IS" BASIS,
12 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 : * See the License for the specific language governing permissions and
14 : * limitations under the License.
15 : *------------------------------------------------------------------
16 : */
17 :
18 : #include <vlib/vlib.h>
19 : #include <vpp/api/types.h>
20 : #include <vat/vat.h>
21 :
22 : const vl_api_mac_address_t VL_API_ZERO_MAC_ADDRESS;
23 : const vl_api_address_t VL_API_ZERO_ADDRESS;
24 :
25 : u8 *
26 0 : format_vl_api_address_family (u8 * s, va_list * args)
27 : {
28 0 : vl_api_address_family_t af = va_arg (*args, int);
29 :
30 0 : if (ADDRESS_IP6 == af)
31 0 : s = format (s, "ip4");
32 : else
33 0 : s = format (s, "ip6");
34 :
35 0 : return s;
36 : }
37 :
38 : u8 *
39 0 : format_vl_api_address (u8 * s, va_list * args)
40 : {
41 0 : const vl_api_address_t *addr = va_arg (*args, vl_api_address_t *);
42 :
43 0 : if (ADDRESS_IP6 == addr->af)
44 0 : s = format (s, "%U", format_ip6_address, addr->un.ip6);
45 : else
46 0 : s = format (s, "%U", format_ip4_address, addr->un.ip4);
47 :
48 0 : return s;
49 : }
50 :
51 : u8 *
52 0 : format_vl_api_address_union (u8 * s, va_list * args)
53 : {
54 0 : const vl_api_address_union_t *addr =
55 : va_arg (*args, vl_api_address_union_t *);
56 0 : vl_api_address_family_t af = va_arg (*args, int);
57 :
58 0 : if (ADDRESS_IP6 == af)
59 0 : s = format (s, "%U", format_ip6_address, addr->ip6);
60 : else
61 0 : s = format (s, "%U", format_ip4_address, addr->ip4);
62 :
63 0 : return s;
64 : }
65 :
66 : u8 *
67 0 : format_vl_api_ip4_address (u8 * s, va_list * args)
68 : {
69 0 : const vl_api_ip4_address_t *addr = va_arg (*args, vl_api_ip4_address_t *);
70 :
71 0 : s = format (s, "%U", format_ip4_address, addr);
72 :
73 0 : return s;
74 : }
75 :
76 : u8 *
77 0 : format_vl_api_ip6_address (u8 * s, va_list * args)
78 : {
79 0 : const vl_api_ip6_address_t *addr = va_arg (*args, vl_api_ip6_address_t *);
80 :
81 0 : s = format (s, "%U", format_ip6_address, addr);
82 :
83 0 : return s;
84 : }
85 :
86 : u8 *
87 0 : format_vl_api_prefix (u8 * s, va_list * args)
88 : {
89 0 : const vl_api_prefix_t *pfx = va_arg (*args, vl_api_prefix_t *);
90 :
91 0 : s = format (s, "%U/%d", format_vl_api_address,
92 0 : &pfx->address, pfx->len);
93 :
94 0 : return s;
95 : }
96 :
97 : u8 *
98 0 : format_vl_api_mac_address (u8 * s, va_list * args)
99 : {
100 0 : vl_api_mac_address_t *mac = va_arg (*args, vl_api_mac_address_t *);
101 :
102 0 : return (format (s, "%U", format_ethernet_address, mac));
103 : }
104 :
105 : u8 *
106 0 : format_vl_api_version (u8 * s, va_list * args)
107 : {
108 0 : vl_api_version_t *ver = va_arg (*args, vl_api_version_t *);
109 0 : s = format(s, "%d.%d.%d", ver->major, ver->minor, ver->patch);
110 0 : if (ver->pre_release[0] != 0)
111 : {
112 0 : s = format(s, "-%v", ver->pre_release);
113 0 : if (ver->build_metadata[0] != 0)
114 0 : s = format(s, "+%v", ver->build_metadata);
115 : }
116 0 : return s;
117 : }
118 :
119 : uword
120 0 : unformat_vl_api_mac_address (unformat_input_t * input, va_list * args)
121 : {
122 0 : vl_api_mac_address_t *mac = va_arg (*args, vl_api_mac_address_t *);
123 :
124 0 : return (unformat (input, "%U",unformat_ethernet_address, mac));
125 : }
126 :
127 : uword
128 0 : unformat_vl_api_address (unformat_input_t * input, va_list * args)
129 : {
130 0 : vl_api_address_t *ip = va_arg (*args, vl_api_address_t *);
131 :
132 0 : if (unformat (input, "%U", unformat_ip4_address, &ip->un.ip4))
133 0 : ip->af = ADDRESS_IP4;
134 0 : else if (unformat (input, "%U", unformat_ip6_address, &ip->un.ip6))
135 0 : ip->af = ADDRESS_IP6;
136 : else
137 0 : return (0);
138 :
139 0 : return (1);
140 : }
141 :
142 : uword
143 0 : unformat_vl_api_address_family (unformat_input_t * input,
144 : va_list * args)
145 : {
146 0 : vl_api_address_family_t *af = va_arg (*args, vl_api_address_family_t *);
147 :
148 0 : if (unformat (input, "ip4") || unformat (input, "ipv4"))
149 0 : *af = ADDRESS_IP4;
150 0 : else if (unformat (input, "ip6") || unformat (input, "ipv6"))
151 0 : *af = ADDRESS_IP6;
152 : else
153 0 : return (0);
154 :
155 0 : return (1);
156 : }
157 :
158 : uword
159 0 : unformat_vl_api_ip4_address (unformat_input_t * input, va_list * args)
160 : {
161 0 : vl_api_ip4_address_t *ip = va_arg (*args, vl_api_ip4_address_t *);
162 :
163 0 : if (unformat (input, "%U", unformat_ip4_address, ip))
164 0 : return (1);
165 0 : return (0);
166 : }
167 :
168 : uword
169 0 : unformat_vl_api_ip6_address (unformat_input_t * input, va_list * args)
170 : {
171 0 : vl_api_ip6_address_t *ip = va_arg (*args, vl_api_ip6_address_t *);
172 :
173 0 : if (unformat (input, "%U", unformat_ip6_address, ip))
174 0 : return (1);
175 0 : return (0);
176 : }
177 :
178 : uword
179 0 : unformat_vl_api_prefix (unformat_input_t * input, va_list * args)
180 : {
181 0 : vl_api_prefix_t *pfx = va_arg (*args, vl_api_prefix_t *);
182 :
183 0 : if (unformat (input, "%U/%d", unformat_vl_api_address, &pfx->address,
184 : &pfx->len))
185 0 : return (1);
186 0 : return (0);
187 : }
188 :
189 : uword
190 0 : unformat_vl_api_mprefix (unformat_input_t * input, va_list * args)
191 : {
192 0 : vl_api_mprefix_t *pfx = va_arg (*args, vl_api_mprefix_t *);
193 :
194 0 : if (unformat (input, "%U/%d",
195 : unformat_vl_api_ip4_address, &pfx->grp_address.ip4,
196 : &pfx->grp_address_length))
197 0 : pfx->af = ADDRESS_IP4;
198 0 : else if (unformat (input, "%U/%d",
199 : unformat_vl_api_ip6_address, &pfx->grp_address.ip6,
200 : &pfx->grp_address_length))
201 0 : pfx->af = ADDRESS_IP6;
202 0 : else if (unformat (input, "%U %U",
203 : unformat_vl_api_ip4_address, &pfx->src_address.ip4,
204 : unformat_vl_api_ip4_address, &pfx->grp_address.ip4))
205 : {
206 0 : pfx->af = ADDRESS_IP4;
207 0 : pfx->grp_address_length = 64;
208 : }
209 0 : else if (unformat (input, "%U %U",
210 : unformat_vl_api_ip6_address, &pfx->src_address.ip6,
211 : unformat_vl_api_ip6_address, &pfx->grp_address.ip6))
212 : {
213 0 : pfx->af = ADDRESS_IP6;
214 0 : pfx->grp_address_length = 256;
215 : }
216 0 : else if (unformat (input, "%U",
217 : unformat_vl_api_ip4_address, &pfx->grp_address.ip4))
218 : {
219 0 : pfx->af = ADDRESS_IP4;
220 0 : pfx->grp_address_length = 32;
221 0 : clib_memset(&pfx->src_address, 0, sizeof(pfx->src_address));
222 : }
223 0 : else if (unformat (input, "%U",
224 : unformat_vl_api_ip6_address, &pfx->grp_address.ip6))
225 : {
226 0 : pfx->af = ADDRESS_IP6;
227 0 : pfx->grp_address_length = 128;
228 0 : clib_memset(&pfx->src_address, 0, sizeof(pfx->src_address));
229 : }
230 : else
231 0 : return (0);
232 :
233 0 : return (1);
234 : }
235 :
236 0 : uword unformat_vl_api_version (unformat_input_t * input, va_list * args)
237 : {
238 0 : vl_api_version_t *ver = va_arg (*args, vl_api_version_t *);
239 :
240 0 : if (unformat (input, "%d.%d.%d-%s+%s", ver->major, ver->minor, ver->patch, ver->pre_release, ver->build_metadata
241 : ))
242 0 : return (1);
243 0 : else if (unformat (input, "%d.%d.%d-%s", ver->major, ver->minor, ver->patch, ver->pre_release
244 : ))
245 0 : return (1);
246 0 : else if (unformat (input, "%d.%d.%d", ver->major, ver->minor, ver->patch
247 : ))
248 0 : return (1);
249 :
250 0 : return (0);
251 : }
|