diff options
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 14 | 
1 files changed, 10 insertions, 4 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 5a27ab4eab39..b9f1fee9a886 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -818,8 +818,12 @@ static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32  	fl6.flowi6_proto = IPPROTO_TCP;  	if (rt6_need_strict(&fl6.daddr) && !oif)  		fl6.flowi6_oif = tcp_v6_iif(skb); -	else -		fl6.flowi6_oif = oif ? : skb->skb_iif; +	else { +		if (!oif && netif_index_is_l3_master(net, skb->skb_iif)) +			oif = skb->skb_iif; + +		fl6.flowi6_oif = oif; +	}  	fl6.flowi6_mark = IP6_REPLY_MARK(net, skb->mark);  	fl6.fl6_dport = t1->dest; @@ -1225,7 +1229,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)  	if (skb->protocol == htons(ETH_P_IP))  		return tcp_v4_do_rcv(sk, skb); -	if (sk_filter(sk, skb)) +	if (tcp_filter(sk, skb))  		goto discard;  	/* @@ -1453,8 +1457,10 @@ process:  	if (tcp_v6_inbound_md5_hash(sk, skb))  		goto discard_and_relse; -	if (sk_filter(sk, skb)) +	if (tcp_filter(sk, skb))  		goto discard_and_relse; +	th = (const struct tcphdr *)skb->data; +	hdr = ipv6_hdr(skb);  	skb->dev = NULL;  | 
