|
@@ -242,6 +242,15 @@ void sctp_transport_pmtu(struct sctp_transport *transport, struct sock *sk)
|
|
&transport->fl, sk);
|
|
&transport->fl, sk);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (transport->param_flags & SPP_PMTUD_DISABLE) {
|
|
|
|
+ struct sctp_association *asoc = transport->asoc;
|
|
|
|
+
|
|
|
|
+ if (!transport->pathmtu && asoc && asoc->pathmtu)
|
|
|
|
+ transport->pathmtu = asoc->pathmtu;
|
|
|
|
+ if (transport->pathmtu)
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (transport->dst)
|
|
if (transport->dst)
|
|
transport->pathmtu = sctp_dst_mtu(transport->dst);
|
|
transport->pathmtu = sctp_dst_mtu(transport->dst);
|
|
else
|
|
else
|
|
@@ -290,6 +299,7 @@ void sctp_transport_route(struct sctp_transport *transport,
|
|
struct sctp_association *asoc = transport->asoc;
|
|
struct sctp_association *asoc = transport->asoc;
|
|
struct sctp_af *af = transport->af_specific;
|
|
struct sctp_af *af = transport->af_specific;
|
|
|
|
|
|
|
|
+ sctp_transport_dst_release(transport);
|
|
af->get_dst(transport, saddr, &transport->fl, sctp_opt2sk(opt));
|
|
af->get_dst(transport, saddr, &transport->fl, sctp_opt2sk(opt));
|
|
|
|
|
|
if (saddr)
|
|
if (saddr)
|
|
@@ -297,25 +307,14 @@ void sctp_transport_route(struct sctp_transport *transport,
|
|
else
|
|
else
|
|
af->get_saddr(opt, transport, &transport->fl);
|
|
af->get_saddr(opt, transport, &transport->fl);
|
|
|
|
|
|
- if ((transport->param_flags & SPP_PMTUD_DISABLE) && transport->pathmtu) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- if (transport->dst) {
|
|
|
|
- transport->pathmtu = SCTP_TRUNC4(dst_mtu(transport->dst));
|
|
|
|
|
|
+ sctp_transport_pmtu(transport, sctp_opt2sk(opt));
|
|
|
|
|
|
- /* Initialize sk->sk_rcv_saddr, if the transport is the
|
|
|
|
- * association's active path for getsockname().
|
|
|
|
- */
|
|
|
|
- if (asoc && (!asoc->peer.primary_path ||
|
|
|
|
- (transport == asoc->peer.active_path)))
|
|
|
|
- opt->pf->to_sk_saddr(&transport->saddr,
|
|
|
|
- asoc->base.sk);
|
|
|
|
- } else if ((transport->param_flags & SPP_PMTUD_DISABLE) &&
|
|
|
|
- asoc && asoc->pathmtu) {
|
|
|
|
- transport->pathmtu = asoc->pathmtu;
|
|
|
|
- } else {
|
|
|
|
- transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT;
|
|
|
|
- }
|
|
|
|
|
|
+ /* Initialize sk->sk_rcv_saddr, if the transport is the
|
|
|
|
+ * association's active path for getsockname().
|
|
|
|
+ */
|
|
|
|
+ if (transport->dst && asoc &&
|
|
|
|
+ (!asoc->peer.primary_path || transport == asoc->peer.active_path))
|
|
|
|
+ opt->pf->to_sk_saddr(&transport->saddr, asoc->base.sk);
|
|
}
|
|
}
|
|
|
|
|
|
/* Hold a reference to a transport. */
|
|
/* Hold a reference to a transport. */
|