• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/include/net/
1/*
2 * INET		An implementation of the TCP/IP protocol suite for the LINUX
3 *		operating system.  INET  is implemented using the  BSD Socket
4 *		interface as the means of communication with the user level.
5 *
6 *		Definitions for the Forwarding Information Base.
7 *
8 * Authors:	A.N.Kuznetsov, <kuznet@ms2.inr.ac.ru>
9 *
10 *		This program is free software; you can redistribute it and/or
11 *		modify it under the terms of the GNU General Public License
12 *		as published by the Free Software Foundation; either version
13 *		2 of the License, or (at your option) any later version.
14 */
15
16#ifndef _NET_IP_FIB_H
17#define _NET_IP_FIB_H
18
19#include <net/flow.h>
20#include <linux/seq_file.h>
21#include <net/fib_rules.h>
22
23struct fib_config {
24	u8			fc_dst_len;
25	u8			fc_tos;
26	u8			fc_protocol;
27	u8			fc_scope;
28	u8			fc_type;
29	/* 3 bytes unused */
30	u32			fc_table;
31	__be32			fc_dst;
32	__be32			fc_gw;
33	int			fc_oif;
34	u32			fc_flags;
35	u32			fc_priority;
36	__be32			fc_prefsrc;
37	struct nlattr		*fc_mx;
38	struct rtnexthop	*fc_mp;
39	int			fc_mx_len;
40	int			fc_mp_len;
41	u32			fc_flow;
42	u32			fc_nlflags;
43	struct nl_info		fc_nlinfo;
44 };
45
46struct fib_info;
47
48struct fib_nh {
49	struct net_device	*nh_dev;
50	struct hlist_node	nh_hash;
51	struct fib_info		*nh_parent;
52	unsigned		nh_flags;
53	unsigned char		nh_scope;
54#ifdef CONFIG_IP_ROUTE_MULTIPATH
55	int			nh_weight;
56	int			nh_power;
57#endif
58#ifdef CONFIG_NET_CLS_ROUTE
59	__u32			nh_tclassid;
60#endif
61	int			nh_oif;
62	__be32			nh_gw;
63};
64
65/*
66 * This structure contains data shared by many of routes.
67 */
68
69struct fib_info {
70	struct hlist_node	fib_hash;
71	struct hlist_node	fib_lhash;
72	struct net		*fib_net;
73	int			fib_treeref;
74	atomic_t		fib_clntref;
75	int			fib_dead;
76	unsigned		fib_flags;
77	int			fib_protocol;
78	__be32			fib_prefsrc;
79	u32			fib_priority;
80	u32			fib_metrics[RTAX_MAX];
81#define fib_mtu fib_metrics[RTAX_MTU-1]
82#define fib_window fib_metrics[RTAX_WINDOW-1]
83#define fib_rtt fib_metrics[RTAX_RTT-1]
84#define fib_advmss fib_metrics[RTAX_ADVMSS-1]
85	int			fib_nhs;
86#ifdef CONFIG_IP_ROUTE_MULTIPATH
87	int			fib_power;
88#endif
89	struct fib_nh		fib_nh[0];
90#define fib_dev		fib_nh[0].nh_dev
91};
92
93
94#ifdef CONFIG_IP_MULTIPLE_TABLES
95struct fib_rule;
96#endif
97
98struct fib_result {
99	unsigned char	prefixlen;
100	unsigned char	nh_sel;
101	unsigned char	type;
102	unsigned char	scope;
103	struct fib_info *fi;
104#ifdef CONFIG_IP_MULTIPLE_TABLES
105	struct fib_rule	*r;
106#endif
107};
108
109struct fib_result_nl {
110	__be32		fl_addr;   /* To be looked up*/
111	u32		fl_mark;
112	unsigned char	fl_tos;
113	unsigned char   fl_scope;
114	unsigned char   tb_id_in;
115
116	unsigned char   tb_id;      /* Results */
117	unsigned char	prefixlen;
118	unsigned char	nh_sel;
119	unsigned char	type;
120	unsigned char	scope;
121	int             err;
122};
123
124#ifdef CONFIG_IP_ROUTE_MULTIPATH
125
126#define FIB_RES_NH(res)		((res).fi->fib_nh[(res).nh_sel])
127
128#define FIB_TABLE_HASHSZ 2
129
130#else /* CONFIG_IP_ROUTE_MULTIPATH */
131
132#define FIB_RES_NH(res)		((res).fi->fib_nh[0])
133
134#define FIB_TABLE_HASHSZ 256
135
136#endif /* CONFIG_IP_ROUTE_MULTIPATH */
137
138#define FIB_RES_PREFSRC(res)		((res).fi->fib_prefsrc ? : __fib_res_prefsrc(&res))
139#define FIB_RES_GW(res)			(FIB_RES_NH(res).nh_gw)
140#define FIB_RES_DEV(res)		(FIB_RES_NH(res).nh_dev)
141#define FIB_RES_OIF(res)		(FIB_RES_NH(res).nh_oif)
142
143struct fib_table {
144	struct hlist_node tb_hlist;
145	u32		tb_id;
146	int		tb_default;
147	unsigned char	tb_data[0];
148};
149
150extern int fib_table_lookup(struct fib_table *tb, const struct flowi *flp,
151			    struct fib_result *res);
152extern int fib_table_insert(struct fib_table *, struct fib_config *);
153extern int fib_table_delete(struct fib_table *, struct fib_config *);
154extern int fib_table_dump(struct fib_table *table, struct sk_buff *skb,
155			  struct netlink_callback *cb);
156extern int fib_table_flush(struct fib_table *table);
157extern void fib_table_select_default(struct fib_table *table,
158				     const struct flowi *flp,
159				     struct fib_result *res);
160
161
162#ifndef CONFIG_IP_MULTIPLE_TABLES
163
164#define TABLE_LOCAL_INDEX	0
165#define TABLE_MAIN_INDEX	1
166
167static inline struct fib_table *fib_get_table(struct net *net, u32 id)
168{
169	struct hlist_head *ptr;
170
171	ptr = id == RT_TABLE_LOCAL ?
172		&net->ipv4.fib_table_hash[TABLE_LOCAL_INDEX] :
173		&net->ipv4.fib_table_hash[TABLE_MAIN_INDEX];
174	return hlist_entry(ptr->first, struct fib_table, tb_hlist);
175}
176
177static inline struct fib_table *fib_new_table(struct net *net, u32 id)
178{
179	return fib_get_table(net, id);
180}
181
182static inline int fib_lookup(struct net *net, const struct flowi *flp,
183			     struct fib_result *res)
184{
185	struct fib_table *table;
186
187	table = fib_get_table(net, RT_TABLE_LOCAL);
188	if (!fib_table_lookup(table, flp, res))
189		return 0;
190
191	table = fib_get_table(net, RT_TABLE_MAIN);
192	if (!fib_table_lookup(table, flp, res))
193		return 0;
194	return -ENETUNREACH;
195}
196
197#else /* CONFIG_IP_MULTIPLE_TABLES */
198extern int __net_init fib4_rules_init(struct net *net);
199extern void __net_exit fib4_rules_exit(struct net *net);
200
201#ifdef CONFIG_NET_CLS_ROUTE
202extern u32 fib_rules_tclass(struct fib_result *res);
203#endif
204
205extern int fib_lookup(struct net *n, struct flowi *flp, struct fib_result *res);
206
207extern struct fib_table *fib_new_table(struct net *net, u32 id);
208extern struct fib_table *fib_get_table(struct net *net, u32 id);
209
210#endif /* CONFIG_IP_MULTIPLE_TABLES */
211
212/* Exported by fib_frontend.c */
213extern const struct nla_policy rtm_ipv4_policy[];
214extern void		ip_fib_init(void);
215extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
216			       struct net_device *dev, __be32 *spec_dst,
217			       u32 *itag, u32 mark);
218extern void fib_select_default(struct net *net, const struct flowi *flp,
219			       struct fib_result *res);
220
221/* Exported by fib_semantics.c */
222extern int ip_fib_check_default(__be32 gw, struct net_device *dev);
223extern int fib_sync_down_dev(struct net_device *dev, int force);
224extern int fib_sync_down_addr(struct net *net, __be32 local);
225extern int fib_sync_up(struct net_device *dev);
226extern __be32  __fib_res_prefsrc(struct fib_result *res);
227extern void fib_select_multipath(const struct flowi *flp, struct fib_result *res);
228
229/* Exported by fib_{hash|trie}.c */
230extern void fib_hash_init(void);
231extern struct fib_table *fib_hash_table(u32 id);
232
233static inline void fib_combine_itag(u32 *itag, struct fib_result *res)
234{
235#ifdef CONFIG_NET_CLS_ROUTE
236#ifdef CONFIG_IP_MULTIPLE_TABLES
237	u32 rtag;
238#endif
239	*itag = FIB_RES_NH(*res).nh_tclassid<<16;
240#ifdef CONFIG_IP_MULTIPLE_TABLES
241	rtag = fib_rules_tclass(res);
242	if (*itag == 0)
243		*itag = (rtag<<16);
244	*itag |= (rtag>>16);
245#endif
246#endif
247}
248
249extern void free_fib_info(struct fib_info *fi);
250
251static inline void fib_info_put(struct fib_info *fi)
252{
253	if (atomic_dec_and_test(&fi->fib_clntref))
254		free_fib_info(fi);
255}
256
257static inline void fib_res_put(struct fib_result *res)
258{
259	if (res->fi)
260		fib_info_put(res->fi);
261#ifdef CONFIG_IP_MULTIPLE_TABLES
262	if (res->r)
263		fib_rule_put(res->r);
264#endif
265}
266
267#ifdef CONFIG_PROC_FS
268extern int __net_init  fib_proc_init(struct net *net);
269extern void __net_exit fib_proc_exit(struct net *net);
270#else
271static inline int fib_proc_init(struct net *net)
272{
273	return 0;
274}
275static inline void fib_proc_exit(struct net *net)
276{
277}
278#endif
279
280#endif  /* _NET_FIB_H */
281