Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dn_fib.h
Go to the documentation of this file.
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;
14  void *rta_prefsrc;
15  struct rtattr *rta_mx;
16  struct rtattr *rta_mp;
17  unsigned char *rta_protoinfo;
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 int nh_flags;
35  unsigned char nh_scope;
36  int nh_weight;
37  int nh_power;
38  int nh_oif;
40 };
41 
42 struct dn_fib_info {
47  int fib_dead;
48  unsigned int fib_flags;
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 {
70 } dn_fib_key_t;
71 
72 typedef struct {
75 
76 typedef struct {
78 } dn_fib_idx_t;
79 
80 struct dn_fib_node {
83 #define DN_FIB_INFO(f) ((f)->fn_info)
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 int 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 {
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 */