aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-07-06 01:13:13 -0400
committerDavid S. Miller <davem@davemloft.net>2012-07-06 01:13:13 -0400
commitf4530fa574df4d833506c53697ed1daa0d390bf4 (patch)
tree2a19ff4c8410d5aee18a78cddaeb765ed9aa95d6 /include
parent700db99d0140e9da2a31e08ebd3e1b121691aa26 (diff)
ipv4: Avoid overhead when no custom FIB rules are installed.
If the user hasn't actually installed any custom rules, or fiddled with the default ones, don't go through the whole FIB rules layer. It's just pure overhead. Instead do what we do with CONFIG_IP_MULTIPLE_TABLES disabled, check the individual tables by hand, one by one. Also, move fib_num_tclassid_users into the ipv4 network namespace. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r--include/net/ip_fib.h36
-rw-r--r--include/net/netns/ipv4.h8
2 files changed, 40 insertions, 4 deletions
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index 3dc7c96bbea..539c6721f81 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -220,11 +220,33 @@ extern void __net_exit fib4_rules_exit(struct net *net);
220extern u32 fib_rules_tclass(const struct fib_result *res); 220extern u32 fib_rules_tclass(const struct fib_result *res);
221#endif 221#endif
222 222
223extern int fib_lookup(struct net *n, struct flowi4 *flp, struct fib_result *res);
224
225extern struct fib_table *fib_new_table(struct net *net, u32 id); 223extern struct fib_table *fib_new_table(struct net *net, u32 id);
226extern struct fib_table *fib_get_table(struct net *net, u32 id); 224extern struct fib_table *fib_get_table(struct net *net, u32 id);
227 225
226extern int __fib_lookup(struct net *net, struct flowi4 *flp,
227 struct fib_result *res);
228
229static inline int fib_lookup(struct net *net, struct flowi4 *flp,
230 struct fib_result *res)
231{
232 if (!net->ipv4.fib_has_custom_rules) {
233 if (net->ipv4.fib_local &&
234 !fib_table_lookup(net->ipv4.fib_local, flp, res,
235 FIB_LOOKUP_NOREF))
236 return 0;
237 if (net->ipv4.fib_main &&
238 !fib_table_lookup(net->ipv4.fib_main, flp, res,
239 FIB_LOOKUP_NOREF))
240 return 0;
241 if (net->ipv4.fib_default &&
242 !fib_table_lookup(net->ipv4.fib_default, flp, res,
243 FIB_LOOKUP_NOREF))
244 return 0;
245 return -ENETUNREACH;
246 }
247 return __fib_lookup(net, flp, res);
248}
249
228#endif /* CONFIG_IP_MULTIPLE_TABLES */ 250#endif /* CONFIG_IP_MULTIPLE_TABLES */
229 251
230/* Exported by fib_frontend.c */ 252/* Exported by fib_frontend.c */
@@ -236,9 +258,15 @@ extern int fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst,
236 struct in_device *idev, u32 *itag); 258 struct in_device *idev, u32 *itag);
237extern void fib_select_default(struct fib_result *res); 259extern void fib_select_default(struct fib_result *res);
238#ifdef CONFIG_IP_ROUTE_CLASSID 260#ifdef CONFIG_IP_ROUTE_CLASSID
239extern int fib_num_tclassid_users; 261static inline int fib_num_tclassid_users(struct net *net)
262{
263 return net->ipv4.fib_num_tclassid_users;
264}
240#else 265#else
241#define fib_num_tclassid_users 0 266static inline int fib_num_tclassid_users(struct net *net)
267{
268 return 0;
269}
242#endif 270#endif
243 271
244/* Exported by fib_semantics.c */ 272/* Exported by fib_semantics.c */
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h
index 227f0cd9d3f..599e48fa97c 100644
--- a/include/net/netns/ipv4.h
+++ b/include/net/netns/ipv4.h
@@ -11,6 +11,7 @@ struct ctl_table_header;
11struct ipv4_devconf; 11struct ipv4_devconf;
12struct fib_rules_ops; 12struct fib_rules_ops;
13struct hlist_head; 13struct hlist_head;
14struct fib_table;
14struct sock; 15struct sock;
15 16
16struct netns_ipv4 { 17struct netns_ipv4 {
@@ -24,6 +25,13 @@ struct netns_ipv4 {
24 struct ipv4_devconf *devconf_dflt; 25 struct ipv4_devconf *devconf_dflt;
25#ifdef CONFIG_IP_MULTIPLE_TABLES 26#ifdef CONFIG_IP_MULTIPLE_TABLES
26 struct fib_rules_ops *rules_ops; 27 struct fib_rules_ops *rules_ops;
28 bool fib_has_custom_rules;
29 struct fib_table *fib_local;
30 struct fib_table *fib_main;
31 struct fib_table *fib_default;
32#endif
33#ifdef CONFIG_IP_ROUTE_CLASSID
34 int fib_num_tclassid_users;
27#endif 35#endif
28 struct hlist_head *fib_table_hash; 36 struct hlist_head *fib_table_hash;
29 struct sock *fibnl; 37 struct sock *fibnl;