diff options
author | Julian Anastasov <ja@ssi.bg> | 2017-02-06 23:14:13 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-02-07 13:07:46 -0500 |
commit | c86a773c78025f5b825bacd7b846f4fa60dc0317 (patch) | |
tree | 4ccbab5f25aafd2682341852882bb05d45174cbe /net/sctp/transport.c | |
parent | 4ff0620354f2b39b9fe2a91c22c4de9d1fba0c8e (diff) | |
download | linux-c86a773c78025f5b825bacd7b846f4fa60dc0317.tar.gz linux-c86a773c78025f5b825bacd7b846f4fa60dc0317.tar.bz2 linux-c86a773c78025f5b825bacd7b846f4fa60dc0317.zip |
sctp: add dst_pending_confirm flag
Add new transport flag to allow sockets to confirm neighbour.
When same struct dst_entry can be used for many different
neighbours we can not use it for pending confirmations.
The flag is propagated from transport to every packet.
It is reset when cached dst is reset.
Reported-by: YueHaibing <yuehaibing@huawei.com>
Fixes: 5110effee8fd ("net: Do delayed neigh confirmation.")
Fixes: f2bb4bedf35d ("ipv4: Cache output routes in fib_info nexthops.")
Signed-off-by: Julian Anastasov <ja@ssi.bg>
Acked-by: Eric Dumazet <edumazet@google.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/transport.c')
-rw-r--r-- | net/sctp/transport.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index baa1ac00d7b5..5b63ceb3bf37 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c @@ -240,7 +240,7 @@ void sctp_transport_pmtu(struct sctp_transport *transport, struct sock *sk) { /* If we don't have a fresh route, look one up */ if (!transport->dst || transport->dst->obsolete) { - dst_release(transport->dst); + sctp_transport_dst_release(transport); transport->af_specific->get_dst(transport, &transport->saddr, &transport->fl, sk); } @@ -672,3 +672,17 @@ void sctp_transport_immediate_rtx(struct sctp_transport *t) sctp_transport_hold(t); } } + +/* Drop dst */ +void sctp_transport_dst_release(struct sctp_transport *t) +{ + dst_release(t->dst); + t->dst = NULL; + t->dst_pending_confirm = 0; +} + +/* Schedule neighbour confirm */ +void sctp_transport_dst_confirm(struct sctp_transport *t) +{ + t->dst_pending_confirm = 1; +} |