]> git.openpandora.org Git - pandora-kernel.git/commitdiff
ipv6: introduce tcp_v6_iif()
authorEric Dumazet <edumazet@google.com>
Fri, 17 Oct 2014 16:17:20 +0000 (09:17 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 18 Oct 2014 03:48:07 +0000 (23:48 -0400)
Commit 971f10eca186 ("tcp: better TCP_SKB_CB layout to reduce cache line
misses") added a regression for SO_BINDTODEVICE on IPv6.

This is because we still use inet6_iif() which expects that IP6 control
block is still at the beginning of skb->cb[]

This patch adds tcp_v6_iif() helper and uses it where necessary.

Because __inet6_lookup_skb() is used by TCP and DCCP, we add an iif
parameter to it.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Fixes: 971f10eca186 ("tcp: better TCP_SKB_CB layout to reduce cache line misses")
Acked-by: Cong Wang <cwang@twopensource.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/inet6_hashtables.h
include/net/tcp.h
net/dccp/ipv6.c
net/ipv6/syncookies.c
net/ipv6/tcp_ipv6.c

index ae061354430836687225be9ae1a8c1f09a35ed8a..d1d272843b3bd609c5e93650d835f32055444d6a 100644 (file)
@@ -80,7 +80,8 @@ static inline struct sock *__inet6_lookup(struct net *net,
 static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo,
                                              struct sk_buff *skb,
                                              const __be16 sport,
-                                             const __be16 dport)
+                                             const __be16 dport,
+                                             int iif)
 {
        struct sock *sk = skb_steal_sock(skb);
 
@@ -90,7 +91,7 @@ static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo,
        return __inet6_lookup(dev_net(skb_dst(skb)->dev), hashinfo,
                              &ipv6_hdr(skb)->saddr, sport,
                              &ipv6_hdr(skb)->daddr, ntohs(dport),
-                             inet6_iif(skb));
+                             iif);
 }
 
 struct sock *inet6_lookup(struct net *net, struct inet_hashinfo *hashinfo,
index 3a4bbbfdcf8d462cca95534a17015718d4c64ce3..c9766f89deba1f82ed2e2a43cf02a2758bc5953b 100644 (file)
@@ -729,6 +729,15 @@ struct tcp_skb_cb {
 
 #define TCP_SKB_CB(__skb)      ((struct tcp_skb_cb *)&((__skb)->cb[0]))
 
+
+/* This is the variant of inet6_iif() that must be used by TCP,
+ * as TCP moves IP6CB into a different location in skb->cb[]
+ */
+static inline int tcp_v6_iif(const struct sk_buff *skb)
+{
+       return TCP_SKB_CB(skb)->header.h6.iif;
+}
+
 /* Due to TSO, an SKB can be composed of multiple actual
  * packets.  To keep these tracked properly, we use this.
  */
diff --cc net/dccp/ipv6.c
Simple merge
Simple merge
Simple merge