git: 7f21500f4912 - stable/13 - sctp: provide sac_error also for ABORT chunk being sent
Michael Tuexen
tuexen at FreeBSD.org
Tue Jul 13 18:30:02 UTC 2021
The branch stable/13 has been updated by tuexen:
URL: https://cgit.FreeBSD.org/src/commit/?id=7f21500f491257f3506deb5e036eb0c1600d92d0
commit 7f21500f491257f3506deb5e036eb0c1600d92d0
Author: Michael Tuexen <tuexen at FreeBSD.org>
AuthorDate: 2021-07-09 11:46:27 +0000
Commit: Michael Tuexen <tuexen at FreeBSD.org>
CommitDate: 2021-07-13 18:29:33 +0000
sctp: provide sac_error also for ABORT chunk being sent
Thanks to Florent Castelli for bringing this issue up for the
userland stack and providing an initial patch.
(cherry picked from commit 84992a3251d56df3bc36e0ac33ba383f41107864)
---
sys/netinet/sctputil.c | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c
index aec2298e26b2..1f909fa1d8d4 100644
--- a/sys/netinet/sctputil.c
+++ b/sys/netinet/sctputil.c
@@ -4367,19 +4367,29 @@ sctp_abort_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
uint8_t mflowtype, uint32_t mflowid,
uint32_t vrf_id, uint16_t port)
{
+ struct sctp_gen_error_cause *cause;
uint32_t vtag;
+ uint16_t cause_code;
- vtag = 0;
if (stcb != NULL) {
vtag = stcb->asoc.peer_vtag;
vrf_id = stcb->asoc.vrf_id;
+ if (op_err != NULL) {
+ /* Read the cause code from the error cause. */
+ cause = mtod(op_err, struct sctp_gen_error_cause *);
+ cause_code = ntohs(cause->code);
+ } else {
+ cause_code = 0;
+ }
+ } else {
+ vtag = 0;
}
sctp_send_abort(m, iphlen, src, dst, sh, vtag, op_err,
mflowtype, mflowid, inp->fibnum,
vrf_id, port);
if (stcb != NULL) {
/* We have a TCB to abort, send notification too */
- sctp_abort_notification(stcb, 0, 0, NULL, SCTP_SO_NOT_LOCKED);
+ sctp_abort_notification(stcb, 0, cause_code, NULL, SCTP_SO_NOT_LOCKED);
/* Ok, now lets free it */
SCTP_STAT_INCR_COUNTER32(sctps_aborted);
if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) ||
@@ -4458,6 +4468,8 @@ sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
struct mbuf *op_err,
int so_locked)
{
+ struct sctp_gen_error_cause *cause;
+ uint16_t cause_code;
if (stcb == NULL) {
/* Got to have a TCB */
@@ -4469,6 +4481,13 @@ sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
}
return;
}
+ if (op_err != NULL) {
+ /* Read the cause code from the error cause. */
+ cause = mtod(op_err, struct sctp_gen_error_cause *);
+ cause_code = ntohs(cause->code);
+ } else {
+ cause_code = 0;
+ }
/* notify the peer */
sctp_send_abort_tcb(stcb, op_err, so_locked);
SCTP_STAT_INCR_COUNTER32(sctps_aborted);
@@ -4478,7 +4497,7 @@ sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
}
/* notify the ulp */
if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) {
- sctp_abort_notification(stcb, 0, 0, NULL, so_locked);
+ sctp_abort_notification(stcb, 0, cause_code, NULL, so_locked);
}
/* now free the asoc */
#ifdef SCTP_ASOCLOG_OF_TSNS
More information about the dev-commits-src-all
mailing list