]> git.proxmox.com Git - mirror_frr.git/blob - qpb/qpb.h
Merge remote-tracking branch 'origin/stable/3.0'
[mirror_frr.git] / qpb / qpb.h
1 /*
2 * qpb.h
3 *
4 * @copyright Copyright (C) 2016 Sproute Networks, Inc.
5 *
6 * @author Avneesh Sachdev <avneesh@sproute.com>
7 *
8 * This file is part of Quagga.
9 *
10 * Quagga is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by the
12 * Free Software Foundation; either version 2, or (at your option) any
13 * later version.
14 *
15 * Quagga is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License along
21 * with this program; see the file COPYING; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25 /*
26 * Main public header file for the quagga protobuf library.
27 */
28
29 #ifndef _QPB_H
30 #define _QPB_H
31
32 #include "prefix.h"
33
34 #include "qpb/qpb.pb-c.h"
35
36 #include "qpb/qpb_allocator.h"
37
38 /*
39 * qpb__address_family__set
40 */
41 #define qpb_address_family_set qpb__address_family__set
42 static inline int
43 qpb__address_family__set (Qpb__AddressFamily *pb_family, u_char family)
44 {
45 switch (family) {
46 case AF_INET:
47 *pb_family = QPB__ADDRESS_FAMILY__IPV4;
48 return 1;
49
50 case AF_INET6:
51 *pb_family = QPB__ADDRESS_FAMILY__IPV6;
52 return 1;
53
54 default:
55 *pb_family = QPB__ADDRESS_FAMILY__UNKNOWN_AF;
56 }
57
58 return 0;
59 }
60
61 /*
62 * qpb__address_family__get
63 */
64 #define qpb_address_family_get qpb__address_family__get
65 static inline int
66 qpb__address_family__get (Qpb__AddressFamily pb_family, u_char *family)
67 {
68
69 switch (pb_family) {
70 case QPB__ADDRESS_FAMILY__IPV4:
71 *family = AF_INET;
72 return 1;
73
74 case QPB__ADDRESS_FAMILY__IPV6:
75 *family = AF_INET6;
76 return 1;
77
78 case QPB__ADDRESS_FAMILY__UNKNOWN_AF:
79 return 0;
80 default: /* protobuf "magic value" _QPB__ADDRESS_FAMILY_IS_INT_SIZE */
81 return 0;
82 }
83
84 return 0;
85 }
86
87 /*
88 * qpb__l3_prefix__create
89 */
90 #define qpb_l3_prefix_create qpb__l3_prefix__create
91 static inline Qpb__L3Prefix *
92 qpb__l3_prefix__create (qpb_allocator_t *allocator, struct prefix *p)
93 {
94 Qpb__L3Prefix *prefix;
95
96 prefix = QPB_ALLOC(allocator, typeof(*prefix));
97 if (!prefix) {
98 return NULL;
99 }
100 qpb__l3_prefix__init(prefix);
101 prefix->length = p->prefixlen;
102 prefix->bytes.len = (p->prefixlen + 7)/8;
103 prefix->bytes.data = qpb_alloc(allocator, prefix->bytes.len);
104 if (!prefix->bytes.data) {
105 return NULL;
106 }
107
108 memcpy(prefix->bytes.data, &p->u.prefix, prefix->bytes.len);
109
110 return prefix;
111 }
112
113 /*
114 * qpb__l3_prefix__get
115 */
116 #define qpb_l3_prefix_get qpb__l3_prefix__get
117 static inline int
118 qpb__l3_prefix__get (const Qpb__L3Prefix *pb_prefix, u_char family,
119 struct prefix *prefix)
120 {
121
122 switch (family)
123 {
124
125 case AF_INET:
126 memset(prefix, 0, sizeof(struct prefix_ipv4));
127 break;
128
129 case AF_INET6:
130 memset(prefix, 0, sizeof(struct prefix_ipv6));
131 break;
132
133 default:
134 memset(prefix, 0, sizeof(*prefix));
135 }
136
137 prefix->prefixlen = pb_prefix->length;
138 prefix->family = family;
139 memcpy(&prefix->u.prefix, pb_prefix->bytes.data, pb_prefix->bytes.len);
140 return 1;
141 }
142
143 /*
144 * qpb__protocol__set
145 *
146 * Translate a quagga route type to a protobuf protocol.
147 */
148 #define qpb_protocol_set qpb__protocol__set
149 static inline int
150 qpb__protocol__set (Qpb__Protocol *pb_proto, int route_type)
151 {
152 switch (route_type) {
153 case ZEBRA_ROUTE_KERNEL:
154 *pb_proto = QPB__PROTOCOL__KERNEL;
155 break;
156
157 case ZEBRA_ROUTE_CONNECT:
158 *pb_proto = QPB__PROTOCOL__CONNECTED;
159 break;
160
161 case ZEBRA_ROUTE_STATIC:
162 *pb_proto = QPB__PROTOCOL__STATIC;
163 break;
164
165 case ZEBRA_ROUTE_RIP:
166 *pb_proto = QPB__PROTOCOL__RIP;
167 break;
168
169 case ZEBRA_ROUTE_RIPNG:
170 *pb_proto = QPB__PROTOCOL__RIPNG;
171 break;
172
173 case ZEBRA_ROUTE_OSPF:
174 case ZEBRA_ROUTE_OSPF6:
175 *pb_proto = QPB__PROTOCOL__OSPF;
176 break;
177
178 case ZEBRA_ROUTE_ISIS:
179 *pb_proto = QPB__PROTOCOL__ISIS;
180 break;
181
182 case ZEBRA_ROUTE_BGP:
183 *pb_proto = QPB__PROTOCOL__BGP;
184 break;
185
186 case ZEBRA_ROUTE_HSLS:
187 case ZEBRA_ROUTE_OLSR:
188 case ZEBRA_ROUTE_MAX:
189 case ZEBRA_ROUTE_SYSTEM:
190 default:
191 *pb_proto = QPB__PROTOCOL__OTHER;
192 }
193
194 return 1;
195 }
196
197 /*
198 * qpb__ipv4_address__create
199 */
200 static inline Qpb__Ipv4Address *
201 qpb__ipv4_address__create (qpb_allocator_t *allocator,
202 struct in_addr *addr)
203 {
204 Qpb__Ipv4Address *v4;
205
206 v4 = QPB_ALLOC(allocator, typeof(*v4));
207 if (!v4) {
208 return NULL;
209 }
210 qpb__ipv4_address__init(v4);
211
212 v4->value = ntohl(addr->s_addr);
213 return v4;
214 }
215
216 /*
217 * qpb__ipv4_address__get
218 */
219 static inline int
220 qpb__ipv4_address__get (const Qpb__Ipv4Address *v4, struct in_addr *addr)
221 {
222 addr->s_addr = htonl(v4->value);
223 return 1;
224 }
225
226 /*
227 * qpb__ipv6_address__create
228 */
229 static inline Qpb__Ipv6Address *
230 qpb__ipv6_address__create (qpb_allocator_t *allocator, struct in6_addr *addr)
231 {
232 Qpb__Ipv6Address *v6;
233
234 v6 = QPB_ALLOC(allocator, typeof(*v6));
235 if (!v6)
236 return NULL;
237
238 qpb__ipv6_address__init(v6);
239 v6->bytes.len = 16;
240 v6->bytes.data = qpb_alloc(allocator, 16);
241 if (!v6->bytes.data)
242 return NULL;
243
244 memcpy(v6->bytes.data, addr->s6_addr, v6->bytes.len);
245 return v6;
246 }
247
248 /*
249 * qpb__ipv6_address__get
250 *
251 * Read out information from a protobuf ipv6 address structure.
252 */
253 static inline int
254 qpb__ipv6_address__get (const Qpb__Ipv6Address *v6, struct in6_addr *addr)
255 {
256 if (v6->bytes.len != 16)
257 return 0;
258
259 memcpy(addr->s6_addr, v6->bytes.data, v6->bytes.len);
260 return 1;
261 }
262
263 /*
264 * qpb__l3_address__create
265 */
266 #define qpb_l3_address_create qpb__l3_address__create
267 static inline Qpb__L3Address *
268 qpb__l3_address__create (qpb_allocator_t *allocator, union g_addr *addr,
269 u_char family)
270 {
271 Qpb__L3Address *l3_addr;
272
273 l3_addr = QPB_ALLOC(allocator, typeof(*l3_addr));
274 if (!l3_addr)
275 return NULL;
276
277 qpb__l3_address__init(l3_addr);
278
279 switch (family) {
280
281 case AF_INET:
282 l3_addr->v4 = qpb__ipv4_address__create (allocator, &addr->ipv4);
283 if (!l3_addr->v4)
284 return NULL;
285
286 break;
287
288 case AF_INET6:
289 l3_addr->v6 = qpb__ipv6_address__create (allocator, &addr->ipv6);
290 if (!l3_addr->v6)
291 return NULL;
292
293 break;
294 }
295 return l3_addr;
296 }
297
298 /*
299 * qpb__l3_address__get
300 *
301 * Read out a gateway address from a protobuf l3 address.
302 */
303 #define qpb_l3_address_get qpb__l3_address__get
304 static inline int
305 qpb__l3_address__get (const Qpb__L3Address *l3_addr,
306 u_char *family, union g_addr *addr)
307 {
308 if (l3_addr->v4)
309 {
310 qpb__ipv4_address__get (l3_addr->v4, &addr->ipv4);
311 *family = AF_INET;
312 return 1;
313 }
314
315 if (l3_addr->v6)
316 {
317 qpb__ipv6_address__get(l3_addr->v6, &addr->ipv6);
318 *family = AF_INET6;
319 return 1;
320 }
321
322 return 0;
323 }
324
325 /*
326 * qpb__if_identifier__create
327 */
328 #define qpb_if_identifier_create qpb__if_identifier__create
329 static inline Qpb__IfIdentifier *
330 qpb__if_identifier__create (qpb_allocator_t *allocator, uint if_index)
331 {
332 Qpb__IfIdentifier *if_id;
333
334 if_id = QPB_ALLOC(allocator, typeof(*if_id));
335 if (!if_id) {
336 return NULL;
337 }
338 qpb__if_identifier__init(if_id);
339 if_id->has_index = 1;
340 if_id->index = if_index;
341 return if_id;
342 }
343
344 /*
345 * qpb__if_identifier__get
346 *
347 * Get interface name and/or if_index from an if identifier.
348 */
349 #define qpb_if_identifier_get qpb__if_identifier__get
350 static inline int
351 qpb__if_identifier__get (Qpb__IfIdentifier *if_id, uint *if_index,
352 char **name)
353 {
354 char *str;
355 uint ix;
356
357 if (!if_index)
358 if_index = &ix;
359
360 if (!name)
361 name = &str;
362
363 if (if_id->has_index)
364 *if_index = if_id->index;
365 else
366 *if_index = 0;
367
368 *name = if_id->name;
369 return 1;
370 }
371
372 #endif