diff options
author | Daniel Borkmann <dborkman@redhat.com> | 2013-07-09 16:17:04 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-07-09 12:49:56 -0700 |
commit | 8c2f414ad1b3aa3af05791cd7312eb8ff9d80e0d (patch) | |
tree | 5d4281f3fbb68256211eaa2d39e45dc85c0874d8 /net/sctp/sm_sideeffect.c | |
parent | e1d6fbc3dedbb463fc79b48ddb05ab6b20fd088a (diff) | |
download | blackbird-op-linux-8c2f414ad1b3aa3af05791cd7312eb8ff9d80e0d.tar.gz blackbird-op-linux-8c2f414ad1b3aa3af05791cd7312eb8ff9d80e0d.zip |
net: sctp: confirm route during forward progress
This fix has been proposed originally by Vlad Yasevich. He says:
When SCTP makes forward progress (receives a SACK that acks new chunks,
renegs, or answeres 0-window probes) or when HB-ACK arrives, mark
the route as confirmed so we don't unnecessarily send NUD probes.
Having a simple SCTP client/server that exchange data chunks every 1sec,
without this patch ARP requests are sent periodically every 40-60sec.
With this fix applied, an ARP request is only done once right at the
"session" beginning. Also, when clearing the related ARP cache entry
manually during the session, a new request is correctly done. I have
only "backported" this to net-next and tested that it works, so full
credit goes to Vlad.
Signed-off-by: Vlad Yasevich <vyasevich@gmail.com>
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/sm_sideeffect.c')
-rw-r--r-- | net/sctp/sm_sideeffect.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index cf6f84518222..9da68852ee94 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c @@ -730,6 +730,12 @@ static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds, sctp_assoc_control_transport(asoc, t, SCTP_TRANSPORT_UP, SCTP_HEARTBEAT_SUCCESS); + /* HB-ACK was received for a the proper HB. Consider this + * forward progress. + */ + if (t->dst) + dst_confirm(t->dst); + /* The receiver of the HEARTBEAT ACK should also perform an * RTT measurement for that destination transport address * using the time value carried in the HEARTBEAT ACK chunk. |