From 195c6a191689afec0df525baf1d5475da8747f00 Mon Sep 17 00:00:00 2001 From: Tom Herbert Date: Sun, 23 May 2010 19:54:12 +0000 Subject: [PATCH] --- yaml --- r: 214797 b: refs/heads/master c: 4465b469008bc03b98a1b8df4e9ae501b6c69d4b h: refs/heads/master i: 214795: f7c271624995202302b51ae54c20dd0ec2aba10a v: v3 --- [refs] | 2 +- trunk/include/net/flow.h | 1 + trunk/net/core/fib_rules.c | 3 ++- trunk/net/ipv4/fib_frontend.c | 7 +++---- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 789aabe00641..1d3667ea0f31 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fc34ecd07f15358e2b29620fafeb8a6a9528ce79 +refs/heads/master: 4465b469008bc03b98a1b8df4e9ae501b6c69d4b diff --git a/trunk/include/net/flow.h b/trunk/include/net/flow.h index bb08692a20b0..0ac3fb5e0973 100644 --- a/trunk/include/net/flow.h +++ b/trunk/include/net/flow.h @@ -49,6 +49,7 @@ struct flowi { __u8 proto; __u8 flags; #define FLOWI_FLAG_ANYSRC 0x01 +#define FLOWI_FLAG_MATCH_ANY_IIF 0x02 union { struct { __be16 sport; diff --git a/trunk/net/core/fib_rules.c b/trunk/net/core/fib_rules.c index d0787284cb07..332c2e31d048 100644 --- a/trunk/net/core/fib_rules.c +++ b/trunk/net/core/fib_rules.c @@ -182,7 +182,8 @@ static int fib_rule_match(struct fib_rule *rule, struct fib_rules_ops *ops, { int ret = 0; - if (rule->iifindex && (rule->iifindex != fl->iif)) + if (rule->iifindex && (rule->iifindex != fl->iif) && + !(fl->flags & FLOWI_FLAG_MATCH_ANY_IIF)) goto out; if (rule->oifindex && (rule->oifindex != fl->oif)) diff --git a/trunk/net/ipv4/fib_frontend.c b/trunk/net/ipv4/fib_frontend.c index 7d02a9f999fa..981f3c59b334 100644 --- a/trunk/net/ipv4/fib_frontend.c +++ b/trunk/net/ipv4/fib_frontend.c @@ -153,17 +153,16 @@ static void fib_flush(struct net *net) struct net_device * ip_dev_find(struct net *net, __be32 addr) { - struct flowi fl = { .nl_u = { .ip4_u = { .daddr = addr } } }; + struct flowi fl = { .nl_u = { .ip4_u = { .daddr = addr } }, + .flags = FLOWI_FLAG_MATCH_ANY_IIF }; struct fib_result res; struct net_device *dev = NULL; - struct fib_table *local_table; #ifdef CONFIG_IP_MULTIPLE_TABLES res.r = NULL; #endif - local_table = fib_get_table(net, RT_TABLE_LOCAL); - if (!local_table || fib_table_lookup(local_table, &fl, &res)) + if (fib_lookup(net, &fl, &res)) return NULL; if (res.type != RTN_LOCAL) goto out;