1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2003-2012 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker */
5*4dc78e53SAndroid Build Coastguard Worker
6*4dc78e53SAndroid Build Coastguard Worker /**
7*4dc78e53SAndroid Build Coastguard Worker * @ingroup rtnl
8*4dc78e53SAndroid Build Coastguard Worker * @defgroup fib_lookup FIB Lookup
9*4dc78e53SAndroid Build Coastguard Worker * @brief
10*4dc78e53SAndroid Build Coastguard Worker * @{
11*4dc78e53SAndroid Build Coastguard Worker */
12*4dc78e53SAndroid Build Coastguard Worker
13*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
14*4dc78e53SAndroid Build Coastguard Worker
15*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
16*4dc78e53SAndroid Build Coastguard Worker #include <netlink/attr.h>
17*4dc78e53SAndroid Build Coastguard Worker #include <netlink/utils.h>
18*4dc78e53SAndroid Build Coastguard Worker #include <netlink/object.h>
19*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/rtnl.h>
20*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/route.h>
21*4dc78e53SAndroid Build Coastguard Worker #include <netlink/fib_lookup/request.h>
22*4dc78e53SAndroid Build Coastguard Worker #include <netlink/fib_lookup/lookup.h>
23*4dc78e53SAndroid Build Coastguard Worker
24*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/object-api.h"
25*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/cache-api.h"
26*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/nl-core.h"
27*4dc78e53SAndroid Build Coastguard Worker
28*4dc78e53SAndroid Build Coastguard Worker /** @cond SKIP */
29*4dc78e53SAndroid Build Coastguard Worker struct flnl_result
30*4dc78e53SAndroid Build Coastguard Worker {
31*4dc78e53SAndroid Build Coastguard Worker NLHDR_COMMON
32*4dc78e53SAndroid Build Coastguard Worker
33*4dc78e53SAndroid Build Coastguard Worker struct flnl_request * fr_req;
34*4dc78e53SAndroid Build Coastguard Worker uint8_t fr_table_id;
35*4dc78e53SAndroid Build Coastguard Worker uint8_t fr_prefixlen;
36*4dc78e53SAndroid Build Coastguard Worker uint8_t fr_nh_sel;
37*4dc78e53SAndroid Build Coastguard Worker uint8_t fr_type;
38*4dc78e53SAndroid Build Coastguard Worker uint8_t fr_scope;
39*4dc78e53SAndroid Build Coastguard Worker uint32_t fr_error;
40*4dc78e53SAndroid Build Coastguard Worker };
41*4dc78e53SAndroid Build Coastguard Worker
42*4dc78e53SAndroid Build Coastguard Worker static struct nl_cache_ops fib_lookup_ops;
43*4dc78e53SAndroid Build Coastguard Worker static struct nl_object_ops result_obj_ops;
44*4dc78e53SAndroid Build Coastguard Worker
45*4dc78e53SAndroid Build Coastguard Worker /* not exported so far */
46*4dc78e53SAndroid Build Coastguard Worker struct fib_result_nl {
47*4dc78e53SAndroid Build Coastguard Worker uint32_t fl_addr; /* To be looked up*/
48*4dc78e53SAndroid Build Coastguard Worker uint32_t fl_fwmark;
49*4dc78e53SAndroid Build Coastguard Worker unsigned char fl_tos;
50*4dc78e53SAndroid Build Coastguard Worker unsigned char fl_scope;
51*4dc78e53SAndroid Build Coastguard Worker unsigned char tb_id_in;
52*4dc78e53SAndroid Build Coastguard Worker
53*4dc78e53SAndroid Build Coastguard Worker unsigned char tb_id; /* Results */
54*4dc78e53SAndroid Build Coastguard Worker unsigned char prefixlen;
55*4dc78e53SAndroid Build Coastguard Worker unsigned char nh_sel;
56*4dc78e53SAndroid Build Coastguard Worker unsigned char type;
57*4dc78e53SAndroid Build Coastguard Worker unsigned char scope;
58*4dc78e53SAndroid Build Coastguard Worker int err;
59*4dc78e53SAndroid Build Coastguard Worker };
60*4dc78e53SAndroid Build Coastguard Worker /** @endcond */
61*4dc78e53SAndroid Build Coastguard Worker
result_free_data(struct nl_object * obj)62*4dc78e53SAndroid Build Coastguard Worker static void result_free_data(struct nl_object *obj)
63*4dc78e53SAndroid Build Coastguard Worker {
64*4dc78e53SAndroid Build Coastguard Worker struct flnl_result *res = nl_object_priv(obj);
65*4dc78e53SAndroid Build Coastguard Worker
66*4dc78e53SAndroid Build Coastguard Worker if (res && res->fr_req)
67*4dc78e53SAndroid Build Coastguard Worker nl_object_put(OBJ_CAST(res->fr_req));
68*4dc78e53SAndroid Build Coastguard Worker }
69*4dc78e53SAndroid Build Coastguard Worker
result_clone(struct nl_object * _dst,struct nl_object * _src)70*4dc78e53SAndroid Build Coastguard Worker static int result_clone(struct nl_object *_dst, struct nl_object *_src)
71*4dc78e53SAndroid Build Coastguard Worker {
72*4dc78e53SAndroid Build Coastguard Worker struct flnl_result *dst = nl_object_priv(_dst);
73*4dc78e53SAndroid Build Coastguard Worker struct flnl_result *src = nl_object_priv(_src);
74*4dc78e53SAndroid Build Coastguard Worker
75*4dc78e53SAndroid Build Coastguard Worker dst->fr_req = NULL;
76*4dc78e53SAndroid Build Coastguard Worker
77*4dc78e53SAndroid Build Coastguard Worker if (src->fr_req) {
78*4dc78e53SAndroid Build Coastguard Worker if (!(dst->fr_req = (struct flnl_request *) nl_object_clone(OBJ_CAST(src->fr_req))))
79*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
80*4dc78e53SAndroid Build Coastguard Worker }
81*4dc78e53SAndroid Build Coastguard Worker
82*4dc78e53SAndroid Build Coastguard Worker return 0;
83*4dc78e53SAndroid Build Coastguard Worker }
84*4dc78e53SAndroid Build Coastguard Worker
result_msg_parser(struct nl_cache_ops * ops,struct sockaddr_nl * who,struct nlmsghdr * n,struct nl_parser_param * pp)85*4dc78e53SAndroid Build Coastguard Worker static int result_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
86*4dc78e53SAndroid Build Coastguard Worker struct nlmsghdr *n, struct nl_parser_param *pp)
87*4dc78e53SAndroid Build Coastguard Worker {
88*4dc78e53SAndroid Build Coastguard Worker struct flnl_result *res;
89*4dc78e53SAndroid Build Coastguard Worker struct fib_result_nl *fr;
90*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *addr;
91*4dc78e53SAndroid Build Coastguard Worker int err = -NLE_INVAL;
92*4dc78e53SAndroid Build Coastguard Worker
93*4dc78e53SAndroid Build Coastguard Worker res = flnl_result_alloc();
94*4dc78e53SAndroid Build Coastguard Worker if (!res)
95*4dc78e53SAndroid Build Coastguard Worker goto errout;
96*4dc78e53SAndroid Build Coastguard Worker
97*4dc78e53SAndroid Build Coastguard Worker res->ce_msgtype = n->nlmsg_type;
98*4dc78e53SAndroid Build Coastguard Worker
99*4dc78e53SAndroid Build Coastguard Worker res->fr_req = flnl_request_alloc();
100*4dc78e53SAndroid Build Coastguard Worker if (!res->fr_req)
101*4dc78e53SAndroid Build Coastguard Worker goto errout;
102*4dc78e53SAndroid Build Coastguard Worker
103*4dc78e53SAndroid Build Coastguard Worker fr = nlmsg_data(n);
104*4dc78e53SAndroid Build Coastguard Worker addr = nl_addr_build(AF_INET, &fr->fl_addr, 4);
105*4dc78e53SAndroid Build Coastguard Worker if (!addr)
106*4dc78e53SAndroid Build Coastguard Worker goto errout;
107*4dc78e53SAndroid Build Coastguard Worker err = flnl_request_set_addr(res->fr_req, addr);
108*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(addr);
109*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
110*4dc78e53SAndroid Build Coastguard Worker goto errout;
111*4dc78e53SAndroid Build Coastguard Worker
112*4dc78e53SAndroid Build Coastguard Worker flnl_request_set_fwmark(res->fr_req, fr->fl_fwmark);
113*4dc78e53SAndroid Build Coastguard Worker flnl_request_set_tos(res->fr_req, fr->fl_tos);
114*4dc78e53SAndroid Build Coastguard Worker flnl_request_set_scope(res->fr_req, fr->fl_scope);
115*4dc78e53SAndroid Build Coastguard Worker flnl_request_set_table(res->fr_req, fr->tb_id_in);
116*4dc78e53SAndroid Build Coastguard Worker
117*4dc78e53SAndroid Build Coastguard Worker res->fr_table_id = fr->tb_id;
118*4dc78e53SAndroid Build Coastguard Worker res->fr_prefixlen = fr->prefixlen;
119*4dc78e53SAndroid Build Coastguard Worker res->fr_nh_sel = fr->nh_sel;
120*4dc78e53SAndroid Build Coastguard Worker res->fr_type = fr->type;
121*4dc78e53SAndroid Build Coastguard Worker res->fr_scope = fr->scope;
122*4dc78e53SAndroid Build Coastguard Worker res->fr_error = fr->err;
123*4dc78e53SAndroid Build Coastguard Worker
124*4dc78e53SAndroid Build Coastguard Worker err = pp->pp_cb((struct nl_object *) res, pp);
125*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
126*4dc78e53SAndroid Build Coastguard Worker goto errout;
127*4dc78e53SAndroid Build Coastguard Worker
128*4dc78e53SAndroid Build Coastguard Worker /* REAL HACK, fib_lookup doesn't support ACK nor does it
129*4dc78e53SAndroid Build Coastguard Worker * send a DONE message, enforce end of message stream
130*4dc78e53SAndroid Build Coastguard Worker * after just the first message */
131*4dc78e53SAndroid Build Coastguard Worker err = NL_STOP;
132*4dc78e53SAndroid Build Coastguard Worker
133*4dc78e53SAndroid Build Coastguard Worker errout:
134*4dc78e53SAndroid Build Coastguard Worker flnl_result_put(res);
135*4dc78e53SAndroid Build Coastguard Worker return err;
136*4dc78e53SAndroid Build Coastguard Worker }
137*4dc78e53SAndroid Build Coastguard Worker
result_dump_line(struct nl_object * obj,struct nl_dump_params * p)138*4dc78e53SAndroid Build Coastguard Worker static void result_dump_line(struct nl_object *obj, struct nl_dump_params *p)
139*4dc78e53SAndroid Build Coastguard Worker {
140*4dc78e53SAndroid Build Coastguard Worker struct flnl_result *res = (struct flnl_result *) obj;
141*4dc78e53SAndroid Build Coastguard Worker char buf[256];
142*4dc78e53SAndroid Build Coastguard Worker
143*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "table %s prefixlen %u next-hop-selector %u\n",
144*4dc78e53SAndroid Build Coastguard Worker rtnl_route_table2str(res->fr_table_id, buf, sizeof(buf)),
145*4dc78e53SAndroid Build Coastguard Worker res->fr_prefixlen, res->fr_nh_sel);
146*4dc78e53SAndroid Build Coastguard Worker nl_dump_line(p, "type %s ",
147*4dc78e53SAndroid Build Coastguard Worker nl_rtntype2str(res->fr_type, buf, sizeof(buf)));
148*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "scope %s error %s (%d)\n",
149*4dc78e53SAndroid Build Coastguard Worker rtnl_scope2str(res->fr_scope, buf, sizeof(buf)),
150*4dc78e53SAndroid Build Coastguard Worker nl_strerror_l(-res->fr_error), res->fr_error);
151*4dc78e53SAndroid Build Coastguard Worker }
152*4dc78e53SAndroid Build Coastguard Worker
result_dump_details(struct nl_object * obj,struct nl_dump_params * p)153*4dc78e53SAndroid Build Coastguard Worker static void result_dump_details(struct nl_object *obj, struct nl_dump_params *p)
154*4dc78e53SAndroid Build Coastguard Worker {
155*4dc78e53SAndroid Build Coastguard Worker result_dump_line(obj, p);
156*4dc78e53SAndroid Build Coastguard Worker }
157*4dc78e53SAndroid Build Coastguard Worker
result_compare(struct nl_object * _a,struct nl_object * _b,uint64_t attrs,int flags)158*4dc78e53SAndroid Build Coastguard Worker static uint64_t result_compare(struct nl_object *_a, struct nl_object *_b,
159*4dc78e53SAndroid Build Coastguard Worker uint64_t attrs, int flags)
160*4dc78e53SAndroid Build Coastguard Worker {
161*4dc78e53SAndroid Build Coastguard Worker return 0;
162*4dc78e53SAndroid Build Coastguard Worker }
163*4dc78e53SAndroid Build Coastguard Worker
164*4dc78e53SAndroid Build Coastguard Worker /**
165*4dc78e53SAndroid Build Coastguard Worker * @name Allocation/Freeing
166*4dc78e53SAndroid Build Coastguard Worker * @{
167*4dc78e53SAndroid Build Coastguard Worker */
168*4dc78e53SAndroid Build Coastguard Worker
flnl_result_alloc(void)169*4dc78e53SAndroid Build Coastguard Worker struct flnl_result *flnl_result_alloc(void)
170*4dc78e53SAndroid Build Coastguard Worker {
171*4dc78e53SAndroid Build Coastguard Worker return (struct flnl_result *) nl_object_alloc(&result_obj_ops);
172*4dc78e53SAndroid Build Coastguard Worker }
173*4dc78e53SAndroid Build Coastguard Worker
flnl_result_put(struct flnl_result * res)174*4dc78e53SAndroid Build Coastguard Worker void flnl_result_put(struct flnl_result *res)
175*4dc78e53SAndroid Build Coastguard Worker {
176*4dc78e53SAndroid Build Coastguard Worker nl_object_put((struct nl_object *) res);
177*4dc78e53SAndroid Build Coastguard Worker }
178*4dc78e53SAndroid Build Coastguard Worker
179*4dc78e53SAndroid Build Coastguard Worker /** @} */
180*4dc78e53SAndroid Build Coastguard Worker
181*4dc78e53SAndroid Build Coastguard Worker /**
182*4dc78e53SAndroid Build Coastguard Worker * @name Cache Management
183*4dc78e53SAndroid Build Coastguard Worker * @{
184*4dc78e53SAndroid Build Coastguard Worker */
185*4dc78e53SAndroid Build Coastguard Worker
186*4dc78e53SAndroid Build Coastguard Worker /**
187*4dc78e53SAndroid Build Coastguard Worker * Allocate lookup result cache.
188*4dc78e53SAndroid Build Coastguard Worker *
189*4dc78e53SAndroid Build Coastguard Worker * Allocates a new lookup result cache and initializes it properly.
190*4dc78e53SAndroid Build Coastguard Worker *
191*4dc78e53SAndroid Build Coastguard Worker * @note Free the memory after usage using nl_cache_destroy_and_free().
192*4dc78e53SAndroid Build Coastguard Worker * @return Newly allocated cache or NULL if an error occured.
193*4dc78e53SAndroid Build Coastguard Worker */
flnl_result_alloc_cache(void)194*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *flnl_result_alloc_cache(void)
195*4dc78e53SAndroid Build Coastguard Worker {
196*4dc78e53SAndroid Build Coastguard Worker return nl_cache_alloc(&fib_lookup_ops);
197*4dc78e53SAndroid Build Coastguard Worker }
198*4dc78e53SAndroid Build Coastguard Worker
199*4dc78e53SAndroid Build Coastguard Worker /** @} */
200*4dc78e53SAndroid Build Coastguard Worker
201*4dc78e53SAndroid Build Coastguard Worker /**
202*4dc78e53SAndroid Build Coastguard Worker * @name Lookup
203*4dc78e53SAndroid Build Coastguard Worker * @{
204*4dc78e53SAndroid Build Coastguard Worker */
205*4dc78e53SAndroid Build Coastguard Worker
206*4dc78e53SAndroid Build Coastguard Worker /**
207*4dc78e53SAndroid Build Coastguard Worker * Builds a netlink request message to do a lookup
208*4dc78e53SAndroid Build Coastguard Worker * @arg req Requested match.
209*4dc78e53SAndroid Build Coastguard Worker * @arg flags additional netlink message flags
210*4dc78e53SAndroid Build Coastguard Worker * @arg result Result pointer
211*4dc78e53SAndroid Build Coastguard Worker *
212*4dc78e53SAndroid Build Coastguard Worker * Builds a new netlink message requesting a change of link attributes.
213*4dc78e53SAndroid Build Coastguard Worker * The netlink message header isn't fully equipped with all relevant
214*4dc78e53SAndroid Build Coastguard Worker * fields and must be sent out via nl_send_auto_complete() or
215*4dc78e53SAndroid Build Coastguard Worker * supplemented as needed.
216*4dc78e53SAndroid Build Coastguard Worker * \a old must point to a link currently configured in the kernel
217*4dc78e53SAndroid Build Coastguard Worker * and \a tmpl must contain the attributes to be changed set via
218*4dc78e53SAndroid Build Coastguard Worker * \c rtnl_link_set_* functions.
219*4dc78e53SAndroid Build Coastguard Worker *
220*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
221*4dc78e53SAndroid Build Coastguard Worker */
flnl_lookup_build_request(struct flnl_request * req,int flags,struct nl_msg ** result)222*4dc78e53SAndroid Build Coastguard Worker int flnl_lookup_build_request(struct flnl_request *req, int flags,
223*4dc78e53SAndroid Build Coastguard Worker struct nl_msg **result)
224*4dc78e53SAndroid Build Coastguard Worker {
225*4dc78e53SAndroid Build Coastguard Worker struct nl_msg *msg;
226*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *addr;
227*4dc78e53SAndroid Build Coastguard Worker uint64_t fwmark;
228*4dc78e53SAndroid Build Coastguard Worker int tos, scope, table;
229*4dc78e53SAndroid Build Coastguard Worker struct fib_result_nl fr = {0};
230*4dc78e53SAndroid Build Coastguard Worker
231*4dc78e53SAndroid Build Coastguard Worker fwmark = flnl_request_get_fwmark(req);
232*4dc78e53SAndroid Build Coastguard Worker tos = flnl_request_get_tos(req);
233*4dc78e53SAndroid Build Coastguard Worker scope = flnl_request_get_scope(req);
234*4dc78e53SAndroid Build Coastguard Worker table = flnl_request_get_table(req);
235*4dc78e53SAndroid Build Coastguard Worker
236*4dc78e53SAndroid Build Coastguard Worker fr.fl_fwmark = fwmark != UINT_LEAST64_MAX ? fwmark : 0;
237*4dc78e53SAndroid Build Coastguard Worker fr.fl_tos = tos >= 0 ? tos : 0;
238*4dc78e53SAndroid Build Coastguard Worker fr.fl_scope = scope >= 0 ? scope : RT_SCOPE_UNIVERSE;
239*4dc78e53SAndroid Build Coastguard Worker fr.tb_id_in = table >= 0 ? (unsigned)table : (unsigned)RT_TABLE_UNSPEC;
240*4dc78e53SAndroid Build Coastguard Worker
241*4dc78e53SAndroid Build Coastguard Worker addr = flnl_request_get_addr(req);
242*4dc78e53SAndroid Build Coastguard Worker if (!addr)
243*4dc78e53SAndroid Build Coastguard Worker return -NLE_MISSING_ATTR;
244*4dc78e53SAndroid Build Coastguard Worker
245*4dc78e53SAndroid Build Coastguard Worker fr.fl_addr = *(uint32_t *) nl_addr_get_binary_addr(addr);
246*4dc78e53SAndroid Build Coastguard Worker
247*4dc78e53SAndroid Build Coastguard Worker msg = nlmsg_alloc_simple(0, flags);
248*4dc78e53SAndroid Build Coastguard Worker if (!msg)
249*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
250*4dc78e53SAndroid Build Coastguard Worker
251*4dc78e53SAndroid Build Coastguard Worker if (nlmsg_append(msg, &fr, sizeof(fr), NLMSG_ALIGNTO) < 0)
252*4dc78e53SAndroid Build Coastguard Worker goto errout;
253*4dc78e53SAndroid Build Coastguard Worker
254*4dc78e53SAndroid Build Coastguard Worker *result = msg;
255*4dc78e53SAndroid Build Coastguard Worker return 0;
256*4dc78e53SAndroid Build Coastguard Worker
257*4dc78e53SAndroid Build Coastguard Worker errout:
258*4dc78e53SAndroid Build Coastguard Worker nlmsg_free(msg);
259*4dc78e53SAndroid Build Coastguard Worker return -NLE_MSGSIZE;
260*4dc78e53SAndroid Build Coastguard Worker }
261*4dc78e53SAndroid Build Coastguard Worker
262*4dc78e53SAndroid Build Coastguard Worker /**
263*4dc78e53SAndroid Build Coastguard Worker * Perform FIB Lookup
264*4dc78e53SAndroid Build Coastguard Worker * @arg sk Netlink socket.
265*4dc78e53SAndroid Build Coastguard Worker * @arg req Lookup request object.
266*4dc78e53SAndroid Build Coastguard Worker * @arg cache Cache for result.
267*4dc78e53SAndroid Build Coastguard Worker *
268*4dc78e53SAndroid Build Coastguard Worker * Builds a netlink message to request a FIB lookup, waits for the
269*4dc78e53SAndroid Build Coastguard Worker * reply and adds the result to the specified cache.
270*4dc78e53SAndroid Build Coastguard Worker *
271*4dc78e53SAndroid Build Coastguard Worker * @return 0 on success or a negative error code.
272*4dc78e53SAndroid Build Coastguard Worker */
flnl_lookup(struct nl_sock * sk,struct flnl_request * req,struct nl_cache * cache)273*4dc78e53SAndroid Build Coastguard Worker int flnl_lookup(struct nl_sock *sk, struct flnl_request *req,
274*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *cache)
275*4dc78e53SAndroid Build Coastguard Worker {
276*4dc78e53SAndroid Build Coastguard Worker struct nl_msg *msg;
277*4dc78e53SAndroid Build Coastguard Worker int err;
278*4dc78e53SAndroid Build Coastguard Worker
279*4dc78e53SAndroid Build Coastguard Worker if ((err = flnl_lookup_build_request(req, 0, &msg)) < 0)
280*4dc78e53SAndroid Build Coastguard Worker return err;
281*4dc78e53SAndroid Build Coastguard Worker
282*4dc78e53SAndroid Build Coastguard Worker err = nl_send_auto_complete(sk, msg);
283*4dc78e53SAndroid Build Coastguard Worker nlmsg_free(msg);
284*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
285*4dc78e53SAndroid Build Coastguard Worker return err;
286*4dc78e53SAndroid Build Coastguard Worker
287*4dc78e53SAndroid Build Coastguard Worker return nl_cache_pickup_checkdup(sk, cache);
288*4dc78e53SAndroid Build Coastguard Worker }
289*4dc78e53SAndroid Build Coastguard Worker
290*4dc78e53SAndroid Build Coastguard Worker /** @} */
291*4dc78e53SAndroid Build Coastguard Worker
292*4dc78e53SAndroid Build Coastguard Worker /**
293*4dc78e53SAndroid Build Coastguard Worker * @name Attribute Access
294*4dc78e53SAndroid Build Coastguard Worker * @{
295*4dc78e53SAndroid Build Coastguard Worker */
296*4dc78e53SAndroid Build Coastguard Worker
flnl_result_get_table_id(struct flnl_result * res)297*4dc78e53SAndroid Build Coastguard Worker int flnl_result_get_table_id(struct flnl_result *res)
298*4dc78e53SAndroid Build Coastguard Worker {
299*4dc78e53SAndroid Build Coastguard Worker return res->fr_table_id;
300*4dc78e53SAndroid Build Coastguard Worker }
301*4dc78e53SAndroid Build Coastguard Worker
flnl_result_get_prefixlen(struct flnl_result * res)302*4dc78e53SAndroid Build Coastguard Worker int flnl_result_get_prefixlen(struct flnl_result *res)
303*4dc78e53SAndroid Build Coastguard Worker {
304*4dc78e53SAndroid Build Coastguard Worker return res->fr_prefixlen;
305*4dc78e53SAndroid Build Coastguard Worker }
306*4dc78e53SAndroid Build Coastguard Worker
flnl_result_get_nexthop_sel(struct flnl_result * res)307*4dc78e53SAndroid Build Coastguard Worker int flnl_result_get_nexthop_sel(struct flnl_result *res)
308*4dc78e53SAndroid Build Coastguard Worker {
309*4dc78e53SAndroid Build Coastguard Worker return res->fr_nh_sel;
310*4dc78e53SAndroid Build Coastguard Worker }
311*4dc78e53SAndroid Build Coastguard Worker
flnl_result_get_type(struct flnl_result * res)312*4dc78e53SAndroid Build Coastguard Worker int flnl_result_get_type(struct flnl_result *res)
313*4dc78e53SAndroid Build Coastguard Worker {
314*4dc78e53SAndroid Build Coastguard Worker return res->fr_type;
315*4dc78e53SAndroid Build Coastguard Worker }
316*4dc78e53SAndroid Build Coastguard Worker
flnl_result_get_scope(struct flnl_result * res)317*4dc78e53SAndroid Build Coastguard Worker int flnl_result_get_scope(struct flnl_result *res)
318*4dc78e53SAndroid Build Coastguard Worker {
319*4dc78e53SAndroid Build Coastguard Worker return res->fr_scope;
320*4dc78e53SAndroid Build Coastguard Worker }
321*4dc78e53SAndroid Build Coastguard Worker
flnl_result_get_error(struct flnl_result * res)322*4dc78e53SAndroid Build Coastguard Worker int flnl_result_get_error(struct flnl_result *res)
323*4dc78e53SAndroid Build Coastguard Worker {
324*4dc78e53SAndroid Build Coastguard Worker return res->fr_error;
325*4dc78e53SAndroid Build Coastguard Worker }
326*4dc78e53SAndroid Build Coastguard Worker
327*4dc78e53SAndroid Build Coastguard Worker /** @} */
328*4dc78e53SAndroid Build Coastguard Worker
329*4dc78e53SAndroid Build Coastguard Worker static struct nl_object_ops result_obj_ops = {
330*4dc78e53SAndroid Build Coastguard Worker .oo_name = "fib_lookup/result",
331*4dc78e53SAndroid Build Coastguard Worker .oo_size = sizeof(struct flnl_result),
332*4dc78e53SAndroid Build Coastguard Worker .oo_free_data = result_free_data,
333*4dc78e53SAndroid Build Coastguard Worker .oo_clone = result_clone,
334*4dc78e53SAndroid Build Coastguard Worker .oo_dump = {
335*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_LINE] = result_dump_line,
336*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_DETAILS] = result_dump_details,
337*4dc78e53SAndroid Build Coastguard Worker },
338*4dc78e53SAndroid Build Coastguard Worker .oo_compare = result_compare,
339*4dc78e53SAndroid Build Coastguard Worker };
340*4dc78e53SAndroid Build Coastguard Worker
341*4dc78e53SAndroid Build Coastguard Worker static struct nl_cache_ops fib_lookup_ops = {
342*4dc78e53SAndroid Build Coastguard Worker .co_name = "fib_lookup/fib_lookup",
343*4dc78e53SAndroid Build Coastguard Worker .co_hdrsize = sizeof(struct fib_result_nl),
344*4dc78e53SAndroid Build Coastguard Worker .co_msgtypes = {
345*4dc78e53SAndroid Build Coastguard Worker { 0, NL_ACT_UNSPEC, "any" },
346*4dc78e53SAndroid Build Coastguard Worker END_OF_MSGTYPES_LIST,
347*4dc78e53SAndroid Build Coastguard Worker },
348*4dc78e53SAndroid Build Coastguard Worker .co_protocol = NETLINK_FIB_LOOKUP,
349*4dc78e53SAndroid Build Coastguard Worker .co_msg_parser = result_msg_parser,
350*4dc78e53SAndroid Build Coastguard Worker .co_obj_ops = &result_obj_ops,
351*4dc78e53SAndroid Build Coastguard Worker };
352*4dc78e53SAndroid Build Coastguard Worker
fib_lookup_init(void)353*4dc78e53SAndroid Build Coastguard Worker static void _nl_init fib_lookup_init(void)
354*4dc78e53SAndroid Build Coastguard Worker {
355*4dc78e53SAndroid Build Coastguard Worker nl_cache_mngt_register(&fib_lookup_ops);
356*4dc78e53SAndroid Build Coastguard Worker }
357*4dc78e53SAndroid Build Coastguard Worker
fib_lookup_exit(void)358*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit fib_lookup_exit(void)
359*4dc78e53SAndroid Build Coastguard Worker {
360*4dc78e53SAndroid Build Coastguard Worker nl_cache_mngt_unregister(&fib_lookup_ops);
361*4dc78e53SAndroid Build Coastguard Worker }
362*4dc78e53SAndroid Build Coastguard Worker
363*4dc78e53SAndroid Build Coastguard Worker /** @} */
364