diff options
author | Xin Long <lucien.xin@gmail.com> | 2016-07-09 11:47:43 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-11 20:25:39 (GMT) |
commit | a6c2f792873aff332a4689717c3cd6104f46684c (patch) | |
tree | 2426d5ab4b3f7b3b4df82330a0df707a65477736 /net/sctp/chunk.c | |
parent | 826d253d57b11f69add81c8086d2e7f1dce5ec77 (diff) | |
download | linux-a6c2f792873aff332a4689717c3cd6104f46684c.tar.xz |
sctp: implement prsctp TTL policy
prsctp TTL policy is a policy to abandon chunks when they expire
at the specific time in local stack. It's similar with expires_at
in struct sctp_datamsg.
This patch uses sinfo->sinfo_timetolive to set the specific time for
TTL policy. sinfo->sinfo_timetolive is also used for msg->expires_at.
So if prsctp_enable or TTL policy is not enabled, msg->expires_at
still works as before.
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/chunk.c')
-rw-r--r-- | net/sctp/chunk.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c index 1eb94bf..2698d12 100644 --- a/net/sctp/chunk.c +++ b/net/sctp/chunk.c @@ -335,13 +335,27 @@ errout: /* Check whether this message has expired. */ int sctp_chunk_abandoned(struct sctp_chunk *chunk) { - struct sctp_datamsg *msg = chunk->msg; + if (!chunk->asoc->prsctp_enable || + !SCTP_PR_POLICY(chunk->sinfo.sinfo_flags)) { + struct sctp_datamsg *msg = chunk->msg; + + if (!msg->can_abandon) + return 0; + + if (time_after(jiffies, msg->expires_at)) + return 1; - if (!msg->can_abandon) return 0; + } - if (time_after(jiffies, msg->expires_at)) + if (SCTP_PR_TTL_ENABLED(chunk->sinfo.sinfo_flags) && + time_after(jiffies, chunk->prsctp_param)) { + if (chunk->sent_count) + chunk->asoc->abandoned_sent[SCTP_PR_INDEX(TTL)]++; + else + chunk->asoc->abandoned_unsent[SCTP_PR_INDEX(TTL)]++; return 1; + } return 0; } |