diff options
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index a3f559162521..b81eb7cb815e 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -737,6 +737,7 @@ static void tcp_v6_init_req(struct request_sock *req, | |||
737 | const struct sock *sk_listener, | 737 | const struct sock *sk_listener, |
738 | struct sk_buff *skb) | 738 | struct sk_buff *skb) |
739 | { | 739 | { |
740 | bool l3_slave = ipv6_l3mdev_skb(TCP_SKB_CB(skb)->header.h6.flags); | ||
740 | struct inet_request_sock *ireq = inet_rsk(req); | 741 | struct inet_request_sock *ireq = inet_rsk(req); |
741 | const struct ipv6_pinfo *np = inet6_sk(sk_listener); | 742 | const struct ipv6_pinfo *np = inet6_sk(sk_listener); |
742 | 743 | ||
@@ -744,7 +745,7 @@ static void tcp_v6_init_req(struct request_sock *req, | |||
744 | ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr; | 745 | ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr; |
745 | 746 | ||
746 | /* So that link locals have meaning */ | 747 | /* So that link locals have meaning */ |
747 | if (!sk_listener->sk_bound_dev_if && | 748 | if ((!sk_listener->sk_bound_dev_if || l3_slave) && |
748 | ipv6_addr_type(&ireq->ir_v6_rmt_addr) & IPV6_ADDR_LINKLOCAL) | 749 | ipv6_addr_type(&ireq->ir_v6_rmt_addr) & IPV6_ADDR_LINKLOCAL) |
749 | ireq->ir_iif = tcp_v6_iif(skb); | 750 | ireq->ir_iif = tcp_v6_iif(skb); |
750 | 751 | ||