[IPV6]: Repair Incoming Interface Handling for Raw Socket.
authorYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Fri, 2 Sep 2005 00:44:49 +0000 (17:44 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 2 Sep 2005 00:44:49 +0000 (17:44 -0700)
Due to changes to enforce checking interface bindings,
sockets did not see loopback packets bound for our local address
on our interface.

e.g.)
  When we ping6 fe80::1%eth0, skb->dev points loopback_dev while
  IP6CB(skb)->iif indicates eth0.

This patch fixes the issue by using appropriate incoming interface,
in the sense of scoping architecture.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/icmp.c
net/ipv6/raw.c

index 5176fc6..fa8f1bb 100644 (file)
@@ -549,7 +549,7 @@ static void icmpv6_notify(struct sk_buff *skb, int type, int code, u32 info)
        read_lock(&raw_v6_lock);
        if ((sk = sk_head(&raw_v6_htable[hash])) != NULL) {
                while((sk = __raw_v6_lookup(sk, nexthdr, daddr, saddr,
-                                           skb->dev->ifindex))) {
+                                           IP6CB(skb)->iif))) {
                        rawv6_err(sk, skb, NULL, type, code, inner_offset, info);
                        sk = sk_next(sk);
                }
index 7a58632..ed3a76b 100644 (file)
@@ -166,7 +166,7 @@ int ipv6_raw_deliver(struct sk_buff *skb, int nexthdr)
        if (sk == NULL)
                goto out;
 
-       sk = __raw_v6_lookup(sk, nexthdr, daddr, saddr, skb->dev->ifindex);
+       sk = __raw_v6_lookup(sk, nexthdr, daddr, saddr, IP6CB(skb)->iif);
 
        while (sk) {
                delivered = 1;
@@ -178,7 +178,7 @@ int ipv6_raw_deliver(struct sk_buff *skb, int nexthdr)
                                rawv6_rcv(sk, clone);
                }
                sk = __raw_v6_lookup(sk_next(sk), nexthdr, daddr, saddr,
-                                    skb->dev->ifindex);
+                                    IP6CB(skb)->iif);
        }
 out:
        read_unlock(&raw_v6_lock);