4 * @copyright Copyright (C) 2016 Sproute Networks, Inc.
6 * @author Avneesh Sachdev <avneesh@sproute.com>
8 * This file is part of Quagga.
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
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.
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
26 * Main public header file for the quagga protobuf library.
34 #include "qpb/qpb.pb-c.h"
36 #include "qpb/qpb_allocator.h"
39 * qpb__address_family__set
41 #define qpb_address_family_set qpb__address_family__set
43 qpb__address_family__set (Qpb__AddressFamily
*pb_family
, u_char family
)
47 *pb_family
= QPB__ADDRESS_FAMILY__IPV4
;
51 *pb_family
= QPB__ADDRESS_FAMILY__IPV6
;
55 *pb_family
= QPB__ADDRESS_FAMILY__UNKNOWN_AF
;
62 * qpb__address_family__get
64 #define qpb_address_family_get qpb__address_family__get
66 qpb__address_family__get (Qpb__AddressFamily pb_family
, u_char
*family
)
70 case QPB__ADDRESS_FAMILY__IPV4
:
74 case QPB__ADDRESS_FAMILY__IPV6
:
78 case QPB__ADDRESS_FAMILY__UNKNOWN_AF
:
80 default: /* protobuf "magic value" _QPB__ADDRESS_FAMILY_IS_INT_SIZE */
88 * qpb__l3_prefix__create
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
)
94 Qpb__L3Prefix
*prefix
;
96 prefix
= QPB_ALLOC(allocator
, typeof(*prefix
));
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
) {
108 memcpy(prefix
->bytes
.data
, &p
->u
.prefix
, prefix
->bytes
.len
);
114 * qpb__l3_prefix__get
116 #define qpb_l3_prefix_get qpb__l3_prefix__get
118 qpb__l3_prefix__get (const Qpb__L3Prefix
*pb_prefix
, u_char family
,
119 struct prefix
*prefix
)
126 memset(prefix
, 0, sizeof(struct prefix_ipv4
));
130 memset(prefix
, 0, sizeof(struct prefix_ipv6
));
134 memset(prefix
, 0, sizeof(*prefix
));
137 prefix
->prefixlen
= pb_prefix
->length
;
138 prefix
->family
= family
;
139 memcpy(&prefix
->u
.prefix
, pb_prefix
->bytes
.data
, pb_prefix
->bytes
.len
);
146 * Translate a quagga route type to a protobuf protocol.
148 #define qpb_protocol_set qpb__protocol__set
150 qpb__protocol__set (Qpb__Protocol
*pb_proto
, int route_type
)
152 switch (route_type
) {
153 case ZEBRA_ROUTE_KERNEL
:
154 *pb_proto
= QPB__PROTOCOL__KERNEL
;
157 case ZEBRA_ROUTE_CONNECT
:
158 *pb_proto
= QPB__PROTOCOL__CONNECTED
;
161 case ZEBRA_ROUTE_STATIC
:
162 *pb_proto
= QPB__PROTOCOL__STATIC
;
165 case ZEBRA_ROUTE_RIP
:
166 *pb_proto
= QPB__PROTOCOL__RIP
;
169 case ZEBRA_ROUTE_RIPNG
:
170 *pb_proto
= QPB__PROTOCOL__RIPNG
;
173 case ZEBRA_ROUTE_OSPF
:
174 case ZEBRA_ROUTE_OSPF6
:
175 *pb_proto
= QPB__PROTOCOL__OSPF
;
178 case ZEBRA_ROUTE_ISIS
:
179 *pb_proto
= QPB__PROTOCOL__ISIS
;
182 case ZEBRA_ROUTE_BGP
:
183 *pb_proto
= QPB__PROTOCOL__BGP
;
186 case ZEBRA_ROUTE_HSLS
:
187 case ZEBRA_ROUTE_OLSR
:
188 case ZEBRA_ROUTE_MAX
:
189 case ZEBRA_ROUTE_SYSTEM
:
191 *pb_proto
= QPB__PROTOCOL__OTHER
;
198 * qpb__ipv4_address__create
200 static inline Qpb__Ipv4Address
*
201 qpb__ipv4_address__create (qpb_allocator_t
*allocator
,
202 struct in_addr
*addr
)
204 Qpb__Ipv4Address
*v4
;
206 v4
= QPB_ALLOC(allocator
, typeof(*v4
));
210 qpb__ipv4_address__init(v4
);
212 v4
->value
= ntohl(addr
->s_addr
);
217 * qpb__ipv4_address__get
220 qpb__ipv4_address__get (const Qpb__Ipv4Address
*v4
, struct in_addr
*addr
)
222 addr
->s_addr
= htonl(v4
->value
);
227 * qpb__ipv6_address__create
229 static inline Qpb__Ipv6Address
*
230 qpb__ipv6_address__create (qpb_allocator_t
*allocator
, struct in6_addr
*addr
)
232 Qpb__Ipv6Address
*v6
;
234 v6
= QPB_ALLOC(allocator
, typeof(*v6
));
238 qpb__ipv6_address__init(v6
);
240 v6
->bytes
.data
= qpb_alloc(allocator
, 16);
244 memcpy(v6
->bytes
.data
, addr
->s6_addr
, v6
->bytes
.len
);
249 * qpb__ipv6_address__get
251 * Read out information from a protobuf ipv6 address structure.
254 qpb__ipv6_address__get (const Qpb__Ipv6Address
*v6
, struct in6_addr
*addr
)
256 if (v6
->bytes
.len
!= 16)
259 memcpy(addr
->s6_addr
, v6
->bytes
.data
, v6
->bytes
.len
);
264 * qpb__l3_address__create
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
,
271 Qpb__L3Address
*l3_addr
;
273 l3_addr
= QPB_ALLOC(allocator
, typeof(*l3_addr
));
277 qpb__l3_address__init(l3_addr
);
282 l3_addr
->v4
= qpb__ipv4_address__create (allocator
, &addr
->ipv4
);
289 l3_addr
->v6
= qpb__ipv6_address__create (allocator
, &addr
->ipv6
);
299 * qpb__l3_address__get
301 * Read out a gateway address from a protobuf l3 address.
303 #define qpb_l3_address_get qpb__l3_address__get
305 qpb__l3_address__get (const Qpb__L3Address
*l3_addr
,
306 u_char
*family
, union g_addr
*addr
)
310 qpb__ipv4_address__get (l3_addr
->v4
, &addr
->ipv4
);
317 qpb__ipv6_address__get(l3_addr
->v6
, &addr
->ipv6
);
326 * qpb__if_identifier__create
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
)
332 Qpb__IfIdentifier
*if_id
;
334 if_id
= QPB_ALLOC(allocator
, typeof(*if_id
));
338 qpb__if_identifier__init(if_id
);
339 if_id
->has_index
= 1;
340 if_id
->index
= if_index
;
345 * qpb__if_identifier__get
347 * Get interface name and/or if_index from an if identifier.
349 #define qpb_if_identifier_get qpb__if_identifier__get
351 qpb__if_identifier__get (Qpb__IfIdentifier
*if_id
, uint
*if_index
,
363 if (if_id
->has_index
)
364 *if_index
= if_id
->index
;