Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/net/dn_fib.h
10818 views
1
#ifndef _NET_DN_FIB_H
2
#define _NET_DN_FIB_H
3
4
/* WARNING: The ordering of these elements must match ordering
5
* of RTA_* rtnetlink attribute numbers.
6
*/
7
struct dn_kern_rta {
8
void *rta_dst;
9
void *rta_src;
10
int *rta_iif;
11
int *rta_oif;
12
void *rta_gw;
13
u32 *rta_priority;
14
void *rta_prefsrc;
15
struct rtattr *rta_mx;
16
struct rtattr *rta_mp;
17
unsigned char *rta_protoinfo;
18
u32 *rta_flow;
19
struct rta_cacheinfo *rta_ci;
20
struct rta_session *rta_sess;
21
};
22
23
struct dn_fib_res {
24
struct fib_rule *r;
25
struct dn_fib_info *fi;
26
unsigned char prefixlen;
27
unsigned char nh_sel;
28
unsigned char type;
29
unsigned char scope;
30
};
31
32
struct dn_fib_nh {
33
struct net_device *nh_dev;
34
unsigned nh_flags;
35
unsigned char nh_scope;
36
int nh_weight;
37
int nh_power;
38
int nh_oif;
39
__le16 nh_gw;
40
};
41
42
struct dn_fib_info {
43
struct dn_fib_info *fib_next;
44
struct dn_fib_info *fib_prev;
45
int fib_treeref;
46
atomic_t fib_clntref;
47
int fib_dead;
48
unsigned fib_flags;
49
int fib_protocol;
50
__le16 fib_prefsrc;
51
__u32 fib_priority;
52
__u32 fib_metrics[RTAX_MAX];
53
int fib_nhs;
54
int fib_power;
55
struct dn_fib_nh fib_nh[0];
56
#define dn_fib_dev fib_nh[0].nh_dev
57
};
58
59
60
#define DN_FIB_RES_RESET(res) ((res).nh_sel = 0)
61
#define DN_FIB_RES_NH(res) ((res).fi->fib_nh[(res).nh_sel])
62
63
#define DN_FIB_RES_PREFSRC(res) ((res).fi->fib_prefsrc ? : __dn_fib_res_prefsrc(&res))
64
#define DN_FIB_RES_GW(res) (DN_FIB_RES_NH(res).nh_gw)
65
#define DN_FIB_RES_DEV(res) (DN_FIB_RES_NH(res).nh_dev)
66
#define DN_FIB_RES_OIF(res) (DN_FIB_RES_NH(res).nh_oif)
67
68
typedef struct {
69
__le16 datum;
70
} dn_fib_key_t;
71
72
typedef struct {
73
__le16 datum;
74
} dn_fib_hash_t;
75
76
typedef struct {
77
__u16 datum;
78
} dn_fib_idx_t;
79
80
struct dn_fib_node {
81
struct dn_fib_node *fn_next;
82
struct dn_fib_info *fn_info;
83
#define DN_FIB_INFO(f) ((f)->fn_info)
84
dn_fib_key_t fn_key;
85
u8 fn_type;
86
u8 fn_scope;
87
u8 fn_state;
88
};
89
90
91
struct dn_fib_table {
92
struct hlist_node hlist;
93
u32 n;
94
95
int (*insert)(struct dn_fib_table *t, struct rtmsg *r,
96
struct dn_kern_rta *rta, struct nlmsghdr *n,
97
struct netlink_skb_parms *req);
98
int (*delete)(struct dn_fib_table *t, struct rtmsg *r,
99
struct dn_kern_rta *rta, struct nlmsghdr *n,
100
struct netlink_skb_parms *req);
101
int (*lookup)(struct dn_fib_table *t, const struct flowidn *fld,
102
struct dn_fib_res *res);
103
int (*flush)(struct dn_fib_table *t);
104
int (*dump)(struct dn_fib_table *t, struct sk_buff *skb, struct netlink_callback *cb);
105
106
unsigned char data[0];
107
};
108
109
#ifdef CONFIG_DECNET_ROUTER
110
/*
111
* dn_fib.c
112
*/
113
extern void dn_fib_init(void);
114
extern void dn_fib_cleanup(void);
115
116
extern int dn_fib_ioctl(struct socket *sock, unsigned int cmd,
117
unsigned long arg);
118
extern struct dn_fib_info *dn_fib_create_info(const struct rtmsg *r,
119
struct dn_kern_rta *rta,
120
const struct nlmsghdr *nlh, int *errp);
121
extern int dn_fib_semantic_match(int type, struct dn_fib_info *fi,
122
const struct flowidn *fld,
123
struct dn_fib_res *res);
124
extern void dn_fib_release_info(struct dn_fib_info *fi);
125
extern __le16 dn_fib_get_attr16(struct rtattr *attr, int attrlen, int type);
126
extern void dn_fib_flush(void);
127
extern void dn_fib_select_multipath(const struct flowidn *fld,
128
struct dn_fib_res *res);
129
130
/*
131
* dn_tables.c
132
*/
133
extern struct dn_fib_table *dn_fib_get_table(u32 n, int creat);
134
extern struct dn_fib_table *dn_fib_empty_table(void);
135
extern void dn_fib_table_init(void);
136
extern void dn_fib_table_cleanup(void);
137
138
/*
139
* dn_rules.c
140
*/
141
extern void dn_fib_rules_init(void);
142
extern void dn_fib_rules_cleanup(void);
143
extern unsigned dnet_addr_type(__le16 addr);
144
extern int dn_fib_lookup(struct flowidn *fld, struct dn_fib_res *res);
145
146
extern int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb);
147
148
extern void dn_fib_free_info(struct dn_fib_info *fi);
149
150
static inline void dn_fib_info_put(struct dn_fib_info *fi)
151
{
152
if (atomic_dec_and_test(&fi->fib_clntref))
153
dn_fib_free_info(fi);
154
}
155
156
static inline void dn_fib_res_put(struct dn_fib_res *res)
157
{
158
if (res->fi)
159
dn_fib_info_put(res->fi);
160
if (res->r)
161
fib_rule_put(res->r);
162
}
163
164
#else /* Endnode */
165
166
#define dn_fib_init() do { } while(0)
167
#define dn_fib_cleanup() do { } while(0)
168
169
#define dn_fib_lookup(fl, res) (-ESRCH)
170
#define dn_fib_info_put(fi) do { } while(0)
171
#define dn_fib_select_multipath(fl, res) do { } while(0)
172
#define dn_fib_rules_policy(saddr,res,flags) (0)
173
#define dn_fib_res_put(res) do { } while(0)
174
175
#endif /* CONFIG_DECNET_ROUTER */
176
177
static inline __le16 dnet_make_mask(int n)
178
{
179
if (n)
180
return cpu_to_le16(~((1 << (16 - n)) - 1));
181
return cpu_to_le16(0);
182
}
183
184
#endif /* _NET_DN_FIB_H */
185
186