diff options
author | YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> | 2007-02-05 05:15:04 +0100 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-02-08 21:38:42 +0100 |
commit | a0d78ebf3a0e33a1aeacf2fc518ad9273d6a1c2f (patch) | |
tree | 0cbbccb38b542073c19fb5e9922b436231e4d1fd /net/ipv6/route.c | |
parent | [NETLINK]: Don't BUG on undersized allocations (diff) | |
download | linux-a0d78ebf3a0e33a1aeacf2fc518ad9273d6a1c2f.tar.xz linux-a0d78ebf3a0e33a1aeacf2fc518ad9273d6a1c2f.zip |
[IPV6] ROUTE: Do not route packets to link-local address on other device.
With help from Wei Dong <weid@np.css.fujitsu.com>.
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/route.c')
-rw-r--r-- | net/ipv6/route.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index f4fda80a41a2..19c906f6efa1 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -311,12 +311,21 @@ static inline void rt6_probe(struct rt6_info *rt) static int inline rt6_check_dev(struct rt6_info *rt, int oif) { struct net_device *dev = rt->rt6i_dev; - if (!oif || dev->ifindex == oif) + int ret = 0; + + if (!oif) return 2; - if ((dev->flags & IFF_LOOPBACK) && - rt->rt6i_idev && rt->rt6i_idev->dev->ifindex == oif) - return 1; - return 0; + if (dev->flags & IFF_LOOPBACK) { + if (!WARN_ON(rt->rt6i_idev == NULL) && + rt->rt6i_idev->dev->ifindex == oif) + ret = 1; + else + return 0; + } + if (dev->ifindex == oif) + return 2; + + return ret; } static int inline rt6_check_neigh(struct rt6_info *rt) |