aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis V. Lunev <den@openvz.org>2008-01-20 19:47:09 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:08:14 -0500
commit51314a17baabc710e5fb12975fe8983dedd5ac0d (patch)
treec0aaa74535570247f34a60bd80133c70881144b6
parent9e3a548781fc1c0da617fc65769a515f074be740 (diff)
[NETNS]: Process FIB rule action in the context of the namespace.
Save namespace context on the fib rule at the rule creation time and call routing lookup in the correct namespace. Signed-off-by: Denis V. Lunev <den@openvz.org> Acked-by: Daniel Lezcano <dlezcano@fr.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/fib_rules.h1
-rw-r--r--net/core/fib_rules.c2
-rw-r--r--net/ipv4/fib_rules.c2
3 files changed, 4 insertions, 1 deletions
diff --git a/include/net/fib_rules.h b/include/net/fib_rules.h
index 7f9f4aec8fc8..34349f9f4331 100644
--- a/include/net/fib_rules.h
+++ b/include/net/fib_rules.h
@@ -22,6 +22,7 @@ struct fib_rule
22 u32 target; 22 u32 target;
23 struct fib_rule * ctarget; 23 struct fib_rule * ctarget;
24 struct rcu_head rcu; 24 struct rcu_head rcu;
25 struct net * fr_net;
25}; 26};
26 27
27struct fib_lookup_arg 28struct fib_lookup_arg
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c
index 3cd4f13413f6..42ccaf5b8509 100644
--- a/net/core/fib_rules.c
+++ b/net/core/fib_rules.c
@@ -29,6 +29,7 @@ int fib_default_rule_add(struct fib_rules_ops *ops,
29 r->pref = pref; 29 r->pref = pref;
30 r->table = table; 30 r->table = table;
31 r->flags = flags; 31 r->flags = flags;
32 r->fr_net = ops->fro_net;
32 33
33 /* The lock is not required here, the list in unreacheable 34 /* The lock is not required here, the list in unreacheable
34 * at the moment this function is called */ 35 * at the moment this function is called */
@@ -242,6 +243,7 @@ static int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
242 err = -ENOMEM; 243 err = -ENOMEM;
243 goto errout; 244 goto errout;
244 } 245 }
246 rule->fr_net = net;
245 247
246 if (tb[FRA_PRIORITY]) 248 if (tb[FRA_PRIORITY])
247 rule->pref = nla_get_u32(tb[FRA_PRIORITY]); 249 rule->pref = nla_get_u32(tb[FRA_PRIORITY]);
diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c
index 3b7affd5cb3b..d2001f1c28a2 100644
--- a/net/ipv4/fib_rules.c
+++ b/net/ipv4/fib_rules.c
@@ -91,7 +91,7 @@ static int fib4_rule_action(struct fib_rule *rule, struct flowi *flp,
91 goto errout; 91 goto errout;
92 } 92 }
93 93
94 if ((tbl = fib_get_table(&init_net, rule->table)) == NULL) 94 if ((tbl = fib_get_table(rule->fr_net, rule->table)) == NULL)
95 goto errout; 95 goto errout;
96 96
97 err = tbl->tb_lookup(tbl, flp, (struct fib_result *) arg->result); 97 err = tbl->tb_lookup(tbl, flp, (struct fib_result *) arg->result);