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
42 static inline int qpb__address_family__set(Qpb__AddressFamily
*pb_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
65 static inline int qpb__address_family__get(Qpb__AddressFamily pb_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
*qpb__l3_prefix__create(qpb_allocator_t
*allocator
,
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
117 static inline int qpb__l3_prefix__get(const Qpb__L3Prefix
*pb_prefix
,
118 u_char family
, struct prefix
*prefix
)
124 memset(prefix
, 0, sizeof(struct prefix_ipv4
));
128 memset(prefix
, 0, sizeof(struct prefix_ipv6
));
132 memset(prefix
, 0, sizeof(*prefix
));
135 prefix
->prefixlen
= pb_prefix
->length
;
136 prefix
->family
= family
;
137 memcpy(&prefix
->u
.prefix
, pb_prefix
->bytes
.data
, pb_prefix
->bytes
.len
);
144 * Translate a quagga route type to a protobuf protocol.
146 #define qpb_protocol_set qpb__protocol__set
147 static inline int qpb__protocol__set(Qpb__Protocol
*pb_proto
, int route_type
)
149 switch (route_type
) {
150 case ZEBRA_ROUTE_KERNEL
:
151 *pb_proto
= QPB__PROTOCOL__KERNEL
;
154 case ZEBRA_ROUTE_CONNECT
:
155 *pb_proto
= QPB__PROTOCOL__CONNECTED
;
158 case ZEBRA_ROUTE_STATIC
:
159 *pb_proto
= QPB__PROTOCOL__STATIC
;
162 case ZEBRA_ROUTE_RIP
:
163 *pb_proto
= QPB__PROTOCOL__RIP
;
166 case ZEBRA_ROUTE_RIPNG
:
167 *pb_proto
= QPB__PROTOCOL__RIPNG
;
170 case ZEBRA_ROUTE_OSPF
:
171 case ZEBRA_ROUTE_OSPF6
:
172 *pb_proto
= QPB__PROTOCOL__OSPF
;
175 case ZEBRA_ROUTE_ISIS
:
176 *pb_proto
= QPB__PROTOCOL__ISIS
;
179 case ZEBRA_ROUTE_BGP
:
180 *pb_proto
= QPB__PROTOCOL__BGP
;
183 case ZEBRA_ROUTE_HSLS
:
184 case ZEBRA_ROUTE_OLSR
:
185 case ZEBRA_ROUTE_MAX
:
186 case ZEBRA_ROUTE_SYSTEM
:
188 *pb_proto
= QPB__PROTOCOL__OTHER
;
195 * qpb__ipv4_address__create
197 static inline Qpb__Ipv4Address
*
198 qpb__ipv4_address__create(qpb_allocator_t
*allocator
, struct in_addr
*addr
)
200 Qpb__Ipv4Address
*v4
;
202 v4
= QPB_ALLOC(allocator
, typeof(*v4
));
206 qpb__ipv4_address__init(v4
);
208 v4
->value
= ntohl(addr
->s_addr
);
213 * qpb__ipv4_address__get
215 static inline int qpb__ipv4_address__get(const Qpb__Ipv4Address
*v4
,
216 struct in_addr
*addr
)
218 addr
->s_addr
= htonl(v4
->value
);
223 * qpb__ipv6_address__create
225 static inline Qpb__Ipv6Address
*
226 qpb__ipv6_address__create(qpb_allocator_t
*allocator
, struct in6_addr
*addr
)
228 Qpb__Ipv6Address
*v6
;
230 v6
= QPB_ALLOC(allocator
, typeof(*v6
));
234 qpb__ipv6_address__init(v6
);
236 v6
->bytes
.data
= qpb_alloc(allocator
, 16);
240 memcpy(v6
->bytes
.data
, addr
->s6_addr
, v6
->bytes
.len
);
245 * qpb__ipv6_address__get
247 * Read out information from a protobuf ipv6 address structure.
249 static inline int qpb__ipv6_address__get(const Qpb__Ipv6Address
*v6
,
250 struct in6_addr
*addr
)
252 if (v6
->bytes
.len
!= 16)
255 memcpy(addr
->s6_addr
, v6
->bytes
.data
, v6
->bytes
.len
);
260 * qpb__l3_address__create
262 #define qpb_l3_address_create qpb__l3_address__create
263 static inline Qpb__L3Address
*
264 qpb__l3_address__create(qpb_allocator_t
*allocator
, union g_addr
*addr
,
267 Qpb__L3Address
*l3_addr
;
269 l3_addr
= QPB_ALLOC(allocator
, typeof(*l3_addr
));
273 qpb__l3_address__init(l3_addr
);
278 l3_addr
->v4
= qpb__ipv4_address__create(allocator
, &addr
->ipv4
);
285 l3_addr
->v6
= qpb__ipv6_address__create(allocator
, &addr
->ipv6
);
295 * qpb__l3_address__get
297 * Read out a gateway address from a protobuf l3 address.
299 #define qpb_l3_address_get qpb__l3_address__get
300 static inline int qpb__l3_address__get(const Qpb__L3Address
*l3_addr
,
301 u_char
*family
, union g_addr
*addr
)
304 qpb__ipv4_address__get(l3_addr
->v4
, &addr
->ipv4
);
310 qpb__ipv6_address__get(l3_addr
->v6
, &addr
->ipv6
);
319 * qpb__if_identifier__create
321 #define qpb_if_identifier_create qpb__if_identifier__create
322 static inline Qpb__IfIdentifier
*
323 qpb__if_identifier__create(qpb_allocator_t
*allocator
, uint if_index
)
325 Qpb__IfIdentifier
*if_id
;
327 if_id
= QPB_ALLOC(allocator
, typeof(*if_id
));
331 qpb__if_identifier__init(if_id
);
332 if_id
->has_index
= 1;
333 if_id
->index
= if_index
;
338 * qpb__if_identifier__get
340 * Get interface name and/or if_index from an if identifier.
342 #define qpb_if_identifier_get qpb__if_identifier__get
343 static inline int qpb__if_identifier__get(Qpb__IfIdentifier
*if_id
,
344 uint
*if_index
, char **name
)
355 if (if_id
->has_index
)
356 *if_index
= if_id
->index
;