The branch stable/13 has been updated by tuexen:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=7f21500f491257f3506deb5e036eb0c1600d92d0

commit 7f21500f491257f3506deb5e036eb0c1600d92d0
Author:     Michael Tuexen <tue...@freebsd.org>
AuthorDate: 2021-07-09 11:46:27 +0000
Commit:     Michael Tuexen <tue...@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
_______________________________________________
dev-commits-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "dev-commits-src-all-unsubscr...@freebsd.org"

Reply via email to