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