diff options
author | Vlad Yasevich <vladislav.yasevich@hp.com> | 2007-06-07 13:47:03 -0400 |
---|---|---|
committer | Vladislav Yasevich <vxy@hera.kernel.org> | 2007-06-13 16:44:42 -0400 |
commit | c910b47e1811b3f8b184108c48de3d7af3e2999b (patch) | |
tree | 76ca90239b074a13137217d3732f79fe83a2500b /net/sctp | |
parent | fe979ac169970b3d12facd6565766735862395c5 (diff) |
[SCTP] Update pmtu handling to be similar to tcp
Introduce new function sctp_transport_update_pmtu that updates
the transports and destination caches view of the path mtu.
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Acked-by: Sridhar Samudrala <sri@us.ibm.com>
Diffstat (limited to 'net/sctp')
-rw-r--r-- | net/sctp/input.c | 16 | ||||
-rw-r--r-- | net/sctp/transport.c | 41 |
2 files changed, 43 insertions, 14 deletions
diff --git a/net/sctp/input.c b/net/sctp/input.c index 885109fb3dda..45d6a644cf06 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c | |||
@@ -371,20 +371,8 @@ void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc, | |||
371 | return; | 371 | return; |
372 | 372 | ||
373 | if (t->param_flags & SPP_PMTUD_ENABLE) { | 373 | if (t->param_flags & SPP_PMTUD_ENABLE) { |
374 | if (unlikely(pmtu < SCTP_DEFAULT_MINSEGMENT)) { | 374 | /* Update transports view of the MTU */ |
375 | printk(KERN_WARNING "%s: Reported pmtu %d too low, " | 375 | sctp_transport_update_pmtu(t, pmtu); |
376 | "using default minimum of %d\n", | ||
377 | __FUNCTION__, pmtu, | ||
378 | SCTP_DEFAULT_MINSEGMENT); | ||
379 | /* Use default minimum segment size and disable | ||
380 | * pmtu discovery on this transport. | ||
381 | */ | ||
382 | t->pathmtu = SCTP_DEFAULT_MINSEGMENT; | ||
383 | t->param_flags = (t->param_flags & ~SPP_PMTUD) | | ||
384 | SPP_PMTUD_DISABLE; | ||
385 | } else { | ||
386 | t->pathmtu = pmtu; | ||
387 | } | ||
388 | 376 | ||
389 | /* Update association pmtu. */ | 377 | /* Update association pmtu. */ |
390 | sctp_assoc_sync_pmtu(asoc); | 378 | sctp_assoc_sync_pmtu(asoc); |
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index 961df275d5b9..e14c271cf28b 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c | |||
@@ -241,6 +241,47 @@ void sctp_transport_pmtu(struct sctp_transport *transport) | |||
241 | transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT; | 241 | transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT; |
242 | } | 242 | } |
243 | 243 | ||
244 | /* this is a complete rip-off from __sk_dst_check | ||
245 | * the cookie is always 0 since this is how it's used in the | ||
246 | * pmtu code | ||
247 | */ | ||
248 | static struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t) | ||
249 | { | ||
250 | struct dst_entry *dst = t->dst; | ||
251 | |||
252 | if (dst && dst->obsolete && dst->ops->check(dst, 0) == NULL) { | ||
253 | dst_release(t->dst); | ||
254 | t->dst = NULL; | ||
255 | return NULL; | ||
256 | } | ||
257 | |||
258 | return dst; | ||
259 | } | ||
260 | |||
261 | void sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu) | ||
262 | { | ||
263 | struct dst_entry *dst; | ||
264 | |||
265 | if (unlikely(pmtu < SCTP_DEFAULT_MINSEGMENT)) { | ||
266 | printk(KERN_WARNING "%s: Reported pmtu %d too low, " | ||
267 | "using default minimum of %d\n", | ||
268 | __FUNCTION__, pmtu, | ||
269 | SCTP_DEFAULT_MINSEGMENT); | ||
270 | /* Use default minimum segment size and disable | ||
271 | * pmtu discovery on this transport. | ||
272 | */ | ||
273 | t->pathmtu = SCTP_DEFAULT_MINSEGMENT; | ||
274 | t->param_flags = (t->param_flags & ~SPP_PMTUD) | | ||
275 | SPP_PMTUD_DISABLE; | ||
276 | } else { | ||
277 | t->pathmtu = pmtu; | ||
278 | } | ||
279 | |||
280 | dst = sctp_transport_dst_check(t); | ||
281 | if (dst) | ||
282 | dst->ops->update_pmtu(dst, pmtu); | ||
283 | } | ||
284 | |||
244 | /* Caches the dst entry and source address for a transport's destination | 285 | /* Caches the dst entry and source address for a transport's destination |
245 | * address. | 286 | * address. |
246 | */ | 287 | */ |