Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
@@ -399,20 +399,24 @@ void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc,
|
||||
return;
|
||||
}
|
||||
|
||||
if (t->param_flags & SPP_PMTUD_ENABLE) {
|
||||
/* Update transports view of the MTU */
|
||||
sctp_transport_update_pmtu(t, pmtu);
|
||||
if (!(t->param_flags & SPP_PMTUD_ENABLE))
|
||||
/* We can't allow retransmitting in such case, as the
|
||||
* retransmission would be sized just as before, and thus we
|
||||
* would get another icmp, and retransmit again.
|
||||
*/
|
||||
return;
|
||||
|
||||
/* Update association pmtu. */
|
||||
sctp_assoc_sync_pmtu(asoc);
|
||||
}
|
||||
|
||||
/* Retransmit with the new pmtu setting.
|
||||
* Normally, if PMTU discovery is disabled, an ICMP Fragmentation
|
||||
* Needed will never be sent, but if a message was sent before
|
||||
* PMTU discovery was disabled that was larger than the PMTU, it
|
||||
* would not be fragmented, so it must be re-transmitted fragmented.
|
||||
/* Update transports view of the MTU. Return if no update was needed.
|
||||
* If an update wasn't needed/possible, it also doesn't make sense to
|
||||
* try to retransmit now.
|
||||
*/
|
||||
if (!sctp_transport_update_pmtu(t, pmtu))
|
||||
return;
|
||||
|
||||
/* Update association pmtu. */
|
||||
sctp_assoc_sync_pmtu(asoc);
|
||||
|
||||
/* Retransmit with the new pmtu setting. */
|
||||
sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD);
|
||||
}
|
||||
|
||||
|
@@ -156,9 +156,9 @@ int sctp_stream_init(struct sctp_stream *stream, __u16 outcnt, __u16 incnt,
|
||||
sctp_stream_outq_migrate(stream, NULL, outcnt);
|
||||
sched->sched_all(stream);
|
||||
|
||||
i = sctp_stream_alloc_out(stream, outcnt, gfp);
|
||||
if (i)
|
||||
return i;
|
||||
ret = sctp_stream_alloc_out(stream, outcnt, gfp);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
stream->outcnt = outcnt;
|
||||
for (i = 0; i < stream->outcnt; i++)
|
||||
@@ -171,19 +171,17 @@ in:
|
||||
if (!incnt)
|
||||
goto out;
|
||||
|
||||
i = sctp_stream_alloc_in(stream, incnt, gfp);
|
||||
if (i) {
|
||||
ret = -ENOMEM;
|
||||
goto free;
|
||||
ret = sctp_stream_alloc_in(stream, incnt, gfp);
|
||||
if (ret) {
|
||||
sched->free(stream);
|
||||
kfree(stream->out);
|
||||
stream->out = NULL;
|
||||
stream->outcnt = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
stream->incnt = incnt;
|
||||
goto out;
|
||||
|
||||
free:
|
||||
sched->free(stream);
|
||||
kfree(stream->out);
|
||||
stream->out = NULL;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
@@ -248,28 +248,37 @@ void sctp_transport_pmtu(struct sctp_transport *transport, struct sock *sk)
|
||||
transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT;
|
||||
}
|
||||
|
||||
void sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu)
|
||||
bool sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu)
|
||||
{
|
||||
struct dst_entry *dst = sctp_transport_dst_check(t);
|
||||
bool change = true;
|
||||
|
||||
if (unlikely(pmtu < SCTP_DEFAULT_MINSEGMENT)) {
|
||||
pr_warn("%s: Reported pmtu %d too low, using default minimum of %d\n",
|
||||
__func__, pmtu, SCTP_DEFAULT_MINSEGMENT);
|
||||
/* Use default minimum segment size and disable
|
||||
* pmtu discovery on this transport.
|
||||
*/
|
||||
t->pathmtu = SCTP_DEFAULT_MINSEGMENT;
|
||||
} else {
|
||||
t->pathmtu = pmtu;
|
||||
pr_warn_ratelimited("%s: Reported pmtu %d too low, using default minimum of %d\n",
|
||||
__func__, pmtu, SCTP_DEFAULT_MINSEGMENT);
|
||||
/* Use default minimum segment instead */
|
||||
pmtu = SCTP_DEFAULT_MINSEGMENT;
|
||||
}
|
||||
pmtu = SCTP_TRUNC4(pmtu);
|
||||
|
||||
if (dst) {
|
||||
dst->ops->update_pmtu(dst, t->asoc->base.sk, NULL, pmtu);
|
||||
dst = sctp_transport_dst_check(t);
|
||||
}
|
||||
|
||||
if (!dst)
|
||||
if (!dst) {
|
||||
t->af_specific->get_dst(t, &t->saddr, &t->fl, t->asoc->base.sk);
|
||||
dst = t->dst;
|
||||
}
|
||||
|
||||
if (dst) {
|
||||
/* Re-fetch, as under layers may have a higher minimum size */
|
||||
pmtu = SCTP_TRUNC4(dst_mtu(dst));
|
||||
change = t->pathmtu != pmtu;
|
||||
}
|
||||
t->pathmtu = pmtu;
|
||||
|
||||
return change;
|
||||
}
|
||||
|
||||
/* Caches the dst entry and source address for a transport's destination
|
||||
|
Reference in New Issue
Block a user