summaryrefslogtreecommitdiffstats
path: root/include/net/sctp/sctp.h
diff options
context:
space:
mode:
authorXin Long <lucien.xin@gmail.com>2017-02-17 16:41:45 +0800
committerDavid S. Miller <davem@davemloft.net>2017-02-19 18:19:37 -0500
commita4d69a4c3ca6be699ed8cdc4683381ce44b85c90 (patch)
tree84d8c1c06593e5671bef4d666f12f4ede62a2dd5 /include/net/sctp/sctp.h
parent585396bc804d4e59d9591054ec12637d1698284c (diff)
downloadlinux-a4d69a4c3ca6be699ed8cdc4683381ce44b85c90.tar.bz2
sctp: sctp_transport_dst_check should check if transport pmtu is dst mtu
Now when sending a packet, sctp_transport_dst_check will check if dst is obsolete by calling ipv4/ip6_dst_check. But they return obsolete only when adding a new cache, after that when the cache's pmtu is updated again, it will not trigger transport->dst/pmtu's update. It can be reproduced by reducing route's pmtu twice. At the 1st time client will add a new cache, and transport->pathmtu gets updated as sctp_transport_dst_check finds it's obsolete. But at the 2nd time, cache's mtu is updated, sctp client will never send out any packet, because transport->pmtu has no chance to update. This patch is to fix this by also checking if transport pmtu is dst mtu in sctp_transport_dst_check, so that transport->pmtu can be updated on time. Signed-off-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/sctp/sctp.h')
-rw-r--r--include/net/sctp/sctp.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
index 6dfc5536a3e6..1f71ee5ab518 100644
--- a/include/net/sctp/sctp.h
+++ b/include/net/sctp/sctp.h
@@ -596,7 +596,9 @@ static inline void sctp_v4_map_v6(union sctp_addr *addr)
*/
static inline struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t)
{
- if (t->dst && !dst_check(t->dst, t->dst_cookie))
+ if (t->dst && (!dst_check(t->dst, t->dst_cookie) ||
+ t->pathmtu != max_t(size_t, SCTP_TRUNC4(dst_mtu(t->dst)),
+ SCTP_DEFAULT_MINSEGMENT)))
sctp_transport_dst_release(t);
return t->dst;