19 #include <netlink-local.h>
20 #include <netlink/netlink.h>
21 #include <netlink/attr.h>
22 #include <netlink/utils.h>
23 #include <netlink/object.h>
24 #include <netlink/fib_lookup/request.h>
29 #define REQUEST_ATTR_ADDR 0x01
30 #define REQUEST_ATTR_FWMARK 0x02
31 #define REQUEST_ATTR_TOS 0x04
32 #define REQUEST_ATTR_SCOPE 0x08
33 #define REQUEST_ATTR_TABLE 0x10
36 static void request_free_data(
struct nl_object *obj)
38 struct flnl_request *req = REQUEST_CAST(obj);
41 nl_addr_put(req->lr_addr);
44 static int request_clone(
struct nl_object *_dst,
struct nl_object *_src)
46 struct flnl_request *dst = nl_object_priv(_dst);
47 struct flnl_request *src = nl_object_priv(_src);
55 return nl_get_errno();
58 static int request_compare(
struct nl_object *_a,
struct nl_object *_b,
59 uint32_t attrs,
int flags)
61 struct flnl_request *a = (
struct flnl_request *) _a;
62 struct flnl_request *b = (
struct flnl_request *) _b;
65 #define REQ_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, REQUEST_ATTR_##ATTR, a, b, EXPR)
67 diff |= REQ_DIFF(FWMARK, a->lr_fwmark != b->lr_fwmark);
68 diff |= REQ_DIFF(TOS, a->lr_tos != b->lr_tos);
69 diff |= REQ_DIFF(SCOPE, a->lr_scope != b->lr_scope);
70 diff |= REQ_DIFF(TABLE, a->lr_table != b->lr_table);
71 diff |= REQ_DIFF(ADDR,
nl_addr_cmp(a->lr_addr, b->lr_addr));
84 struct flnl_request *flnl_request_alloc(
void)
96 void flnl_request_set_fwmark(
struct flnl_request *req, uint64_t fwmark)
98 req->lr_fwmark = fwmark;
99 req->ce_mask |= REQUEST_ATTR_FWMARK;
102 uint64_t flnl_request_get_fwmark(
struct flnl_request *req)
104 if (req->ce_mask & REQUEST_ATTR_FWMARK)
105 return req->lr_fwmark;
107 return UINT_LEAST64_MAX;
110 void flnl_request_set_tos(
struct flnl_request *req,
int tos)
113 req->ce_mask |= REQUEST_ATTR_TOS;
116 int flnl_request_get_tos(
struct flnl_request *req)
118 if (req->ce_mask & REQUEST_ATTR_TOS)
124 void flnl_request_set_scope(
struct flnl_request *req,
int scope)
126 req->lr_scope = scope;
127 req->ce_mask |= REQUEST_ATTR_SCOPE;
130 int flnl_request_get_scope(
struct flnl_request *req)
132 if (req->ce_mask & REQUEST_ATTR_SCOPE)
133 return req->lr_scope;
138 void flnl_request_set_table(
struct flnl_request *req,
int table)
140 req->lr_table = table;
141 req->ce_mask |= REQUEST_ATTR_TABLE;
144 int flnl_request_get_table(
struct flnl_request *req)
146 if (req->ce_mask & REQUEST_ATTR_TABLE)
147 return req->lr_table;
152 int flnl_request_set_addr(
struct flnl_request *req,
struct nl_addr *addr)
154 if (addr->a_family != AF_INET)
155 return nl_error(EINVAL,
"Address must be an IPv4 address");
158 nl_addr_put(req->lr_addr);
163 req->ce_mask |= REQUEST_ATTR_ADDR;
168 struct nl_addr *flnl_request_get_addr(
struct flnl_request *req)
170 if (req->ce_mask & REQUEST_ATTR_ADDR)
179 .
oo_name =
"fib_lookup/request",
180 .oo_size =
sizeof(
struct flnl_request),
181 .oo_free_data = request_free_data,
182 .oo_clone = request_clone,
183 .oo_compare = request_compare,
struct nl_object * nl_object_alloc(struct nl_object_ops *ops)
Allocate a new object of kind specified by the operations handle.
struct nl_addr * nl_addr_clone(struct nl_addr *addr)
Clone existing abstract address object.
int nl_addr_cmp(struct nl_addr *a, struct nl_addr *b)
Compares two abstract address objects.
char * oo_name
Unique name of object type.