13#include "nl-default.h"
15#include <netlink/netlink.h>
16#include <netlink/attr.h>
17#include <netlink/utils.h>
18#include <netlink/object.h>
19#include <netlink/fib_lookup/request.h>
21#include "nl-priv-dynamic-core/nl-core.h"
22#include "nl-priv-dynamic-core/object-api.h"
24static struct nl_object_ops request_obj_ops;
31 struct nl_addr * lr_addr;
38#define REQUEST_ATTR_ADDR 0x01
39#define REQUEST_ATTR_FWMARK 0x02
40#define REQUEST_ATTR_TOS 0x04
41#define REQUEST_ATTR_SCOPE 0x08
42#define REQUEST_ATTR_TABLE 0x10
45static void request_free_data(
struct nl_object *obj)
47 struct flnl_request *req = REQUEST_CAST(obj);
53static int request_clone(
struct nl_object *_dst,
struct nl_object *_src)
55 struct flnl_request *dst = nl_object_priv(_dst);
56 struct flnl_request *src = nl_object_priv(_src);
68static uint64_t request_compare(
struct nl_object *_a,
struct nl_object *_b,
69 uint64_t attrs,
int flags)
71 struct flnl_request *a = (
struct flnl_request *) _a;
72 struct flnl_request *b = (
struct flnl_request *) _b;
75#define _DIFF(ATTR, EXPR) ATTR_DIFF(attrs, ATTR, a, b, EXPR)
76 diff |= _DIFF(REQUEST_ATTR_FWMARK, a->lr_fwmark != b->lr_fwmark);
77 diff |= _DIFF(REQUEST_ATTR_TOS, a->lr_tos != b->lr_tos);
78 diff |= _DIFF(REQUEST_ATTR_SCOPE, a->lr_scope != b->lr_scope);
79 diff |= _DIFF(REQUEST_ATTR_TABLE, a->lr_table != b->lr_table);
80 diff |= _DIFF(REQUEST_ATTR_ADDR,
nl_addr_cmp(a->lr_addr, b->lr_addr));
92struct flnl_request *flnl_request_alloc(
void)
104void flnl_request_set_fwmark(
struct flnl_request *req, uint64_t fwmark)
106 req->lr_fwmark = fwmark;
107 req->ce_mask |= REQUEST_ATTR_FWMARK;
110uint64_t flnl_request_get_fwmark(
struct flnl_request *req)
112 if (req->ce_mask & REQUEST_ATTR_FWMARK)
113 return req->lr_fwmark;
115 return UINT_LEAST64_MAX;
118void flnl_request_set_tos(
struct flnl_request *req,
int tos)
121 req->ce_mask |= REQUEST_ATTR_TOS;
124int flnl_request_get_tos(
struct flnl_request *req)
126 if (req->ce_mask & REQUEST_ATTR_TOS)
132void flnl_request_set_scope(
struct flnl_request *req,
int scope)
134 req->lr_scope = scope;
135 req->ce_mask |= REQUEST_ATTR_SCOPE;
138int flnl_request_get_scope(
struct flnl_request *req)
140 if (req->ce_mask & REQUEST_ATTR_SCOPE)
141 return req->lr_scope;
146void flnl_request_set_table(
struct flnl_request *req,
int table)
148 req->lr_table = table;
149 req->ce_mask |= REQUEST_ATTR_TABLE;
152int flnl_request_get_table(
struct flnl_request *req)
154 if (req->ce_mask & REQUEST_ATTR_TABLE)
155 return req->lr_table;
160int flnl_request_set_addr(
struct flnl_request *req,
struct nl_addr *addr)
162 if (addr->a_family != AF_INET)
163 return -NLE_AF_NOSUPPORT;
171 req->ce_mask |= REQUEST_ATTR_ADDR;
176struct nl_addr *flnl_request_get_addr(
struct flnl_request *req)
178 if (req->ce_mask & REQUEST_ATTR_ADDR)
186static struct nl_object_ops request_obj_ops = {
187 .oo_name =
"fib_lookup/request",
188 .oo_size =
sizeof(
struct flnl_request),
189 .oo_free_data = request_free_data,
190 .oo_clone = request_clone,
191 .oo_compare = request_compare,
struct nl_addr * nl_addr_get(struct nl_addr *addr)
Increase the reference counter of an abstract address.
int nl_addr_cmp(const struct nl_addr *a, const struct nl_addr *b)
Compare abstract addresses.
struct nl_addr * nl_addr_clone(const struct nl_addr *addr)
Clone existing abstract address object.
void nl_addr_put(struct nl_addr *addr)
Decrease the reference counter of an abstract address.
struct nl_object * nl_object_alloc(struct nl_object_ops *ops)
Allocate a new object of kind specified by the operations handle.