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
21 * along with Quagga; see the file COPYING. If not, write to the Free
22 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27 * Main public header file for the quagga protobuf library.
35 #include "qpb/qpb.pb-c.h"
37 #include "qpb/qpb_allocator.h"
40 * qpb__address_family__set
42 #define qpb_address_family_set qpb__address_family__set
44 qpb__address_family__set (Qpb__AddressFamily *pb_family, u_char family)
48 *pb_family = QPB__ADDRESS_FAMILY__IPV4;
52 *pb_family = QPB__ADDRESS_FAMILY__IPV6;
56 *pb_family = QPB__ADDRESS_FAMILY__UNKNOWN_AF;
63 * qpb__address_family__get
65 #define qpb_address_family_get qpb__address_family__get
67 qpb__address_family__get (Qpb__AddressFamily pb_family, u_char *family)
71 case QPB__ADDRESS_FAMILY__IPV4:
75 case QPB__ADDRESS_FAMILY__IPV6:
79 case QPB__ADDRESS_FAMILY__UNKNOWN_AF:
87 * qpb__l3_prefix__create
89 #define qpb_l3_prefix_create qpb__l3_prefix__create
90 static inline Qpb__L3Prefix *
91 qpb__l3_prefix__create (qpb_allocator_t *allocator, struct prefix *p)
93 Qpb__L3Prefix *prefix;
95 prefix = QPB_ALLOC(allocator, typeof(*prefix));
99 qpb__l3_prefix__init(prefix);
100 prefix->length = p->prefixlen;
101 prefix->bytes.len = (p->prefixlen + 7)/8;
102 prefix->bytes.data = qpb_alloc(allocator, prefix->bytes.len);
103 if (!prefix->bytes.data) {
107 memcpy(prefix->bytes.data, &p->u.prefix, prefix->bytes.len);
113 * qpb__l3_prefix__get
115 #define qpb_l3_prefix_get qpb__l3_prefix__get
117 qpb__l3_prefix__get (const Qpb__L3Prefix *pb_prefix, u_char family,
118 struct prefix *prefix)
125 memset(prefix, 0, sizeof(struct prefix_ipv4));
129 memset(prefix, 0, sizeof(struct prefix_ipv6));
133 memset(prefix, 0, sizeof(*prefix));
136 prefix->prefixlen = pb_prefix->length;
137 prefix->family = family;
138 memcpy(&prefix->u.prefix, pb_prefix->bytes.data, pb_prefix->bytes.len);
145 * Translate a quagga route type to a protobuf protocol.
147 #define qpb_protocol_set qpb__protocol__set
149 qpb__protocol__set (Qpb__Protocol *pb_proto, int route_type)
151 switch (route_type) {
152 case ZEBRA_ROUTE_KERNEL:
153 *pb_proto = QPB__PROTOCOL__KERNEL;
156 case ZEBRA_ROUTE_CONNECT:
157 *pb_proto = QPB__PROTOCOL__CONNECTED;
160 case ZEBRA_ROUTE_STATIC:
161 *pb_proto = QPB__PROTOCOL__STATIC;
164 case ZEBRA_ROUTE_RIP:
165 *pb_proto = QPB__PROTOCOL__RIP;
168 case ZEBRA_ROUTE_RIPNG:
169 *pb_proto = QPB__PROTOCOL__RIPNG;
172 case ZEBRA_ROUTE_OSPF:
173 case ZEBRA_ROUTE_OSPF6:
174 *pb_proto = QPB__PROTOCOL__OSPF;
177 case ZEBRA_ROUTE_ISIS:
178 *pb_proto = QPB__PROTOCOL__ISIS;
181 case ZEBRA_ROUTE_BGP:
182 *pb_proto = QPB__PROTOCOL__BGP;
185 case ZEBRA_ROUTE_HSLS:
186 case ZEBRA_ROUTE_OLSR:
187 case ZEBRA_ROUTE_BABEL:
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;