20 #include <netlink-private/netlink.h> 21 #include <netlink/netlink.h> 22 #include <netlink/attr.h> 23 #include <netlink/utils.h> 24 #include <netlink/object.h> 25 #include <netlink/fib_lookup/request.h> 27 static struct nl_object_ops request_obj_ops;
30 #define REQUEST_ATTR_ADDR 0x01 31 #define REQUEST_ATTR_FWMARK 0x02 32 #define REQUEST_ATTR_TOS 0x04 33 #define REQUEST_ATTR_SCOPE 0x08 34 #define REQUEST_ATTR_TABLE 0x10 37 static void request_free_data(
struct nl_object *obj)
39 struct flnl_request *req = REQUEST_CAST(obj);
45 static int request_clone(
struct nl_object *_dst,
struct nl_object *_src)
47 struct flnl_request *dst = nl_object_priv(_dst);
48 struct flnl_request *src = nl_object_priv(_src);
57 static uint64_t request_compare(
struct nl_object *_a,
struct nl_object *_b,
58 uint64_t attrs,
int flags)
60 struct flnl_request *a = (
struct flnl_request *) _a;
61 struct flnl_request *b = (
struct flnl_request *) _b;
64 #define REQ_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, REQUEST_ATTR_##ATTR, a, b, EXPR) 66 diff |= REQ_DIFF(FWMARK, a->lr_fwmark != b->lr_fwmark);
67 diff |= REQ_DIFF(TOS, a->lr_tos != b->lr_tos);
68 diff |= REQ_DIFF(SCOPE, a->lr_scope != b->lr_scope);
69 diff |= REQ_DIFF(TABLE, a->lr_table != b->lr_table);
70 diff |= REQ_DIFF(ADDR,
nl_addr_cmp(a->lr_addr, b->lr_addr));
83 struct flnl_request *flnl_request_alloc(
void)
95 void flnl_request_set_fwmark(
struct flnl_request *req, uint64_t fwmark)
97 req->lr_fwmark = fwmark;
98 req->ce_mask |= REQUEST_ATTR_FWMARK;
101 uint64_t flnl_request_get_fwmark(
struct flnl_request *req)
103 if (req->ce_mask & REQUEST_ATTR_FWMARK)
104 return req->lr_fwmark;
106 return UINT_LEAST64_MAX;
109 void flnl_request_set_tos(
struct flnl_request *req,
int tos)
112 req->ce_mask |= REQUEST_ATTR_TOS;
115 int flnl_request_get_tos(
struct flnl_request *req)
117 if (req->ce_mask & REQUEST_ATTR_TOS)
123 void flnl_request_set_scope(
struct flnl_request *req,
int scope)
125 req->lr_scope = scope;
126 req->ce_mask |= REQUEST_ATTR_SCOPE;
129 int flnl_request_get_scope(
struct flnl_request *req)
131 if (req->ce_mask & REQUEST_ATTR_SCOPE)
132 return req->lr_scope;
137 void flnl_request_set_table(
struct flnl_request *req,
int table)
139 req->lr_table = table;
140 req->ce_mask |= REQUEST_ATTR_TABLE;
143 int flnl_request_get_table(
struct flnl_request *req)
145 if (req->ce_mask & REQUEST_ATTR_TABLE)
146 return req->lr_table;
151 int flnl_request_set_addr(
struct flnl_request *req,
struct nl_addr *addr)
153 if (addr->a_family != AF_INET)
154 return -NLE_AF_NOSUPPORT;
162 req->ce_mask |= REQUEST_ATTR_ADDR;
167 struct nl_addr *flnl_request_get_addr(
struct flnl_request *req)
169 if (req->ce_mask & REQUEST_ATTR_ADDR)
177 static struct nl_object_ops request_obj_ops = {
178 .oo_name =
"fib_lookup/request",
179 .oo_size =
sizeof(
struct flnl_request),
180 .oo_free_data = request_free_data,
181 .oo_clone = request_clone,
182 .oo_compare = request_compare,
struct nl_addr * nl_addr_clone(const struct nl_addr *addr)
Clone existing abstract address object.
int nl_addr_cmp(const struct nl_addr *a, const struct nl_addr *b)
Compare abstract addresses.
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_get(struct nl_addr *addr)
Increase the reference counter of an abstract address.
void nl_addr_put(struct nl_addr *addr)
Decrease the reference counter of an abstract address.