diff options
Diffstat (limited to 'net/dccp/ipv4.c')
| -rw-r--r-- | net/dccp/ipv4.c | 24 | 
1 files changed, 14 insertions, 10 deletions
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index 07f5579ca75..176ecdba4a2 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c @@ -161,17 +161,10 @@ static inline void dccp_do_pmtu_discovery(struct sock *sk,  	if (sk->sk_state == DCCP_LISTEN)  		return; -	/* We don't check in the destentry if pmtu discovery is forbidden -	 * on this route. We just assume that no packet_to_big packets -	 * are send back when pmtu discovery is not active. -	 * There is a small race when the user changes this flag in the -	 * route, but I think that's acceptable. -	 */ -	if ((dst = __sk_dst_check(sk, 0)) == NULL) +	dst = inet_csk_update_pmtu(sk, mtu); +	if (!dst)  		return; -	dst->ops->update_pmtu(dst, mtu); -  	/* Something is about to be wrong... Remember soft error  	 * for the case, if this connection will not able to recover.  	 */ @@ -195,6 +188,14 @@ static inline void dccp_do_pmtu_discovery(struct sock *sk,  	} /* else let the usual retransmit timer handle it */  } +static void dccp_do_redirect(struct sk_buff *skb, struct sock *sk) +{ +	struct dst_entry *dst = __sk_dst_check(sk, 0); + +	if (dst) +		dst->ops->redirect(dst, sk, skb); +} +  /*   * This routine is called by the ICMP module when it gets some sort of error   * condition. If err < 0 then the socket should be closed and the error @@ -259,6 +260,9 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)  	}  	switch (type) { +	case ICMP_REDIRECT: +		dccp_do_redirect(skb, sk); +		goto out;  	case ICMP_SOURCE_QUENCH:  		/* Just silently ignore these. */  		goto out; @@ -477,7 +481,7 @@ static struct dst_entry* dccp_v4_route_skb(struct net *net, struct sock *sk,  	struct rtable *rt;  	const struct iphdr *iph = ip_hdr(skb);  	struct flowi4 fl4 = { -		.flowi4_oif = skb_rtable(skb)->rt_iif, +		.flowi4_oif = inet_iif(skb),  		.daddr = iph->saddr,  		.saddr = iph->daddr,  		.flowi4_tos = RT_CONN_FLAGS(sk),  |