2
* lib/fib_lookup/request.c FIB Lookup Request
4
* This library is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation version 2.1
9
* Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch>
14
* @defgroup flreq Request
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>
26
static struct nl_object_ops request_obj_ops;
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);
50
if (!(dst->lr_addr = nl_addr_clone(src->lr_addr)))
56
static int request_compare(struct nl_object *_a, struct nl_object *_b,
57
uint32_t attrs, int flags)
59
struct flnl_request *a = (struct flnl_request *) _a;
60
struct flnl_request *b = (struct flnl_request *) _b;
63
#define REQ_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, REQUEST_ATTR_##ATTR, a, b, EXPR)
65
diff |= REQ_DIFF(FWMARK, a->lr_fwmark != b->lr_fwmark);
66
diff |= REQ_DIFF(TOS, a->lr_tos != b->lr_tos);
67
diff |= REQ_DIFF(SCOPE, a->lr_scope != b->lr_scope);
68
diff |= REQ_DIFF(TABLE, a->lr_table != b->lr_table);
69
diff |= REQ_DIFF(ADDR, nl_addr_cmp(a->lr_addr, b->lr_addr));
78
* @name Lookup Request Creation/Deletion
82
struct flnl_request *flnl_request_alloc(void)
84
return REQUEST_CAST(nl_object_alloc(&request_obj_ops));
94
void flnl_request_set_fwmark(struct flnl_request *req, uint64_t fwmark)
96
req->lr_fwmark = fwmark;
97
req->ce_mask |= REQUEST_ATTR_FWMARK;
100
uint64_t flnl_request_get_fwmark(struct flnl_request *req)
102
if (req->ce_mask & REQUEST_ATTR_FWMARK)
103
return req->lr_fwmark;
105
return UINT_LEAST64_MAX;
108
void flnl_request_set_tos(struct flnl_request *req, int tos)
111
req->ce_mask |= REQUEST_ATTR_TOS;
114
int flnl_request_get_tos(struct flnl_request *req)
116
if (req->ce_mask & REQUEST_ATTR_TOS)
122
void flnl_request_set_scope(struct flnl_request *req, int scope)
124
req->lr_scope = scope;
125
req->ce_mask |= REQUEST_ATTR_SCOPE;
128
int flnl_request_get_scope(struct flnl_request *req)
130
if (req->ce_mask & REQUEST_ATTR_SCOPE)
131
return req->lr_scope;
136
void flnl_request_set_table(struct flnl_request *req, int table)
138
req->lr_table = table;
139
req->ce_mask |= REQUEST_ATTR_TABLE;
142
int flnl_request_get_table(struct flnl_request *req)
144
if (req->ce_mask & REQUEST_ATTR_TABLE)
145
return req->lr_table;
150
int flnl_request_set_addr(struct flnl_request *req, struct nl_addr *addr)
152
if (addr->a_family != AF_INET)
153
return -NLE_AF_NOSUPPORT;
156
nl_addr_put(req->lr_addr);
161
req->ce_mask |= REQUEST_ATTR_ADDR;
166
struct nl_addr *flnl_request_get_addr(struct flnl_request *req)
168
if (req->ce_mask & REQUEST_ATTR_ADDR)
176
static struct nl_object_ops request_obj_ops = {
177
.oo_name = "fib_lookup/request",
178
.oo_size = sizeof(struct flnl_request),
179
.oo_free_data = request_free_data,
180
.oo_clone = request_clone,
181
.oo_compare = request_compare,