svn commit: r305080 - stable/11/sys/netinet

Michael Tuexen tuexen at FreeBSD.org
Tue Aug 30 19:27:28 UTC 2016


Author: tuexen
Date: Tue Aug 30 19:27:27 2016
New Revision: 305080
URL: https://svnweb.freebsd.org/changeset/base/305080

Log:
  MFC r304736:
  When aborting an association, send the ABORT before notifying the upper
  layer. For the kernel this doesn't matter, for the userland stack, it does.
  While there, silence a clang warning when compiling it in userland.
  
  MFC r304837:
  Fix a bug, where no SACK is sent when receiving a FORWARD-TSN or
  I-FORWARD-TSN chunk before any DATA or I-DATA chunk.
  
  Thanks to Julian Cordes for finding this problem and prividing
  packetdrill scripts to reporduce the issue.

Modified:
  stable/11/sys/netinet/sctp_input.c
  stable/11/sys/netinet/sctputil.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/netinet/sctp_input.c
==============================================================================
--- stable/11/sys/netinet/sctp_input.c	Tue Aug 30 19:26:07 2016	(r305079)
+++ stable/11/sys/netinet/sctp_input.c	Tue Aug 30 19:27:27 2016	(r305080)
@@ -5515,6 +5515,11 @@ process_control_chunks:
 					*offset = length;
 					return (NULL);
 				}
+				/*
+				 * For sending a SACK this looks like DATA
+				 * chunks.
+				 */
+				stcb->asoc.last_data_chunk_from = stcb->asoc.last_control_chunk_from;
 				sctp_handle_forward_tsn(stcb,
 				    (struct sctp_forward_tsn_chunk *)ch, &abort_flag, m, *offset);
 				if (abort_flag) {

Modified: stable/11/sys/netinet/sctputil.c
==============================================================================
--- stable/11/sys/netinet/sctputil.c	Tue Aug 30 19:26:07 2016	(r305079)
+++ stable/11/sys/netinet/sctputil.c	Tue Aug 30 19:27:27 2016	(r305080)
@@ -3983,17 +3983,16 @@ sctp_abort_association(struct sctp_inpcb
 
 	vtag = 0;
 	if (stcb != NULL) {
-		/* We have a TCB to abort, send notification too */
 		vtag = stcb->asoc.peer_vtag;
-		sctp_abort_notification(stcb, 0, 0, NULL, SCTP_SO_NOT_LOCKED);
-		/* get the assoc vrf id and table id */
 		vrf_id = stcb->asoc.vrf_id;
-		stcb->asoc.state |= SCTP_STATE_WAS_ABORTED;
 	}
 	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);
+		stcb->asoc.state |= SCTP_STATE_WAS_ABORTED;
 		/* Ok, now lets free it */
 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
 		so = SCTP_INP_SO(inp);
@@ -4109,10 +4108,6 @@ sctp_abort_an_association(struct sctp_in
 	} else {
 		stcb->asoc.state |= SCTP_STATE_WAS_ABORTED;
 	}
-	/* notify the ulp */
-	if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) {
-		sctp_abort_notification(stcb, 0, 0, NULL, so_locked);
-	}
 	/* notify the peer */
 	sctp_send_abort_tcb(stcb, op_err, so_locked);
 	SCTP_STAT_INCR_COUNTER32(sctps_aborted);
@@ -4120,6 +4115,10 @@ sctp_abort_an_association(struct sctp_in
 	    (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) {
 		SCTP_STAT_DECR_GAUGE32(sctps_currestab);
 	}
+	/* notify the ulp */
+	if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) {
+		sctp_abort_notification(stcb, 0, 0, NULL, so_locked);
+	}
 	/* now free the asoc */
 #ifdef SCTP_ASOCLOG_OF_TSNS
 	sctp_print_out_track_log(stcb);
@@ -6400,6 +6399,7 @@ sctp_connectx_helper_find(struct sctp_in
 #endif
 		default:
 			*totaddr = i;
+			incr = 0;
 			/* we are done */
 			break;
 		}


More information about the svn-src-all mailing list