]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
tcp/ipv6: fix flow label setting in TIME_WAIT state
authorFlorent Fourcot <florent.fourcot@enst-bretagne.fr>
Fri, 15 May 2015 22:24:59 +0000 (00:24 +0200)
committerLuis Henriques <luis.henriques@canonical.com>
Tue, 2 Jun 2015 12:00:40 +0000 (13:00 +0100)
commit 21858cd02dabcf290564cbf4769b101eba54d7bb upstream.

commit 1d13a96c74fc ("ipv6: tcp: fix flowlabel value in ACK messages
send from TIME_WAIT") added the flow label in the last TCP packets.
Unfortunately, it was not casted properly.

This patch replace the buggy shift with be32_to_cpu/cpu_to_be32.

Fixes: 1d13a96c74fc ("ipv6: tcp: fix flowlabel value in ACK messages")
Reported-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Florent Fourcot <florent.fourcot@enst-bretagne.fr>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
[ luis: backported to 3.16: adjusted context ]
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
net/ipv4/tcp_minisocks.c
net/ipv6/tcp_ipv6.c

index e68e0d4af6c97bcd0f8c983890ba555adbfb3a00..0c02551369929baefc76fc6d146fc9f3e55f9eed 100644 (file)
@@ -297,7 +297,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
                        tw->tw_v6_daddr = sk->sk_v6_daddr;
                        tw->tw_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
                        tw->tw_tclass = np->tclass;
-                       tw->tw_flowlabel = np->flow_label >> 12;
+                       tw->tw_flowlabel = be32_to_cpu(np->flow_label & IPV6_FLOWLABEL_MASK);
                        tw->tw_ipv6only = np->ipv6only;
                }
 #endif
index d15a5484076f33b7a58c127f494ef756942f2e3b..f9f8bb3c2605586d267edc928d56d1404cc8e59f 100644 (file)
@@ -920,7 +920,7 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
                        tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
                        tcp_time_stamp + tcptw->tw_ts_offset,
                        tcptw->tw_ts_recent, tw->tw_bound_dev_if, tcp_twsk_md5_key(tcptw),
-                       tw->tw_tclass, (tw->tw_flowlabel << 12));
+                       tw->tw_tclass, cpu_to_be32(tw->tw_flowlabel));
 
        inet_twsk_put(tw);
 }