diff options
Diffstat (limited to 'net/sctp/transport.c')
| -rw-r--r-- | net/sctp/transport.c | 28 | 
1 files changed, 15 insertions, 13 deletions
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index d3ae493d234..d8595dd1a8a 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c @@ -211,15 +211,19 @@ void sctp_transport_set_owner(struct sctp_transport *transport,  }  /* Initialize the pmtu of a transport. */ -void sctp_transport_pmtu(struct sctp_transport *transport) +void sctp_transport_pmtu(struct sctp_transport *transport, struct sock *sk)  { -	struct dst_entry *dst; +	struct flowi fl; -	dst = transport->af_specific->get_dst(NULL, &transport->ipaddr, NULL); +	/* If we don't have a fresh route, look one up */ +	if (!transport->dst || transport->dst->obsolete > 1) { +		dst_release(transport->dst); +		transport->af_specific->get_dst(transport, &transport->saddr, +					      &fl, sk); +	} -	if (dst) { -		transport->pathmtu = dst_mtu(dst); -		dst_release(dst); +	if (transport->dst) { +		transport->pathmtu = dst_mtu(transport->dst);  	} else  		transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT;  } @@ -270,22 +274,20 @@ void sctp_transport_route(struct sctp_transport *transport,  {  	struct sctp_association *asoc = transport->asoc;  	struct sctp_af *af = transport->af_specific; -	union sctp_addr *daddr = &transport->ipaddr; -	struct dst_entry *dst; +	struct flowi fl; -	dst = af->get_dst(asoc, daddr, saddr); +	af->get_dst(transport, saddr, &fl, sctp_opt2sk(opt));  	if (saddr)  		memcpy(&transport->saddr, saddr, sizeof(union sctp_addr));  	else -		af->get_saddr(opt, asoc, dst, daddr, &transport->saddr); +		af->get_saddr(opt, transport, &fl); -	transport->dst = dst;  	if ((transport->param_flags & SPP_PMTUD_DISABLE) && transport->pathmtu) {  		return;  	} -	if (dst) { -		transport->pathmtu = dst_mtu(dst); +	if (transport->dst) { +		transport->pathmtu = dst_mtu(transport->dst);  		/* Initialize sk->sk_rcv_saddr, if the transport is the  		 * association's active path for getsockname().  |