diff --git a/gtests/net/packetdrill/README b/gtests/net/packetdrill/README
index 026f6b956f72bc9689a8dfcb04e090057cdf6ba9..5caba0bc7544ced263a7fa8ea86ccd18b7cbf89e 100644
--- a/gtests/net/packetdrill/README
+++ b/gtests/net/packetdrill/README
@@ -32,7 +32,7 @@ Here's a quick example.
 
 On FreeBSD, OpenBSD, and NetBSD, try:
 
-# ./packetdrill tests/bsd/fast_retransmit/fr-4pkt-sack-bsd.pkt
+# ./packetdrill tests/bsd/tcp/fast_retransmit/fr-4pkt-sack-bsd.pkt
 
 On Linux try:
 
diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l
index bac85750dae609e5fc81857f270d86163c5dc6eb..f55833b12ab448d9a6b6fa3bb189b5c6e433f7d2 100644
--- a/gtests/net/packetdrill/lexer.l
+++ b/gtests/net/packetdrill/lexer.l
@@ -312,14 +312,22 @@ ce				return CE;
 iov_base			return IOV_BASE;
 iov_len				return IOV_LEN;
 [.][.][.]			return ELLIPSIS;
+assoc_id			return ASSOC_ID;
 assoc_value			return ASSOC_VALUE;
+shmac_number_of_idents		return SHMAC_NUMBER_OF_IDENTS;
+shmac_idents			return SHMAC_IDENTS;
 stream_id			return STREAM_ID;
 stream_value			return STREAM_VALUE;
+scact_assoc_id			return SCACT_ASSOC_ID;
+scact_keynumber			return SCACT_KEYNUMBER;
+sack_assoc_id			return SACK_ASSOC_ID;
 sack_delay			return SACK_DELAY;
 sack_freq			return SACK_FREQ;
+srto_assoc_id			return SRTO_ASSOC_ID;
 srto_initial			return SRTO_INITIAL;
 srto_max			return SRTO_MAX;
 srto_min			return SRTO_MIN;
+sasoc_assoc_id	 		return SASOC_ASSOC_ID;
 sasoc_asocmaxrxt		return SASOC_ASOCMAXRXT;
 sasoc_number_peer_destinations	return SASOC_NUMBER_PEER_DESTINATIONS;
 sasoc_peer_rwnd			return SASOC_PEER_RWND;
@@ -329,6 +337,7 @@ sinit_num_ostreams		return SINIT_NUM_OSTREAMS;
 sinit_max_instreams		return SINIT_MAX_INSTREAMS;
 sinit_max_attempts		return SINIT_MAX_ATTEMPTS;
 sinit_max_init_timeo		return SINIT_MAX_INIT_TIMEO;
+sstat_assoc_id                  return SSTAT_ASSOC_ID;
 sstat_state			return SSTAT_STATE;
 sstat_rwnd			return SSTAT_RWND;
 sstat_unackdata			return SSTAT_UNACKDATA;
@@ -337,12 +346,14 @@ sstat_instrms			return SSTAT_INSTRMS;
 sstat_outstrms			return SSTAT_OUTSTRMS;
 sstat_fragmentation_point	return SSTAT_FRAGMENTATION_POINT;
 sstat_primary			return SSTAT_PRIMARY;
+spinfo_assoc_id			return SPINFO_ASSOC_ID;
 spinfo_address			return SPINFO_ADDRESS;
 spinfo_state			return SPINFO_STATE;
 spinfo_cwnd			return SPINFO_CWND;
 spinfo_srtt			return SPINFO_SRTT;
 spinfo_rto			return SPINFO_RTO;
 spinfo_mtu			return SPINFO_MTU;
+spp_assoc_id			return SPP_ASSOC_ID;
 spp_address			return SPP_ADDRESS;
 spp_hbinterval			return SPP_HBINTERVAL;
 spp_pathmaxrxt			return SPP_PATHMAXRXT;
@@ -350,6 +361,7 @@ spp_pathmtu			return SPP_PATHMTU;
 spp_flags			return SPP_FLAGS;
 spp_ipv6_flowlabel		return SPP_IPV6_FLOWLABEL_; /* avoid name clash */
 spp_dscp			return SPP_DSCP_; /* avoid name clash */
+se_assoc_id			return SE_ASSOC_ID;
 se_type				return SE_TYPE;
 se_on				return SE_ON;
 sctp_data_io_event              return _SCTP_DATA_IO_EVENT_;
@@ -367,6 +379,8 @@ snd_flags			return SND_FLAGS;
 snd_ppid			return SND_PPID;
 snd_context			return SND_CONTEXT;
 snd_assoc_id                    return SND_ASSOC_ID;
+ssp_assoc_id			return SSP_ASSOC_ID;
+ssp_addr			return SSP_ADDR;
 ssb_adaptation_ind		return SSB_ADAPTATION_IND;
 sinfo_stream			return SINFO_STREAM;
 sinfo_ssn			return SINFO_SSN;
@@ -385,6 +399,7 @@ serinfo_next_length             return SERINFO_NEXT_LENGTH;
 serinfo_next_ppid		return SERINFO_NEXT_PPID;
 pr_policy			return PR_POLICY;
 pr_value			return PR_VALUE;
+pr_assoc_id                     return PR_ASSOC_ID;
 sendv_flags			return SENDV_FLAGS;
 sendv_sndinfo			return SENDV_SNDINFO;
 sendv_prinfo			return SENDV_PRINFO;
@@ -414,6 +429,7 @@ recvv_nxtinfo                   return RECVV_NXTINFO;
 sse_type                        return SSE_TYPE;
 sse_flags                       return SSE_FLAGS;
 sse_length                      return SSE_LENGTH;
+sse_assoc_id                    return SSE_ASSOC_ID;
 sac_type                        return SAC_TYPE;
 sac_flags                       return SAC_FLAGS;
 sac_length                      return SAC_LENGTH;
@@ -468,6 +484,18 @@ sai_assoc_id                    return SAI_ASSOC_ID;
 sn_type                         return SN_TYPE;
 sn_length                       return SN_LENGTH;
 sn_flags                        return SN_FLAGS;
+gaids_number_of_ids             return GAIDS_NUMBER_OF_IDS;
+gaids_assoc_id			return GAIDS_ASSOC_ID;
+gauth_assoc_id			return GAUTH_ASSOC_ID;
+gauth_number_of_chunks		return GAUTH_NUMBER_OF_CHUNKS;
+gauth_chunks			return GAUTH_CHUNKS;
+sspp_assoc_id			return SSPP_ASSOC_ID;
+sspp_addr			return SSPP_ADDR;
+sauth_chunk			return SAUTH_CHUNK;
+sca_assoc_id			return SCA_ASSOC_ID;
+sca_keynumber			return SCA_KEYNUMBER;
+sca_keylength			return SCA_KEYLENGTH;
+sca_key				return SCA_KEY;
 CHUNK				return CHUNK;
 DATA				return DATA;
 INIT				return INIT;
diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index a708d9ea995dc52a107bfd3e6c374df3aa883c09..f5c85b66fe083778b3a6556f247c61649b1f9dae 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -503,17 +503,17 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %token <reserved> IPV4 IPV6 ICMP SCTP UDP UDPLITE GRE MTU
 %token <reserved> MPLS LABEL TC TTL
 %token <reserved> OPTION
-%token <reserved> SRTO_INITIAL SRTO_MAX SRTO_MIN
+%token <reserved> SRTO_ASSOC_ID SRTO_INITIAL SRTO_MAX SRTO_MIN
 %token <reserved> SINIT_NUM_OSTREAMS SINIT_MAX_INSTREAMS SINIT_MAX_ATTEMPTS
 %token <reserved> SINIT_MAX_INIT_TIMEO
-%token <reserved> ASSOC_VALUE
+%token <reserved> ASSOC_ID ASSOC_VALUE SHMAC_NUMBER_OF_IDENTS SHMAC_IDENTS
 %token <reserved> STREAM_ID STREAM_VALUE
-%token <reserved> SACK_DELAY SACK_FREQ
-%token <reserved> SSTAT_STATE SSTAT_RWND SSTAT_UNACKDATA SSTAT_PENDDATA
+%token <reserved> SCACT_ASSOC_ID SCACT_KEYNUMBER SACK_ASSOC_ID SACK_DELAY SACK_FREQ
+%token <reserved> SSTAT_ASSOC_ID SSTAT_STATE SSTAT_RWND SSTAT_UNACKDATA SSTAT_PENDDATA
 %token <reserved> SSTAT_INSTRMS SSTAT_OUTSTRMS SSTAT_FRAGMENTATION_POINT
 %token <reserved> SSTAT_PRIMARY
-%token <reserved> SPINFO_ADDRESS SPINFO_STATE SPINFO_CWND SPINFO_SRTT SPINFO_RTO
-%token <reserved> SPINFO_MTU
+%token <reserved> SPINFO_ASSOC_ID SPINFO_ADDRESS SPINFO_STATE SPINFO_CWND SPINFO_SRTT SPINFO_RTO
+%token <reserved> SPINFO_MTU GAUTH_ASSOC_ID GAUTH_NUMBER_OF_CHUNKS GAUTH_CHUNKS
 %token <reserved> CHUNK DATA INIT INIT_ACK HEARTBEAT HEARTBEAT_ACK ABORT
 %token <reserved> SHUTDOWN SHUTDOWN_ACK ERROR COOKIE_ECHO COOKIE_ACK ECNE CWR
 %token <reserved> SHUTDOWN_COMPLETE I_DATA PAD
@@ -534,21 +534,22 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %token <reserved> COOKIE_RECEIVED_WHILE_SHUTDOWN RESTART_WITH_NEW_ADDRESSES
 %token <reserved> USER_INITIATED_ABORT PROTOCOL_VIOLATION
 %token <reserved> STALENESS CHK PARAM UNRECOGNIZED_PARAMETERS
-%token <reserved> SPP_ADDRESS SPP_HBINTERVAL SPP_PATHMAXRXT SPP_PATHMTU
+%token <reserved> SPP_ASSOC_ID SPP_ADDRESS SPP_HBINTERVAL SPP_PATHMAXRXT SPP_PATHMTU
 %token <reserved> SPP_FLAGS SPP_IPV6_FLOWLABEL_ SPP_DSCP_
-%token <reserved> SASOC_ASOCMAXRXT SASOC_NUMBER_PEER_DESTINATIONS SASOC_PEER_RWND
-%token <reserved> SASOC_LOCAL_RWND SASOC_COOKIE_LIFE SE_TYPE SE_ON
+%token <reserved> SASOC_ASOCMAXRXT SASOC_ASSOC_ID SASOC_NUMBER_PEER_DESTINATIONS SASOC_PEER_RWND
+%token <reserved> SASOC_LOCAL_RWND SASOC_COOKIE_LIFE SE_ASSOC_ID SE_TYPE SE_ON
+%token <reserved> SSP_ASSOC_ID SSP_ADDR
 %token <reserved> SND_SID SND_FLAGS SND_PPID SND_CONTEXT SND_ASSOC_ID SSB_ADAPTATION_IND
 %token <reserved> BAD_CRC32C NULL_
 %token <reserved> SINFO_STREAM SINFO_SSN SINFO_FLAGS SINFO_PPID SINFO_CONTEXT SINFO_ASSOC_ID
 %token <reserved> SINFO_TIMETOLIVE SINFO_TSN SINFO_CUMTSN SINFO_PR_VALUE SERINFO_NEXT_FLAGS
 %token <reserved> SERINFO_NEXT_STREAM SERINFO_NEXT_AID SERINFO_NEXT_LENGTH SERINFO_NEXT_PPID
-%token <reserved> PR_POLICY PR_VALUE AUTH_KEYNUMBER SENDV_FLAGS SENDV_SNDINFO
+%token <reserved> PR_POLICY PR_VALUE PR_ASSOC_ID AUTH_KEYNUMBER SENDV_FLAGS SENDV_SNDINFO
 %token <reserved> SENDV_PRINFO SENDV_AUTHINFO
 %token <reserved> RCV_SID RCV_SSN RCV_FLAGS RCV_PPID RCV_TSN RCV_CUMTSN RCV_CONTEXT RCV_ASSOC_ID
 %token <reserved> NXT_SID NXT_FLAGS NXT_PPID NXT_LENGTH NXT_ASSOC_ID
 %token <reserved> RECVV_RCVINFO RECVV_NXTINFO
-%token <reserved> SSE_TYPE SSE_FLAGS SSE_LENGTH
+%token <reserved> SSE_TYPE SSE_FLAGS SSE_LENGTH SSE_ASSOC_ID
 %token <reserved> SENDER_DRY_TYPE SENDER_DRY_FLAGS SENDER_DRY_LENGTH SENDER_DRY_ASSOC_ID
 %token <reserved> _SCTP_DATA_IO_EVENT_ _SCTP_ASSOCIATION_EVENT_ _SCTP_ADDRESS_EVENT_
 %token <reserved> _SCTP_SEND_FAILURE_EVENT_ _SCTP_PEER_ERROR_EVENT_ _SCTP_SHUTDOWN_EVENT_
@@ -563,7 +564,9 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %token <reserved> SPC_TYPE SPC_FLAGS SPC_LENGTH SPC_AADDR SPC_STATE SPC_ERROR SPC_ASSOC_ID
 %token <reserved> SSF_TYPE SSF_LENGTH SSF_FLAGS SSF_ERROR SSF_INFO SSF_ASSOC_ID SSF_DATA
 %token <reserved> SAI_TYPE SAI_FLAGS SAI_LENGTH SAI_ADAPTATION_IND SAI_ASSOC_ID
-%token <reserved> SN_TYPE SN_FLAGS SN_LENGTH
+%token <reserved> GAIDS_NUMBER_OF_IDS GAIDS_ASSOC_ID SSPP_ASSOC_ID SSPP_ADDR
+%token <reserved> SN_TYPE SN_FLAGS SN_LENGTH SAUTH_CHUNK
+%token <reserved> SCA_ASSOC_ID SCA_KEYNUMBER SCA_KEYLENGTH SCA_KEY
 %token <floating> FLOAT
 %token <integer> INTEGER HEX_INTEGER
 %token <string> WORD STRING BACK_QUOTED CODE IPV4_ADDR IPV6_ADDR
@@ -601,39 +604,42 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %type <expression> decimal_integer hex_integer data
 %type <expression> inaddr sockaddr msghdr cmsghdr cmsg_level cmsg_type cmsg_data
 %type <expression> iovec pollfd opt_revents
-%type <expression> linger l_onoff l_linger
+%type <expression> linger l_onoff l_linger sctp_assoc_id
 %type <expression> sctp_status sstat_state sstat_rwnd sstat_unackdata sstat_penddata
 %type <expression> sstat_instrms sstat_outstrms sstat_fragmentation_point sstat_primary
 %type <expression> sctp_initmsg sinit_num_ostreams sinit_max_instreams sinit_max_attempts
-%type <expression> sinit_max_init_timeo sctp_assoc_value sctp_stream_value
-%type <expression> sctp_sackinfo sack_delay sack_freq
+%type <expression> sinit_max_init_timeo sctp_assoc_value sctp_stream_value sctp_hmacalgo
+%type <expression> shmac_number_of_idents
+%type <expression> sctp_authkeyid scact_keynumber sctp_sackinfo sack_delay sack_freq
 %type <expression> sctp_rtoinfo srto_initial srto_max srto_min sctp_paddrinfo
 %type <expression> sctp_paddrparams spp_address spp_hbinterval spp_pathmtu spp_pathmaxrxt
-%type <expression> spp_flags spp_ipv6_flowlabel spp_dscp
+%type <expression> spp_flags spp_ipv6_flowlabel spp_dscp ssp_addr
 %type <expression> spinfo_address spinfo_state spinfo_cwnd spinfo_srtt spinfo_rto spinfo_mtu
+%type <expression> sctp_authchunks gauth_number_of_chunks
 %type <expression> sasoc_asocmaxrxt sasoc_number_peer_destinations sasoc_peer_rwnd
 %type <expression> sasoc_local_rwnd sasoc_cookie_life sctp_assocparams
-%type <expression> sctp_sndinfo snd_sid snd_flags snd_ppid snd_assoc_id snd_context
-%type <expression> sctp_event se_type se_on sctp_setadaptation null
+%type <expression> sctp_sndinfo snd_sid snd_flags snd_ppid snd_context
+%type <expression> sctp_event se_type se_on sctp_setadaptation sctp_setprim null
 %type <expression> sctp_sndrcvinfo sinfo_stream sinfo_ssn sinfo_flags sinfo_ppid sinfo_context
-%type <expression> sinfo_timetolive sinfo_tsn sinfo_cumtsn sinfo_assoc_id sinfo_pr_value serinfo_next_flags
+%type <expression> sinfo_timetolive sinfo_tsn sinfo_cumtsn sinfo_pr_value serinfo_next_flags
 %type <expression> serinfo_next_stream serinfo_next_aid serinfo_next_length serinfo_next_ppid sctp_extrcvinfo
-%type <expression> sctp_prinfo sctp_authinfo pr_policy sctp_sendv_spa
-%type <expression> sctp_rcvinfo rcv_sid rcv_ssn rcv_flags rcv_ppid rcv_tsn rcv_cumtsn rcv_context rcv_assoc_id
-%type <expression> sctp_nxtinfo nxt_sid nxt_flags nxt_ppid nxt_length nxt_assoc_id sctp_recvv_rn
+%type <expression> sctp_prinfo sctp_authinfo pr_policy sctp_sendv_spa sctp_default_prinfo
+%type <expression> sctp_rcvinfo rcv_sid rcv_ssn rcv_flags rcv_ppid rcv_tsn rcv_cumtsn rcv_context
+%type <expression> sctp_nxtinfo nxt_sid nxt_flags nxt_ppid nxt_length sctp_recvv_rn
 %type <expression> sctp_shutdown_event sse_type sse_flags sse_length
-%type <expression> sctp_sender_dry_event sender_dry_type sender_dry_flags sender_dry_length sender_dry_assoc_id
+%type <expression> sctp_sender_dry_event sender_dry_type sender_dry_flags sender_dry_length
 %type <expression> sctp_event_subscribe
 %type <expression> sctp_assoc_change sac_type sac_flags sac_length sac_state sac_error sac_outbound_streams
-%type <expression> sac_inbound_streams sac_assoc_id sac_info
-%type <expression> sctp_send_failed_event ssfe_type ssfe_flags ssfe_length ssfe_error ssfe_assoc_id ssfe_data
-%type <expression> sctp_authkey_event auth_type auth_flags auth_length auth_keynumber auth_indication auth_assoc_id
-%type <expression> sctp_remote_error sre_type sre_flags sre_length sre_error sre_assoc_id sre_data
-%type <expression> sctp_pdapi_event pdapi_type pdapi_flags pdapi_length pdapi_indication pdapi_stream pdapi_seq pdapi_assoc_id
-%type <expression> sctp_paddr_change spc_type spc_flags spc_length spc_aaddr spc_error spc_state spc_assoc_id
-%type <expression> sctp_send_failed ssf_type ssf_length ssf_flags ssf_error ssf_info ssf_assoc_id ssf_data
-%type <expression> sctp_adaptation_event sai_type sai_flags sai_length sai_adaptation_ind sai_assoc_id
-%type <expression> sctp_tlv sn_type sn_flags sn_length
+%type <expression> sac_inbound_streams sac_info
+%type <expression> sctp_send_failed_event ssfe_type ssfe_flags ssfe_length ssfe_error ssfe_data
+%type <expression> sctp_authkey_event auth_type auth_flags auth_length auth_keynumber auth_indication
+%type <expression> sctp_remote_error sre_type sre_flags sre_length sre_error sre_data
+%type <expression> sctp_pdapi_event pdapi_type pdapi_flags pdapi_length pdapi_indication pdapi_stream pdapi_seq
+%type <expression> sctp_paddr_change spc_type spc_flags spc_length spc_aaddr spc_error spc_state
+%type <expression> sctp_send_failed ssf_type ssf_length ssf_flags ssf_error ssf_info ssf_data
+%type <expression> sctp_adaptation_event sai_type sai_flags sai_length sai_adaptation_ind
+%type <expression> sctp_tlv sn_type sn_flags sn_length sctp_assoc_ids gaids_number_of_ids
+%type <expression> sctp_setpeerprim sctp_authchunk sctp_authkey
 %type <errno_info> opt_errno
 %type <chunk_list> sctp_chunk_list_spec
 %type <chunk_list_item> sctp_chunk_spec
@@ -2548,7 +2554,13 @@ expression
 | sctp_assoc_value  {
 	$$ = $1;
 }
-| sctp_stream_value  {
+| sctp_hmacalgo     {
+	$$ = $1;
+}
+| sctp_stream_value {
+	$$ = $1;
+}
+| sctp_authkeyid    {
 	$$ = $1;
 }
 | sctp_sackinfo     {
@@ -2575,6 +2587,9 @@ expression
 | sctp_sndinfo      {
 	$$ = $1;
 }
+| sctp_setprim      {
+	$$ = $1;
+}
 | sctp_setadaptation{
 	$$ = $1;
 }
@@ -2584,6 +2599,9 @@ expression
 | sctp_prinfo       {
 	$$ = $1;
 }
+|sctp_default_prinfo{
+	$$ = $1;
+}
 | sctp_authinfo     {
 	$$ = $1;
 }
@@ -2599,6 +2617,21 @@ expression
 | sctp_recvv_rn     {
 	$$ = $1;
 }
+| sctp_assoc_ids    {
+	$$ = $1;
+}
+| sctp_authchunks   {
+	$$ = $1;
+}
+| sctp_setpeerprim  {
+	$$ = $1;
+}
+| sctp_authchunk    {
+	$$ = $1;
+}
+| sctp_authkey      {
+	$$ = $1;
+}
 | null              {
 	$$ = $1;
 }
@@ -2862,10 +2895,33 @@ srto_min
 | SRTO_MIN '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
+sctp_assoc_id
+: INTEGER {
+	if (!is_valid_u32($1)) {
+		semantic_error("value for sctp_assoc_t out of range");
+	}
+	$$ = new_integer_expression($1, "%u");
+}
+| WORD {
+	$$ = new_expression(EXPR_WORD);
+	$$->value.string = $1;
+}
+| ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
 sctp_rtoinfo
-: '{' srto_initial ',' srto_max ',' srto_min '}' {
+: '{' SRTO_ASSOC_ID '=' sctp_assoc_id ',' srto_initial ',' srto_max ',' srto_min '}' {
+	$$ = new_expression(EXPR_SCTP_RTOINFO);
+	$$->value.sctp_rtoinfo = calloc(1, sizeof(struct sctp_rtoinfo_expr));
+	$$->value.sctp_rtoinfo->srto_assoc_id = $4;
+	$$->value.sctp_rtoinfo->srto_initial = $6;
+	$$->value.sctp_rtoinfo->srto_max = $8;
+	$$->value.sctp_rtoinfo->srto_min = $10;
+}
+| '{' srto_initial ',' srto_max ',' srto_min '}' {
 	$$ = new_expression(EXPR_SCTP_RTOINFO);
 	$$->value.sctp_rtoinfo = calloc(1, sizeof(struct sctp_rtoinfo_expr));
+	$$->value.sctp_rtoinfo->srto_assoc_id = new_expression(EXPR_ELLIPSIS);
 	$$->value.sctp_rtoinfo->srto_initial = $2;
 	$$->value.sctp_rtoinfo->srto_max = $4;
 	$$->value.sctp_rtoinfo->srto_min = $6;
@@ -2934,13 +2990,61 @@ sctp_stream_value
 ;
 
 sctp_assoc_value
-: '{' ASSOC_VALUE '=' expression '}' {
+: '{' ASSOC_ID '=' sctp_assoc_id ',' ASSOC_VALUE '=' expression '}' {
 	$$ = new_expression(EXPR_SCTP_ASSOC_VALUE);
 	$$->value.sctp_assoc_value = calloc(1, sizeof(struct sctp_assoc_value_expr));
+	$$->value.sctp_assoc_value->assoc_id = $4;
+	$$->value.sctp_assoc_value->assoc_value = $8;
+}
+| '{' ASSOC_VALUE '=' expression '}' {
+	$$ = new_expression(EXPR_SCTP_ASSOC_VALUE);
+	$$->value.sctp_assoc_value = calloc(1, sizeof(struct sctp_assoc_value_expr));
+	$$->value.sctp_assoc_value->assoc_id = new_expression(EXPR_ELLIPSIS);
 	$$->value.sctp_assoc_value->assoc_value = $4;
 }
 ;
 
+shmac_number_of_idents
+: SHMAC_NUMBER_OF_IDENTS '=' INTEGER {
+	if (!is_valid_u32($3)) {
+		semantic_error("shmac_number_of_idents out of range");
+	}
+	$$ = new_integer_expression($3, "%u");
+}
+| SHMAC_NUMBER_OF_IDENTS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sctp_hmacalgo
+: '{' shmac_number_of_idents ',' SHMAC_IDENTS '=' array '}' {
+	$$ = new_expression(EXPR_SCTP_HMACALGO);
+	$$->value.sctp_hmacalgo = calloc(1, sizeof(struct sctp_assoc_value_expr));
+	$$->value.sctp_hmacalgo->shmac_number_of_idents = $2;
+	$$->value.sctp_hmacalgo->shmac_idents = $6;
+}
+
+scact_keynumber
+: SCACT_KEYNUMBER '=' INTEGER {
+	if (!is_valid_u16($3)) {
+		semantic_error("scact_keynumber out of range");
+	}
+	$$ = new_integer_expression($3, "%hu");
+}
+| SCACT_KEYNUMBER '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+
+sctp_authkeyid
+: '{' SCACT_ASSOC_ID '=' sctp_assoc_id ',' scact_keynumber '}' {
+	$$ = new_expression(EXPR_SCTP_AUTHKEYID);
+	$$->value.sctp_authkeyid = calloc(1, sizeof(struct sctp_authkeyid_expr));
+	$$->value.sctp_authkeyid->scact_assoc_id = $4;
+	$$->value.sctp_authkeyid->scact_keynumber = $6;
+}
+| '{' scact_keynumber '}'{ 
+	$$ = new_expression(EXPR_SCTP_AUTHKEYID);
+	$$->value.sctp_authkeyid = calloc(1, sizeof(struct sctp_authkeyid_expr));
+	$$->value.sctp_authkeyid->scact_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_authkeyid->scact_keynumber = $2;
+}
+
 sack_delay
 : SACK_DELAY '=' INTEGER {
 	if (!is_valid_u32($3)) {
@@ -2960,9 +3064,17 @@ sack_freq
 | SACK_FREQ '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 
 sctp_sackinfo
-: '{' sack_delay ',' sack_freq '}' {
+: '{' SACK_ASSOC_ID '=' sctp_assoc_id ',' sack_delay ',' sack_freq '}' {
+	$$ = new_expression(EXPR_SCTP_SACKINFO);
+	$$->value.sctp_sack_info = calloc(1, sizeof(struct sctp_sack_info_expr));
+	$$->value.sctp_sack_info->sack_assoc_id = $4;
+	$$->value.sctp_sack_info->sack_delay = $6;
+	$$->value.sctp_sack_info->sack_freq = $8;
+}
+| '{' sack_delay ',' sack_freq '}' {
 	$$ = new_expression(EXPR_SCTP_SACKINFO);
 	$$->value.sctp_sack_info = calloc(1, sizeof(struct sctp_sack_info_expr));
+	$$->value.sctp_sack_info->sack_assoc_id = new_expression(EXPR_ELLIPSIS);
 	$$->value.sctp_sack_info->sack_delay = $2;
 	$$->value.sctp_sack_info->sack_freq = $4;
 }
@@ -3097,9 +3209,23 @@ spinfo_mtu
 ;
 
 sctp_paddrinfo
-: '{' spinfo_address ',' spinfo_state ',' spinfo_cwnd ',' spinfo_srtt ',' spinfo_rto ',' spinfo_mtu '}' {
+: '{' SPINFO_ASSOC_ID '=' sctp_assoc_id ',' spinfo_address ',' spinfo_state ',' spinfo_cwnd ','
+      spinfo_srtt ',' spinfo_rto ',' spinfo_mtu '}' {
 	$$ = new_expression(EXPR_SCTP_PADDRINFO);
 	$$->value.sctp_paddrinfo = calloc(1, sizeof(struct sctp_paddrinfo_expr));
+	$$->value.sctp_paddrinfo->spinfo_assoc_id = $4;
+	$$->value.sctp_paddrinfo->spinfo_address = $6;
+	$$->value.sctp_paddrinfo->spinfo_state = $8;
+	$$->value.sctp_paddrinfo->spinfo_cwnd = $10;
+	$$->value.sctp_paddrinfo->spinfo_srtt = $12;
+	$$->value.sctp_paddrinfo->spinfo_rto = $14;
+	$$->value.sctp_paddrinfo->spinfo_mtu = $16;
+}
+| '{' spinfo_address ',' spinfo_state ',' spinfo_cwnd ','
+      spinfo_srtt ',' spinfo_rto ',' spinfo_mtu '}' {
+	$$ = new_expression(EXPR_SCTP_PADDRINFO);
+	$$->value.sctp_paddrinfo = calloc(1, sizeof(struct sctp_paddrinfo_expr));
+	$$->value.sctp_paddrinfo->spinfo_assoc_id = new_expression(EXPR_ELLIPSIS);
 	$$->value.sctp_paddrinfo->spinfo_address = $2;
 	$$->value.sctp_paddrinfo->spinfo_state = $4;
 	$$->value.sctp_paddrinfo->spinfo_cwnd = $6;
@@ -3110,10 +3236,25 @@ sctp_paddrinfo
 ;
 
 sctp_status
-: '{' sstat_state ',' sstat_rwnd ',' sstat_unackdata ',' sstat_penddata ',' sstat_instrms ',' sstat_outstrms ','
-	sstat_fragmentation_point ',' sstat_primary  '}' {
+: '{' SSTAT_ASSOC_ID '=' sctp_assoc_id ',' sstat_state ',' sstat_rwnd ',' sstat_unackdata ',' sstat_penddata ',' sstat_instrms ',' sstat_outstrms ','
+	sstat_fragmentation_point ',' sstat_primary '}' {
+	$$ = new_expression(EXPR_SCTP_STATUS);
+	$$->value.sctp_status = calloc(1, sizeof(struct sctp_status_expr));
+	$$->value.sctp_status->sstat_assoc_id = $4;
+	$$->value.sctp_status->sstat_state = $6;
+	$$->value.sctp_status->sstat_rwnd = $8;
+	$$->value.sctp_status->sstat_unackdata = $10;
+	$$->value.sctp_status->sstat_penddata = $12;
+	$$->value.sctp_status->sstat_instrms = $14;
+	$$->value.sctp_status->sstat_outstrms = $16;
+	$$->value.sctp_status->sstat_fragmentation_point = $18;
+	$$->value.sctp_status->sstat_primary = $20;
+}
+| '{' sstat_state ',' sstat_rwnd ',' sstat_unackdata ',' sstat_penddata ',' sstat_instrms ',' sstat_outstrms ','
+	sstat_fragmentation_point ',' sstat_primary '}' {
 	$$ = new_expression(EXPR_SCTP_STATUS);
 	$$->value.sctp_status = calloc(1, sizeof(struct sctp_status_expr));
+	$$->value.sctp_status->sstat_assoc_id = new_expression(EXPR_ELLIPSIS);
 	$$->value.sctp_status->sstat_state = $2;
 	$$->value.sctp_status->sstat_rwnd = $4;
 	$$->value.sctp_status->sstat_unackdata = $6;
@@ -3185,9 +3326,24 @@ spp_dscp
 ;
 
 sctp_paddrparams
-: '{' spp_address ',' spp_hbinterval ',' spp_pathmaxrxt ',' spp_pathmtu ','spp_flags ',' spp_ipv6_flowlabel ',' spp_dscp'}' {
+: '{' SPP_ASSOC_ID '=' sctp_assoc_id ',' spp_address ',' spp_hbinterval ',' spp_pathmaxrxt ',' spp_pathmtu ','spp_flags ','
+      spp_ipv6_flowlabel ',' spp_dscp'}' {
+	$$ = new_expression(EXPR_SCTP_PEER_ADDR_PARAMS);
+	$$->value.sctp_paddrparams = calloc(1, sizeof(struct sctp_paddrparams_expr));
+	$$->value.sctp_paddrparams->spp_assoc_id = $4;
+	$$->value.sctp_paddrparams->spp_address = $6;
+	$$->value.sctp_paddrparams->spp_hbinterval = $8;
+	$$->value.sctp_paddrparams->spp_pathmaxrxt = $10;
+	$$->value.sctp_paddrparams->spp_pathmtu = $12;
+	$$->value.sctp_paddrparams->spp_flags = $14;
+	$$->value.sctp_paddrparams->spp_ipv6_flowlabel = $16;
+	$$->value.sctp_paddrparams->spp_dscp = $18;
+}
+| '{' spp_address ',' spp_hbinterval ',' spp_pathmaxrxt ',' spp_pathmtu ','spp_flags ','
+      spp_ipv6_flowlabel ',' spp_dscp'}' {
 	$$ = new_expression(EXPR_SCTP_PEER_ADDR_PARAMS);
 	$$->value.sctp_paddrparams = calloc(1, sizeof(struct sctp_paddrparams_expr));
+	$$->value.sctp_paddrparams->spp_assoc_id = new_expression(EXPR_ELLIPSIS);
 	$$->value.sctp_paddrparams->spp_address = $2;
 	$$->value.sctp_paddrparams->spp_hbinterval = $4;
 	$$->value.sctp_paddrparams->spp_pathmaxrxt = $6;
@@ -3249,9 +3405,22 @@ sasoc_cookie_life
 ;
 
 sctp_assocparams
-: '{' sasoc_asocmaxrxt ',' sasoc_number_peer_destinations ',' sasoc_peer_rwnd ',' sasoc_local_rwnd ',' sasoc_cookie_life '}' {
+: '{' SASOC_ASSOC_ID '=' sctp_assoc_id ',' sasoc_asocmaxrxt ',' sasoc_number_peer_destinations ','
+      sasoc_peer_rwnd ',' sasoc_local_rwnd ',' sasoc_cookie_life '}' {
+	$$ = new_expression(EXPR_SCTP_ASSOCPARAMS);
+        $$->value.sctp_assocparams = calloc(1, sizeof(struct sctp_assocparams_expr));
+        $$->value.sctp_assocparams->sasoc_assoc_id = $4;
+        $$->value.sctp_assocparams->sasoc_asocmaxrxt = $6;
+        $$->value.sctp_assocparams->sasoc_number_peer_destinations = $8;
+        $$->value.sctp_assocparams->sasoc_peer_rwnd = $10;
+        $$->value.sctp_assocparams->sasoc_local_rwnd = $12;
+        $$->value.sctp_assocparams->sasoc_cookie_life = $14;
+}
+| '{' sasoc_asocmaxrxt ',' sasoc_number_peer_destinations ','
+      sasoc_peer_rwnd ',' sasoc_local_rwnd ',' sasoc_cookie_life '}' {
 	$$ = new_expression(EXPR_SCTP_ASSOCPARAMS);
         $$->value.sctp_assocparams = calloc(1, sizeof(struct sctp_assocparams_expr));
+        $$->value.sctp_assocparams->sasoc_assoc_id = new_expression(EXPR_ELLIPSIS);
         $$->value.sctp_assocparams->sasoc_asocmaxrxt = $2;
         $$->value.sctp_assocparams->sasoc_number_peer_destinations = $4;
         $$->value.sctp_assocparams->sasoc_peer_rwnd = $6;
@@ -3284,9 +3453,17 @@ se_on
 ;
 
 sctp_event
-: '{' se_type ',' se_on '}' {
+: '{' SE_ASSOC_ID '=' sctp_assoc_id ',' se_type ',' se_on '}' {
 	$$ = new_expression(EXPR_SCTP_EVENT);
 	$$->value.sctp_event = calloc(1, sizeof(struct sctp_event_expr));
+	$$->value.sctp_event->se_assoc_id = $4;
+	$$->value.sctp_event->se_type = $6;
+	$$->value.sctp_event->se_on = $8;
+}
+| '{' se_type ',' se_on '}' {
+	$$ = new_expression(EXPR_SCTP_EVENT);
+	$$->value.sctp_event = calloc(1, sizeof(struct sctp_event_expr));
+	$$->value.sctp_event->se_assoc_id = new_expression(EXPR_ELLIPSIS);
 	$$->value.sctp_event->se_type = $2;
 	$$->value.sctp_event->se_on = $4;
 }
@@ -3377,30 +3554,43 @@ snd_context
 | SND_CONTEXT '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-snd_assoc_id
-: SND_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("snd_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SND_ASSOC_ID '=' WORD {
-	$$ = new_expression(EXPR_WORD);
-	$$->value.string = $3;
-}
-| SND_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
-
 sctp_sndinfo
-: '{' snd_sid ',' snd_flags ',' snd_ppid ',' snd_context ',' snd_assoc_id'}' {
+: '{' snd_sid ',' snd_flags ',' snd_ppid ',' snd_context ',' SND_ASSOC_ID '=' sctp_assoc_id'}' {
+	$$ = new_expression(EXPR_SCTP_SNDINFO);
+	$$->value.sctp_sndinfo = calloc(1, sizeof(struct sctp_sndinfo_expr));
+	$$->value.sctp_sndinfo->snd_sid = $2;
+	$$->value.sctp_sndinfo->snd_flags = $4;
+	$$->value.sctp_sndinfo->snd_ppid = $6;
+	$$->value.sctp_sndinfo->snd_context = $8;
+	$$->value.sctp_sndinfo->snd_assoc_id = $12;
+}
+| '{' snd_sid ',' snd_flags ',' snd_ppid ',' snd_context '}' {
 	$$ = new_expression(EXPR_SCTP_SNDINFO);
 	$$->value.sctp_sndinfo = calloc(1, sizeof(struct sctp_sndinfo_expr));
 	$$->value.sctp_sndinfo->snd_sid = $2;
 	$$->value.sctp_sndinfo->snd_flags = $4;
 	$$->value.sctp_sndinfo->snd_ppid = $6;
 	$$->value.sctp_sndinfo->snd_context = $8;
-	$$->value.sctp_sndinfo->snd_assoc_id = $10;
+	$$->value.sctp_sndinfo->snd_assoc_id = new_expression(EXPR_ELLIPSIS);
+}
+;
+ssp_addr
+: SSP_ADDR '=' sockaddr { $$ = $3; }
+| SSP_ADDR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sctp_setprim
+: '{' SSP_ASSOC_ID '=' sctp_assoc_id ',' ssp_addr '}' {
+	$$ = new_expression(EXPR_SCTP_SETPRIM);
+	$$->value.sctp_setprim = calloc(1, sizeof(struct sctp_setprim_expr));
+	$$->value.sctp_setprim->ssp_assoc_id = $4;
+	$$->value.sctp_setprim->ssp_addr = $6;
+}
+| '{' ssp_addr '}' {
+	$$ = new_expression(EXPR_SCTP_SETPRIM);
+	$$->value.sctp_setprim = calloc(1, sizeof(struct sctp_setprim_expr));
+	$$->value.sctp_setprim->ssp_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_setprim->ssp_addr = $2;
 }
 ;
 
@@ -3413,6 +3603,11 @@ sctp_setadaptation
 	}
 	$$->value.sctp_setadaptation->ssb_adaptation_ind = new_integer_expression($4, "%u");
 }
+| '{' SSB_ADAPTATION_IND '=' ELLIPSIS '}' {
+	$$ = new_expression(EXPR_SCTP_SETADAPTATION);
+	$$->value.sctp_setadaptation = calloc(1, sizeof(struct sctp_setadaptation_expr));
+	$$->value.sctp_setadaptation->ssb_adaptation_ind = new_expression(EXPR_ELLIPSIS);
+}
 ;
 
 sinfo_stream
@@ -3489,18 +3684,23 @@ sinfo_cumtsn
 | SINFO_CUMTSN '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-sinfo_assoc_id
-: SINFO_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("sinfo_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SINFO_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 sctp_sndrcvinfo
-: '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_timetolive ',' sinfo_tsn ',' sinfo_cumtsn ',' sinfo_assoc_id '}' {
+: '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_timetolive ','
+      sinfo_tsn ',' sinfo_cumtsn ',' SINFO_ASSOC_ID '=' sctp_assoc_id '}' {
+	$$ = new_expression(EXPR_SCTP_SNDRCVINFO);
+	$$->value.sctp_sndrcvinfo = calloc(1, sizeof(struct sctp_sndrcvinfo_expr));
+	$$->value.sctp_sndrcvinfo->sinfo_stream = $2;
+	$$->value.sctp_sndrcvinfo->sinfo_ssn = $4;
+	$$->value.sctp_sndrcvinfo->sinfo_flags = $6;
+	$$->value.sctp_sndrcvinfo->sinfo_ppid = $8;
+	$$->value.sctp_sndrcvinfo->sinfo_context = $10;
+	$$->value.sctp_sndrcvinfo->sinfo_timetolive = $12;
+	$$->value.sctp_sndrcvinfo->sinfo_tsn = $14;
+	$$->value.sctp_sndrcvinfo->sinfo_cumtsn = $16;
+	$$->value.sctp_sndrcvinfo->sinfo_assoc_id = $20;
+}
+| '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_timetolive ','
+      sinfo_tsn ',' sinfo_cumtsn '}' {
 	$$ = new_expression(EXPR_SCTP_SNDRCVINFO);
 	$$->value.sctp_sndrcvinfo = calloc(1, sizeof(struct sctp_sndrcvinfo_expr));
 	$$->value.sctp_sndrcvinfo->sinfo_stream = $2;
@@ -3511,7 +3711,7 @@ sctp_sndrcvinfo
 	$$->value.sctp_sndrcvinfo->sinfo_timetolive = $12;
 	$$->value.sctp_sndrcvinfo->sinfo_tsn = $14;
 	$$->value.sctp_sndrcvinfo->sinfo_cumtsn = $16;
-	$$->value.sctp_sndrcvinfo->sinfo_assoc_id = $18;
+	$$->value.sctp_sndrcvinfo->sinfo_assoc_id = new_expression(EXPR_ELLIPSIS);
 };
 
 sinfo_pr_value
@@ -3568,7 +3768,26 @@ serinfo_next_ppid
 
 sctp_extrcvinfo
 : '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_pr_value ',' sinfo_tsn ',' sinfo_cumtsn ','
-serinfo_next_flags ',' serinfo_next_stream ',' serinfo_next_aid ',' serinfo_next_length ',' serinfo_next_ppid ',' sinfo_assoc_id '}' {
+serinfo_next_flags ',' serinfo_next_stream ',' serinfo_next_aid ',' serinfo_next_length ',' serinfo_next_ppid ',' SINFO_ASSOC_ID '=' sctp_assoc_id '}' {
+	$$ = new_expression(EXPR_SCTP_EXTRCVINFO);
+	$$->value.sctp_extrcvinfo = calloc(1, sizeof(struct sctp_extrcvinfo_expr));
+	$$->value.sctp_extrcvinfo->sinfo_stream = $2;
+	$$->value.sctp_extrcvinfo->sinfo_ssn = $4;
+	$$->value.sctp_extrcvinfo->sinfo_flags = $6;
+	$$->value.sctp_extrcvinfo->sinfo_ppid = $8;
+	$$->value.sctp_extrcvinfo->sinfo_context = $10;
+	$$->value.sctp_extrcvinfo->sinfo_pr_value = $12;
+	$$->value.sctp_extrcvinfo->sinfo_tsn = $14;
+	$$->value.sctp_extrcvinfo->sinfo_cumtsn = $16;
+	$$->value.sctp_extrcvinfo->serinfo_next_flags = $18;
+	$$->value.sctp_extrcvinfo->serinfo_next_stream = $20;
+	$$->value.sctp_extrcvinfo->serinfo_next_aid = $22;
+	$$->value.sctp_extrcvinfo->serinfo_next_length = $24;
+	$$->value.sctp_extrcvinfo->serinfo_next_ppid = $26;
+	$$->value.sctp_extrcvinfo->sinfo_assoc_id = $30;
+}
+| '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_pr_value ',' sinfo_tsn ',' sinfo_cumtsn ','
+serinfo_next_flags ',' serinfo_next_stream ',' serinfo_next_aid ',' serinfo_next_length ',' serinfo_next_ppid '}' {
 	$$ = new_expression(EXPR_SCTP_EXTRCVINFO);
 	$$->value.sctp_extrcvinfo = calloc(1, sizeof(struct sctp_extrcvinfo_expr));
 	$$->value.sctp_extrcvinfo->sinfo_stream = $2;
@@ -3584,10 +3803,9 @@ serinfo_next_flags ',' serinfo_next_stream ',' serinfo_next_aid ',' serinfo_next
 	$$->value.sctp_extrcvinfo->serinfo_next_aid = $22;
 	$$->value.sctp_extrcvinfo->serinfo_next_length = $24;
 	$$->value.sctp_extrcvinfo->serinfo_next_ppid = $26;
-	$$->value.sctp_extrcvinfo->sinfo_assoc_id = $28;
+	$$->value.sctp_extrcvinfo->sinfo_assoc_id = new_expression(EXPR_ELLIPSIS);
 };
 
-
 rcv_sid
 : RCV_SID '=' INTEGER {
 	if (!is_valid_u16($3)) {
@@ -3652,19 +3870,20 @@ rcv_context
 | RCV_CONTEXT '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-rcv_assoc_id
-: RCV_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("rcv_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| RCV_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
-
 sctp_rcvinfo
-: '{' rcv_sid ',' rcv_ssn ',' rcv_flags ',' rcv_ppid ',' rcv_tsn ',' rcv_cumtsn ',' rcv_context ',' rcv_assoc_id'}' {
+: '{' rcv_sid ',' rcv_ssn ',' rcv_flags ',' rcv_ppid ',' rcv_tsn ',' rcv_cumtsn ',' rcv_context ',' RCV_ASSOC_ID '=' sctp_assoc_id'}' {
+	$$ = new_expression(EXPR_SCTP_RCVINFO);
+	$$->value.sctp_rcvinfo = calloc(1, sizeof(struct sctp_rcvinfo_expr));
+	$$->value.sctp_rcvinfo->rcv_sid = $2;
+	$$->value.sctp_rcvinfo->rcv_ssn = $4;
+	$$->value.sctp_rcvinfo->rcv_flags = $6;
+	$$->value.sctp_rcvinfo->rcv_ppid = $8;
+	$$->value.sctp_rcvinfo->rcv_tsn = $10;
+	$$->value.sctp_rcvinfo->rcv_cumtsn = $12;
+	$$->value.sctp_rcvinfo->rcv_context = $14;
+	$$->value.sctp_rcvinfo->rcv_assoc_id = $18;
+}
+| '{' rcv_sid ',' rcv_ssn ',' rcv_flags ',' rcv_ppid ',' rcv_tsn ',' rcv_cumtsn ',' rcv_context '}' {
 	$$ = new_expression(EXPR_SCTP_RCVINFO);
 	$$->value.sctp_rcvinfo = calloc(1, sizeof(struct sctp_rcvinfo_expr));
 	$$->value.sctp_rcvinfo->rcv_sid = $2;
@@ -3674,7 +3893,7 @@ sctp_rcvinfo
 	$$->value.sctp_rcvinfo->rcv_tsn = $10;
 	$$->value.sctp_rcvinfo->rcv_cumtsn = $12;
 	$$->value.sctp_rcvinfo->rcv_context = $14;
-	$$->value.sctp_rcvinfo->rcv_assoc_id = $16;
+	$$->value.sctp_rcvinfo->rcv_assoc_id = new_expression(EXPR_ELLIPSIS);
 }
 ;
 
@@ -3690,8 +3909,21 @@ pr_policy
 	$$ = new_integer_expression($3, "%hu");
 };
 
+sctp_default_prinfo
+: '{' pr_policy ',' PR_VALUE '=' INTEGER ',' PR_ASSOC_ID '=' sctp_assoc_id '}' {
+	$$ = new_expression(EXPR_SCTP_DEFAULT_PRINFO);
+	$$->value.sctp_default_prinfo = calloc(1, sizeof(struct sctp_default_prinfo_expr));
+	$$->value.sctp_default_prinfo->pr_policy = $2;
+	if (!is_valid_u32($6)) {
+		semantic_error("pr_value out of range");
+	}
+	$$->value.sctp_default_prinfo->pr_value = new_integer_expression($6, "%u");
+	$$->value.sctp_default_prinfo->pr_assoc_id = $10;
+}
+;
+
 sctp_prinfo
-: '{' pr_policy ',' PR_VALUE '=' INTEGER'}' {
+: '{' pr_policy ',' PR_VALUE '=' INTEGER '}' {
 	$$ = new_expression(EXPR_SCTP_PRINFO);
 	$$->value.sctp_prinfo = calloc(1, sizeof(struct sctp_prinfo_expr));
 	$$->value.sctp_prinfo->pr_policy = $2;
@@ -3758,25 +3990,24 @@ nxt_length
 | NXT_LENGTH '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-nxt_assoc_id
-: NXT_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("nxt_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| NXT_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 sctp_nxtinfo
-: '{' nxt_sid ',' nxt_flags ',' nxt_ppid ',' nxt_length ',' nxt_assoc_id '}' {
+: '{' nxt_sid ',' nxt_flags ',' nxt_ppid ',' nxt_length ',' NXT_ASSOC_ID '=' sctp_assoc_id '}' {
+	$$ = new_expression(EXPR_SCTP_NXTINFO);
+	$$->value.sctp_sendv_spa = calloc(1, sizeof(struct sctp_nxtinfo_expr));
+	$$->value.sctp_nxtinfo->nxt_sid = $2;
+	$$->value.sctp_nxtinfo->nxt_flags = $4;
+	$$->value.sctp_nxtinfo->nxt_ppid = $6;
+	$$->value.sctp_nxtinfo->nxt_length = $8;
+	$$->value.sctp_nxtinfo->nxt_assoc_id = $12;
+}
+| '{' nxt_sid ',' nxt_flags ',' nxt_ppid ',' nxt_length '}' {
 	$$ = new_expression(EXPR_SCTP_NXTINFO);
 	$$->value.sctp_sendv_spa = calloc(1, sizeof(struct sctp_nxtinfo_expr));
 	$$->value.sctp_nxtinfo->nxt_sid = $2;
 	$$->value.sctp_nxtinfo->nxt_flags = $4;
 	$$->value.sctp_nxtinfo->nxt_ppid = $6;
 	$$->value.sctp_nxtinfo->nxt_length = $8;
-	$$->value.sctp_nxtinfo->nxt_assoc_id = $10;
+	$$->value.sctp_nxtinfo->nxt_assoc_id = new_expression(EXPR_ELLIPSIS);
 }
 ;
 
@@ -3824,12 +4055,21 @@ sse_length
 ;
 
 sctp_shutdown_event
-: '{' sse_type ',' sse_flags ',' sse_length '}' {
+: '{' sse_type ',' sse_flags ',' sse_length ',' SSE_ASSOC_ID '=' sctp_assoc_id '}' {
 	$$ = new_expression(EXPR_SCTP_SHUTDOWN_EVENT);
 	$$->value.sctp_shutdown_event = calloc(1, sizeof(struct sctp_shutdown_event_expr));
 	$$->value.sctp_shutdown_event->sse_type = $2;
 	$$->value.sctp_shutdown_event->sse_flags = $4;
 	$$->value.sctp_shutdown_event->sse_length = $6;
+	$$->value.sctp_shutdown_event->sse_assoc_id = $10;
+}
+| '{' sse_type ',' sse_flags ',' sse_length '}' {
+	$$ = new_expression(EXPR_SCTP_SHUTDOWN_EVENT);
+	$$->value.sctp_shutdown_event = calloc(1, sizeof(struct sctp_shutdown_event_expr));
+	$$->value.sctp_shutdown_event->sse_type = $2;
+	$$->value.sctp_shutdown_event->sse_flags = $4;
+	$$->value.sctp_shutdown_event->sse_length = $6;
+	$$->value.sctp_shutdown_event->sse_assoc_id = new_expression(EXPR_ELLIPSIS);
 };
 
 pdapi_type
@@ -3899,18 +4139,8 @@ pdapi_seq
 | PDAPI_SEQ '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-pdapi_assoc_id
-: PDAPI_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("pdapi_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| PDAPI_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 sctp_pdapi_event
-: '{' pdapi_type',' pdapi_flags ',' pdapi_length ',' pdapi_indication ',' pdapi_stream ',' pdapi_seq ',' pdapi_assoc_id '}' {
+: '{' pdapi_type',' pdapi_flags ',' pdapi_length ',' pdapi_indication ',' pdapi_stream ',' pdapi_seq ',' PDAPI_ASSOC_ID '=' sctp_assoc_id '}' {
 	$$ = new_expression(EXPR_SCTP_PDAPI_EVENT);
 	$$->value.sctp_pdapi_event = calloc(1, sizeof(struct sctp_pdapi_event_expr));
 	$$->value.sctp_pdapi_event->pdapi_type = $2;
@@ -3919,7 +4149,18 @@ sctp_pdapi_event
 	$$->value.sctp_pdapi_event->pdapi_indication = $8;
 	$$->value.sctp_pdapi_event->pdapi_stream = $10;
 	$$->value.sctp_pdapi_event->pdapi_seq = $12;
-	$$->value.sctp_pdapi_event->pdapi_assoc_id = $14;
+	$$->value.sctp_pdapi_event->pdapi_assoc_id = $16;
+}
+| '{' pdapi_type',' pdapi_flags ',' pdapi_length ',' pdapi_indication ',' pdapi_stream ',' pdapi_seq '}' {
+	$$ = new_expression(EXPR_SCTP_PDAPI_EVENT);
+	$$->value.sctp_pdapi_event = calloc(1, sizeof(struct sctp_pdapi_event_expr));
+	$$->value.sctp_pdapi_event->pdapi_type = $2;
+	$$->value.sctp_pdapi_event->pdapi_flags = $4;
+	$$->value.sctp_pdapi_event->pdapi_length = $6;
+	$$->value.sctp_pdapi_event->pdapi_indication = $8;
+	$$->value.sctp_pdapi_event->pdapi_stream = $10;
+	$$->value.sctp_pdapi_event->pdapi_seq = $12;
+	$$->value.sctp_pdapi_event->pdapi_assoc_id = new_expression(EXPR_ELLIPSIS);
 }
 ;
 
@@ -3981,18 +4222,18 @@ auth_indication
 | AUTH_INDICATION '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-auth_assoc_id
-: AUTH_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("auth_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| AUTH_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 sctp_authkey_event
-: '{' auth_type ',' auth_flags ',' auth_length ',' auth_keynumber ',' auth_indication ',' auth_assoc_id '}' {
+: '{' auth_type ',' auth_flags ',' auth_length ',' auth_keynumber ',' auth_indication ',' AUTH_ASSOC_ID '=' sctp_assoc_id '}' {
+	$$ = new_expression(EXPR_SCTP_AUTHKEY_EVENT);
+	$$->value.sctp_authkey_event = calloc(1, sizeof(struct sctp_authkey_event_expr));
+	$$->value.sctp_authkey_event->auth_type = $2;
+	$$->value.sctp_authkey_event->auth_flags = $4;
+	$$->value.sctp_authkey_event->auth_length = $6;
+	$$->value.sctp_authkey_event->auth_keynumber = $8;
+	$$->value.sctp_authkey_event->auth_indication = $10;
+	$$->value.sctp_authkey_event->auth_assoc_id = $14;
+}
+| '{' auth_type ',' auth_flags ',' auth_length ',' auth_keynumber ',' auth_indication '}' {
 	$$ = new_expression(EXPR_SCTP_AUTHKEY_EVENT);
 	$$->value.sctp_authkey_event = calloc(1, sizeof(struct sctp_authkey_event_expr));
 	$$->value.sctp_authkey_event->auth_type = $2;
@@ -4000,7 +4241,7 @@ sctp_authkey_event
 	$$->value.sctp_authkey_event->auth_length = $6;
 	$$->value.sctp_authkey_event->auth_keynumber = $8;
 	$$->value.sctp_authkey_event->auth_indication = $10;
-	$$->value.sctp_authkey_event->auth_assoc_id = $12;
+	$$->value.sctp_authkey_event->auth_assoc_id = new_expression(EXPR_ELLIPSIS);
 }
 ;
 
@@ -4038,26 +4279,25 @@ sender_dry_length
 | SENDER_DRY_LENGTH '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-sender_dry_assoc_id
-: SENDER_DRY_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("sender_dry_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SENDER_DRY_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 sctp_sender_dry_event
-: '{'sender_dry_type ',' sender_dry_flags ',' sender_dry_length ',' sender_dry_assoc_id '}' {
+: '{'sender_dry_type ',' sender_dry_flags ',' sender_dry_length ',' SENDER_DRY_ASSOC_ID '=' sctp_assoc_id '}' {
+	$$ = new_expression(EXPR_SCTP_SENDER_DRY_EVENT);
+	$$->value.sctp_sender_dry_event = calloc(1, sizeof(struct sctp_sender_dry_event_expr));
+	$$->value.sctp_sender_dry_event->sender_dry_type = $2;
+	$$->value.sctp_sender_dry_event->sender_dry_flags = $4;
+	$$->value.sctp_sender_dry_event->sender_dry_length = $6;
+	$$->value.sctp_sender_dry_event->sender_dry_assoc_id = $10;
+}
+| '{'sender_dry_type ',' sender_dry_flags ',' sender_dry_length '}' {
 	$$ = new_expression(EXPR_SCTP_SENDER_DRY_EVENT);
 	$$->value.sctp_sender_dry_event = calloc(1, sizeof(struct sctp_sender_dry_event_expr));
 	$$->value.sctp_sender_dry_event->sender_dry_type = $2;
 	$$->value.sctp_sender_dry_event->sender_dry_flags = $4;
 	$$->value.sctp_sender_dry_event->sender_dry_length = $6;
-	$$->value.sctp_sender_dry_event->sender_dry_assoc_id = $8;
+	$$->value.sctp_sender_dry_event->sender_dry_assoc_id = new_expression(EXPR_ELLIPSIS);
 }
 ;
+
 ssfe_type
 : SSFE_TYPE '=' INTEGER {
 	if (!is_valid_u16($3)) {
@@ -4106,23 +4346,24 @@ ssfe_error
 | SSFE_ERROR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-ssfe_assoc_id
-: SSFE_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("ssfe_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SSFE_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 ssfe_data
 : SSFE_DATA '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 | SSFE_DATA '=' array    { $$ = $3; }
 ;
 
 sctp_send_failed_event
-: '{' ssfe_type ',' ssfe_flags ',' ssfe_length ',' ssfe_error ',' SSFE_INFO '=' sctp_sndinfo ',' ssfe_assoc_id ',' ssfe_data '}' {
+: '{' ssfe_type ',' ssfe_flags ',' ssfe_length ',' ssfe_error ',' SSFE_INFO '=' sctp_sndinfo ',' SSFE_ASSOC_ID '=' sctp_assoc_id ',' ssfe_data '}' {
+	$$ = new_expression(EXPR_SCTP_SEND_FAILED_EVENT);
+	$$->value.sctp_send_failed_event = calloc(1, sizeof(struct sctp_send_failed_event_expr));
+	$$->value.sctp_send_failed_event->ssfe_type = $2;
+	$$->value.sctp_send_failed_event->ssfe_flags = $4;
+	$$->value.sctp_send_failed_event->ssfe_length = $6;
+	$$->value.sctp_send_failed_event->ssfe_error = $8;
+	$$->value.sctp_send_failed_event->ssfe_info = $12;
+	$$->value.sctp_send_failed_event->ssfe_assoc_id = $16;
+	$$->value.sctp_send_failed_event->ssfe_data = $18;
+}
+| '{' ssfe_type ',' ssfe_flags ',' ssfe_length ',' ssfe_error ',' SSFE_INFO '=' sctp_sndinfo ',' ssfe_data '}' {
 	$$ = new_expression(EXPR_SCTP_SEND_FAILED_EVENT);
 	$$->value.sctp_send_failed_event = calloc(1, sizeof(struct sctp_send_failed_event_expr));
 	$$->value.sctp_send_failed_event->ssfe_type = $2;
@@ -4130,8 +4371,8 @@ sctp_send_failed_event
 	$$->value.sctp_send_failed_event->ssfe_length = $6;
 	$$->value.sctp_send_failed_event->ssfe_error = $8;
 	$$->value.sctp_send_failed_event->ssfe_info = $12;
-	$$->value.sctp_send_failed_event->ssfe_assoc_id = $14;
-	$$->value.sctp_send_failed_event->ssfe_data = $16;
+	$$->value.sctp_send_failed_event->ssfe_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_send_failed_event->ssfe_data = $14;
 };
 
 sac_type
@@ -4212,16 +4453,6 @@ sac_inbound_streams
 | SAC_INBOUND_STREAMS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-sac_assoc_id
-: SAC_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("sac_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SAC_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 sac_info
 : SAC_INFO '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 | SAC_INFO '=' array { $$ = $3; }
@@ -4229,7 +4460,21 @@ sac_info
 
 sctp_assoc_change
 : '{' sac_type ',' sac_flags ',' sac_length ',' sac_state ',' sac_error ',' sac_outbound_streams ','
-sac_inbound_streams ',' sac_assoc_id ',' sac_info '}' {
+sac_inbound_streams ',' SAC_ASSOC_ID '=' sctp_assoc_id ',' sac_info '}' {
+	$$ = new_expression(EXPR_SCTP_ASSOC_CHANGE);
+	$$->value.sctp_assoc_change = calloc(1, sizeof(struct sctp_assoc_change_expr));
+	$$->value.sctp_assoc_change->sac_type = $2;
+	$$->value.sctp_assoc_change->sac_flags = $4;
+	$$->value.sctp_assoc_change->sac_length = $6;
+	$$->value.sctp_assoc_change->sac_state = $8;
+	$$->value.sctp_assoc_change->sac_error = $10;
+	$$->value.sctp_assoc_change->sac_outbound_streams = $12;
+	$$->value.sctp_assoc_change->sac_inbound_streams = $14;
+	$$->value.sctp_assoc_change->sac_assoc_id = $18;
+	$$->value.sctp_assoc_change->sac_info = $20;
+}
+| '{' sac_type ',' sac_flags ',' sac_length ',' sac_state ',' sac_error ',' sac_outbound_streams ','
+sac_inbound_streams ',' sac_info '}' {
 	$$ = new_expression(EXPR_SCTP_ASSOC_CHANGE);
 	$$->value.sctp_assoc_change = calloc(1, sizeof(struct sctp_assoc_change_expr));
 	$$->value.sctp_assoc_change->sac_type = $2;
@@ -4239,8 +4484,8 @@ sac_inbound_streams ',' sac_assoc_id ',' sac_info '}' {
 	$$->value.sctp_assoc_change->sac_error = $10;
 	$$->value.sctp_assoc_change->sac_outbound_streams = $12;
 	$$->value.sctp_assoc_change->sac_inbound_streams = $14;
-	$$->value.sctp_assoc_change->sac_assoc_id = $16;
-	$$->value.sctp_assoc_change->sac_info = $18;
+	$$->value.sctp_assoc_change->sac_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_assoc_change->sac_info = $16;
 }
 ;
 
@@ -4288,31 +4533,31 @@ sre_error
 | SRE_ERROR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-sre_assoc_id
-: SRE_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("sre_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SRE_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 sre_data
 : SRE_DATA '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 | SRE_DATA '=' array { $$ = $3; }
 ;
 
 sctp_remote_error
-: '{' sre_type ',' sre_flags ',' sre_length ',' sre_error ',' sre_assoc_id ',' sre_data '}' {
+: '{' sre_type ',' sre_flags ',' sre_length ',' sre_error ',' SRE_ASSOC_ID '=' sctp_assoc_id ',' sre_data '}' {
+	$$ = new_expression(EXPR_SCTP_REMOTE_ERROR);
+	$$->value.sctp_remote_error = calloc(1, sizeof(struct sctp_remote_error_expr));
+	$$->value.sctp_remote_error->sre_type = $2;
+	$$->value.sctp_remote_error->sre_flags = $4;
+	$$->value.sctp_remote_error->sre_length = $6;
+	$$->value.sctp_remote_error->sre_error = $8;
+	$$->value.sctp_remote_error->sre_assoc_id = $12;
+	$$->value.sctp_remote_error->sre_data = $14;
+}
+| '{' sre_type ',' sre_flags ',' sre_length ',' sre_error ',' sre_data '}' {
 	$$ = new_expression(EXPR_SCTP_REMOTE_ERROR);
 	$$->value.sctp_remote_error = calloc(1, sizeof(struct sctp_remote_error_expr));
 	$$->value.sctp_remote_error->sre_type = $2;
 	$$->value.sctp_remote_error->sre_flags = $4;
 	$$->value.sctp_remote_error->sre_length = $6;
 	$$->value.sctp_remote_error->sre_error = $8;
-	$$->value.sctp_remote_error->sre_assoc_id = $10;
-	$$->value.sctp_remote_error->sre_data = $12;
+	$$->value.sctp_remote_error->sre_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_remote_error->sre_data = $10;
 }
 ;
 
@@ -4383,18 +4628,19 @@ spc_error
 | SPC_ERROR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-spc_assoc_id
-: SPC_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("spc_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SPC_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 sctp_paddr_change
-: '{' spc_type ',' spc_flags ',' spc_length ',' spc_aaddr ',' spc_state ',' spc_error ',' spc_assoc_id '}' {
+: '{' spc_type ',' spc_flags ',' spc_length ',' spc_aaddr ',' spc_state ',' spc_error ',' SPC_ASSOC_ID '=' sctp_assoc_id '}' {
+	$$ = new_expression(EXPR_SCTP_PADDR_CHANGE);
+	$$->value.sctp_paddr_change = calloc(1, sizeof(struct sctp_paddr_change_expr));
+	$$->value.sctp_paddr_change->spc_type = $2;
+	$$->value.sctp_paddr_change->spc_flags = $4;
+	$$->value.sctp_paddr_change->spc_length = $6;
+	$$->value.sctp_paddr_change->spc_aaddr = $8;
+	$$->value.sctp_paddr_change->spc_state = $10;
+	$$->value.sctp_paddr_change->spc_error = $12;
+	$$->value.sctp_paddr_change->spc_assoc_id = $16;
+}
+| '{' spc_type ',' spc_flags ',' spc_length ',' spc_aaddr ',' spc_state ',' spc_error '}' {
 	$$ = new_expression(EXPR_SCTP_PADDR_CHANGE);
 	$$->value.sctp_paddr_change = calloc(1, sizeof(struct sctp_paddr_change_expr));
 	$$->value.sctp_paddr_change->spc_type = $2;
@@ -4403,7 +4649,7 @@ sctp_paddr_change
 	$$->value.sctp_paddr_change->spc_aaddr = $8;
 	$$->value.sctp_paddr_change->spc_state = $10;
 	$$->value.sctp_paddr_change->spc_error = $12;
-	$$->value.sctp_paddr_change->spc_assoc_id = $14;
+	$$->value.sctp_paddr_change->spc_assoc_id = new_expression(EXPR_ELLIPSIS);
 }
 ;
 ssf_type
@@ -4463,23 +4709,13 @@ ssf_info
 | SSF_INFO '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-ssf_assoc_id
-: SSF_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("ssf_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SSF_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 ssf_data
 : SSF_DATA '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 | SSF_DATA '=' array { $$ = $3; }
 ;
 
 sctp_send_failed
-: '{' ssf_type ',' ssf_flags ',' ssf_length ',' ssf_error ',' ssf_info ',' ssf_assoc_id ',' ssf_data '}' {
+: '{' ssf_type ',' ssf_flags ',' ssf_length ',' ssf_error ',' ssf_info ',' SSF_ASSOC_ID '=' sctp_assoc_id ',' ssf_data '}' {
 	$$ = new_expression(EXPR_SCTP_SEND_FAILED);
 	$$->value.sctp_send_failed = calloc(1, sizeof(struct sctp_send_failed_expr));
 	$$->value.sctp_send_failed->ssf_type = $2;
@@ -4487,8 +4723,19 @@ sctp_send_failed
 	$$->value.sctp_send_failed->ssf_length = $6;
 	$$->value.sctp_send_failed->ssf_error = $8;
 	$$->value.sctp_send_failed->ssf_info = $10;
-	$$->value.sctp_send_failed->ssf_assoc_id = $12;
-	$$->value.sctp_send_failed->ssf_data = $14;
+	$$->value.sctp_send_failed->ssf_assoc_id = $14;
+	$$->value.sctp_send_failed->ssf_data = $16;
+}
+| '{' ssf_type ',' ssf_flags ',' ssf_length ',' ssf_error ',' ssf_info ',' ssf_data '}' {
+	$$ = new_expression(EXPR_SCTP_SEND_FAILED);
+	$$->value.sctp_send_failed = calloc(1, sizeof(struct sctp_send_failed_expr));
+	$$->value.sctp_send_failed->ssf_type = $2;
+	$$->value.sctp_send_failed->ssf_flags = $4;
+	$$->value.sctp_send_failed->ssf_length = $6;
+	$$->value.sctp_send_failed->ssf_error = $8;
+	$$->value.sctp_send_failed->ssf_info = $10;
+	$$->value.sctp_send_failed->ssf_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_send_failed->ssf_data = $12;
 }
 ;
 
@@ -4536,25 +4783,24 @@ sai_adaptation_ind
 | SAI_ADAPTATION_IND '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
-sai_assoc_id
-: SAI_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("sai_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SAI_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 sctp_adaptation_event
-: '{' sai_type ',' sai_flags ',' sai_length ',' sai_adaptation_ind ',' sai_assoc_id '}' {
+: '{' sai_type ',' sai_flags ',' sai_length ',' sai_adaptation_ind ',' SAI_ASSOC_ID '=' sctp_assoc_id '}' {
+	$$ = new_expression(EXPR_SCTP_ADAPTATION_EVENT);
+	$$->value.sctp_adaptation_event = calloc(1, sizeof(struct sctp_adaptation_event_expr));
+	$$->value.sctp_adaptation_event->sai_type = $2;
+	$$->value.sctp_adaptation_event->sai_flags = $4;
+	$$->value.sctp_adaptation_event->sai_length = $6;
+	$$->value.sctp_adaptation_event->sai_adaptation_ind = $8;
+	$$->value.sctp_adaptation_event->sai_assoc_id = $12;
+}
+| '{' sai_type ',' sai_flags ',' sai_length ',' sai_adaptation_ind '}' {
 	$$ = new_expression(EXPR_SCTP_ADAPTATION_EVENT);
 	$$->value.sctp_adaptation_event = calloc(1, sizeof(struct sctp_adaptation_event_expr));
 	$$->value.sctp_adaptation_event->sai_type = $2;
 	$$->value.sctp_adaptation_event->sai_flags = $4;
 	$$->value.sctp_adaptation_event->sai_length = $6;
 	$$->value.sctp_adaptation_event->sai_adaptation_ind = $8;
-	$$->value.sctp_adaptation_event->sai_assoc_id = $10;
+	$$->value.sctp_adaptation_event->sai_assoc_id = new_expression(EXPR_ELLIPSIS);
 }
 ;
 
@@ -4602,6 +4848,104 @@ sctp_tlv
 }
 ;
 
+gaids_number_of_ids
+: GAIDS_NUMBER_OF_IDS '=' INTEGER {
+	if (!is_valid_u32($3)) {
+		semantic_error("gaids_number_of_ids out of range");
+	}
+	$$ = new_integer_expression($3, "%u");
+}
+| GAIDS_NUMBER_OF_IDS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sctp_assoc_ids
+: '{' gaids_number_of_ids ',' GAIDS_ASSOC_ID '=' array '}' {
+	$$ = new_expression(EXPR_SCTP_ASSOC_IDS);
+	$$->value.sctp_assoc_ids = calloc(1, sizeof(struct sctp_assoc_ids_expr));
+	$$->value.sctp_assoc_ids->gaids_number_of_ids = $2;
+	$$->value.sctp_assoc_ids->gaids_assoc_id = $6;
+};
+
+gauth_number_of_chunks
+: GAUTH_NUMBER_OF_CHUNKS '=' INTEGER {
+	if (!is_valid_u32($3)) {
+		semantic_error("gauth_number_of_chunks out of range");
+	}
+	$$ = new_integer_expression($3, "%u");
+}
+| GAUTH_NUMBER_OF_CHUNKS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sctp_authchunks
+: '{' GAUTH_ASSOC_ID '=' sctp_assoc_id ',' gauth_number_of_chunks ',' GAUTH_CHUNKS '=' array '}' {
+	$$ = new_expression(EXPR_SCTP_AUTHCHUNKS);
+	$$->value.sctp_authchunks = calloc(1, sizeof(struct sctp_authchunks_expr));
+	$$->value.sctp_authchunks->gauth_assoc_id = $4;
+	$$->value.sctp_authchunks->gauth_number_of_chunks = $6;
+	$$->value.sctp_authchunks->gauth_chunks = $10;
+}
+| '{' gauth_number_of_chunks ',' GAUTH_CHUNKS '=' array '}' {
+	$$ = new_expression(EXPR_SCTP_AUTHCHUNKS);
+	$$->value.sctp_authchunks = calloc(1, sizeof(struct sctp_authchunks_expr));
+	$$->value.sctp_authchunks->gauth_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_authchunks->gauth_number_of_chunks = $2;
+	$$->value.sctp_authchunks->gauth_chunks = $6;
+};
+
+sctp_setpeerprim
+: '{' SSPP_ASSOC_ID '=' sctp_assoc_id ',' SSPP_ADDR '=' sockaddr '}' {
+	$$ = new_expression(EXPR_SCTP_SETPEERPRIM);
+	$$->value.sctp_setpeerprim = calloc(1, sizeof(struct sctp_setpeerprim_expr));
+	$$->value.sctp_setpeerprim->sspp_assoc_id = $4;
+	$$->value.sctp_setpeerprim->sspp_addr = $8;
+}
+| '{' SSPP_ADDR '=' sockaddr '}' {
+	$$ = new_expression(EXPR_SCTP_SETPEERPRIM);
+	$$->value.sctp_setpeerprim = calloc(1, sizeof(struct sctp_setpeerprim_expr));
+	$$->value.sctp_setpeerprim->sspp_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_setpeerprim->sspp_addr = $4;
+};
+
+sctp_authchunk
+: '{' SAUTH_CHUNK '=' INTEGER '}' {
+	$$ = new_expression(EXPR_SCTP_AUTHCHUNK);
+	$$->value.sctp_authchunk = calloc(1, sizeof(struct sctp_authchunk_expr));
+	if (!is_valid_u8($4)) {
+		semantic_error("sauth_chunk out of range");
+	}
+	$$->value.sctp_authchunk->sauth_chunk = new_integer_expression($4, "%hhu");
+};
+
+sctp_authkey
+: '{' SCA_ASSOC_ID '=' sctp_assoc_id ',' SCA_KEYNUMBER '=' INTEGER ',' SCA_KEYLENGTH '=' INTEGER ',' SCA_KEY '=' array '}' {
+	$$ = new_expression(EXPR_SCTP_AUTHKEY);
+	$$->value.sctp_authkey = calloc(1, sizeof(struct sctp_authkey_expr));
+	$$->value.sctp_authkey->sca_assoc_id = $4;
+	if (!is_valid_u16($8)) {
+		semantic_error("sca_keynumber out of range");
+	}
+	$$->value.sctp_authkey->sca_keynumber = new_integer_expression($8, "%hu");
+	if (!is_valid_u16($12)) {
+		semantic_error("sca_keylength out of range");
+	}
+	$$->value.sctp_authkey->sca_keylength = new_integer_expression($12, "%hu");
+	$$->value.sctp_authkey->sca_key = $16;
+}
+| '{' SCA_KEYNUMBER '=' INTEGER ',' SCA_KEYLENGTH '=' INTEGER ',' SCA_KEY '=' array '}' {
+	$$ = new_expression(EXPR_SCTP_AUTHKEY);
+	$$->value.sctp_authkey = calloc(1, sizeof(struct sctp_authkey_expr));
+	$$->value.sctp_authkey->sca_assoc_id = new_expression(EXPR_ELLIPSIS);
+	if (!is_valid_u16($4)) {
+		semantic_error("sca_keynumber out of range");
+	}
+	$$->value.sctp_authkey->sca_keynumber = new_integer_expression($4, "%hu");
+	if (!is_valid_u16($8)) {
+		semantic_error("sca_keylength out of range");
+	}
+	$$->value.sctp_authkey->sca_keylength = new_integer_expression($8, "%hu");
+	$$->value.sctp_authkey->sca_key = $12;
+};
+
 opt_errno
 :                   { $$ = NULL; }
 | WORD note         {
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 7403cc711344cc476b5e5a9e3639f708ba87488e..3aca62574383932bb1f9e0e08f1dea0304dbc479 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -269,6 +269,31 @@ static int get_size_t(struct expression *expression,
 }
 #endif
 
+#if defined(linux) || defined(__FreeBSD__)
+/* Sets the value from the expression argument, checking that it is a
+ * valid sctp_assoc_t, and matches the expected type. Returns STATUS_OK on
+ * success; on failure returns STATUS_ERR and sets error message.
+ */
+static int get_sctp_assoc_t(struct expression *expression,
+			    sctp_assoc_t *value, char **error)
+{
+	if (expression->type == EXPR_ELLIPSIS) {
+		value = 0;
+	} else {
+		if (check_type(expression, EXPR_INTEGER, error))
+			return STATUS_ERR;
+		if (expression->value.num < 0) {
+			asprintf(error,
+				 "Value out of range for sctp_assoc_t: %lld",
+				 expression->value.num);
+			return STATUS_ERR;
+		}
+		*value = expression->value.num;
+	}
+	return STATUS_OK;
+}
+#endif
+
 /* Sets the value from the expression argument, checking that it is a
  * valid u32, and matches the expected type. Returns STATUS_OK on
  * success; on failure returns STATUS_ERR and sets error message.
@@ -470,7 +495,7 @@ static int ellipsis_arg(struct expression_list *args, int index, char **error)
 	return STATUS_OK;
 }
 
-#if defined(SCTP_GET_PEER_ADDR_INFO) || defined(SCTP_PEER_ADDR_PARAMS)
+#if defined(SCTP_GET_PEER_ADDR_INFO) || defined(SCTP_PEER_ADDR_PARAMS) || defined(SCTP_SET_PEER_PRIMARY_ADDR)
 /* Return STATUS_OK if the argument in from type sockaddr_in or
  * sockaddr_in6
  */
@@ -639,6 +664,23 @@ int check_u32_expr(struct expression *expr, u32 value, char *val_name, char **er
 	return STATUS_OK;
 }
 
+#if defined(__FreeBSD__) || defined(linux)
+int check_sctp_assoc_t_expr(struct expression *expr, sctp_assoc_t value, char *val_name, char **error) {
+	if (expr->type != EXPR_ELLIPSIS) {
+		sctp_assoc_t script_val;
+
+		if (get_sctp_assoc_t(expr, &script_val, error)) {
+			return STATUS_ERR;
+		}
+		if (script_val != value) {
+			asprintf(error, "%s: expected: %u actual: %u", val_name, script_val, value);
+			return STATUS_ERR;
+		}
+	}
+	return STATUS_OK;
+}
+#endif
+
 int check_socklen_t_expr(struct expression *expr, socklen_t value, char *val_name, char **error) {
 	if (expr->type != EXPR_ELLIPSIS) {
 		socklen_t script_val;
@@ -713,6 +755,48 @@ static int check_u8array_expr(struct expression *expr_list, u8 *data, size_t dat
 }
 #endif
 
+#if defined(__FreeBSD__) || defined(linux)
+static int check_u16array_expr(struct expression *expr_list, u16 *data, int data_len, char *val_name, char **error) {
+	if ( expr_list->type != EXPR_ELLIPSIS) {
+		struct expression *expr = NULL;
+		unsigned int i;
+
+		switch(expr_list->type) {
+		case EXPR_LIST:
+			if (data_len != expression_list_length(expr_list->value.list)) {
+				asprintf(error, "%s length: expected: %u actual %d",
+					 val_name, expression_list_length(expr_list->value.list), data_len);
+				return STATUS_ERR;
+			}
+			for (i = 0; i < data_len; i++) {
+				expr = get_arg(expr_list->value.list, i, error);
+				if (expr->type != EXPR_ELLIPSIS) {
+					u16 script_val;
+
+					if (get_u16(expr, &script_val, error)) {
+						return STATUS_ERR;
+					}
+					if (script_val != data[i]) {
+						asprintf(error, "%s[%d]: expected: %hu actual: %hu",
+							val_name, i, script_val, data[i]);
+						return STATUS_ERR;
+					}
+				}
+			}
+			break;
+		case EXPR_NULL:
+			if (data != NULL)
+				return STATUS_ERR;
+			break;
+		default: asprintf(error, "Bad expressiontype for %s", val_name);
+			return STATUS_ERR;
+			break;
+		}
+	}
+	return STATUS_OK;
+}
+#endif
+
 /* Free all the space used by the given iovec. */
 static void iovec_free(struct iovec *iov, size_t iov_len)
 {
@@ -2488,6 +2572,9 @@ static int check_linger(struct linger_expr *expr,
 static int check_sctp_rtoinfo(struct sctp_rtoinfo_expr *expr,
 			      struct sctp_rtoinfo *sctp_rtoinfo, char **error)
 {
+	if (check_sctp_assoc_t_expr(expr->srto_assoc_id, sctp_rtoinfo->srto_assoc_id,
+				    "sctp_rtoinfo.srto_assoc_id", error))
+		return STATUS_ERR;
 	if (check_u32_expr(expr->srto_initial, sctp_rtoinfo->srto_initial,
 			   "sctp_rtoinfo.srto_initial", error))
 		return STATUS_ERR;
@@ -2523,11 +2610,30 @@ static int check_sctp_initmsg(struct sctp_initmsg_expr *expr,
 }
 #endif
 
+#if defined(SCTP_AUTH_ACTIVE_KEY) || defined(SCTP_AUTH_DEACTIVATE_KEY) || defined(SCTP_AUTH_DELETE_KEY)
+static int check_sctp_authkeyid(struct sctp_authkeyid_expr *expr,
+				struct sctp_authkeyid *sctp_authkeyid,
+				char **error)
+{
+	if (check_sctp_assoc_t_expr(expr->scact_assoc_id, sctp_authkeyid->scact_assoc_id,
+			 	    "sctp_authkeyid.scact_assoc_id", error))
+		return STATUS_ERR;
+	if (check_u16_expr(expr->scact_keynumber, sctp_authkeyid->scact_keynumber,
+			   "sctp_authkeyid.scact_keynumber", error))
+		return STATUS_ERR;
+
+	return STATUS_OK;
+}
+#endif
+
 #ifdef SCTP_DELAYED_SACK
 static int check_sctp_sack_info(struct sctp_sack_info_expr *expr,
 				struct sctp_sack_info *sctp_sack_info,
 				char **error)
 {
+	if (check_sctp_assoc_t_expr(expr->sack_assoc_id, sctp_sack_info->sack_assoc_id,
+			 	    "sctp_sack_info.sack_assoc_id", error))
+		return STATUS_ERR;
 	if (check_u32_expr(expr->sack_delay, sctp_sack_info->sack_delay,
 			   "sctp_sack_info.sack_delay", error))
 		return STATUS_ERR;
@@ -2544,6 +2650,9 @@ static int check_sctp_paddrinfo(struct sctp_paddrinfo_expr *expr,
 				struct sctp_paddrinfo *sctp_paddrinfo,
 				char **error)
 {
+	if (check_sctp_assoc_t_expr(expr->spinfo_assoc_id, sctp_paddrinfo->spinfo_assoc_id,
+				    "sctp_paddrinfo.spinfo_assoc_id", error))
+		return STATUS_ERR;
 	if (check_s32_expr(expr->spinfo_state, sctp_paddrinfo->spinfo_state,
 			   "sctp_paddrinfo.spinfo_state", error))
 		return STATUS_ERR;
@@ -2569,6 +2678,9 @@ static int check_sctp_status(struct sctp_status_expr *expr,
 			     struct sctp_status *sctp_status,
 			     char **error)
 {
+	if (check_sctp_assoc_t_expr(expr->sstat_assoc_id, sctp_status->sstat_assoc_id,
+				   "sctp_status.sstat_assoc_id", error))
+		return STATUS_ERR;
 	if (check_s32_expr(expr->sstat_state, sctp_status->sstat_state,
 			   "sctp_status.sstat_state", error))
 		return STATUS_ERR;
@@ -2647,6 +2759,9 @@ static int check_sctp_assoc_value(struct sctp_assoc_value_expr *expr,
 				  struct sctp_assoc_value *sctp_assoc_value,
 				  char **error)
 {
+	if (check_sctp_assoc_t_expr(expr->assoc_id, sctp_assoc_value->assoc_id,
+				    "sctp_assoc_value.assoc_id", error))
+		return STATUS_ERR;
 	if (check_u16_expr(expr->assoc_value, sctp_assoc_value->assoc_value,
 			   "sctp_assoc_value.stream_id", error))
 		return STATUS_ERR;
@@ -2676,6 +2791,9 @@ static int check_sctp_assocparams(struct sctp_assocparams_expr *expr,
 			     struct sctp_assocparams *sctp_assocparams,
 			     char **error)
 {
+	if (check_sctp_assoc_t_expr(expr->sasoc_assoc_id, sctp_assocparams->sasoc_assoc_id,
+				    "sctp_assocparams.sasoc_assoc_id", error))
+		return STATUS_ERR;
 	if (check_u16_expr(expr->sasoc_asocmaxrxt, sctp_assocparams->sasoc_asocmaxrxt,
 			   "sctp_assocparams.sasoc_asocmaxrxt", error))
 		return STATUS_ERR;
@@ -2701,6 +2819,9 @@ static int check_sctp_event(struct sctp_event_expr *expr,
 			    struct sctp_event *sctp_event,
 			    char **error)
 {
+	if (check_sctp_assoc_t_expr(expr->se_assoc_id, sctp_event->se_assoc_id,
+				    "sctp_event.se_assoc_id", error))
+		return STATUS_ERR;
 	if (check_u16_expr(expr->se_type, sctp_event->se_type,
 			   "sctp_event.se_type", error))
 		return STATUS_ERR;
@@ -2778,8 +2899,53 @@ static int check_sctp_sndinfo(struct sctp_sndinfo_expr *expr,
 	if (check_u32_expr(expr->snd_context, sctp_sndinfo->snd_context,
 			   "sctp_sndinfo.snd_context", error))
 		return STATUS_ERR;
-	if (check_u32_expr(expr->snd_assoc_id, sctp_sndinfo->snd_assoc_id,
-			   "sctp_sndinfo.snd_assoc_id", error))
+	if (check_sctp_assoc_t_expr(expr->snd_assoc_id, sctp_sndinfo->snd_assoc_id,
+				    "sctp_sndinfo.snd_assoc_id", error))
+		return STATUS_ERR;
+
+	return STATUS_OK;
+}
+#endif
+#ifdef SCTP_DEFAULT_PRINFO
+static int check_sctp_default_prinfo(struct expression *expression,
+				     struct sctp_default_prinfo *info,
+				     char **error)
+{
+	if (expression->type == EXPR_SCTP_DEFAULT_PRINFO) {
+		struct sctp_default_prinfo_expr *expr = expression->value.sctp_default_prinfo;
+		if (check_sctp_assoc_t_expr(expr->pr_assoc_id, info->pr_assoc_id,
+					   "sctp_default_prinfo.pr_assoc_id", error))
+			return STATUS_ERR;
+		if (check_u16_expr(expr->pr_policy, info->pr_policy,
+				   "sctp_default_prinfo.pr_policy", error))
+			return STATUS_ERR;
+		if (check_u32_expr(expr->pr_value, info->pr_value,
+				   "sctp_default_prinfo.pr_value", error))
+			return STATUS_ERR;
+	} else if (expression->type == EXPR_SCTP_PRINFO) {
+		struct sctp_prinfo_expr *expr = expression->value.sctp_prinfo;
+		if (check_u16_expr(expr->pr_policy, info->pr_policy,
+				   "sctp_default_prinfo.pr_policy", error))
+			return STATUS_ERR;
+		if (check_u32_expr(expr->pr_value, info->pr_value,
+				   "sctp_default_prinfo.pr_value", error))
+			return STATUS_ERR;	
+	} else {
+		return STATUS_ERR;
+	}
+	return STATUS_OK;
+}
+#endif
+
+#ifdef SCTP_PRIMARY_ADDR
+static int check_sctp_setprim(struct sctp_setprim_expr *expr,
+			      struct sctp_setprim *sctp_setprim,
+			      char **error)
+{
+	if (check_sctp_assoc_t_expr(expr->ssp_assoc_id, sctp_setprim->ssp_assoc_id,
+			   "sctp_setprim.ssp_assoc_id", error))
+		return STATUS_ERR;
+	if (check_sockaddr(expr->ssp_addr, (struct sockaddr *)&sctp_setprim->ssp_addr, error))
 		return STATUS_ERR;
 
 	return STATUS_OK;
@@ -2799,6 +2965,85 @@ static int check_sctp_setadaptation(struct sctp_setadaptation_expr *expr,
 }
 #endif
 
+#ifdef SCTP_HMAC_IDENT
+static int check_sctp_hamcalgo(struct sctp_hmacalgo_expr *expr,
+			       struct sctp_hmacalgo *sctp_hmacalgo,
+			       char **error) {
+	if (check_u32_expr(expr->shmac_number_of_idents, sctp_hmacalgo->shmac_number_of_idents,
+			   "sctp_hmacalgo.shmac_number_of_idents", error))
+		return STATUS_ERR;
+	if (check_type(expr->shmac_idents, EXPR_LIST, error)) {
+		return STATUS_ERR;
+	}
+	if (check_u16array_expr(expr->shmac_idents, sctp_hmacalgo->shmac_idents,
+				sctp_hmacalgo->shmac_number_of_idents,
+				"sctp_hmacalgo.shmac_idents", error))
+		return STATUS_ERR;
+
+	return STATUS_OK;
+}
+#endif
+
+#ifdef SCTP_GET_ASSOC_ID_LIST
+static int check_sctp_assoc_ids(struct sctp_assoc_ids_expr *expr,
+			        struct sctp_assoc_ids *sctp_assoc_ids,
+			        char **error) {
+	int list_len = 0, i = 0;
+	struct expression *assoc_id;  
+	struct expression_list *ids;
+
+	if (check_u32_expr(expr->gaids_number_of_ids, sctp_assoc_ids->gaids_number_of_ids,
+			   "sctp_assoc_ids.gaids_number_of_ids", error)) {
+		return STATUS_ERR;
+	}
+	ids = expr->gaids_assoc_id->value.list;
+	list_len = expression_list_length(ids);
+	if (list_len != sctp_assoc_ids->gaids_number_of_ids) {
+		asprintf(error, "live gaids_number_if_ids unequal to length if expected gaids_assoc_id. actual %u, expected %d", 
+			sctp_assoc_ids->gaids_number_of_ids, list_len);
+		return STATUS_ERR;
+	}
+	if (list_len == 1) {
+		assoc_id = get_arg(ids, 0, error);
+		if (assoc_id->type == EXPR_ELLIPSIS) {
+			return STATUS_OK;
+		}
+	}
+	for (i = 0; i < list_len; i++) {
+		assoc_id = get_arg(ids, i, error);
+		sctp_assoc_t script_id;
+		if (get_sctp_assoc_t(assoc_id, &script_id, error)) {
+			return STATUS_ERR;
+		}
+		if (script_id != sctp_assoc_ids->gaids_assoc_id[i]) {
+			asprintf(error, "sctp_assoc_ids.gaids_assoc_id[%d]. expected %u, actual %u",
+				 i, script_id, sctp_assoc_ids->gaids_assoc_id[i]);
+			return STATUS_ERR;
+		}
+	}
+	return STATUS_OK;
+}
+#endif
+
+#if defined(SCTP_PEER_AUTH_CHUNKS) || defined(SCTP_LOCAL_AUTH_CHUNKS)
+static int check_sctp_authchunks(struct sctp_authchunks_expr *expr,
+			         struct sctp_authchunks *sctp_authchunks,
+			         char **error) {
+	if (check_sctp_assoc_t_expr(expr->gauth_assoc_id, sctp_authchunks->gauth_assoc_id,
+			   "sctp_authchunks.gauth_assoc_id", error))
+		return STATUS_ERR;
+	if (check_u32_expr(expr->gauth_number_of_chunks, sctp_authchunks->gauth_number_of_chunks,
+			   "sctp_authchunks.gauth_number_of_chunks", error))
+		return STATUS_ERR;
+	if (check_u8array_expr(expr->gauth_chunks, sctp_authchunks->gauth_chunks,
+				sctp_authchunks->gauth_number_of_chunks,
+				"sctp_authchunks.gauth_chunks", error))
+		return STATUS_ERR;
+
+	return STATUS_OK;
+}
+#endif
+
 static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 			      struct expression_list *args, char **error)
 {
@@ -2835,14 +3080,24 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 	case EXPR_SCTP_RTOINFO:
 		live_optval = malloc(sizeof(struct sctp_rtoinfo));
 		live_optlen = (socklen_t)sizeof(struct sctp_rtoinfo);
-		((struct sctp_rtoinfo*)live_optval)->srto_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_rtoinfo->srto_assoc_id,
+				     &((struct sctp_rtoinfo*)live_optval)->srto_assoc_id,
+				     error)) {
+			free(live_optval);
+			return STATUS_ERR;
+		}
 		break;
 #endif
 #ifdef SCTP_ASSOCINFO
 	case EXPR_SCTP_ASSOCPARAMS:
 		live_optval = malloc(sizeof(struct sctp_assocparams));
 		live_optlen = (socklen_t)sizeof(struct sctp_assocparams);
-		((struct sctp_assocparams*) live_optval)->sasoc_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_assocparams->sasoc_assoc_id,
+				    &((struct sctp_assocparams*) live_optval)->sasoc_assoc_id,
+				    error)) {
+			free(live_optval);
+			return STATUS_ERR;
+		}
 		break;
 #endif
 #ifdef SCTP_INITMSG
@@ -2851,27 +3106,53 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		live_optlen = (socklen_t)sizeof(struct sctp_initmsg);
 		break;
 #endif
+#if defined(SCTP_AUTH_ACTIVE_KEY) || defined(SCTP_AUTH_DEACTIVATE_KEY) || defined(SCTP_AUTH_DELETE_KEY)
+	case EXPR_SCTP_AUTHKEYID:
+		live_optval = malloc(sizeof(struct sctp_authkeyid));
+		live_optlen = (socklen_t)sizeof(struct sctp_authkeyid);
+		if (get_sctp_assoc_t(val_expression->value.sctp_authkeyid->scact_assoc_id,
+				    &((struct sctp_authkeyid*) live_optval)->scact_assoc_id,
+				    error)) {
+			free(live_optval);
+			return STATUS_ERR;
+		}
+		break;
+#endif
 #ifdef SCTP_DELAYED_SACK
 	case EXPR_SCTP_SACKINFO:
 		live_optval = malloc(sizeof(struct sctp_sack_info));
 		live_optlen = (socklen_t)sizeof(struct sctp_sack_info);
-		((struct sctp_sack_info*) live_optval)->sack_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_sack_info->sack_assoc_id,
+				    &((struct sctp_sack_info*) live_optval)->sack_assoc_id,
+				    error)) {
+			free(live_optval);
+			return STATUS_ERR;
+		}
 		break;
 #endif
 #ifdef SCTP_STATUS
 	case EXPR_SCTP_STATUS:
 		live_optval = malloc(sizeof(struct sctp_status));
-		live_optlen = (socklen_t)sizeof(struct sctp_status);
-		((struct sctp_status*) live_optval)->sstat_assoc_id = 0;
+		live_optlen = (socklen_t) sizeof(struct sctp_status);
+		if (get_sctp_assoc_t(val_expression->value.sctp_status->sstat_assoc_id,
+				    &((struct sctp_status*) live_optval)->sstat_assoc_id,
+				    error)) {
+			free(live_optval);
+			return STATUS_ERR;
+		}
 		break;
 #endif
 #ifdef SCTP_GET_PEER_ADDR_INFO
 	case EXPR_SCTP_PADDRINFO: {
 		struct sctp_paddrinfo_expr *expr_paddrinfo = val_expression->value.sctp_paddrinfo;
 		struct sctp_paddrinfo *live_paddrinfo = malloc(sizeof(struct sctp_paddrinfo));
-		live_optlen = (socklen_t)sizeof(struct sctp_paddrinfo);
+		live_optlen = (socklen_t) sizeof(struct sctp_paddrinfo);
 		memset(live_paddrinfo, 0, sizeof(struct sctp_paddrinfo));
-		live_paddrinfo->spinfo_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_paddrinfo->spinfo_assoc_id,
+				    &(live_paddrinfo->spinfo_assoc_id), error)) {
+			free(live_paddrinfo);
+			return STATUS_ERR;
+		}
 		if (get_sockstorage_arg(expr_paddrinfo->spinfo_address,
 					&(live_paddrinfo->spinfo_address), live_fd)) {
 			asprintf(error, "can't determine spinfo_address");
@@ -2888,13 +3169,15 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		struct sctp_paddrparams *live_params = malloc(sizeof(struct sctp_paddrparams));
 		memset(live_params, 0, sizeof(struct sctp_paddrparams));
 		live_optlen = sizeof(struct sctp_paddrparams);
-		if (get_sockstorage_arg(expr_params->spp_address, &live_params->spp_address,
-					live_fd)) {
+		if (get_sockstorage_arg(expr_params->spp_address, &live_params->spp_address, live_fd)) {
 			asprintf(error, "can't determine spp_address");
 			free(live_params);
 			return STATUS_ERR;
 		}
-		live_params->spp_assoc_id = 0;
+		if (get_sctp_assoc_t(expr_params->spp_assoc_id, &live_params->spp_assoc_id, error)) {
+			free(live_params);
+			return STATUS_ERR;
+		}
 		live_optval = live_params;
 		break;
 	}
@@ -2903,7 +3186,17 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 	case EXPR_SCTP_ASSOC_VALUE:
 		live_optval = malloc(sizeof(struct sctp_assoc_value));
 		live_optlen = (socklen_t)sizeof(struct sctp_assoc_value);
-		((struct sctp_assoc_value *) live_optval)->assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_assoc_value->assoc_id,
+			&((struct sctp_assoc_value *) live_optval)->assoc_id, error)) {
+			free(live_optval);
+			return STATUS_ERR;
+		}
+		break;
+#endif
+#ifdef SCTP_HMAC_IDENT
+	case EXPR_SCTP_HMACALGO:
+		live_optval = malloc(sizeof(struct sctp_hmacalgo));
+		live_optlen = sizeof(struct sctp_hmacalgo);
 		break;
 #endif
 #ifdef SCTP_SS_VALUE
@@ -2923,7 +3216,12 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 	case EXPR_SCTP_EVENT:
 		live_optval = malloc(sizeof(struct sctp_event));
 		live_optlen = sizeof(struct sctp_event);
-		((struct sctp_event *)live_optval)->se_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_event->se_assoc_id,
+				     &((struct sctp_event *)live_optval)->se_assoc_id,
+				     error)) {
+			free(live_optval);
+			return STATUS_ERR;
+		}
 		if (get_u16(val_expression->value.sctp_event->se_type,
 			    &((struct sctp_event *)live_optval)->se_type,
 			    error)) {
@@ -2932,6 +3230,12 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		}
 		break;
 #endif
+#ifdef SCTP_DEFAULT_SEND_PARAM
+	case EXPR_SCTP_SNDRCVINFO:
+		live_optval = malloc(sizeof(struct sctp_sndrcvinfo));
+		live_optlen = sizeof(struct sctp_sndrcvinfo);
+		break;
+#endif
 #ifdef SCTP_EVENTS
 	case EXPR_SCTP_EVENT_SUBSCRIBE:
 		live_optval = malloc(sizeof(struct sctp_event_subscribe));
@@ -2942,9 +3246,38 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 	case EXPR_SCTP_SNDINFO:
 		live_optval = malloc(sizeof(struct sctp_sndinfo));
 		live_optlen = sizeof(struct sctp_sndinfo);
-		if (get_u32(val_expression->value.sctp_sndinfo->snd_assoc_id,
-			    &((struct sctp_sndinfo *)live_optval)->snd_assoc_id,
-			    error)) {
+		if (get_sctp_assoc_t(val_expression->value.sctp_sndinfo->snd_assoc_id,
+				     &((struct sctp_sndinfo *)live_optval)->snd_assoc_id,
+				     error)) {
+			free(live_optval);
+			return STATUS_ERR;
+		}
+		break;
+#endif
+#ifdef SCTP_DEFAULT_PRINFO
+	case EXPR_SCTP_PRINFO:
+	case EXPR_SCTP_DEFAULT_PRINFO:
+		live_optval = malloc(sizeof(struct sctp_default_prinfo));
+		live_optlen = sizeof(struct sctp_default_prinfo);
+		if (EXPR_SCTP_DEFAULT_PRINFO) {
+			if (get_sctp_assoc_t(val_expression->value.sctp_default_prinfo->pr_assoc_id,
+					     &((struct sctp_default_prinfo *)live_optval)->pr_assoc_id,
+					     error)) {
+				free(live_optval);
+				return STATUS_ERR;
+			}
+		}else{
+			((struct sctp_default_prinfo *)live_optval)->pr_assoc_id = 0;
+		}
+		break;
+#endif
+#ifdef SCTP_PRIMARY_ADDR
+	case EXPR_SCTP_SETPRIM:
+		live_optval = malloc(sizeof(struct sctp_setprim));
+		live_optlen = sizeof(struct sctp_setprim);
+		if (get_sctp_assoc_t(val_expression->value.sctp_setprim->ssp_assoc_id,
+				     &((struct sctp_setprim *)live_optval)->ssp_assoc_id,
+				     error)) {
 			free(live_optval);
 			return STATUS_ERR;
 		}
@@ -2955,6 +3288,28 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		live_optval = malloc(sizeof(struct sctp_setadaptation));
 		live_optlen = sizeof(struct sctp_setadaptation);
 		break;
+#endif
+#ifdef SCTP_GET_ASSOC_ID_LIST
+	case EXPR_SCTP_ASSOC_IDS: {
+		int len = expression_list_length(val_expression->value.sctp_assoc_ids->gaids_assoc_id->value.list);
+		live_optval = malloc(sizeof(u32) + (sizeof(sctp_assoc_t) * len));
+		live_optlen = sizeof(u32) + (sizeof(sctp_assoc_t) * len);
+		break;
+	}
+#endif
+#if defined(SCTP_PEER_AUTH_CHUNKS) || defined(SCTP_LOCAL_AUTH_CHUNKS)
+	case EXPR_SCTP_AUTHCHUNKS: {
+		int len = expression_list_length(val_expression->value.sctp_authchunks->gauth_chunks->value.list);
+		live_optval = malloc(sizeof(sctp_assoc_t) + sizeof(u32) + (sizeof(u8) * len));
+		live_optlen = sizeof(sctp_assoc_t) + sizeof(u32) + (sizeof(u8) * len);		
+		if (get_sctp_assoc_t(val_expression->value.sctp_authchunks->gauth_assoc_id,
+				     &((struct sctp_authchunks *)live_optval)->gauth_assoc_id,
+				     error)) {
+			free(live_optval);
+			return STATUS_ERR;
+		}
+		break;
+	}
 #endif
 	case EXPR_LIST:
 		s32_bracketed_arg(args, 3, &script_optval, error);
@@ -3002,6 +3357,11 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		result = check_sctp_initmsg(val_expression->value.sctp_initmsg, live_optval, error);
 		break;
 #endif
+#if defined(SCTP_AUTH_ACTIVE_KEY) || defined(SCTP_AUTH_DEACTIVATE_KEY) || defined(SCTP_AUTH_DELETE_KEY)
+	case EXPR_SCTP_AUTHKEYID:
+		result = check_sctp_authkeyid(val_expression->value.sctp_authkeyid, live_optval, error);
+		break;
+#endif
 #ifdef SCTP_DELAYED_SACK
 	case EXPR_SCTP_SACKINFO:
 		result = check_sctp_sack_info(val_expression->value.sctp_sack_info, live_optval, error);
@@ -3027,6 +3387,11 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		result = check_sctp_assoc_value(val_expression->value.sctp_assoc_value, live_optval, error);
 		break;
 #endif
+#ifdef SCTP_HMAC_IDENT
+	case EXPR_SCTP_HMACALGO:
+		result = check_sctp_hamcalgo(val_expression->value.sctp_hmacalgo, live_optval, error);
+		break;
+#endif		
 #ifdef SCTP_SS_VALUE
 	case EXPR_SCTP_STREAM_VALUE:
 		result = check_sctp_stream_value(val_expression->value.sctp_stream_value, live_optval, error);
@@ -3037,6 +3402,11 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		result = check_sctp_event(val_expression->value.sctp_event, live_optval, error);
 		break;
 #endif
+#ifdef SCTP_DEFAULT_SEND_PARAM
+	case EXPR_SCTP_SNDRCVINFO:
+		result = check_sctp_sndrcvinfo(val_expression->value.sctp_sndrcvinfo, live_optval, error);
+		break;
+#endif
 #ifdef SCTP_EVENTS
 	case EXPR_SCTP_EVENT_SUBSCRIBE:
 		result = check_sctp_event_subscribe(val_expression->value.sctp_event_subscribe, live_optval, error);
@@ -3047,10 +3417,30 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		result = check_sctp_sndinfo(val_expression->value.sctp_sndinfo, live_optval, error);
 		break;
 #endif
+#ifdef SCTP_DEFAULT_PRINFO
+	case EXPR_SCTP_DEFAULT_PRINFO:
+		result = check_sctp_default_prinfo(val_expression, live_optval, error);
+		break;
+#endif
+#ifdef SCTP_PRIMARY_ADDR
+	case EXPR_SCTP_SETPRIM:
+		result = check_sctp_setprim(val_expression->value.sctp_setprim, live_optval, error);
+		break;
+#endif
 #ifdef SCTP_ADAPTATION_LAYER
 	case EXPR_SCTP_SETADAPTATION:
 		result = check_sctp_setadaptation(val_expression->value.sctp_setadaptation, live_optval, error);
 		break;
+#endif
+#ifdef SCTP_GET_ASSOC_ID_LIST
+	case EXPR_SCTP_ASSOC_IDS:
+		result = check_sctp_assoc_ids(val_expression->value.sctp_assoc_ids, live_optval, error);
+		break;
+#endif
+#if defined(SCTP_PEER_AUTH_CHUNKS) || defined(SCTP_LOCAL_AUTH_CHUNKS)
+	case EXPR_SCTP_AUTHCHUNKS:
+		result = check_sctp_authchunks(val_expression->value.sctp_authchunks, live_optval, error);
+		break;
 #endif
 	case EXPR_LIST:
 		if (*(int*)live_optval != script_optval) {
@@ -3087,6 +3477,9 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
 	struct sctp_assoc_value assoc_value;
 #endif
+#ifdef SCTP_AUTH_ACTIVE_KEY
+	struct sctp_authkeyid authkeyid;
+#endif
 #ifdef SCTP_DELAYED_SACK
 	struct sctp_sack_info sack_info;
 #endif
@@ -3105,12 +3498,27 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #ifdef SCTP_EVENTS
 	struct sctp_event_subscribe event_subscribe;
 #endif
+#ifdef SCTP_DEFAULT_SEND_PARAM
+	struct sctp_sndrcvinfo sndrcvinfo;
+#endif
 #ifdef SCTP_DEFAULT_SNDINFO
 	struct sctp_sndinfo sndinfo;
 #endif
+#ifdef SCTP_DEFAULT_PRINFO
+	struct sctp_default_prinfo default_prinfo;
+#endif
+#ifdef SCTP_PRIMARY_ADDR
+	struct sctp_setprim setprim;
+#endif
 #ifdef SCTP_ADAPTATION_LAYER
 	struct sctp_setadaptation setadaptation;
 #endif
+#ifdef SCTP_SET_PEER_PRIMARY_ADDR
+	struct sctp_setpeerprim setpeerprim;
+#endif
+#ifdef SCTP_AUTH_CHUNK
+	struct sctp_authchunk authchunk;
+#endif
 #ifdef SCTP_PEER_ADDR_PARAMS
 	struct sctp_paddrparams paddrparams;
 #ifdef linux
@@ -3152,7 +3560,10 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		break;
 #ifdef SCTP_RTOINFO
 	case EXPR_SCTP_RTOINFO:
-		rtoinfo.srto_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_rtoinfo->srto_assoc_id,
+				      &rtoinfo.srto_assoc_id, error)) {
+			return STATUS_ERR;
+		}
 		if (get_u32(val_expression->value.sctp_rtoinfo->srto_initial,
 			    &rtoinfo.srto_initial, error)) {
 			return STATUS_ERR;
@@ -3170,7 +3581,10 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #endif
 #ifdef SCTP_ASSOCINFO
 	case EXPR_SCTP_ASSOCPARAMS:
-		assocparams.sasoc_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_assocparams->sasoc_assoc_id,
+				     &assocparams.sasoc_assoc_id, error)) {
+			return STATUS_ERR;
+		}
 		if (get_u16(val_expression->value.sctp_assocparams->sasoc_asocmaxrxt,
 			    &assocparams.sasoc_asocmaxrxt, error)) {
 			return STATUS_ERR;
@@ -3204,7 +3618,10 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #endif
 #if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
 	case EXPR_SCTP_ASSOC_VALUE:
-		assoc_value.assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_assoc_value->assoc_id,
+				     &assoc_value.assoc_id, error)) {
+			return STATUS_ERR;
+		}
 		if (get_u32(val_expression->value.sctp_assoc_value->assoc_value,
 			    &assoc_value.assoc_value, error)) {
 			return STATUS_ERR;
@@ -3212,6 +3629,33 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		optval = &assoc_value;
 		break;
 #endif
+#ifdef SCTP_HMAC_IDENT
+	case EXPR_SCTP_HMACALGO: {
+		int len, i;
+		struct sctp_hmacalgo *hmacalgo;
+		struct expression_list *list;
+
+		if (check_type(val_expression->value.sctp_hmacalgo->shmac_idents, EXPR_LIST, error)) {
+			return STATUS_ERR;
+		}
+		list = val_expression->value.sctp_hmacalgo->shmac_idents->value.list;
+		len = expression_list_length(list);
+		hmacalgo = malloc(sizeof(u32) + (sizeof(u16) * len));
+
+		if (get_u32(val_expression->value.sctp_hmacalgo->shmac_number_of_idents,
+			    &hmacalgo->shmac_number_of_idents, error)) {
+			free(hmacalgo);
+			return STATUS_ERR;
+		}
+		for (i = 0; i < len; i++) {
+			struct expression *expr;
+			expr = get_arg(list, i, error);
+			get_u16(expr, &(hmacalgo->shmac_idents[i]), error);
+		}
+		optval = &hmacalgo;
+		break;
+		}
+#endif
 #ifdef SCTP_SS_VALUE
 	case EXPR_SCTP_STREAM_VALUE:
 		stream_value.assoc_id = 0;
@@ -3226,9 +3670,25 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		optval = &stream_value;
 		break;
 #endif
+#if defined(SCTP_AUTH_ACTIVE_KEY) || defined(SCTP_AUTH_DEACTIVATE_KEY) || defined(SCTP_AUTH_DELETE_KEY)
+	case EXPR_SCTP_AUTHKEYID:
+		if (get_sctp_assoc_t(val_expression->value.sctp_authkeyid->scact_assoc_id,
+				    &authkeyid.scact_assoc_id, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u16(val_expression->value.sctp_authkeyid->scact_keynumber,
+			    &authkeyid.scact_keynumber, error)) {
+			return STATUS_ERR;
+		}
+		optval = &authkeyid;
+		break;
+#endif
 #ifdef SCTP_DELAYED_SACK
 	case EXPR_SCTP_SACKINFO:
-		sack_info.sack_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_sack_info->sack_assoc_id,
+				    &sack_info.sack_assoc_id, error)) {
+			return STATUS_ERR;
+		}
 		if (get_u32(val_expression->value.sctp_sack_info->sack_delay,
 			    &sack_info.sack_delay, error)) {
 			return STATUS_ERR;
@@ -3242,13 +3702,19 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #endif
 #ifdef SCTP_STATUS
 	case EXPR_SCTP_STATUS:
-		status.sstat_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_status->sstat_assoc_id,
+				    &status.sstat_assoc_id, error)) {
+			return STATUS_ERR;
+		}
 		optval = &status;
 		break;
 #endif
 #ifdef SCTP_GET_PEER_ADDR_INFO
 	case EXPR_SCTP_PADDRINFO:
-		paddrinfo.spinfo_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_paddrinfo->spinfo_assoc_id,
+				    &paddrinfo.spinfo_assoc_id, error)) {
+			return STATUS_ERR;
+		}
 		if (get_sockstorage_arg(val_expression->value.sctp_paddrinfo->spinfo_address,
 					&paddrinfo.spinfo_address, live_fd)) {
 			asprintf(error, "can't determine spp_address");
@@ -3259,7 +3725,10 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #endif
 #ifdef SCTP_EVENT
 	case EXPR_SCTP_EVENT:
-		event.se_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_event->se_assoc_id,
+				     &event.se_assoc_id, error)) {
+			return STATUS_ERR;
+		}
 		if (get_u16(val_expression->value.sctp_event->se_type,
 			    &event.se_type, error)) {
 			return STATUS_ERR;
@@ -3316,6 +3785,14 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		optval = &event_subscribe;
 		break;
 #endif
+#ifdef SCTP_DEFAULT_SEND_PARAM
+	case EXPR_SCTP_SNDRCVINFO:
+		if (parse_expression_to_sctp_sndrcvinfo(val_expression, &sndrcvinfo, true, error)) {
+			return STATUS_ERR;
+		}
+		optval = &sndrcvinfo;	
+		break;	
+#endif
 #ifdef SCTP_DEFAULT_SNDINFO
 	case EXPR_SCTP_SNDINFO:
 		if (get_u16(val_expression->value.sctp_sndinfo->snd_sid,
@@ -3334,13 +3811,55 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 			    &sndinfo.snd_context, error)) {
 			return STATUS_ERR;
 		}
-		if (get_u32(val_expression->value.sctp_sndinfo->snd_assoc_id,
-			    &sndinfo.snd_assoc_id, error)) {
+		if (get_sctp_assoc_t(val_expression->value.sctp_sndinfo->snd_assoc_id,
+				     &sndinfo.snd_assoc_id, error)) {
 			return STATUS_ERR;
 		}
 		optval = &sndinfo;
 		break;
 #endif
+#ifdef SCTP_DEFAULT_PRINFO
+	case EXPR_SCTP_PRINFO:
+		if (get_u16(val_expression->value.sctp_prinfo->pr_policy,
+			    &default_prinfo.pr_policy, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u32(val_expression->value.sctp_prinfo->pr_value,
+			    &default_prinfo.pr_value, error)) {
+			return STATUS_ERR;
+		}
+		default_prinfo.pr_assoc_id = 0;
+		optval = &default_prinfo;
+		break;
+	case EXPR_SCTP_DEFAULT_PRINFO:
+		if (get_u16(val_expression->value.sctp_default_prinfo->pr_policy,
+			    &default_prinfo.pr_policy, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u32(val_expression->value.sctp_default_prinfo->pr_value,
+			    &default_prinfo.pr_value, error)) {
+			return STATUS_ERR;
+		}
+		if (get_sctp_assoc_t(val_expression->value.sctp_default_prinfo->pr_assoc_id,
+				    &default_prinfo.pr_assoc_id, error)) {
+			return STATUS_ERR;
+		}
+		optval = &default_prinfo;		
+		break;		
+#endif
+#ifdef SCTP_PRIMARY_ADDR
+	case EXPR_SCTP_SETPRIM:
+		if (get_sctp_assoc_t(val_expression->value.sctp_setprim->ssp_assoc_id,
+				     &setprim.ssp_assoc_id, error)) {
+			return STATUS_ERR;
+		}
+		if (get_sockstorage_arg(val_expression->value.sctp_setprim->ssp_addr,
+			    	&setprim.ssp_addr, live_fd)) {
+			return STATUS_ERR;
+		}
+		optval = &setprim;		
+		break;
+#endif
 #ifdef SCTP_ADAPTATION_LAYER
 	case EXPR_SCTP_SETADAPTATION:
 		if (get_u32(val_expression->value.sctp_setadaptation->ssb_adaptation_ind,
@@ -3350,9 +3869,75 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		optval = &setadaptation;
 		break;
 #endif
+#ifdef SCTP_SET_PEER_PRIMARY_ADDR
+	case EXPR_SCTP_SETPEERPRIM:
+		if (get_sctp_assoc_t(val_expression->value.sctp_setpeerprim->sspp_assoc_id,
+				     &setpeerprim.sspp_assoc_id, error)) {
+			return STATUS_ERR;
+		}
+		if (get_sockstorage_arg(val_expression->value.sctp_setpeerprim->sspp_addr,
+		    		&setpeerprim.sspp_addr, live_fd)) {
+			return STATUS_ERR;
+		}
+		optval = &setpeerprim;
+		break;
+#endif
+#ifdef SCTP_AUTH_CHUNK
+	case EXPR_SCTP_AUTHCHUNK:
+		if (get_u8(val_expression->value.sctp_authchunk->sauth_chunk,
+			    &authchunk.sauth_chunk, error)) {
+			return STATUS_ERR;
+		}		
+		optval = &authchunk;
+		break;
+#endif
+#ifdef SCTP_AUTH_KEY
+	case EXPR_SCTP_AUTHKEY: {
+		struct sctp_authkey *key;
+		int i = 0, len = 0;
+		struct expression *key_expr;
+		struct expression_list *list;
+
+		if (check_type(val_expression->value.sctp_authkey->sca_key, EXPR_LIST, error)) {
+			return STATUS_ERR;
+		}
+		list = val_expression->value.sctp_authkey->sca_key->value.list;
+		len = expression_list_length(list);
+		key = malloc(sizeof(sctp_assoc_t) + sizeof(u16) + sizeof(u16) + (sizeof(u8) * len));
+
+		if (get_sctp_assoc_t(val_expression->value.sctp_authkey->sca_assoc_id,
+				     &key->sca_assoc_id, error)) {
+			free(key);
+			return STATUS_ERR;
+		}
+		if (get_u16(val_expression->value.sctp_authkey->sca_keynumber,
+			    &key->sca_keynumber, error)) {
+			free(key);
+			return STATUS_ERR;
+		}
+		if (get_u16(val_expression->value.sctp_authkey->sca_keylength,
+			    &key->sca_keylength, error)) {
+			free(key);
+			return STATUS_ERR;
+		}
+		for (i = 0; i < len; i++) {
+			key_expr = get_arg(list, i, error);
+			if (get_u8(key_expr, &(key->sca_key[i]), error)) {
+				free(key);
+				return STATUS_ERR;
+			}
+		}
+		key->sca_keylength = len;
+		optval = key;
+		break;
+	}
+#endif
 #ifdef SCTP_PEER_ADDR_PARAMS
 	case EXPR_SCTP_PEER_ADDR_PARAMS:
-		paddrparams.spp_assoc_id = 0;
+		if (get_sctp_assoc_t(val_expression->value.sctp_paddrparams->spp_assoc_id,
+				     &paddrparams.spp_assoc_id, error)) {
+			return STATUS_ERR;
+		}
 		if (get_sockstorage_arg(val_expression->value.sctp_paddrparams->spp_address,
 					&paddrparams.spp_address, live_fd)) {
 			asprintf(error, "can't determine spp_address");
@@ -3415,6 +4000,9 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 	result = setsockopt(live_fd, level, optname, optval, optlen);
 
 	return end_syscall(state, syscall, CHECK_EXACT, result, error);
+#if defined(SCTP_HMAC_IDENT) || defined(SCTP_AUTH_KEY)
+	free(optval);
+#endif
 }
 
 static int syscall_poll(struct state *state, struct syscall_spec *syscall,
@@ -3578,8 +4166,8 @@ static int check_sctp_sndrcvinfo(struct sctp_sndrcvinfo_expr *expr,
 	if (check_u32_expr(expr->sinfo_cumtsn, sctp_sndrcvinfo->sinfo_cumtsn,
 			   "sctp_sndrcvinfo.sinfo_cumtsn", error))
 		return STATUS_ERR;
-	if (check_u32_expr(expr->sinfo_assoc_id, sctp_sndrcvinfo->sinfo_assoc_id,
-			   "sctp_sndrcvinfo.sinfo_assoc_id", error))
+	if (check_sctp_assoc_t_expr(expr->sinfo_assoc_id, sctp_sndrcvinfo->sinfo_assoc_id,
+				    "sctp_sndrcvinfo.sinfo_assoc_id", error))
 		return STATUS_ERR;
 
 	return STATUS_OK;
@@ -3653,8 +4241,8 @@ static int check_sctp_extrcvinfo(struct sctp_extrcvinfo_expr *expr,
 			   "sctp_extrcvinfo.serinfo_next_ppid", error))
 		return STATUS_ERR;
 #endif
-	if (check_u32_expr(expr->sinfo_assoc_id, sctp_extrcvinfo->sinfo_assoc_id,
-			   "sctp_extrcvinfo.sinfo_assoc_id", error))
+	if (check_sctp_assoc_t_expr(expr->sinfo_assoc_id, sctp_extrcvinfo->sinfo_assoc_id,
+			   	    "sctp_extrcvinfo.sinfo_assoc_id", error))
 		return STATUS_ERR;
 
 	return STATUS_OK;
@@ -3855,14 +4443,9 @@ static int parse_expression_to_sctp_sndrcvinfo(struct expression *expr,
 			}
 		}
 		if (sndrcvinfo_expr->sinfo_assoc_id->type == EXPR_ELLIPSIS) {
-			if (send) {
-				asprintf(error, "sinfo_assoc_id must be specified");
-				return STATUS_ERR;
-			} else {
-				info->sinfo_assoc_id = 0;
-			}
+			info->sinfo_assoc_id = 0;
 		} else {
-			if (get_u32(sndrcvinfo_expr->sinfo_assoc_id, (u32 *)&info->sinfo_assoc_id, error)) {
+			if (get_sctp_assoc_t(sndrcvinfo_expr->sinfo_assoc_id, &info->sinfo_assoc_id, error)) {
 				return STATUS_ERR;
 			}
 		}
@@ -3889,7 +4472,7 @@ static int parse_expression_to_sctp_sndinfo(struct expression *expr, struct sctp
 		if (get_u32(sndinfo_expr->snd_context, &info->snd_context, error)) {
 			return STATUS_ERR;
 		}
-		if (get_u32(sndinfo_expr->snd_assoc_id, &info->snd_assoc_id, error)) {
+		if (get_sctp_assoc_t(sndinfo_expr->snd_assoc_id, &info->snd_assoc_id, error)) {
 			return STATUS_ERR;
 		}
 	} else {
@@ -4078,7 +4661,7 @@ static int syscall_sctp_sendx(struct state *state, struct syscall_spec *syscall,
 	if (ellipsis_arg(args, 1, error))
 		return STATUS_ERR;
 	len_expr = get_arg(args, 2, error);
-	if (get_u32(len_expr, &len, error)) {
+	if (get_size_t(len_expr, &len, error)) {
 		 return STATUS_ERR;
 	}
 	addrs_expr = get_arg(args, 3, error);
@@ -4266,8 +4849,8 @@ static int check_sctp_rcvinfo(struct sctp_rcvinfo_expr *expr,
 	if (check_u32_expr(expr->rcv_context, sctp_rcvinfo->rcv_context,
 			   "sctp_rcvinfo.rcv_context", error))
 		return STATUS_ERR;
-	if (check_u32_expr(expr->rcv_assoc_id, sctp_rcvinfo->rcv_assoc_id,
-			   "sctp_rcvinfo.rcv_assoc_id", error))
+	if (check_sctp_assoc_t_expr(expr->rcv_assoc_id, sctp_rcvinfo->rcv_assoc_id,
+				    "sctp_rcvinfo.rcv_assoc_id", error))
 		return STATUS_ERR;
 
 	return STATUS_OK;
@@ -4279,15 +4862,20 @@ static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr,
 			      struct sctp_nxtinfo *sctp_nxtinfo,
 			      char **error)
 {
-	if (check_u16_expr(expr->nxt_sid, sctp_nxtinfo->nxt_sid, "sctp_nxtinfo.nxt_sid", error))
+	if (check_u16_expr(expr->nxt_sid, sctp_nxtinfo->nxt_sid,
+			   "sctp_nxtinfo.nxt_sid", error))
 		return STATUS_ERR;
-	if (check_u16_expr(expr->nxt_flags, sctp_nxtinfo->nxt_flags, "sctp_nxtinfo.nxt_flags", error))
+	if (check_u16_expr(expr->nxt_flags, sctp_nxtinfo->nxt_flags,
+			   "sctp_nxtinfo.nxt_flags", error))
 		return STATUS_ERR;
-	if (check_u32_hton_expr(expr->nxt_ppid, sctp_nxtinfo->nxt_ppid, "sctp_nxtinfo.nxt_ppid", error))
+	if (check_u32_hton_expr(expr->nxt_ppid, sctp_nxtinfo->nxt_ppid,
+				"sctp_nxtinfo.nxt_ppid", error))
 		return STATUS_ERR;
-	if (check_u32_expr(expr->nxt_length, sctp_nxtinfo->nxt_length, "sctp_nxtinfo.nxt_length", error))
+	if (check_u32_expr(expr->nxt_length, sctp_nxtinfo->nxt_length,
+			   "sctp_nxtinfo.nxt_length", error))
 		return STATUS_ERR;
-	if (check_u32_expr(expr->nxt_assoc_id, sctp_nxtinfo->nxt_assoc_id, "sctp_nxtinfo.nxt_assoc_id", error))
+	if (check_sctp_assoc_t_expr(expr->nxt_assoc_id, sctp_nxtinfo->nxt_assoc_id,
+				    "sctp_nxtinfo.nxt_assoc_id", error))
 		return STATUS_ERR;
 
 	return STATUS_OK;
@@ -4319,7 +4907,7 @@ static int check_sctp_assoc_change(struct sctp_assoc_change_expr *expr,
 	if (check_u16_expr(expr->sac_inbound_streams, sctp_event->sac_inbound_streams,
 			   "sctp_assoc_change.sac_inbound_streams", error))
 		return STATUS_ERR;
-	if (check_u32_expr(expr->sac_assoc_id, sctp_event->sac_assoc_id,
+	if (check_sctp_assoc_t_expr(expr->sac_assoc_id, sctp_event->sac_assoc_id,
 			   "sctp_assoc_change.sac_assoc_id", error))
 		return STATUS_ERR;
 	if (check_u8array_expr(expr->sac_info, sctp_event->sac_info, sctp_event->sac_length - sizeof(struct sctp_assoc_change),
@@ -4352,7 +4940,7 @@ static int check_sctp_paddr_change(struct sctp_paddr_change_expr *expr,
 	if (check_u32_expr(expr->spc_error, sctp_event->spc_error,
 			   "sctp_paddr_change.spc_error", error))
 		return STATUS_ERR;
-	if (check_u32_expr(expr->spc_assoc_id, sctp_event->spc_assoc_id,
+	if (check_sctp_assoc_t_expr(expr->spc_assoc_id, sctp_event->spc_assoc_id,
 			   "sctp_paddr_change.spc_assoc_id", error))
 		return STATUS_ERR;
 
@@ -4376,7 +4964,7 @@ static int check_sctp_remote_error(struct sctp_remote_error_expr *expr,
 	if (check_u16_expr(expr->sre_error, sctp_event->sre_error,
 			   "sctp_remote_error.sre_error", error))
 		return STATUS_ERR;
-	if (check_u32_expr(expr->sre_assoc_id, sctp_event->sre_assoc_id,
+	if (check_sctp_assoc_t_expr(expr->sre_assoc_id, sctp_event->sre_assoc_id,
 			   "sctp_remote_error.sre_assoc_id", error))
 		return STATUS_ERR;
 	if (check_u8array_expr(expr->sre_data, sctp_event->sre_data, sctp_event->sre_length - sizeof(struct sctp_remote_error),
@@ -4409,7 +4997,7 @@ static int check_sctp_send_failed(struct sctp_send_failed_expr *expr,
 					  &sctp_event->ssf_info, error))
 			return STATUS_ERR;
 	}
-	if (check_u32_expr(expr->ssf_assoc_id, sctp_event->ssf_assoc_id,
+	if (check_sctp_assoc_t_expr(expr->ssf_assoc_id, sctp_event->ssf_assoc_id,
 			   "sctp_send_failed.ssf_assoc_id", error))
 		return STATUS_ERR;
 	if (check_u8array_expr(expr->ssf_data, sctp_event->ssf_data, sctp_event->ssf_length - sizeof(struct sctp_send_failed),
@@ -4434,6 +5022,9 @@ static int check_sctp_shutdown_event(struct sctp_shutdown_event_expr *expr,
 	if (check_u32_expr(expr->sse_length, sctp_event->sse_length,
 			   "sctp_shutdown_event.sse_length", error))
 		return STATUS_ERR;
+	if (check_sctp_assoc_t_expr(expr->sse_assoc_id, sctp_event->sse_assoc_id,
+			   "sctp_shutdown_event.sse_assoc_id", error))
+		return STATUS_ERR;
 
 	return STATUS_OK;
 }
@@ -4456,7 +5047,7 @@ static int check_sctp_adaptation_event(struct sctp_adaptation_event_expr *expr,
 	if (check_u32_expr(expr->sai_adaptation_ind, sctp_event->sai_adaptation_ind,
 			   "sctp_adaptation_event.sai_adaptation_ind", error))
 		return STATUS_ERR;
-	if (check_u32_expr(expr->sai_assoc_id, sctp_event->sai_assoc_id,
+	if (check_sctp_assoc_t_expr(expr->sai_assoc_id, sctp_event->sai_assoc_id,
 			   "sctp_adaptation_event.sai_assoc_id", error))
 		return STATUS_ERR;
 
@@ -4501,7 +5092,7 @@ static int check_sctp_pdapi_event(struct sctp_pdapi_event_expr *expr,
 			   "sctp_pdapi_event.pdapi_seq", error))
 		return STATUS_ERR;
 #endif
-	if (check_u32_expr(expr->pdapi_assoc_id, sctp_event->pdapi_assoc_id,
+	if (check_sctp_assoc_t_expr(expr->pdapi_assoc_id, sctp_event->pdapi_assoc_id,
 			   "sctp_pdapi_event.pdapi_assoc_id", error))
 		return STATUS_ERR;
 
@@ -4529,7 +5120,7 @@ static int check_sctp_authkey_event(struct sctp_authkey_event_expr *expr,
 	if (check_u32_expr(expr->auth_indication, sctp_event->auth_indication,
 			   "sctp_authkey_event.auth_indication", error))
 		return STATUS_ERR;
-	if (check_u32_expr(expr->auth_assoc_id, sctp_event->auth_assoc_id,
+	if (check_sctp_assoc_t_expr(expr->auth_assoc_id, sctp_event->auth_assoc_id,
 			   "sctp_authkey_event.auth_assoc_id", error))
 		return STATUS_ERR;
 
@@ -4551,7 +5142,7 @@ static int check_sctp_sender_dry_event(struct sctp_sender_dry_event_expr *expr,
 	if (check_u32_expr(expr->sender_dry_length, sctp_event->sender_dry_length,
 			   "sctp_sender_dry.sender_dry_length", error))
 		return STATUS_ERR;
-	if (check_u32_expr(expr->sender_dry_assoc_id, sctp_event->sender_dry_assoc_id,
+	if (check_sctp_assoc_t_expr(expr->sender_dry_assoc_id, sctp_event->sender_dry_assoc_id,
 			   "sctp_sender_dry.sender_dry_assoc_id", error))
 		return STATUS_ERR;
 
@@ -4579,7 +5170,7 @@ static int check_sctp_send_failed_event(struct sctp_send_failed_event_expr *expr
 		if (check_sctp_sndinfo(expr->ssfe_info->value.sctp_sndinfo, &sctp_event->ssfe_info, error))
 			return STATUS_ERR;
 	}
-	if (check_u32_expr(expr->ssfe_assoc_id, sctp_event->ssfe_assoc_id,
+	if (check_sctp_assoc_t_expr(expr->ssfe_assoc_id, sctp_event->ssfe_assoc_id,
 			   "sctp_send_failed.ssfe_assoc_id", error))
 		return STATUS_ERR;
 	if (check_u8array_expr(expr->ssfe_data, sctp_event->ssfe_data,
@@ -4964,7 +5555,7 @@ static int syscall_sctp_connectx(struct state *state, struct syscall_spec *sysca
 	if (check_arg_count(assoc_expr->value.list, 1, error))
 		return STATUS_ERR;
 	assoc_expr = get_arg(assoc_expr->value.list, 0, error);
-	if (check_u32_expr(assoc_expr, (u32)live_associd,
+	if (check_sctp_assoc_t_expr(assoc_expr, live_associd,
 			   "sctp_connectx assoc_id", error))
 		return STATUS_ERR;
 
@@ -4991,7 +5582,7 @@ static int syscall_sctp_peeloff(struct state *state, struct syscall_spec *syscal
 	if (to_live_fd(state, script_fd, &live_fd, error))
 		return STATUS_ERR;
 	expr_assoc = get_arg(args, 1, error);
-	if (get_u32(expr_assoc, (u32 *)&assoc_id, error))
+	if (get_sctp_assoc_t(expr_assoc, &assoc_id, error))
 		return STATUS_ERR;
 
 	//check connection Type and set assoc_id if one-to-many style socket
@@ -5038,7 +5629,7 @@ static int syscall_sctp_getpaddrs(struct state *state, struct syscall_spec *sysc
 	if (to_live_fd(state, script_fd, &live_fd, error))
 		return STATUS_ERR;
 	assoc_expr = get_arg(args, 1, error);
-	if (get_u32(assoc_expr, (u32 *)&assoc_id, error))
+	if (get_sctp_assoc_t(assoc_expr, &assoc_id, error))
 		return STATUS_ERR;
 
 	begin_syscall(state, syscall);
@@ -5123,7 +5714,7 @@ static int syscall_sctp_getladdrs(struct state *state, struct syscall_spec *sysc
 	if (to_live_fd(state, script_fd, &live_fd, error))
 		return STATUS_ERR;
 	assoc_expr = get_arg(args, 1, error);
-	if (get_u32(assoc_expr, (u32 *)&assoc_id, error))
+	if (get_sctp_assoc_t(assoc_expr, &assoc_id, error))
 		return STATUS_ERR;
 
 	begin_syscall(state, syscall);
diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c
index 47d6c43b72f57f6699bec8c45031b025e24c7218..1b78fccfec74215093642b6e0833afbbf83e1a41 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -70,6 +70,8 @@ struct expression_type_entry expression_type_table[] = {
 	{ EXPR_SCTP_RTOINFO,         "sctp_rtoinfo"},
 	{ EXPR_SCTP_INITMSG,         "sctp_initmsg"},
 	{ EXPR_SCTP_ASSOC_VALUE,     "sctp_assoc_value"},
+	{ EXPR_SCTP_HMACALGO,        "sctp_hmacalgo"},
+	{ EXPR_SCTP_AUTHKEYID,       "sctp_authkeyid"},
 	{ EXPR_SCTP_SACKINFO,        "sctp_sackinfo"},
 	{ EXPR_SCTP_STATUS,          "sctp_status"},
 	{ EXPR_SCTP_PADDRINFO,	     "sctp_paddrinfo"},
@@ -79,9 +81,11 @@ struct expression_type_entry expression_type_table[] = {
 	{ EXPR_SCTP_EVENT,	     "sctp_event"      },
 	{ EXPR_SCTP_EVENT_SUBSCRIBE, "sctp_event_subscribe"},
 	{ EXPR_SCTP_SNDINFO,         "sctp_sndinfo"    },
+	{ EXPR_SCTP_SETPRIM,         "sctp_setprim"    },
 	{ EXPR_SCTP_SETADAPTATION,   "sctp_setadaptation"},
 	{ EXPR_SCTP_SNDRCVINFO,      "sctp_sndrcvinfo" },
 	{ EXPR_SCTP_PRINFO,          "sctp_prinfo"     },
+	{ EXPR_SCTP_DEFAULT_PRINFO,  "sctp_default_prinfo"},
 	{ EXPR_SCTP_AUTHINFO,        "sctp_authinfo"   },
 	{ EXPR_SCTP_SENDV_SPA,       "sctp_sendv_spa"  },
 	{ EXPR_SCTP_RCVINFO,         "sctp_rcvinfo"    },
@@ -99,6 +103,11 @@ struct expression_type_entry expression_type_table[] = {
 	{ EXPR_SCTP_SEND_FAILED_EVENT,"sctp_send_failed_event"},
 	{ EXPR_SCTP_TLV,             "sctp_tlv"        },
 	{ EXPR_SCTP_EXTRCVINFO,      "sctp_extrcvinfo" },
+	{ EXPR_SCTP_ASSOC_IDS,       "sctp_assoc_ids"  },
+	{ EXPR_SCTP_AUTHCHUNKS,      "sctp_authchunks" },
+	{ EXPR_SCTP_SETPEERPRIM,     "sctp_setpeerprim"},
+	{ EXPR_SCTP_AUTHCHUNK,       "sctp_authchunk"  },
+	{ EXPR_SCTP_AUTHKEY,         "sctp_authkey"    },
 	{ NUM_EXPR_TYPES,            NULL}
 };
 
@@ -313,12 +322,19 @@ void free_expression(struct expression *expression)
 		break;
 	case EXPR_SCTP_RTOINFO:
 		assert(expression->value.sctp_rtoinfo);
+		free_expression(expression->value.sctp_rtoinfo->srto_assoc_id);
 		free_expression(expression->value.sctp_rtoinfo->srto_initial);
 		free_expression(expression->value.sctp_rtoinfo->srto_max);
 		free_expression(expression->value.sctp_rtoinfo->srto_min);
 		break;
+	case EXPR_SCTP_HMACALGO:
+		assert(expression->value.sctp_hmacalgo);
+		free_expression(expression->value.sctp_hmacalgo->shmac_number_of_idents);
+		free_expression(expression->value.sctp_hmacalgo->shmac_idents);
+		break;
 	case EXPR_SCTP_ASSOC_VALUE:
 		assert(expression->value.sctp_assoc_value);
+		free_expression(expression->value.sctp_assoc_value->assoc_id);
 		free_expression(expression->value.sctp_assoc_value->assoc_value);
 		break;
 	case EXPR_SCTP_INITMSG:
@@ -328,13 +344,20 @@ void free_expression(struct expression *expression)
 		free_expression(expression->value.sctp_initmsg->sinit_max_attempts);
 		free_expression(expression->value.sctp_initmsg->sinit_max_init_timeo);
 		break;
+	case EXPR_SCTP_AUTHKEYID:
+		assert(expression->value.sctp_authkeyid);
+		free_expression(expression->value.sctp_authkeyid->scact_assoc_id);
+		free_expression(expression->value.sctp_authkeyid->scact_keynumber);
+		break;
 	case EXPR_SCTP_SACKINFO:
 		assert(expression->value.sctp_sack_info);
+		free_expression(expression->value.sctp_sack_info->sack_assoc_id);
 		free_expression(expression->value.sctp_sack_info->sack_delay);
-		free_expression(expression->value.sctp_sack_info->sack_freq);		
+		free_expression(expression->value.sctp_sack_info->sack_freq);
 		break;
 	case EXPR_SCTP_PADDRINFO:
 		assert(expression->value.sctp_paddrinfo);
+		free_expression(expression->value.sctp_paddrinfo->spinfo_assoc_id);
 		free_expression(expression->value.sctp_paddrinfo->spinfo_address);
 		free_expression(expression->value.sctp_paddrinfo->spinfo_state);
 		free_expression(expression->value.sctp_paddrinfo->spinfo_cwnd);
@@ -344,6 +367,7 @@ void free_expression(struct expression *expression)
 		break;
 	case EXPR_SCTP_STATUS:
 		assert(expression->value.sctp_status);
+		free_expression(expression->value.sctp_status->sstat_assoc_id);
 		free_expression(expression->value.sctp_status->sstat_state);
 		free_expression(expression->value.sctp_status->sstat_rwnd);
 		free_expression(expression->value.sctp_status->sstat_unackdata);
@@ -355,6 +379,7 @@ void free_expression(struct expression *expression)
 		break;
 	case EXPR_SCTP_PEER_ADDR_PARAMS:
 		assert(expression->value.sctp_paddrparams);
+		free_expression(expression->value.sctp_paddrparams->spp_assoc_id);
 		free_expression(expression->value.sctp_paddrparams->spp_address);
 		free_expression(expression->value.sctp_paddrparams->spp_hbinterval);
 		free_expression(expression->value.sctp_paddrparams->spp_pathmaxrxt);
@@ -369,6 +394,7 @@ void free_expression(struct expression *expression)
 		free_expression(expression->value.sctp_stream_value->stream_value);
 		break;
 	case EXPR_SCTP_ASSOCPARAMS:
+		free_expression(expression->value.sctp_assocparams->sasoc_assoc_id);
 		free_expression(expression->value.sctp_assocparams->sasoc_asocmaxrxt);
 		free_expression(expression->value.sctp_assocparams->sasoc_number_peer_destinations);
 		free_expression(expression->value.sctp_assocparams->sasoc_peer_rwnd);
@@ -376,6 +402,7 @@ void free_expression(struct expression *expression)
 		free_expression(expression->value.sctp_assocparams->sasoc_cookie_life);
 		break;
 	case EXPR_SCTP_EVENT:
+		free_expression(expression->value.sctp_event->se_assoc_id);
 		free_expression(expression->value.sctp_event->se_type);
 		free_expression(expression->value.sctp_event->se_on);
 		break;
@@ -397,6 +424,10 @@ void free_expression(struct expression *expression)
 		free_expression(expression->value.sctp_sndinfo->snd_ppid);
 		free_expression(expression->value.sctp_sndinfo->snd_context);
 		free_expression(expression->value.sctp_sndinfo->snd_assoc_id);
+		break;
+	case EXPR_SCTP_SETPRIM:
+		free_expression(expression->value.sctp_setprim->ssp_assoc_id);
+		free_expression(expression->value.sctp_setprim->ssp_addr);
 		break;		
 	case EXPR_SCTP_SETADAPTATION:
 		free_expression(expression->value.sctp_setadaptation->ssb_adaptation_ind);
@@ -416,6 +447,11 @@ void free_expression(struct expression *expression)
 		free_expression(expression->value.sctp_prinfo->pr_policy);
 		free_expression(expression->value.sctp_prinfo->pr_value);
 		break;		
+	case EXPR_SCTP_DEFAULT_PRINFO:
+		free_expression(expression->value.sctp_default_prinfo->pr_policy);
+		free_expression(expression->value.sctp_default_prinfo->pr_value);
+		free_expression(expression->value.sctp_default_prinfo->pr_assoc_id);
+		break;		
 	case EXPR_SCTP_AUTHINFO:
 		free_expression(expression->value.sctp_authinfo->auth_keynumber);
 		break;
@@ -487,6 +523,7 @@ void free_expression(struct expression *expression)
 		free_expression(expression->value.sctp_shutdown_event->sse_type);
 		free_expression(expression->value.sctp_shutdown_event->sse_flags);
 		free_expression(expression->value.sctp_shutdown_event->sse_length);
+		free_expression(expression->value.sctp_shutdown_event->sse_assoc_id);
 		break;
 	case EXPR_SCTP_ADAPTATION_EVENT:
 		free_expression(expression->value.sctp_adaptation_event->sai_type);
@@ -548,6 +585,28 @@ void free_expression(struct expression *expression)
 		free_expression(expression->value.sctp_extrcvinfo->serinfo_next_ppid);
 		free_expression(expression->value.sctp_extrcvinfo->sinfo_assoc_id);
 		break;
+	case EXPR_SCTP_ASSOC_IDS:
+		free_expression(expression->value.sctp_assoc_ids->gaids_number_of_ids);
+		free_expression(expression->value.sctp_assoc_ids->gaids_assoc_id);
+		break;
+	case EXPR_SCTP_AUTHCHUNKS:
+		free_expression(expression->value.sctp_authchunks->gauth_assoc_id);
+		free_expression(expression->value.sctp_authchunks->gauth_number_of_chunks);
+		free_expression(expression->value.sctp_authchunks->gauth_chunks);
+		break;
+	case EXPR_SCTP_SETPEERPRIM:
+		free_expression(expression->value.sctp_setpeerprim->sspp_assoc_id);
+		free_expression(expression->value.sctp_setpeerprim->sspp_addr);
+		break;
+	case EXPR_SCTP_AUTHCHUNK:
+		free_expression(expression->value.sctp_authchunk->sauth_chunk);
+		break;
+	case EXPR_SCTP_AUTHKEY:
+		free_expression(expression->value.sctp_authkey->sca_assoc_id);
+		free_expression(expression->value.sctp_authkey->sca_keynumber);
+		free_expression(expression->value.sctp_authkey->sca_keylength);
+		free_expression(expression->value.sctp_authkey->sca_key);
+		break;
 	case EXPR_WORD:
 		assert(expression->value.string);
 		free(expression->value.string);
@@ -787,6 +846,10 @@ static int evaluate_sctp_rtoinfo_expression(struct expression *in,
 	in_rtoinfo = in->value.sctp_rtoinfo;
 	out_rtoinfo = out->value.sctp_rtoinfo;
 
+	if (evaluate(in_rtoinfo->srto_assoc_id,
+	             &out_rtoinfo->srto_assoc_id,
+	             error))
+		return STATUS_ERR;
 	if (evaluate(in_rtoinfo->srto_initial,
 	             &out_rtoinfo->srto_initial,
 	             error))
@@ -838,6 +901,34 @@ static int evaluate_sctp_initmsg_expression(struct expression *in,
 	return STATUS_OK;
 }
 
+static int evaluate_sctp_hmacalgo_expression(struct expression *in,
+					     struct expression *out,
+					     char **error)
+{
+	struct sctp_hmacalgo_expr *in_hmac;
+	struct sctp_hmacalgo_expr *out_hmac;
+
+	assert(in->type == EXPR_SCTP_HMACALGO);
+	assert(in->value.sctp_hmacalgo);
+	assert(out->type == EXPR_SCTP_HMACALGO);
+
+	out->value.sctp_hmacalgo = calloc(1, sizeof(struct sctp_hmacalgo_expr));
+
+	in_hmac = in->value.sctp_hmacalgo;
+	out_hmac = out->value.sctp_hmacalgo;
+
+	if (evaluate(in_hmac->shmac_number_of_idents,
+	             &out_hmac->shmac_number_of_idents,
+	             error))
+		return STATUS_ERR;
+	if (evaluate(in_hmac->shmac_idents,
+	             &out_hmac->shmac_idents,
+	             error))
+		return STATUS_ERR;
+
+	return STATUS_OK;
+}
+
 static int evaluate_sctp_assoc_value_expression(struct expression *in,
 						struct expression *out,
 						char **error)
@@ -854,6 +945,10 @@ static int evaluate_sctp_assoc_value_expression(struct expression *in,
 	in_value = in->value.sctp_assoc_value;
 	out_value = out->value.sctp_assoc_value;
 
+	if (evaluate(in_value->assoc_id,
+	             &out_value->assoc_id,
+	             error))
+		return STATUS_ERR;
 	if (evaluate(in_value->assoc_value,
 	             &out_value->assoc_value,
 	             error))
@@ -862,6 +957,33 @@ static int evaluate_sctp_assoc_value_expression(struct expression *in,
 	return STATUS_OK;
 }
 
+static int evaluate_sctp_authkeyid_expression(struct expression *in,
+					      struct expression *out,
+					      char **error)
+{
+	struct sctp_authkeyid_expr *in_authkeyid;
+	struct sctp_authkeyid_expr *out_authkeyid;
+
+	assert(in->type == EXPR_SCTP_AUTHKEYID);
+	assert(in->value.sctp_authkeyid);
+	assert(out->type == EXPR_SCTP_AUTHKEYID);
+
+	out->value.sctp_authkeyid = calloc(1, sizeof(struct sctp_authkeyid_expr));
+
+	in_authkeyid = in->value.sctp_authkeyid;
+	out_authkeyid = out->value.sctp_authkeyid;
+
+	if (evaluate(in_authkeyid->scact_assoc_id,
+		     &out_authkeyid->scact_assoc_id,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_authkeyid->scact_keynumber,
+		     &out_authkeyid->scact_keynumber,
+		     error))
+		return STATUS_ERR;
+	return STATUS_OK;
+}
+
 static int evaluate_sctp_sack_info_expression(struct expression *in,
 					    struct expression *out,
 					    char **error)
@@ -878,6 +1000,10 @@ static int evaluate_sctp_sack_info_expression(struct expression *in,
 	in_sack_info = in->value.sctp_sack_info;
 	out_sack_info = out->value.sctp_sack_info;
 
+	if (evaluate(in_sack_info->sack_assoc_id,
+		     &out_sack_info->sack_assoc_id,
+		     error))
+		return STATUS_ERR;
 	if (evaluate(in_sack_info->sack_delay,
 		     &out_sack_info->sack_delay,
 		     error))
@@ -906,6 +1032,10 @@ static int evaluate_sctp_paddrinfo_expression(struct expression *in,
 	in_paddrinfo = in->value.sctp_paddrinfo;
 	out_paddrinfo = out->value.sctp_paddrinfo;
 
+	if (evaluate(in_paddrinfo->spinfo_assoc_id,
+	             &out_paddrinfo->spinfo_assoc_id,
+	             error))
+		return STATUS_ERR;
 	if (evaluate(in_paddrinfo->spinfo_address,
 	             &out_paddrinfo->spinfo_address,
 	             error))
@@ -950,6 +1080,10 @@ static int evaluate_sctp_status_expression(struct expression *in,
 	in_status = in->value.sctp_status;
 	out_status = out->value.sctp_status;
 
+	if (evaluate(in_status->sstat_assoc_id,
+	             &out_status->sstat_assoc_id,
+	             error))
+		return STATUS_ERR;
 	if (evaluate(in_status->sstat_state,
 	             &out_status->sstat_state,
 	             error))
@@ -1001,6 +1135,10 @@ static int evaluate_sctp_peer_addr_param_expression(struct expression *in,
 	in_paddrparams = in->value.sctp_paddrparams;
 	out_paddrparams = out->value.sctp_paddrparams;
 
+	if (evaluate(in_paddrparams->spp_assoc_id,
+	             &out_paddrparams->spp_assoc_id,
+	             error))
+		return STATUS_ERR;
 	if (evaluate(in_paddrparams->spp_address,
 	             &out_paddrparams->spp_address,
 	             error))
@@ -1076,6 +1214,10 @@ static int evaluate_sctp_event_expression(struct expression *in,
 	in_event = in->value.sctp_event;
 	out_event = out->value.sctp_event;
 
+	if (evaluate(in_event->se_assoc_id,
+		    &out_event->se_assoc_id,
+		    error))
+		return STATUS_ERR;
 	if (evaluate(in_event->se_type,
 		    &out_event->se_type,
 		    error))
@@ -1164,6 +1306,10 @@ static int evaluate_sctp_accocparams_expression(struct expression *in,
 	in_params = in->value.sctp_assocparams;
 	out_params = out->value.sctp_assocparams;
 
+	if (evaluate(in_params->sasoc_assoc_id,
+		     &out_params->sasoc_assoc_id,
+		     error))
+		return STATUS_ERR;
 	if (evaluate(in_params->sasoc_asocmaxrxt,
 		     &out_params->sasoc_asocmaxrxt,
 		     error))
@@ -1227,6 +1373,34 @@ static int evaluate_sctp_sndinfo_expression(struct expression *in,
 	return STATUS_OK;
 }
 
+static int evaluate_sctp_setprim_expression(struct expression *in,
+					    struct expression *out,
+					    char **error)
+{
+        struct sctp_setprim_expr *in_prim;
+        struct sctp_setprim_expr *out_prim;
+
+        assert(in->type == EXPR_SCTP_SETPRIM);
+        assert(in->value.sctp_setprim);
+        assert(out->type == EXPR_SCTP_SETPRIM);
+
+        out->value.sctp_setprim = calloc(1, sizeof(struct sctp_setprim_expr));
+                     
+        in_prim = in->value.sctp_setprim;
+        out_prim = out->value.sctp_setprim;
+                     
+        if (evaluate(in_prim->ssp_assoc_id,
+		     &out_prim->ssp_assoc_id,
+		     error))
+		return STATUS_ERR;
+        if (evaluate(in_prim->ssp_addr,
+		     &out_prim->ssp_addr,
+		     error))
+		return STATUS_ERR;
+
+	return STATUS_OK;
+}
+
 static int evaluate_sctp_setadaptation_expression(struct expression *in,
 						  struct expression *out,
 						  char **error)
@@ -1335,6 +1509,38 @@ static int evaluate_sctp_prinfo_expression(struct expression *in,
 	return STATUS_OK;	
 }
 
+static int evaluate_sctp_default_prinfo_expression(struct expression *in,
+						   struct expression *out,
+						   char **error)
+{
+        struct sctp_default_prinfo_expr *in_info;
+        struct sctp_default_prinfo_expr *out_info;
+
+        assert(in->type == EXPR_SCTP_DEFAULT_PRINFO);
+        assert(in->value.sctp_default_prinfo);
+        assert(out->type == EXPR_SCTP_DEFAULT_PRINFO);
+
+        out->value.sctp_default_prinfo = calloc(1, sizeof(struct sctp_default_prinfo_expr));
+                     
+        in_info = in->value.sctp_default_prinfo;
+        out_info = out->value.sctp_default_prinfo;
+                     
+        if (evaluate(in_info->pr_policy,
+		     &out_info->pr_policy,
+		     error))
+		return STATUS_ERR;
+        if (evaluate(in_info->pr_value,
+		     &out_info->pr_value,
+		     error))
+		return STATUS_ERR;
+        if (evaluate(in_info->pr_assoc_id,
+		     &out_info->pr_assoc_id,
+		     error))
+		return STATUS_ERR;
+
+	return STATUS_OK;	
+}
+
 static int evaluate_sctp_authinfo_expression(struct expression *in,
 					     struct expression *out,
 					     char **error)
@@ -1737,6 +1943,10 @@ static int evaluate_sctp_shutdown_event_expression(struct expression *in,
 		     &out_event->sse_length,
 		     error))
 		return STATUS_ERR;
+	if (evaluate(in_event->sse_assoc_id,
+		     &out_event->sse_assoc_id,
+		     error))
+		return STATUS_ERR;
 
 	return STATUS_OK;
 }
@@ -2064,6 +2274,150 @@ static int evaluate_sctp_extrcvinfo_expression(struct expression *in,
 	return STATUS_OK;
 }
 
+static int evaluate_sctp_assoc_ids_expression(struct expression *in,
+					      struct expression *out,
+					      char **error)
+{
+	struct sctp_assoc_ids_expr *in_ids;
+	struct sctp_assoc_ids_expr *out_ids;
+
+	assert(in->type == EXPR_SCTP_ASSOC_IDS);
+	assert(in->value.sctp_assoc_ids);
+	assert(out->type == EXPR_SCTP_ASSOC_IDS);
+
+	out->value.sctp_assoc_ids = calloc(1, sizeof(struct sctp_assoc_ids_expr));
+
+	in_ids = in->value.sctp_assoc_ids;
+	out_ids = out->value.sctp_assoc_ids;
+
+	if (evaluate(in_ids->gaids_number_of_ids,
+		     &out_ids->gaids_number_of_ids,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_ids->gaids_assoc_id,
+		     &out_ids->gaids_assoc_id,
+		     error))
+		return STATUS_ERR;
+	return STATUS_OK;
+}
+
+static int evaluate_sctp_authchunks_expression(struct expression *in,
+					       struct expression *out,
+					       char **error)
+{
+	struct sctp_authchunks_expr *in_chunks;
+	struct sctp_authchunks_expr *out_chunks;
+
+	assert(in->type == EXPR_SCTP_AUTHCHUNKS);
+	assert(in->value.sctp_authchunks);
+	assert(out->type == EXPR_SCTP_AUTHCHUNKS);
+
+	out->value.sctp_authchunks = calloc(1, sizeof(struct sctp_authchunks_expr));
+
+	in_chunks = in->value.sctp_authchunks;
+	out_chunks = out->value.sctp_authchunks;
+
+	if (evaluate(in_chunks->gauth_assoc_id,
+		     &out_chunks->gauth_assoc_id,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_chunks->gauth_number_of_chunks,
+		     &out_chunks->gauth_number_of_chunks,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_chunks->gauth_chunks,
+		     &out_chunks->gauth_chunks,
+		     error))
+		return STATUS_ERR;
+	return STATUS_OK;
+}
+
+static int evaluate_sctp_setpeerprim_expression(struct expression *in,
+					        struct expression *out,
+					        char **error)
+{
+	struct sctp_setpeerprim_expr *in_sspp;
+	struct sctp_setpeerprim_expr *out_sspp;
+
+	assert(in->type == EXPR_SCTP_SETPEERPRIM);
+	assert(in->value.sctp_setpeerprim);
+	assert(out->type == EXPR_SCTP_SETPEERPRIM);
+
+	out->value.sctp_setpeerprim = calloc(1, sizeof(struct sctp_setpeerprim_expr));
+
+	in_sspp = in->value.sctp_setpeerprim;
+	out_sspp = out->value.sctp_setpeerprim;
+
+	if (evaluate(in_sspp->sspp_assoc_id,
+		     &out_sspp->sspp_assoc_id,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_sspp->sspp_addr,
+		     &out_sspp->sspp_addr,
+		     error))
+		return STATUS_ERR;
+	return STATUS_OK;
+}
+
+static int evaluate_sctp_authchunk_expression(struct expression *in,
+					      struct expression *out,
+					      char **error)
+{
+	struct sctp_authchunk_expr *in_authchunk;
+	struct sctp_authchunk_expr *out_authchunk;
+
+	assert(in->type == EXPR_SCTP_AUTHCHUNK);
+	assert(in->value.sctp_authchunk);
+	assert(out->type == EXPR_SCTP_AUTHCHUNK);
+
+	out->value.sctp_authchunk = calloc(1, sizeof(struct sctp_authchunk_expr));
+
+	in_authchunk = in->value.sctp_authchunk;
+	out_authchunk = out->value.sctp_authchunk;
+
+	if (evaluate(in_authchunk->sauth_chunk,
+		     &out_authchunk->sauth_chunk,
+		     error))
+		return STATUS_ERR;
+	return STATUS_OK;
+}
+
+static int evaluate_sctp_authkey_expression(struct expression *in,
+					    struct expression *out,
+					    char **error)
+{
+	struct sctp_authkey_expr *in_authkey;
+	struct sctp_authkey_expr *out_authkey;
+
+	assert(in->type == EXPR_SCTP_AUTHKEY);
+	assert(in->value.sctp_authkey);
+	assert(out->type == EXPR_SCTP_AUTHKEY);
+
+	out->value.sctp_authkey = calloc(1, sizeof(struct sctp_authkey_expr));
+
+	in_authkey = in->value.sctp_authkey;
+	out_authkey = out->value.sctp_authkey;
+
+	if (evaluate(in_authkey->sca_assoc_id,
+		     &out_authkey->sca_assoc_id,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_authkey->sca_keynumber,
+		     &out_authkey->sca_keynumber,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_authkey->sca_keylength,
+		     &out_authkey->sca_keylength,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_authkey->sca_key,
+		     &out_authkey->sca_key,
+		     error))
+		return STATUS_ERR;
+
+	return STATUS_OK;
+}
+
 static int evaluate(struct expression *in,
 		    struct expression **out_ptr, char **error)
 {
@@ -2095,12 +2449,18 @@ static int evaluate(struct expression *in,
 	case EXPR_SCTP_ASSOCPARAMS:
 		result = evaluate_sctp_accocparams_expression(in, out, error);
 		break;
+	case EXPR_SCTP_HMACALGO:
+		result = evaluate_sctp_hmacalgo_expression(in, out, error);
+		break;
 	case EXPR_SCTP_INITMSG:
 		result = evaluate_sctp_initmsg_expression(in, out, error);
 		break;
 	case EXPR_SCTP_ASSOC_VALUE:
 		result = evaluate_sctp_assoc_value_expression(in, out, error);
 		break;
+	case EXPR_SCTP_AUTHKEYID:
+		result = evaluate_sctp_authkeyid_expression(in, out, error);	
+		break;
 	case EXPR_SCTP_SACKINFO:
 		result = evaluate_sctp_sack_info_expression(in, out, error);	
 		break;
@@ -2125,6 +2485,9 @@ static int evaluate(struct expression *in,
 	case EXPR_SCTP_SNDINFO:
 		result = evaluate_sctp_sndinfo_expression(in, out, error);
 		break;
+	case EXPR_SCTP_SETPRIM:
+		result = evaluate_sctp_setprim_expression(in, out, error);
+		break;
 	case EXPR_SCTP_SETADAPTATION:
 		result = evaluate_sctp_setadaptation_expression(in, out, error);
 		break;
@@ -2134,6 +2497,9 @@ static int evaluate(struct expression *in,
 	case EXPR_SCTP_PRINFO:
 		result = evaluate_sctp_prinfo_expression(in, out, error);
 		break;
+	case EXPR_SCTP_DEFAULT_PRINFO:
+		result = evaluate_sctp_default_prinfo_expression(in, out, error);
+		break;
 	case EXPR_SCTP_AUTHINFO:
 		result = evaluate_sctp_authinfo_expression(in, out, error);
 		break;
@@ -2185,6 +2551,21 @@ static int evaluate(struct expression *in,
 	case EXPR_SCTP_EXTRCVINFO:
 		result = evaluate_sctp_extrcvinfo_expression(in, out, error);
 		break;
+	case EXPR_SCTP_ASSOC_IDS:
+		result = evaluate_sctp_assoc_ids_expression(in, out, error);
+		break;
+	case EXPR_SCTP_AUTHCHUNKS:
+		result = evaluate_sctp_authchunks_expression(in, out, error);
+		break;
+	case EXPR_SCTP_SETPEERPRIM:
+		result = evaluate_sctp_setpeerprim_expression(in, out, error);
+		break;
+	case EXPR_SCTP_AUTHCHUNK:
+		result = evaluate_sctp_authchunk_expression(in, out, error);
+		break;
+	case EXPR_SCTP_AUTHKEY:
+		result = evaluate_sctp_authkey_expression(in, out, error);
+		break;
 	case EXPR_WORD:
 		out->type = EXPR_INTEGER;
 		if (symbol_to_int(in->value.string,
diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h
index 00ab1b4b1c1be7cad8b2a3084b82cfb7f03d0888..6769d095c235523409f84915806502704ee57d23 100644
--- a/gtests/net/packetdrill/script.h
+++ b/gtests/net/packetdrill/script.h
@@ -50,6 +50,8 @@ enum expression_t {
 	EXPR_SCTP_RTOINFO,	  /* struct sctp_rtoinfo for SCTP_RTOINFO */
 	EXPR_SCTP_INITMSG,	  /* struct sctp_initmsg for SCTP_INITMSG */
 	EXPR_SCTP_ASSOC_VALUE,	  /* struct sctp_assoc_value */
+	EXPR_SCTP_HMACALGO,       /* expression tree for sctp_hmacalgo struct for [gs]etsockopt */
+	EXPR_SCTP_AUTHKEYID,      /* expression tree for sctp_authkeyid struct for [gs]etsockopt */
 	EXPR_SCTP_SACKINFO,	  /* struct sctp_sack_info_expr for */
 	EXPR_SCTP_STATUS,	  /* struct sctp_status for SCTP_STATUS */
 	EXPR_SCTP_PADDRINFO,
@@ -59,9 +61,11 @@ enum expression_t {
 	EXPR_SCTP_EVENT,	  /* struct sctp_event for SCTP_EVENT */
 	EXPR_SCTP_EVENT_SUBSCRIBE,/* struct sctp_event_subscribe for SCTP_EVENTS */
 	EXPR_SCTP_SNDINFO,	  /* struct sctp_sndinfo for SCTP_DEFAULT_SNDINFO */
+	EXPR_SCTP_SETPRIM,        /* expression tree for sctp_setprim SCTP_PRIMARY_ADDR */
 	EXPR_SCTP_SETADAPTATION,  /* struct sctp_setadaptation for SCTP_ADATTATION_LAYER */
 	EXPR_SCTP_SNDRCVINFO,     /* struct sctp_sndrcvinfo for syscall sctp_recvmsg */
 	EXPR_SCTP_PRINFO,	  /* struct sctp_prinfo for syscall sctp_sendv */
+	EXPR_SCTP_DEFAULT_PRINFO, /* expression tree for struct sctp_default_prinfo for syscall [gs]etsockopt */
 	EXPR_SCTP_AUTHINFO,	  /* struct sctp_authinfo for syscall sctp_sendv */
 	EXPR_SCTP_SENDV_SPA,	  /* struct sctp_sendv_spa for syscall sctp_sendv */
 	EXPR_SCTP_RCVINFO,        /* struct sctp_rcvinfo for syscall sctp_recvv */
@@ -79,6 +83,11 @@ enum expression_t {
 	EXPR_SCTP_SEND_FAILED_EVENT, /* expression tree for sctp_send_failed_event */
 	EXPR_SCTP_TLV,            /* expression tree for sctp_notifications_stopped_event */
 	EXPR_SCTP_EXTRCVINFO,     /* expression tree for sctp_extrcvinfo struct in cmsghdr */
+	EXPR_SCTP_ASSOC_IDS,      /* expression tree for sctp_assoc_ids struct for [gs]etsockopt */
+	EXPR_SCTP_AUTHCHUNKS,     /* expression tree for sctp_authchunks struct for [gs]etsockopt */
+	EXPR_SCTP_SETPEERPRIM,    /* expression tree for sctp_setpeerprim struct for [gs]etsockopt */
+	EXPR_SCTP_AUTHCHUNK,      /* expression tree for sctp_authchunk struct for setsockopt */
+	EXPR_SCTP_AUTHKEY,        /* expression tree for sctp_authkey struct for setsockopt */
 	NUM_EXPR_TYPES,
 };
 /* Convert an expression type to a human-readable string */
@@ -101,7 +110,9 @@ struct expression {
 		struct pollfd_expr *pollfd;
 		struct sctp_rtoinfo_expr *sctp_rtoinfo;
 		struct sctp_initmsg_expr *sctp_initmsg;
+		struct sctp_hmacalgo_expr *sctp_hmacalgo;
 		struct sctp_assoc_value_expr *sctp_assoc_value;
+		struct sctp_authkeyid_expr *sctp_authkeyid;
 		struct sctp_sack_info_expr *sctp_sack_info;
 		struct sctp_status_expr *sctp_status;
 		struct sctp_paddrinfo_expr *sctp_paddrinfo;
@@ -111,9 +122,11 @@ struct expression {
 		struct sctp_event_expr *sctp_event;
 		struct sctp_event_subscribe_expr *sctp_event_subscribe;
 		struct sctp_sndinfo_expr *sctp_sndinfo;
+		struct sctp_setprim_expr *sctp_setprim;
 		struct sctp_setadaptation_expr *sctp_setadaptation;
 		struct sctp_sndrcvinfo_expr *sctp_sndrcvinfo;
 		struct sctp_prinfo_expr *sctp_prinfo;
+		struct sctp_default_prinfo_expr *sctp_default_prinfo;
 		struct sctp_authinfo_expr *sctp_authinfo;
 		struct sctp_sendv_spa_expr *sctp_sendv_spa;
 		struct sctp_rcvinfo_expr *sctp_rcvinfo;
@@ -131,6 +144,11 @@ struct expression {
 		struct sctp_send_failed_event_expr *sctp_send_failed_event;
 		struct sctp_tlv_expr *sctp_tlv;
 		struct sctp_extrcvinfo_expr *sctp_extrcvinfo;
+		struct sctp_assoc_ids_expr *sctp_assoc_ids;
+		struct sctp_authchunks_expr *sctp_authchunks;
+		struct sctp_setpeerprim_expr *sctp_setpeerprim;
+		struct sctp_authchunk_expr *sctp_authchunk;
+		struct sctp_authkey_expr *sctp_authkey;
 	} value;
 	const char *format;	/* the printf format for printing the value */
 };
@@ -190,6 +208,7 @@ struct linger_expr {
 
 /* Parse tree for a sctp_rtoinfo struct in a [gs]etsockopt syscall. */
 struct sctp_rtoinfo_expr {
+	struct expression *srto_assoc_id;
 	struct expression *srto_initial;
 	struct expression *srto_max;
 	struct expression *srto_min;
@@ -203,8 +222,15 @@ struct sctp_initmsg_expr {
 	struct expression *sinit_max_init_timeo;
 };
 
+/* Parse tree for a sctp_hmacalgo struct in a [gs]etsockopt syscall. */
+struct sctp_hmacalgo_expr {
+	struct expression *shmac_number_of_idents;
+	struct expression *shmac_idents;
+};
+
 /* Parse tree for a sctp_assoc_value struct in a [gs]etsockopt syscall. */
 struct sctp_assoc_value_expr {
+	struct expression *assoc_id;
 	struct expression *assoc_value;
 };
 
@@ -214,14 +240,22 @@ struct sctp_stream_value_expr {
 	struct expression *stream_value;
 };
 
+/* Parse tree for a sctp_authkey struct in a [gs]etsockopt syscall. */
+struct sctp_authkeyid_expr {
+	struct expression *scact_assoc_id;
+	struct expression *scact_keynumber;
+};
+
 /* Parse tree for a sctp_sack_info struct in a [gs]etsockopt syscall. */
 struct sctp_sack_info_expr {
+	struct expression *sack_assoc_id;
 	struct expression *sack_delay;
 	struct expression *sack_freq;
 };
 
 /* Parse tree for a sctp_status struct in a [gs]etsockopt syscall. */
 struct sctp_status_expr {
+	struct expression *sstat_assoc_id;
 	struct expression *sstat_state;
 	struct expression *sstat_rwnd;
 	struct expression *sstat_unackdata;
@@ -234,6 +268,7 @@ struct sctp_status_expr {
 
 /* Parse tree for a sctp_paddrinfo struct in a [gs]etsockopt syscall. */
 struct sctp_paddrinfo_expr {
+	struct expression *spinfo_assoc_id;
 	struct expression *spinfo_address;
 	struct expression *spinfo_state;
 	struct expression *spinfo_cwnd;
@@ -244,6 +279,7 @@ struct sctp_paddrinfo_expr {
 
 /* Parse tree for a sctp_paddrparams struct in a [gs]etsockopt syscall. */
 struct sctp_paddrparams_expr {
+	struct expression *spp_assoc_id;
 	struct expression *spp_address;
 	struct expression *spp_hbinterval;
 	struct expression *spp_pathmaxrxt;
@@ -255,6 +291,7 @@ struct sctp_paddrparams_expr {
 
 /* Parse tree for sctp_assocparams struct in [gs]etsockopt syscall. */
 struct sctp_assocparams_expr {
+	struct expression *sasoc_assoc_id;
 	struct expression *sasoc_asocmaxrxt;
 	struct expression *sasoc_number_peer_destinations;
 	struct expression *sasoc_peer_rwnd;
@@ -264,6 +301,7 @@ struct sctp_assocparams_expr {
 
 /* Parse tree for sctp_event struct in [gs]etsockopt syscall. */
 struct sctp_event_expr {
+	struct expression *se_assoc_id;
 	struct expression *se_type;
 	struct expression *se_on;
 };
@@ -291,6 +329,12 @@ struct sctp_sndinfo_expr {
 	struct expression *snd_assoc_id;
 };
 
+/* Parse tree for sctp_setadaptation struct in [gs]etsockopt syscall. */
+struct sctp_setprim_expr {
+	struct expression *ssp_assoc_id;
+	struct expression *ssp_addr;
+};
+
 /* Parse tree for sctp_setadaptation struct in [gs]etsockopt syscall. */
 struct sctp_setadaptation_expr {
 	struct expression *ssb_adaptation_ind;
@@ -315,6 +359,13 @@ struct sctp_prinfo_expr {
 	struct expression *pr_value;
 };
 
+/* Parse tree for sctp_default_prinfo in [gs]etsockopt syscall. */
+struct sctp_default_prinfo_expr {
+	struct expression *pr_policy;
+	struct expression *pr_value;
+	struct expression *pr_assoc_id;
+};
+
 /* Parse tree for sctp_authinfo in sctp_sendv syscall. */
 struct sctp_authinfo_expr {
 	struct expression *auth_keynumber;
@@ -405,6 +456,7 @@ struct sctp_shutdown_event_expr {
 	struct expression *sse_type;
 	struct expression *sse_flags;
 	struct expression *sse_length;
+	struct expression *sse_assoc_id;
 };
 
 /* Parse tree for sctp_adaptation_event for notifications. */
@@ -481,6 +533,38 @@ struct sctp_extrcvinfo_expr {
 	struct expression *sinfo_assoc_id;
 };
 
+/* Parse tree for sctp_extrcvinfo struct for [gs]etsockopt. */
+struct sctp_assoc_ids_expr {
+	struct expression *gaids_number_of_ids;
+	struct expression *gaids_assoc_id;
+};
+
+/* Parse tree for sctp_authchunks struct for [gs]etsockopt. */
+struct sctp_authchunks_expr {
+	struct expression *gauth_assoc_id;
+	struct expression *gauth_number_of_chunks;
+	struct expression *gauth_chunks;
+};
+
+/* Parse tree for sctp_setpeerprim struct for [gs]etsockopt. */
+struct sctp_setpeerprim_expr {
+	struct expression *sspp_assoc_id;
+	struct expression *sspp_addr;
+};
+
+/* Parse tree for sctp_authchunk struct for setsockopt. */
+struct sctp_authchunk_expr {
+	struct expression *sauth_chunk;
+};
+
+/* Parse tree for sctp_authkey struct for setsockopt. */
+struct sctp_authkey_expr {
+	struct expression *sca_assoc_id;
+	struct expression *sca_keynumber;
+	struct expression *sca_keylength;
+	struct expression *sca_key;
+};
+
 /* The errno-related info from strace to summarize a system call error */
 struct errno_spec {
 	const char *errno_macro;	/* errno symbol (C macro name) */
diff --git a/gtests/net/packetdrill/symbols_freebsd.c b/gtests/net/packetdrill/symbols_freebsd.c
index a3adfe351b873ca8a1ef0b973b198922e7852b75..3d245a68dfe9f0aff27794814ad55e638c4692f0 100644
--- a/gtests/net/packetdrill/symbols_freebsd.c
+++ b/gtests/net/packetdrill/symbols_freebsd.c
@@ -84,17 +84,40 @@ struct int_symbol platform_symbols_table[] = {
 	{ SCTP_INITMSG,                     "SCTP_INITMSG"                    },
 	{ SCTP_INIT,                        "SCTP_INIT"                       },
 	{ SCTP_NODELAY,                     "SCTP_NODELAY"                    },
+	{ SCTP_AUTOCLOSE,                   "SCTP_AUTOCLOSE"                  },
+	{ SCTP_PRIMARY_ADDR,                "SCTP_PRIMARY_ADDR"               },
 	{ SCTP_ADAPTATION_LAYER,            "SCTP_ADAPTATION_LAYER"           },
+	{ SCTP_DISABLE_FRAGMENTS,           "SCTP_DISABLE_FRAGMENTS"          },
+	{ SCTP_DEFAULT_SEND_PARAM,          "SCTP_DEFAULT_SEND_PARAM"         },
+	{ SCTP_I_WANT_MAPPED_V4_ADDR,       "SCTP_I_WANT_MAPPED_V4_ADDR"      },
 	{ SCTP_MAXSEG,                      "SCTP_MAXSEG"                     },
+	{ SCTP_HMAC_IDENT,                  "SCTP_HMAC_IDENT"                 },
+	{ SCTP_AUTH_ACTIVE_KEY,             "SCTP_AUTH_ACTIVE_KEY"            },
 	{ SCTP_DELAYED_SACK,                "SCTP_DELAYED_SACK"               },
+	{ SCTP_PARTIAL_DELIVERY_POINT,      "SCTP_PARTIAL_DELIVERY_POINT"     },
+	{ SCTP_AUTO_ASCONF,                 "SCTP_AUTO_ASCONF"                },
 	{ SCTP_MAX_BURST,                   "SCTP_MAX_BURST"                  },
+	{ SCTP_CONTEXT,                     "SCTP_CONTEXT"                    },
 	{ SCTP_PEER_ADDR_PARAMS,            "SCTP_PEER_ADDR_PARAMS"           },
 	{ SCTP_EVENT,                       "SCTP_EVENT"                      },
+	{ SCTP_EXPLICIT_EOR,                "SCTP_EXPLICIT_EOR"               },
+	{ SCTP_REUSE_PORT,                  "SCTP_REUSE_PORT"                 },
 	{ SCTP_EVENTS,                      "SCTP_EVENTS"                     },
 	{ SCTP_DEFAULT_SNDINFO,             "SCTP_DEFAULT_SNDINFO"            },
+	{ SCTP_DEFAULT_PRINFO,              "SCTP_DEFAULT_PRINFO"             },
 	{ SCTP_STATUS,                      "SCTP_STATUS"                     },
 	{ SCTP_GET_PEER_ADDR_INFO,          "SCTP_GET_PEER_ADDR_INFO"         },
+	{ SCTP_PEER_AUTH_CHUNKS,            "SCTP_PEER_AUTH_CHUNKS"           },
+	{ SCTP_LOCAL_AUTH_CHUNKS,           "SCTP_LOCAL_AUTH_CHUNKS"          },
+	{ SCTP_GET_ASSOC_NUMBER,            "SCTP_GET_ASSOC_NUMBER"           },
+	{ SCTP_GET_ASSOC_ID_LIST,           "SCTP_GET_ASSOC_ID_LIST"          },
+	{ SCTP_SET_PEER_PRIMARY_ADDR,       "SCTP_SET_PEER_PRIMARY_ADDR"      },
+	{ SCTP_AUTH_CHUNK,                  "SCTP_AUTH_CHUNK"                 },
+	{ SCTP_AUTH_KEY,                    "SCTP_AUTH_KEY"                   },
+	{ SCTP_AUTH_DEACTIVATE_KEY,         "SCTP_AUTH_DEACTIVATE_KEY"        },
+	{ SCTP_AUTH_DELETE_KEY,             "SCTP_AUTH_DELETE_KEY"            },
 	{ SCTP_FRAGMENT_INTERLEAVE,         "SCTP_FRAGMENT_INTERLEAVE"        },
+	{ SCTP_EXPLICIT_EOR,                "SCTP_EXPLICIT_EOR"               },
 #if defined(SCTP_INTERLEAVING_SUPPORTED)
 	{ SCTP_INTERLEAVING_SUPPORTED,      "SCTP_INTERLEAVING_SUPPORTED"     },
 #endif
@@ -239,6 +262,8 @@ struct int_symbol platform_symbols_table[] = {
 	{ SCTP_DSTADDRV6,                   "SCTP_DSTADDRV6"                  },
 	{ SCTP_EXTRCV,                      "SCTP_EXTRCV"                     },
 	{ SCTP_USE_EXT_RCVINFO,             "SCTP_USE_EXT_RCVINFO"            },
+	{ SCTP_AUTH_HMAC_ID_SHA1,           "SCTP_AUTH_HMAC_ID_SHA1"          },
+	{ SCTP_AUTH_HMAC_ID_SHA256,         "SCTP_AUTH_HMAC_ID_SHA256"        },
 	/* /usr/include/netinet/tcp.h */
 	{ TCP_NODELAY,                      "TCP_NODELAY"                     },
 	{ TCP_MAXSEG,                       "TCP_MAXSEG"                      },
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..bf44947527a16a98c19550410182fff1011606e2
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg.pkt
@@ -0,0 +1,168 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//recvmsg(sd, msghdr, flags)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
+                {spp_assoc_id=0,
+		 spp_address=...,
+                 spp_hbinterval=0,
+                 spp_pathmaxrxt=8,
+                 spp_pathmtu=1468,
+                 spp_flags=SPP_HB_DISABLE,
+                 spp_ipv6_flowlabel=0,
+                 spp_dscp=0}, 152) = 0
+//base test
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=2, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(40)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=0,
+                                              rcv_flags=SCTP_UNORDERED,
+                                              rcv_ppid=htonl(0),
+                                              rcv_tsn=2,
+                                              rcv_cumtsn=2,
+                                              rcv_context=0,
+                                              rcv_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=3, sid=0, ssn=1, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=4, sid=0, ssn=2, ppid=1234]
+*    > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(28)=[{cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data={nxt_sid=0,
+                                              nxt_flags=SCTP_COMPLETE,
+                                              nxt_ppid=htonl(1234),
+                                              nxt_length=1000,
+                                              nxt_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=5, sid=0, ssn=0, ppid=9876]
+*    > sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(68)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=2,
+                                              rcv_flags=0,
+                                              rcv_ppid=htonl(1234),
+                                              rcv_tsn=4,
+                                              rcv_cumtsn=5,
+                                              rcv_context=0,
+                                              rcv_assoc_id=...}},
+                                  {cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data= {nxt_sid=0,
+                                               nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE,
+                                               nxt_ppid=htonl(9876),
+                                               nxt_length=1000,
+                                               nxt_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1,
+                                               sctp_association_event=0,
+                                               sctp_address_event=0,
+                                               sctp_send_failure_event=0,
+                                               sctp_peer_error_event=0,
+                                               sctp_shutdown_event=0,
+                                               sctp_partial_delivery_event=0,
+                                               sctp_adaptation_layer_event=0,
+                                               sctp_authentication_event=0,
+                                               sctp_sender_dry_event=0}, 11) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [0], 4) = 0
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_SNDRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=0,
+                                               sinfo_flags=SCTP_UNORDERED,
+                                               sinfo_ppid=htonl(9876),
+                                               sinfo_context=0,
+                                               sinfo_timetolive=0,
+                                               sinfo_tsn=5,
+                                               sinfo_cumtsn=5,
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=6, sid=0, ssn=3, ppid=9877]
+*    > sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_EXTRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=3,
+                                               sinfo_flags=0,
+                                               sinfo_ppid=htonl(9877),
+                                               sinfo_context=0,
+                                               sinfo_pr_value=0,
+                                               sinfo_tsn=6,
+                                               sinfo_cumtsn=6,
+                                               serinfo_next_flags=0,
+                                               serinfo_next_stream=0,
+                                               serinfo_next_aid=0,
+                                               serinfo_next_length=0,
+                                               serinfo_next_ppid=htonl(0),
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=7, sid=0, ssn=4, ppid=9878]
+*    > sctp: SACK[flgs=0, cum_tsn=7, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=8, sid=1, ssn=0, ppid=9879]
+*    > sctp: SACK[flgs=0, cum_tsn=8, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_EXTRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=4,
+                                               sinfo_flags=0,
+                                               sinfo_ppid=htonl(9878),
+                                               sinfo_context=0,
+                                               sinfo_pr_value=0,
+                                               sinfo_tsn=7,
+                                               sinfo_cumtsn=8,
+                                               serinfo_next_flags=SCTP_NEXT_MSG_AVAIL|SCTP_NEXT_MSG_ISCOMPLETE|SCTP_NEXT_MSG_IS_UNORDERED,
+                                               serinfo_next_stream=1,
+                                               serinfo_next_aid=...,
+                                               serinfo_next_length=1000,
+                                               serinfo_next_ppid=htonl(9879),
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_extrcv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_extrcv.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..3609bc3178d1483ed66ca38296cf41326b284f91
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_extrcv.pkt
@@ -0,0 +1,108 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
+                {spp_assoc_id=0,
+		 spp_address=...,
+                 spp_hbinterval=0,
+                 spp_pathmaxrxt=8,
+                 spp_pathmtu=1468,
+                 spp_flags=SPP_HB_DISABLE,
+                 spp_ipv6_flowlabel=0,
+                 spp_dscp=0}, 152) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1,
+                                               sctp_association_event=0,
+                                               sctp_address_event=0,
+                                               sctp_send_failure_event=0,
+                                               sctp_peer_error_event=0,
+                                               sctp_shutdown_event=0,
+                                               sctp_partial_delivery_event=0,
+                                               sctp_adaptation_layer_event=0,
+                                               sctp_authentication_event=0,
+                                               sctp_sender_dry_event=0}, 11) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], 4) = 0
+
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=9877]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_EXTRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=0,
+                                               sinfo_flags=0,
+                                               sinfo_ppid=htonl(9877),
+                                               sinfo_context=0,
+                                               sinfo_pr_value=0,
+                                               sinfo_tsn=1,
+                                               sinfo_cumtsn=1,
+                                               serinfo_next_flags=0,
+                                               serinfo_next_stream=0,
+                                               serinfo_next_aid=0,
+                                               serinfo_next_length=0,
+                                               serinfo_next_ppid=htonl(0),
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=2, sid=0, ssn=1, ppid=9878]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=3, sid=1, ssn=0, ppid=9879]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_EXTRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=1,
+                                               sinfo_flags=0,
+                                               sinfo_ppid=htonl(9878),
+                                               sinfo_context=0,
+                                               sinfo_pr_value=0,
+                                               sinfo_tsn=2,
+                                               sinfo_cumtsn=3,
+                                               serinfo_next_flags=SCTP_NEXT_MSG_AVAIL|SCTP_NEXT_MSG_ISCOMPLETE|SCTP_NEXT_MSG_IS_UNORDERED,
+                                               serinfo_next_stream=1,
+                                               serinfo_next_aid=...,
+                                               serinfo_next_length=1000,
+                                               serinfo_next_ppid=htonl(9879),
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=4, sid=2, ssn=0, ppid=9880]
+*    > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_EXTRCV,
+                                    cmsg_data={sinfo_stream=1,
+                                               sinfo_ssn=0,
+                                               sinfo_flags=SCTP_UNORDERED,
+                                               sinfo_ppid=htonl(9879),
+                                               sinfo_context=0,
+                                               sinfo_pr_value=0,
+                                               sinfo_tsn=3,
+                                               sinfo_cumtsn=4,
+                                               serinfo_next_flags=SCTP_NEXT_MSG_AVAIL|SCTP_NEXT_MSG_ISCOMPLETE|SCTP_NEXT_MSG_IS_UNORDERED,
+                                               serinfo_next_stream=2,
+                                               serinfo_next_aid=...,
+                                               serinfo_next_length=1000,
+                                               serinfo_next_ppid=htonl(9880)}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_nxtinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_nxtinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..aaea9f59ae4bc3ba1f7a105d6cc79ba0f69ed211
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_nxtinfo.pkt
@@ -0,0 +1,93 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//recvmsg(sd, msghdr, flags)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
+                {spp_assoc_id=0,
+		 spp_address=...,
+                 spp_hbinterval=0,
+                 spp_pathmaxrxt=8,
+                 spp_pathmtu=1468,
+                 spp_flags=SPP_HB_DISABLE,
+                 spp_ipv6_flowlabel=0,
+                 spp_dscp=0}, 152) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=2, sid=0, ssn=1, ppid=1234]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(28)=[{cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data={nxt_sid=0,
+                                              nxt_flags=SCTP_COMPLETE,
+                                              nxt_ppid=htonl(1234),
+                                              nxt_length=1000,
+                                              nxt_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=3, sid=0, ssn=0, ppid=9876]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(68)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=1,
+                                              rcv_flags=0,
+                                              rcv_ppid=htonl(1234),
+                                              rcv_tsn=2,
+                                              rcv_cumtsn=3,
+                                              rcv_context=0,
+					      rcv_assoc_id=3}},
+                                  {cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data= {nxt_sid=0,
+                                               nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE,
+                                               nxt_ppid=htonl(9876),
+                                               nxt_length=1000,
+					       nxt_assoc_id=3}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=4, sid=0, ssn=0, ppid=9876]
+*    > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(68)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=0,
+                                              rcv_flags=SCTP_UNORDERED,
+                                              rcv_ppid=htonl(9876),
+                                              rcv_tsn=3,
+                                              rcv_cumtsn=4,
+                                              rcv_context=0}},
+                                  {cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data= {nxt_sid=0,
+                                               nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE,
+                                               nxt_ppid=htonl(9876),
+                                               nxt_length=1000}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_rcvinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_rcvinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..9d19a020045722901690e98a75f633cbd3979295
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_rcvinfo.pkt
@@ -0,0 +1,149 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//recvmsg(sd, msghdr, flags)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
+                {spp_assoc_id=0,
+		 spp_address=...,
+                 spp_hbinterval=0,
+                 spp_pathmaxrxt=8,
+                 spp_pathmtu=1468,
+                 spp_flags=SPP_HB_DISABLE,
+                 spp_ipv6_flowlabel=0,
+                 spp_dscp=0}, 152) = 0
+//base test
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=2, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(40)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=0,
+                                              rcv_flags=SCTP_UNORDERED,
+                                              rcv_ppid=htonl(0),
+                                              rcv_tsn=2,
+                                              rcv_cumtsn=2,
+                                              rcv_context=0,
+                                              rcv_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=3, sid=0, ssn=1, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=4, sid=0, ssn=2, ppid=1234]
+*    > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(28)=[{cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data={nxt_sid=0,
+                                              nxt_flags=SCTP_COMPLETE,
+                                              nxt_ppid=htonl(1234),
+                                              nxt_length=1000,
+                                              nxt_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=5, sid=0, ssn=0, ppid=9876]
+*    > sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(68)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=2,
+                                              rcv_flags=0,
+                                              rcv_ppid=htonl(1234),
+                                              rcv_tsn=4,
+                                              rcv_cumtsn=5,
+                                              rcv_context=0,
+                                              rcv_assoc_id=...}},
+                                  {cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data= {nxt_sid=0,
+                                               nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE,
+                                               nxt_ppid=htonl(9876),
+                                               nxt_length=1000,
+                                               nxt_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1,
+                                               sctp_association_event=0,
+                                               sctp_address_event=0,
+                                               sctp_send_failure_event=0,
+                                               sctp_peer_error_event=0,
+                                               sctp_shutdown_event=0,
+                                               sctp_partial_delivery_event=0,
+                                               sctp_adaptation_layer_event=0,
+                                               sctp_authentication_event=0,
+                                               sctp_sender_dry_event=0}, 11) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [0], 4) = 0
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_SNDRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=0,
+                                               sinfo_flags=SCTP_UNORDERED,
+                                               sinfo_ppid=htonl(9876),
+                                               sinfo_context=0,
+                                               sinfo_timetolive=0,
+                                               sinfo_tsn=5,
+                                               sinfo_cumtsn=5,
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                               sctp_association_event=0,
+                                               sctp_address_event=0,
+                                               sctp_send_failure_event=0,
+                                               sctp_peer_error_event=0,
+                                               sctp_shutdown_event=0,
+                                               sctp_partial_delivery_event=0,
+                                               sctp_adaptation_layer_event=0,
+                                               sctp_authentication_event=0,
+                                               sctp_sender_dry_event=0}, 11) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=6, sid=0, ssn=0, ppid=9876]
+*    > sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(40)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=0,
+                                              rcv_flags=SCTP_UNORDERED,
+                                              rcv_ppid=htonl(9876),
+                                              rcv_tsn=6,
+                                              rcv_cumtsn=6,
+                                              rcv_context=0}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_sndrcv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_sndrcv.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..3e1c7fc76ade256d3abffece9dd5def28b48a93f
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_sndrcv.pkt
@@ -0,0 +1,89 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//recvmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1,
+					       sctp_association_event=0,
+					       sctp_address_event=0,
+					       sctp_send_failure_event=0,
+					       sctp_peer_error_event=0,
+					       sctp_shutdown_event=0,
+					       sctp_partial_delivery_event=0,
+					       sctp_adaptation_layer_event=0,
+					       sctp_authentication_event=0,
+					       sctp_sender_dry_event=0}, 11) = 0
+
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
+                {spp_assoc_id=0,
+		 spp_address=...,
+                 spp_hbinterval=0,
+                 spp_pathmaxrxt=8,
+                 spp_pathmtu=1468,
+                 spp_flags=SPP_HB_DISABLE,
+                 spp_ipv6_flowlabel=0,
+                 spp_dscp=0}, 152) = 0
+
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=9877]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_SNDRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=0,
+                                               sinfo_flags=0,
+                                               sinfo_ppid=htonl(9877),
+                                               sinfo_context=0,
+                                               sinfo_timetolive=0,
+                                               sinfo_tsn=1,
+                                               sinfo_cumtsn=1,
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=2, sid=0, ssn=1, ppid=9878]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_SNDRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=1,
+                                               sinfo_flags=SCTP_UNORDERED,
+                                               sinfo_ppid=htonl(9878),
+                                               sinfo_context=0,
+                                               sinfo_timetolive=0,
+                                               sinfo_tsn=2,
+                                               sinfo_cumtsn=2,
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=3, sid=0, ssn=2, ppid=9879]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_SNDRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=2,
+                                               sinfo_flags=SCTP_UNORDERED,
+                                               sinfo_ppid=htonl(9879),
+                                               sinfo_context=0,
+                                               sinfo_timetolive=0,
+                                               sinfo_tsn=3,
+                                               sinfo_cumtsn=3}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..7dec990876a50acf1949cf4c9a10ea43c7510f4b
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg.pkt
@@ -0,0 +1,154 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(0)=[],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
+//base test
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(28)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(3),
+					      snd_context=2,
+					      snd_assoc_id=0}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=0, ppid=3]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
+// test with 2 cmsg
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(44)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(4),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=2, ssn=1, ppid=4]
++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
+
+// test with 2 cmsg
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(64)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(5),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}},
+				  {cmsg_len=18,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_PRINFO,
+				   cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=2, ssn=2, ppid=5]
++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]]
+
+// test with 4 cmsg
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(80)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(6),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}},
+				  {cmsg_len=18,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_PRINFO,
+				   cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}},
+			          {cmsg_len=14,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_AUTHINFO,
+				   cmsg_data={auth_keynumber=123}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=5, sid=2, ssn=3, ppid=6]
++0.0 < sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=1500, gaps=[], dups=[]]
+
+//test for sndrcvinfo
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(168)=[{cmsg_len=28,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDINFO,
+				    cmsg_data={snd_sid=2,
+					       snd_flags=0,
+					       snd_ppid=htonl(6),
+					       snd_context=2,
+					       snd_assoc_id=0}},
+				   {cmsg_len=140,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDRCV,
+				    cmsg_data={sinfo_stream=3,
+					       sinfo_ssn=3,
+					       sinfo_flags=0,
+					       sinfo_ppid=htonl(7),
+					       sinfo_context=0,
+					       sinfo_timetolive=0,
+					       sinfo_tsn=6,
+					       sinfo_cumtsn=6,
+					       sinfo_assoc_id=3}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=6, sid=3, ssn=0, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_authinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_authinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..73287130a3a050b27916cf1e786abff955ab266d
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_authinfo.pkt
@@ -0,0 +1,58 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(44)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(6),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+			          {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_AUTHINFO,
+				   cmsg_data={auth_keynumber=123}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=6]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(16)=[{cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_AUTHINFO,
+				   cmsg_data={auth_keynumber=123}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv4.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv4.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c298b1777c8c2c2a304873edaf5fc9431cb56b22
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv4.pkt
@@ -0,0 +1,62 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(16)=[{cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(44)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(5),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=0, ppid=5]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv6.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv6.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..60530f1f9ca496e6f85282a9c7123cd06257ea06
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv6.pkt
@@ -0,0 +1,62 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET6,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("2001:DB8::1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(16)=[{cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV6,
+				   cmsg_data={sa_family=AF_INET6,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("2001:DB8::1")}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(44)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(5),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV6,
+				   cmsg_data={sa_family=AF_INET6,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("2001:DB8::1")}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=0, ppid=5]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..d92e3f7ac26bde06922d8f6e75af91759c7e045a
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt
@@ -0,0 +1,36 @@
+--tolerance_usecs=100000
+
+0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(64)=[{cmsg_len=20,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_INIT,
+				   cmsg_data={sinit_num_ostreams=1,
+					      sinit_max_instreams=1,
+					      sinit_max_attempts=1,
+					      sinit_max_init_timeo=100}},
+				  {cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(1234),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}}], msg_flags=0}, 0) = 1000
+
+*    > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
+*    > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]; DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=1234]
++0.1 < sctp: COOKIE_ACK[flgs=0]; SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_prinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_prinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c4b32245c416cf9deea5da37838636cb601d4dc3
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_prinfo.pkt
@@ -0,0 +1,58 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(48)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(6),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=20,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_PRINFO,
+				   cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=6]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(20)=[{cmsg_len=20,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_PRINFO,
+				   cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b773b1b2b93f64f5e5013adabf46c4614560a4e1
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt
@@ -0,0 +1,87 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(28)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=1,
+					      snd_flags=0,
+					      snd_ppid=htonl(3),
+					      snd_context=2,
+					      snd_assoc_id=0}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=1, ssn=0, ppid=3]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(28)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=1,
+					      snd_flags=0,
+					      snd_ppid=htonl(3),
+					      snd_context=2,
+					      snd_assoc_id=...}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=1, ssn=1, ppid=3]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(28)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=3,
+					      snd_flags=0,
+					      snd_ppid=htonl(32),
+					      snd_context=2,
+					      snd_assoc_id=...}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=3, ssn=0, ppid=32]
++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(28)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=4,
+					      snd_flags=0,
+					      snd_ppid=htonl(33),
+					      snd_context=2}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=4, ssn=0, ppid=33]
++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]]
+
+
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..4485ccf4c78d65f6ef91b9977becefec768bef37
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt
@@ -0,0 +1,124 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(140)=[{cmsg_len=140,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDRCV,
+				    cmsg_data={sinfo_stream=3,
+					       sinfo_ssn=0,
+					       sinfo_flags=SCTP_SENDALL,
+					       sinfo_ppid=htonl(7),
+					       sinfo_context=0,
+					       sinfo_timetolive=0,
+					       sinfo_tsn=1,
+					       sinfo_cumtsn=1,
+					       sinfo_assoc_id=3}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
+//test for sndrcvinfo
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(168)=[{cmsg_len=28,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDINFO,
+				    cmsg_data={snd_sid=2,
+					       snd_flags=0,
+					       snd_ppid=htonl(6),
+					       snd_context=2,
+					       snd_assoc_id=0}},
+				   {cmsg_len=140,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDRCV,
+				    cmsg_data={sinfo_stream=3,
+					       sinfo_ssn=3,
+					       sinfo_flags=0,
+					       sinfo_ppid=htonl(7),
+					       sinfo_context=0,
+					       sinfo_timetolive=0,
+					       sinfo_tsn=3,
+					       sinfo_cumtsn=3,
+					       sinfo_assoc_id=3}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=3, ssn=1, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(168)=[{cmsg_len=28,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDINFO,
+				    cmsg_data={snd_sid=2,
+					       snd_flags=0,
+					       snd_ppid=htonl(6),
+					       snd_context=2,
+					       snd_assoc_id=0}},
+				   {cmsg_len=140,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDRCV,
+				    cmsg_data={sinfo_stream=3,
+					       sinfo_ssn=3,
+					       sinfo_flags=0,
+					       sinfo_ppid=htonl(7),
+					       sinfo_context=0,
+					       sinfo_timetolive=0,
+					       sinfo_tsn=...,
+					       sinfo_cumtsn=...,
+					       sinfo_assoc_id=3}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=3, ssn=2, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(168)=[{cmsg_len=28,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDINFO,
+				    cmsg_data={snd_sid=2,
+					       snd_flags=0,
+					       snd_ppid=htonl(6),
+					       snd_context=2}},
+				   {cmsg_len=140,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDRCV,
+				    cmsg_data={sinfo_stream=3,
+					       sinfo_ssn=3,
+					       sinfo_flags=0,
+					       sinfo_ppid=htonl(7),
+					       sinfo_context=0,
+					       sinfo_timetolive=0,
+					       sinfo_tsn=...,
+					       sinfo_cumtsn=...}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=3, ssn=3, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_adaptation_layer.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_adaptation_layer.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..145d3e6c49ac508a4bd85dae9853934b1b2460a1
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_adaptation_layer.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ADAPTATION_LAYER, {ssb_adaptation_ind=...}, [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ADAPTATION_LAYER, {ssb_adaptation_ind=2}, 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ADAPTATION_LAYER, {ssb_adaptation_ind=2}, [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_associnfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_associnfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..114342a01093f90f6f5068057fe3022b2b1984e8
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_associnfo.pkt
@@ -0,0 +1,55 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=...,
+						sasoc_asocmaxrxt=5,
+						sasoc_number_peer_destinations=3,
+						sasoc_peer_rwnd=1800,
+						sasoc_local_rwnd=2000,
+						sasoc_cookie_life=40000}, 20) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=...,
+						sasoc_asocmaxrxt=5,
+						sasoc_number_peer_destinations=1,
+						sasoc_peer_rwnd=1500,
+						sasoc_local_rwnd=1864135,
+						sasoc_cookie_life=40000}, [20]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=...,
+						sasoc_asocmaxrxt=...,
+						sasoc_number_peer_destinations=...,
+						sasoc_peer_rwnd=1500,
+						sasoc_local_rwnd=...,
+						sasoc_cookie_life=40000}, [20]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=...,
+						sasoc_asocmaxrxt=5,
+						sasoc_number_peer_destinations=1,
+						sasoc_peer_rwnd=1500,
+						sasoc_local_rwnd=...,
+						sasoc_cookie_life=40000}, [20]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=...,
+						sasoc_asocmaxrxt=...,
+						sasoc_number_peer_destinations=...,
+						sasoc_peer_rwnd=...,
+						sasoc_local_rwnd=...,
+						sasoc_cookie_life=...}, [20]) = 0
+//now test structure without associd
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5,
+						sasoc_number_peer_destinations=2,
+						sasoc_peer_rwnd=1800,
+						sasoc_local_rwnd=2000,
+						sasoc_cookie_life=40000}, 20) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5,
+						sasoc_number_peer_destinations=1,
+						sasoc_peer_rwnd=1500,
+						sasoc_local_rwnd=1864135,
+						sasoc_cookie_life=40000}, [20]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_active_key.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_active_key.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..a5944c6d3bc57dffe393d09b4bf23ffb98b90d39
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_active_key.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, {scact_assoc_id=0, scact_keynumber=0}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, {scact_assoc_id=0, scact_keynumber=0}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, {scact_assoc_id=0, scact_keynumber=0}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..0a023a16c2b6e424da2015fb75eb1dedcf882afc
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=0}, 1) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=1}, 1) = -1
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=4}, 1) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_deactivate_key.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_deactivate_key.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..06103c6ba81797f4aeee310542a2dd9b50bc4392
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_deactivate_key.pkt
@@ -0,0 +1,16 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, {scact_assoc_id=..., scact_keynumber=0}, 6) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, {scact_keynumber=0}, 6) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_delete_key.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_delete_key.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..86d0fa1f4d1a62ae993270d175c603c88ab91280
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_delete_key.pkt
@@ -0,0 +1,16 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, {scact_assoc_id=..., scact_keynumber=0}, 8) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, {scact_keynumber=0}, 8) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_key.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_key.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..58b63eccc76dec085f0d9740fcb2d925a622b4dd
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_key.pkt
@@ -0,0 +1,16 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_KEY, {sca_assoc_id=..., sca_keynumber=123, sca_keylength=2, sca_key=[0x00, 0x00]}, 10) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_KEY, {sca_keynumber=123, sca_keylength=2, sca_key=[0x00, 0x00]}, 10) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auto_asconf.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auto_asconf.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..d6b3c8481dcd4638c9594c628c928d509e5ffe7a
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auto_asconf.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTO_ASCONF, [1], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTO_ASCONF, [0], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTO_ASCONF, [0], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_autoclose.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_autoclose.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b7e923431729907fc26ee89e5fd21f3640385148
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_autoclose.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTOCLOSE, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTOCLOSE, [1], 4) = -1
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTOCLOSE, [0], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_context.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_context.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c9843cc46e1744e3f7638fd0d8d49a7ed09025f6
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_context.pkt
@@ -0,0 +1,19 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_id=0, assoc_value=1200}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_id=0, assoc_value=1200}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_value=1200}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_value=1200}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_prinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_prinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..86b3b89b0add8207034a0c488c786fc20465094e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_prinfo.pkt
@@ -0,0 +1,28 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL,
+						     pr_value=5,
+						     pr_assoc_id=3}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL,
+						     pr_value=5,
+						     pr_assoc_id=3}, [12]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL,
+						     pr_value=5,
+						     pr_assoc_id=...}, [12]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL,
+						     pr_value=5}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL,
+						     pr_value=5}, [12]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_send_param.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_send_param.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..275882b7d3a221384087e409a04b70fc8187199f
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_send_param.pkt
@@ -0,0 +1,61 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0,
+							 sinfo_ssn=0,
+							 sinfo_flags=0,
+							 sinfo_ppid=htonl(0),
+							 sinfo_context=0,
+							 sinfo_timetolive=0,
+							 sinfo_tsn=0,
+							 sinfo_cumtsn=0,
+							 sinfo_assoc_id=0}, [128]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0,
+							 sinfo_ssn=1,
+							 sinfo_flags=0,
+							 sinfo_ppid=htonl(123),
+							 sinfo_context=0,
+							 sinfo_timetolive=0,
+							 sinfo_tsn=2,
+							 sinfo_cumtsn=1,
+							 sinfo_assoc_id=3}, 128) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0,
+							 sinfo_ssn=1,
+							 sinfo_flags=0,
+							 sinfo_ppid=htonl(123),
+							 sinfo_context=0,
+							 sinfo_timetolive=0,
+							 sinfo_tsn=2,
+							 sinfo_cumtsn=1,
+							 sinfo_assoc_id=3}, [128]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0,
+							 sinfo_ssn=1,
+							 sinfo_flags=0,
+							 sinfo_ppid=htonl(123),
+							 sinfo_context=0,
+							 sinfo_timetolive=0,
+							 sinfo_tsn=2,
+							 sinfo_cumtsn=1}, 128) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0,
+							 sinfo_ssn=1,
+							 sinfo_flags=0,
+							 sinfo_ppid=htonl(123),
+							 sinfo_context=0,
+							 sinfo_timetolive=0,
+							 sinfo_tsn=2,
+							 sinfo_cumtsn=1}, [128]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_sndinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_sndinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..aa7732ca66ab0b8385575c6df0150a718d94c6d1
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_sndinfo.pkt
@@ -0,0 +1,54 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=0,
+						      snd_ppid=htonl(1),
+						      snd_context=1,
+						      snd_assoc_id=0}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=0,
+						      snd_ppid=htonl(1),
+						      snd_context=1,
+						      snd_assoc_id=0}, [16]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=SCTP_UNORDERED,
+						      snd_ppid=htonl(2),
+						      snd_context=2,
+						      snd_assoc_id=0}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=SCTP_UNORDERED,
+						      snd_ppid=htonl(2),
+						      snd_context=2,
+						      snd_assoc_id=...}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=SCTP_UNORDERED,
+						      snd_ppid=htonl(2),
+						      snd_context=...,
+						      snd_assoc_id=...}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=SCTP_UNORDERED,
+						      snd_ppid=...,
+						      snd_context=2,
+						      snd_assoc_id=...}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=...,
+						      snd_ppid=htonl(2),
+						      snd_context=2,
+						      snd_assoc_id=...}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=...,
+						      snd_flags=SCTP_UNORDERED,
+						      snd_ppid=htonl(2),
+						      snd_context=2,
+						      snd_assoc_id=...}, [16]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_delayed_sack.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_delayed_sack.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..8e344e1dcd762e0fa08bd81ed9f5e32c468a9aed
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_delayed_sack.pkt
@@ -0,0 +1,24 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0,   sack_delay=250, sack_freq=1}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0,   sack_delay=250, sack_freq=1}, [12]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=250, sack_freq=1}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=250, sack_freq=1}, [12]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=..., sack_freq=1}, [12]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=250, sack_freq=...}, [12]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=200, sack_freq=1}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=200, sack_freq=1}, [12]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_disable_fragments.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_disable_fragments.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..5498560b078b643fe0d8f1d2320d8c7aef4d266e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_disable_fragments.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS, [1], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..d817e4150f47ab2084c1e652eb89515c85f55eba
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_event.pkt
@@ -0,0 +1,20 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_events.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_events.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..732cbb8827a4f2bf18ee8efbaa574ab58244b315
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_events.pkt
@@ -0,0 +1,35 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1,
+					     sctp_association_event=1,
+					     sctp_address_event=0,
+					     sctp_send_failure_event=1,
+					     sctp_peer_error_event=0,
+					     sctp_shutdown_event=1,
+					     sctp_partial_delivery_event=0,
+					     sctp_adaptation_layer_event=0,
+					     sctp_authentication_event=0,
+					     sctp_sender_dry_event=0}, 11) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1,
+					     sctp_association_event=1,
+					     sctp_address_event=0,
+					     sctp_send_failure_event=1,
+					     sctp_peer_error_event=0,
+					     sctp_shutdown_event=1,
+					     sctp_partial_delivery_event=0,
+					     sctp_adaptation_layer_event=0,
+					     sctp_authentication_event=0,
+					     sctp_sender_dry_event=0}, [11]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_explicit_eor.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_explicit_eor.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..e2cfe119980df381910c5701e16c76ac92470d39
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_explicit_eor.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EXPLICIT_EOR, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EXPLICIT_EOR, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EXPLICIT_EOR, [1], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_fragment_interleave.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_fragment_interleave.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..f8a8f2dad5db82d86cc5be3c68e7cc2a16541804
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_fragment_interleave.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE, [1], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE, [2], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE, [2], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_id_list.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_id_list.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..e09f741ffa43b803f4dfb217bd2ce7f9f5d040f6
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_id_list.pkt
@@ -0,0 +1,15 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_ASSOC_ID_LIST, {gaids_number_of_ids=1, gaids_assoc_id=[3]}, [8]) = -1
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_number.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_number.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..f7a67b81dc764ccbe38610d1ef0b84625ce80bc9
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_number.pkt
@@ -0,0 +1,15 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_ASSOC_NUMBER, [1], [4]) = -1
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_peer_addr_info.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_peer_addr_info.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..4f765e3e2de5da4cb2b8c7e83e904e8bb836cd29
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_peer_addr_info.pkt
@@ -0,0 +1,101 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4464,
+							 spinfo_srtt=111,
+							 spinfo_rto=1000,
+							 spinfo_mtu=1468}, 152) = -1 (ENOPROTOOPT)
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=3,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4464,
+							 spinfo_srtt=...,
+							 spinfo_rto=1000,
+							 spinfo_mtu=1468}, [152]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4464,
+							 spinfo_srtt=...,
+							 spinfo_rto=1000,
+							 spinfo_mtu=1468}, [152]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address=...,
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=...,
+							 spinfo_srtt=...,
+							 spinfo_rto=1000,
+							 spinfo_mtu=1468}, [152]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=...,
+							 spinfo_cwnd=...,
+							 spinfo_srtt=...,
+							 spinfo_rto=1000,
+							 spinfo_mtu=1468}, [152]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=...,
+							 spinfo_srtt=...,
+							 spinfo_rto=...,
+							 spinfo_mtu=1468}, [152]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4464,
+							 spinfo_srtt=...,
+							 spinfo_rto=1000,
+							 spinfo_mtu=...}, [152]) = 0
+
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4464,
+							 spinfo_srtt=111,
+							 spinfo_rto=1000,
+							 spinfo_mtu=1468}, 152) = -1 (ENOPROTOOPT)
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4464,
+							 spinfo_srtt=...,
+							 spinfo_rto=1000,
+							 spinfo_mtu=1468}, [152]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_hmac_ident.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_hmac_ident.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..2388a9c2ccc873ae78914deac891e092a7fbd1bf
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_hmac_ident.pkt
@@ -0,0 +1,16 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_HMAC_IDENT, {shmac_number_of_idents=2, shmac_idents=[SCTP_AUTH_HMAC_ID_SHA1, SCTP_AUTH_HMAC_ID_SHA256]}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_HMAC_IDENT, {shmac_number_of_idents=2, shmac_idents=[SCTP_AUTH_HMAC_ID_SHA1, SCTP_AUTH_HMAC_ID_SHA256]}, 8) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..1b0fbf0fbe6b0f38cb633bf67e652ab638084fc2
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, [1], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_initmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_initmsg.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..adaa43af3223218add8d476ef981e83407edcdec
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_initmsg.pkt
@@ -0,0 +1,42 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2,
+					      sinit_max_instreams=2,
+					      sinit_max_attempts=2,
+					      sinit_max_init_timeo=30}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2,
+					      sinit_max_instreams=2,
+					      sinit_max_attempts=2,
+					      sinit_max_init_timeo=30}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=...,
+					      sinit_max_instreams=2,
+					      sinit_max_attempts=2,
+					      sinit_max_init_timeo=30}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2,
+					      sinit_max_instreams=...,
+					      sinit_max_attempts=2,
+					      sinit_max_init_timeo=30}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2,
+					      sinit_max_instreams=2,
+					      sinit_max_attempts=...,
+					      sinit_max_init_timeo=30}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2,
+					      sinit_max_instreams=2,
+					      sinit_max_attempts=2,
+					      sinit_max_init_timeo=...}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=...,
+					      sinit_max_instreams=...,
+					      sinit_max_attempts=...,
+					      sinit_max_init_timeo=...}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_local_auth_chunks.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_local_auth_chunks.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..fab0f1c5d9b81d73fb138a48124d8b031d95d233
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_local_auth_chunks.pkt
@@ -0,0 +1,20 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, {gauth_assoc_id=3,
+							gauth_number_of_chunks=2,
+							gauth_chunks=[0x80,0xC1]}, [10]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, {gauth_number_of_chunks=2,
+							gauth_chunks=[0x80,0xC1]}, [10]) = 0
+
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_max_burst.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_max_burst.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..9f3dd90242304adfd252d70b8895af41bb689850
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_max_burst.pkt
@@ -0,0 +1,20 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=4}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=5}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=5}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=4}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=4}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_maxseg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_maxseg.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..5a941be44d88d394bc0ea71646ae091fc009e81d
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_maxseg.pkt
@@ -0,0 +1,20 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1452}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1200}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1200}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1452}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1452}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_nodelay.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_nodelay.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..0745ab4b59b6c24ba55ae4853e023ce977292589
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_nodelay.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, SOL_SOCKET, SCTP_NODELAY, [0], [4]) = 0
++0 setsockopt(3, SOL_SOCKET, SCTP_NODELAY, [1], 4) = 0
++0 getsockopt(3, SOL_SOCKET, SCTP_NODELAY, [4], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_partial_delivery_point.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_partial_delivery_point.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..cb80af28e4080b064a1b4f0c81b78ffc801c80ff
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_partial_delivery_point.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, [932067], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, [1000], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, [1000], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_addr_params.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_addr_params.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..3aca77e9e0d16834c76436977ee10de99cc13bb4
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_addr_params.pkt
@@ -0,0 +1,130 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=3,
+						       spp_address={sa_family=AF_INET,
+								    sin_port=htons(8080),
+								    sin_addr=inet_addr("192.0.2.1")},
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_DSCP|SPP_HB_ENABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, 152) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+						       spp_address={sa_family=AF_INET, 
+								    sin_port=htons(8080),
+								    sin_addr=inet_addr("192.0.2.1")},
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address={sa_family=AF_INET, 
+								    sin_port=htons(8080),
+								    sin_addr=inet_addr("192.0.2.1")},
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=...,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=...,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=...,
+						       spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=...,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=0}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=...}, [152]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET,
+								    sin_port=htons(8080),
+								    sin_addr=inet_addr("192.0.2.1")},
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_DSCP|SPP_HB_DISABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, 152) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, 
+								    sin_port=htons(8080),
+								    sin_addr=inet_addr("192.0.2.1")},
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_DSCP|SPP_HB_DISABLE|SPP_PMTUD_ENABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, [152]) = 0
+
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_auth_chunks.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_auth_chunks.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..e97bfe5954fd2e17b74e0a5676bf2f9ef11108ab
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_auth_chunks.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//only dummy values, unimplemented in packetdrill
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, {gauth_assoc_id=..., gauth_number_of_chunks=0, gauth_chunks=[]}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, {gauth_number_of_chunks=0, gauth_chunks=[]}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_primary_addr.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_primary_addr.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..db160a48f491c9541e8f87a8b8af24035b05e340
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_primary_addr.pkt
@@ -0,0 +1,31 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=...,
+						   ssp_addr={sa_family=AF_INET,
+							     sin_port=htons(8080),
+							     sin_addr=inet_addr("192.0.2.1")}}, 136) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=...,
+						   ssp_addr={sa_family=AF_INET,
+						   sin_port=htons(8080),
+						   sin_addr=inet_addr("192.0.2.1")}}, [136]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=...,
+						   ssp_addr=...}, [136]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_addr={sa_family=AF_INET,
+							     sin_port=htons(8080),
+							     sin_addr=inet_addr("192.0.2.1")}}, 136) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_addr={sa_family=AF_INET,
+						   sin_port=htons(8080),
+						   sin_addr=inet_addr("192.0.2.1")}}, [136]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvnxtinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvnxtinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..59eea97afadd197ac065fcdd4b5ef08b6cd048c7
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvnxtinfo.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvrcvinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvrcvinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..037533c8e9725833a469487ca2629bb64fda98fe
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvrcvinfo.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_reuse_port.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_reuse_port.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..7f0849265f6b3272df860899682335de2c2b0fef
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_reuse_port.pkt
@@ -0,0 +1,12 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_REUSE_PORT, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_REUSE_PORT, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_REUSE_PORT, [1], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..554879b17acbc5504ea78c29dbef9c23f7ec236f
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt
@@ -0,0 +1,41 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=...,
+					      srto_initial=100,
+					      srto_max=200,
+					      srto_min=50}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=...,
+					      srto_initial=100,
+					      srto_max=200,
+					      srto_min=50}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=...,
+					      srto_initial=...,
+					      srto_max=200,
+					      srto_min=50}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+					      srto_initial=100,
+					      srto_max=...,
+					      srto_min=50}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+					      srto_initial=100,
+					      srto_max=200,
+					      srto_min=...}, [16]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=150,
+					      srto_max=200,
+					      srto_min=50}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=150,
+					      srto_max=200,
+					      srto_min=50}, [16]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_set_peer_primary_addr.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_set_peer_primary_addr.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..4a3e7b8886287e753d001cf9bbd251806417c0c4
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_set_peer_primary_addr.pkt
@@ -0,0 +1,21 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, {sspp_addr={sa_family=AF_INET,
+								       sin_port=htons(8080),
+								       sin_addr=inet_addr("192.0.2.1")}}, 136) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, {sspp_assoc_id=...,
+							    sspp_addr={sa_family=AF_INET,
+								       sin_port=htons(8080),
+								       sin_addr=inet_addr("192.0.2.1")}}, 136) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_status.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_status.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..db00d22768e871d406143479d1e37d8411a26c45
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_status.pkt
@@ -0,0 +1,166 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=...,
+					     sstat_rwnd=...,
+					     sstat_unackdata=..., sstat_penddata=...,
+					     sstat_instrms=...,
+					     sstat_outstrms=...,
+					     sstat_fragmentation_point=...,
+					     sstat_primary=...}, 176) = -1
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500,
+					     sstat_unackdata=0, 
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary={spinfo_assoc_id=3,
+							    spinfo_address={sa_family=AF_INET,
+									    sin_port=htons(8080),
+									    sin_addr=inet_addr("192.0.2.1")},
+							    spinfo_state=SCTP_ACTIVE,
+							    spinfo_cwnd=4464,
+							    spinfo_srtt=...,
+							    spinfo_rto=1000,
+							    spinfo_mtu=1468}}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=...,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=..., 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=...,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=...,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=...,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=...,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=...,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=8,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=...,
+					     sstat_primary=...}, [176]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=...,
+					     sstat_rwnd=...,
+					     sstat_unackdata=..., sstat_penddata=...,
+					     sstat_instrms=...,
+					     sstat_outstrms=...,
+					     sstat_fragmentation_point=...,
+					     sstat_primary=...}, 176) = -1
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500,
+					     sstat_unackdata=0, 
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary={spinfo_assoc_id=3,
+							    spinfo_address={sa_family=AF_INET,
+									    sin_port=htons(8080),
+									    sin_addr=inet_addr("192.0.2.1")},
+							    spinfo_state=SCTP_ACTIVE,
+							    spinfo_cwnd=4464,
+							    spinfo_srtt=...,
+							    spinfo_rto=1000,
+							    spinfo_mtu=1468}}, [176]) = 0
+
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_use_ext_rcvinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_use_ext_rcvinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..64defd820a9033a8d91bda101de1bdb420ae4615
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_use_ext_rcvinfo.pkt
@@ -0,0 +1,18 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], [4]) = 0
+
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/so_linger.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/so_linger.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..4c95a0325a94a2e9f8dfd37c953ef8567754c1ba
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/so_linger.pkt
@@ -0,0 +1,19 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1, linger=30}, 8) = 0
++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=128, linger=30}, [8]) = 0
++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=128, linger=...}, [8]) = 0
++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=..., linger=30}, [8]) = 0
++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=..., linger=...}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_adaptation_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_adaptation_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c270602302208c57a3e48ac0b9960d5b3a986cf1
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_adaptation_event.pkt
@@ -0,0 +1,30 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.0 bind(3, ..., ...) = 0
++0.0 listen(3, 1) = 0
+
+// Enable Event notification
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0
+
+// Send Adaptation Indication with Init chunk
++0.0 < sctp: INIT[flgs=0, tag=1, a_rwnd=1500, os=1, is=1, tsn=0,
+                  ECN_CAPABLE[],
+		  ADAPTATION_INDICATION[adaptation_code_point=3],
+                  COOKIE_PRESERVATIVE[incr=12345],
+                  SUPPORTED_ADDRESS_TYPES[types=[IPv4]]]
+
+*    > sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=..., os=..., is=..., tsn=10, ...]
++0.0 < sctp: COOKIE_ECHO[flgs=0, len=..., val=...]
+*    > sctp: COOKIE_ACK[flgs=0]
+
++0.0 accept(3, ..., ...) = 4
+
+//TODO: Packetdrill does not support Path reconfiguration, after that update this test
++0.0 sctp_recvv(4, [{iov_base={sai_type=SCTP_ADAPTATION_INDICATION,
+			       sai_flags=0,
+			       sai_length=16,
+			       sai_adaptation_ind=3,
+			       sai_assoc_id=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO],[MSG_NOTIFICATION|MSG_EOR]) = 16
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_assoc_change_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_assoc_change_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..39332546f893ffc26adf36b167759486832c0651
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_assoc_change_event.pkt
@@ -0,0 +1,34 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ASSOC_CHANGE, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ASSOC_CHANGE, se_on=1}, [8]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE,
+			       sac_flags=0,
+			       sac_length=21,
+			       sac_state=SCTP_COMM_UP,
+			       sac_error=0,
+			       sac_outbound_streams=1, 
+			       sac_inbound_streams=1,
+			       sac_assoc_id=...,
+			       sac_info=[SCTP_ASSOC_SUPPORTS_MULTIBUF]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
++0.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE,
+			       sac_flags=0,
+			       sac_length=20,
+			       sac_state=SCTP_SHUTDOWN_COMP,
+			       sac_error=0,
+			       sac_outbound_streams=1, 
+			       sac_inbound_streams=1,
+			       sac_info=[]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20
+
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..d94a2f811b100ff2fb6365b76838256b0c464473
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event.pkt
@@ -0,0 +1,24 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, [8]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 sctp_recvv(3, [{iov_base={auth_type=SCTP_AUTHENTICATION_EVENT,
+			       auth_flags=0,
+			       auth_length=20,
+			       auth_keynumber=0,
+			       auth_indication=SCTP_AUTH_NO_AUTH,
+			       auth_assoc_id=3}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
+
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b43bf482f1002b4a2d4f18292021b411be65e33b
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event_2.pkt
@@ -0,0 +1,23 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, [8]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 sctp_recvv(3, [{iov_base={auth_type=SCTP_AUTHENTICATION_EVENT,
+			       auth_flags=0,
+			       auth_length=20,
+			       auth_keynumber=0,
+			       auth_indication=SCTP_AUTH_NO_AUTH}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
+
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_notifications_stopped_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_notifications_stopped_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..65a7771b77639237c0e5b8b27846dccc007f1bd3
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_notifications_stopped_event.pkt
@@ -0,0 +1,17 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_NOTIFICATIONS_STOPPED_EVENT, se_on=1}, 8) = 0
+
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+// No implementation provides this messages, so it can't be tested
+// as discribed in rfc, create an notification storm so that the implementation disable notifications
++0.0 sctp_recvv(3, [{iov_base={sn_type=SCTP_NOTIFICATIONS_STOPPED_EVENT, sn_flags=0, sn_length=8}, iov_len=1000}], 1,
+..., 20, NULL, [0], [SCTP_RECVV_NOINFO],[MSG_NOTIFICATION|MSG_EOR]) = 21
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..68ffb5bba20a025be8a21d819098957a32e38dda
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event.pkt
@@ -0,0 +1,26 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+//Enable Partial delivery event
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, [8]) = 0
+
++0.0 < sctp: DATA[flgs=B, len=300, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=0, len=300, tsn=2, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: ABORT[flgs=0]
++1.5 sctp_recvv(3, [{iov_base=..., iov_len=1000},
+		    {iov_base={pdapi_type=SCTP_PARTIAL_DELIVERY_EVENT,
+			       pdapi_flags=0,
+			       pdapi_length=24,
+			       pdapi_indication=SCTP_PARTIAL_DELIVERY_ABORTED,
+			       pdapi_stream=0,
+			       pdapi_seq=0,
+			       pdapi_assoc_id=3 }, iov_len=1000}], 2, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..53dfa5436c70311f318a7f98a058a77fc15dd2c2
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event_2.pkt
@@ -0,0 +1,25 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+//Enable Partial delivery event
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, [8]) = 0
+
++0.0 < sctp: DATA[flgs=B, len=300, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=0, len=300, tsn=2, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: ABORT[flgs=0]
++1.5 sctp_recvv(3, [{iov_base=..., iov_len=1000},
+		    {iov_base={pdapi_type=SCTP_PARTIAL_DELIVERY_EVENT,
+			       pdapi_flags=0,
+			       pdapi_length=24,
+			       pdapi_indication=SCTP_PARTIAL_DELIVERY_ABORTED,
+			       pdapi_stream=0,
+			       pdapi_seq=0}, iov_len=1000}], 2, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..1737976033c57d139d21064ab8c4a451ee58f8e3
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change.pkt
@@ -0,0 +1,47 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, [8]) = 0
+
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address=...,
+							 spp_hbinterval=1,
+							 spp_pathmaxrxt=3,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_ENABLE, 
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+
++0.5 sctp_recvv(3, [{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE,
+			       spc_flags=0,
+			       spc_length=152,
+			       spc_aaddr=...,
+			       spc_state=SCTP_ADDR_UNREACHABLE,
+			       spc_error=0,
+			       spc_assoc_id=...},
+		     iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 152
+
++0.0 < sctp: HEARTBEAT_ACK[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+
++0.5 sctp_recvv(3, [{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE,
+			       spc_flags=0,
+			       spc_length=152,
+			       spc_aaddr=...,
+			       spc_state=SCTP_ADDR_AVAILABLE,
+			       spc_error=0,
+			       spc_assoc_id=...},
+		     iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 152
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c69c7697942b4924f1b675bb3b71148fbca7dec0
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change_2.pkt
@@ -0,0 +1,46 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, [8]) = 0
+
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address=...,
+							 spp_hbinterval=1,
+							 spp_pathmaxrxt=3,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_ENABLE, 
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+
++0.5 sctp_recvv(3, [{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE,
+			       spc_flags=0,
+			       spc_length=152,
+			       spc_aaddr=...,
+			       spc_state=SCTP_ADDR_UNREACHABLE,
+			       spc_error=0,
+			       spc_assoc_id=...},
+		     iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 152
+
++0.0 < sctp: HEARTBEAT_ACK[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+
++0.5 sctp_recvv(3, [{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE,
+			       spc_flags=0,
+			       spc_length=152,
+			       spc_aaddr=...,
+			       spc_state=SCTP_ADDR_AVAILABLE,
+			       spc_error=0},
+		     iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 152
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..0d7557b6976a59996fa71021fab815780c98d62c
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error.pkt
@@ -0,0 +1,23 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, [8]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: ERROR[flgs=0, INVALID_STREAM_IDENTIFIER[sid=1]]
+
++0.0 sctp_recvv(3, [{iov_base={sre_type=SCTP_REMOTE_ERROR,
+			       sre_flags=0,
+			       sre_length=32,
+			       sre_error=1,
+			       sre_assoc_id=...,
+			       sre_data=[0x09, 0x00, 0x00 , 0x0C, 0x00, 0x01, 0x00 , 0x08, 0x00, 0x01, 0x00 , 0x00]},
+		   iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 32
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..eeda20bc4ea171dd61893aadc447325282d043a3
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error_2.pkt
@@ -0,0 +1,22 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, [8]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: ERROR[flgs=0, INVALID_STREAM_IDENTIFIER[sid=1]]
+
++0.0 sctp_recvv(3, [{iov_base={sre_type=SCTP_REMOTE_ERROR,
+			       sre_flags=0,
+			       sre_length=32,
+			       sre_error=1,
+			       sre_data=[0x09, 0x00, 0x00 , 0x0C, 0x00, 0x01, 0x00 , 0x08, 0x00, 0x01, 0x00 , 0x00]},
+		   iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 32
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..3a7570d6e6a3549f21074173ce26b5b775c9474c
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed.pkt
@@ -0,0 +1,53 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address=...,
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=100,
+							 spp_pathmtu=1468, 
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
+//test for SEND_FAILED_EVENT
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, [8]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+						srto_initial=100,
+						srto_max=150,
+						srto_min=50}, 16) = 0
+
++0.0 write(3, ..., 1000) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++1.0 sctp_recvv(3, [{iov_base={ssf_type=SCTP_SEND_FAILED,
+			       ssf_flags=SCTP_DATA_SENT,
+			       ssf_length=1144,
+			       ssf_error=0,
+			       ssf_info={sinfo_stream=0,
+					 sinfo_ssn=0,
+					 sinfo_flags=3,
+					 sinfo_ppid=htonl(0),
+					 sinfo_context=0,
+					 sinfo_timetolive=0,
+					 sinfo_tsn=0,
+					 sinfo_cumtsn=0,
+					 sinfo_assoc_id=3},
+			       ssf_assoc_id=3,
+			       ssf_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..2244a1678b11af7a859dd9bd99b01ad3db4495b5
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_2.pkt
@@ -0,0 +1,51 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address=...,
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=100,
+							 spp_pathmtu=1468, 
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
+//test for SEND_FAILED_EVENT
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, [8]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+						srto_initial=100,
+						srto_max=150,
+						srto_min=50}, 16) = 0
+
++0.0 write(3, ..., 1000) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++1.0 sctp_recvv(3, [{iov_base={ssf_type=SCTP_SEND_FAILED,
+			       ssf_flags=SCTP_DATA_SENT,
+			       ssf_length=1144,
+			       ssf_error=0,
+			       ssf_info={sinfo_stream=0,
+					 sinfo_ssn=0,
+					 sinfo_flags=3,
+					 sinfo_ppid=htonl(0),
+					 sinfo_context=0,
+					 sinfo_timetolive=0,
+					 sinfo_tsn=0,
+					 sinfo_cumtsn=0},
+			       ssf_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..3febfbd9c61efa0aa4c736063585dca7504f570e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event.pkt
@@ -0,0 +1,50 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=0,
+						       spp_pathmaxrxt=100,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_HB_DISABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, 152) = 0
+
+//test for SEND_FAILED_EVENT
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0,
+					      se_type=SCTP_SEND_FAILED_EVENT,
+					      se_on=1}, 8) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+						srto_initial=100,
+						srto_max=150,
+						srto_min=50}, 16) = 0
+
++0.0 write(3, ..., 1000) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT,
+			       ssfe_flags=SCTP_DATA_SENT,
+			       ssfe_length=1032,
+			       ssfe_error=0,
+			       ssfe_info={snd_sid=0,
+					  snd_flags=3,
+                                          snd_ppid=htonl(0),
+                                          snd_context=0,
+					  snd_assoc_id=3},
+			       ssfe_assoc_id=3,
+			       ssfe_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..39d8113ee59bbacccee271cfd29d2d2f7b95ab70
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event_2.pkt
@@ -0,0 +1,48 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=0,
+						       spp_pathmaxrxt=100,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_HB_DISABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, 152) = 0
+
+//test for SEND_FAILED_EVENT
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0,
+					      se_type=SCTP_SEND_FAILED_EVENT,
+					      se_on=1}, 8) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+						srto_initial=100,
+						srto_max=150,
+						srto_min=50}, 16) = 0
+
++0.0 write(3, ..., 1000) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT,
+			       ssfe_flags=SCTP_DATA_SENT,
+			       ssfe_length=1032,
+			       ssfe_error=0,
+			       ssfe_info={snd_sid=0,
+					  snd_flags=3,
+                                          snd_ppid=htonl(0),
+                                          snd_context=0},
+			       ssfe_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..f060cbee7b38827f4911d3e33fc8726c2c70a954
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event.pkt
@@ -0,0 +1,34 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1,
+					       sctp_association_event=1,
+					       sctp_address_event=0,
+					       sctp_send_failure_event=1,
+					       sctp_peer_error_event=0,
+					       sctp_shutdown_event=1,
+					       sctp_partial_delivery_event=0,
+					       sctp_adaptation_layer_event=0,
+					       sctp_authentication_event=0,
+					       sctp_sender_dry_event=0}, 11) = 0
+
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
+
+//test for SENDER_DRY_EVENT
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0
++0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT,
+			       sender_dry_flags=0,
+			       sender_dry_length=12,
+			       sender_dry_assoc_id=3}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0
+
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b298a7000d43f44b0303f01c860dd5628d8d19a9
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event_2.pkt
@@ -0,0 +1,34 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1,
+					       sctp_association_event=1,
+					       sctp_address_event=0,
+					       sctp_send_failure_event=1,
+					       sctp_peer_error_event=0,
+					       sctp_shutdown_event=1,
+					       sctp_partial_delivery_event=0,
+					       sctp_adaptation_layer_event=0,
+					       sctp_authentication_event=0,
+					       sctp_sender_dry_event=0}, 11) = 0
+
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
+
+//test for SENDER_DRY_EVENT
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0
++0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT,
+			       sender_dry_flags=0,
+			       sender_dry_length=12},
+		     iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0
+
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..9671000ddce4f8021868cd7a2e38d9caa8a01be6
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event.pkt
@@ -0,0 +1,28 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
+
+// Tear down the association
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
++0.0 recvmsg(3, {msg_name(...)=..., 
+		 msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT,
+					sse_flags=0,
+					sse_length=12,
+					sse_assoc_id=3}, iov_len=1000}],
+		 msg_control(0)=[],
+		 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12
+//+0.0 sctp_recvv(3, [{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=1, sse_length=12}, iov_len=1000}], 1,
+//..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..19762c465c942a4023b169f15321cb5102eed122
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event_2.pkt
@@ -0,0 +1,26 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
+
+// Tear down the association
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
++0.0 recvmsg(3, {msg_name(...)=..., 
+		 msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT,
+					sse_flags=0,
+					sse_length=12},
+			      iov_len=1000}],
+		 msg_control(0)=[],
+		 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests
new file mode 100755
index 0000000000000000000000000000000000000000..c2290936d66546d63ee039575390f9dc3a02a548
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests
@@ -0,0 +1,191 @@
+#!/usr/bin/env tcsh
+
+#
+# Copyright (c) 2015 Michael Tuexen
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+set packetdrill = ./../../../../packetdrill
+set delay = 1
+set testcases = (setsockopt/sctp_rtoinfo_1 \
+		 setsockopt/sctp_rtoinfo_2 \
+		 setsockopt/sctp_rtoinfo_3 \
+		 getsockopt/sctp_rtoinfo \
+		 getsockopt/sctp_associnfo \
+		 getsockopt/sctp_initmsg \
+		 getsockopt/so_linger \
+		 getsockopt/sctp_nodelay \
+		 getsockopt/sctp_autoclose \
+		 getsockopt/sctp_primary_addr \
+		 getsockopt/sctp_adaptation_layer \
+		 getsockopt/sctp_disable_fragments \
+		 getsockopt/sctp_peer_addr_params \
+		 getsockopt/sctp_default_send_param \
+		 getsockopt/sctp_events \
+		 getsockopt/sctp_i_want_mapped_v4_addr \
+		 getsockopt/sctp_maxseg \
+		 getsockopt/sctp_hmac_ident \
+		 getsockopt/sctp_auth_active_key \
+		 getsockopt/sctp_delayed_sack \
+		 getsockopt/sctp_fragment_interleave \
+		 getsockopt/sctp_partial_delivery_point \
+		 getsockopt/sctp_use_ext_rcvinfo \
+		 getsockopt/sctp_auto_asconf \
+		 getsockopt/sctp_max_burst \
+		 getsockopt/sctp_context \
+		 getsockopt/sctp_explicit_eor \
+		 getsockopt/sctp_reuse_port \
+		 getsockopt/sctp_event \
+		 getsockopt/sctp_recvrcvinfo \
+		 getsockopt/sctp_recvnxtinfo \
+		 getsockopt/sctp_default_sndinfo \
+		 getsockopt/sctp_default_prinfo \
+		 getsockopt/sctp_status \
+		 getsockopt/sctp_get_peer_addr_info \
+		 getsockopt/sctp_peer_auth_chunks \
+		 getsockopt/sctp_local_auth_chunks \
+		 getsockopt/sctp_get_assoc_number \
+		 getsockopt/sctp_get_assoc_id_list \
+		 getsockopt/sctp_set_peer_primary_addr \
+		 getsockopt/sctp_auth_chunk \
+		 getsockopt/sctp_auth_key \
+		 getsockopt/sctp_auth_deactivate_key \
+		 getsockopt/sctp_auth_delete_key \
+		 notifications/sctp_adaptation_event \
+                 notifications/sctp_notifications_stopped_event \
+                 notifications/sctp_remote_error \
+                 notifications/sctp_remote_error_2 \
+                 notifications/sctp_sender_dry_event \
+                 notifications/sctp_sender_dry_event_2 \
+                 notifications/sctp_assoc_change_event \
+                 notifications/sctp_partial_delivery_event \
+                 notifications/sctp_partial_delivery_event_2 \
+                 notifications/sctp_send_failed \
+                 notifications/sctp_send_failed_2 \
+                 notifications/sctp_shutdown_event \
+                 notifications/sctp_shutdown_event_2 \
+                 notifications/sctp_authentication_event \
+                 notifications/sctp_authentication_event_2 \
+                 notifications/sctp_peer_addr_change \
+                 notifications/sctp_peer_addr_change_2 \
+                 notifications/sctp_send_failed_event \
+                 notifications/sctp_send_failed_event_2 \
+		 cmsgs/sendmsg_sctp_init \
+		 cmsgs/sendmsg_sctp_sndrcv \
+		 cmsgs/sendmsg_sctp_sndinfo \
+		 cmsgs/sendmsg_sctp_authinfo \
+		 cmsgs/sendmsg_sctp_prinfo \
+		 cmsgs/sendmsg_sctp_dstaddrv4 \
+		 cmsgs/sendmsg_sctp_dstaddrv6 \
+		 cmsgs/recvmsg_sctp_extrcv \
+		 cmsgs/recvmsg_sctp_nxtinfo \
+		 cmsgs/recvmsg_sctp_rcvinfo \
+		 cmsgs/recvmsg_sctp_sndrcv \
+		 cmsgs/recvmsg \
+		 cmsgs/sendmsg \
+		 sctp_send/sctp_send_1 \
+		 sctp_send/sctp_send_2 \
+		 sctp_sendx/sctp_sendx_1 \
+		 sctp_sendx/sctp_sendx_2 \
+		 sctp_sendv/sctp_sendv \
+		 sctp_sendv/sctp_sendv_1 \
+		 sctp_sendv/sctp_sendv_2 \
+		 sctp_sendv/sctp_sendv_3 \
+		 sctp_sendv/sctp_sendv_4 \
+		 sctp_sendv/sctp_sendv_5 \
+		 sctp_sendv/sctp_sendv_6 \
+		 sctp_sendv/sctp_sendv_7 \
+		 sctp_sendv/sctp_sendv_8 \
+		 sctp_bindx/sctp_bindx \
+		 sctp_peeloff/sctp_peeloff \
+		 sctp_getpaddrs/sctp_getpaddrs \
+		 sctp_getladdrs/sctp_getladdrs \
+		 sctp_sendmsg/sctp_sendmsg_1 \
+		 sctp_sendmsg/sctp_sendmsg_2 \
+		 sctp_sendmsg/sctp_sendmsg_3 \
+		 sctp_recvmsg/sctp_recvmsg_1 \
+		 sctp_recvmsg/sctp_recvmsg_2 \
+		 sctp_recvmsg/sctp_recvmsg_3 \
+		 sctp_connectx/sctp_connectx \
+		 sctp_recvv/sctp_recvv_1 \
+		 sctp_recvv/sctp_recvv_2 \
+		 sctp_recvv/sctp_recvv_3 \
+		 sctp_recvv/sctp_recvv_4 \
+		 sctp_recvv/sctp_recvv_5 \
+		 sctp_recvv/sctp_recvv_6 \
+		 sctp_recvv/sctp_recvv_7 )
+
+set rootdir = `/usr/bin/dirname $0`
+set os = `uname -s | tr '[A-Z]' '[a-z]'`
+set passed = 0
+set failed = 0
+set run = 0
+set skipped = 0
+set first = 1
+
+printf "Name                                        Verdict\n"
+printf "===================================================\n"
+foreach testcase ($testcases)
+  printf "%-40.40s " `/usr/bin/basename $testcase`
+  if ($first == 0) then
+    if ($delay != 0) then
+      printf "\033[33m%10s\033[0m" "WAITING"
+      sleep $delay
+      printf "\b\b\b\b\b\b\b\b\b\b"
+    endif
+  else
+    set first = 0
+  endif
+  printf "\033[33m%10s\033[0m" "RUNNING"
+  if (-f ${rootdir}/${testcase}-$os.pkt) then
+    $packetdrill ${rootdir}/${testcase}-$os.pkt >& /dev/null
+    set result = $status
+    set found = 1
+  else if (-f ${rootdir}/${testcase}.pkt) then
+    $packetdrill ${rootdir}/${testcase}.pkt >& /dev/null
+    set result = $status
+    set found = 1
+  else
+    set found = 0
+  endif
+  printf "\b\b\b\b\b\b\b\b\b\b"
+  if ($found == 1) then
+    if ($result == 0) then
+      @ passed++
+      printf "\033[32m%10s\033[0m\n" "PASSED"
+    else
+      @ failed++
+      printf "\033[31m%10s\033[0m\n" "FAILED"
+    endif
+    @ run++
+  else
+    printf "\033[34m%10s\033[0m\n" "SKIPPED"
+    @ skipped++
+  endif
+end
+printf "===================================================\n"
+printf "Summary: Number of tests run:     %3u\n" $run
+printf "         Number of tests passed:  %3u\n" $passed
+printf "         Number of tests failed:  %3u\n" $failed
+printf "         Number of tests skipped: %3u\n" $skipped
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_bindx/sctp_bindx.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_bindx/sctp_bindx.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..664ca300e40758a088790ed15a7f6759908a762e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_bindx/sctp_bindx.pkt
@@ -0,0 +1,6 @@
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+
++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_connectx/sctp_connectx.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_connectx/sctp_connectx.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..8e33925643afae0accb16042ac8dbc7cc6ab48eb
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_connectx/sctp_connectx.pkt
@@ -0,0 +1,17 @@
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+
++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0
+
+// Check the handshake with an empty(!) cookie
++0.1 sctp_connectx(3, [...], 1, [3]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getladdrs/sctp_getladdrs.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getladdrs/sctp_getladdrs.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..96dba972178a72aaa935c382fa41ffb925bd08df
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getladdrs/sctp_getladdrs.pkt
@@ -0,0 +1,19 @@
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+
++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0
+
+// Check the handshake with an empty(!) cookie
++0.1 sctp_connectx(3, [...], 1, [3]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 sctp_getladdrs(3, 3, [...]) = 1
++0.0 sctp_freeladdrs([...]) = 0
+
++0.0 sctp_getladdrs(3, 3, [{sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.168.0.1")}]) = 1
++0.0 sctp_freeladdrs([...]) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getpaddrs/sctp_getpaddrs.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getpaddrs/sctp_getpaddrs.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..eeec01d894c7558d5e3dec9fc859c56d37887b5a
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getpaddrs/sctp_getpaddrs.pkt
@@ -0,0 +1,19 @@
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+
++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0
+
+// Check the handshake with an empty(!) cookie
++0.1 sctp_connectx(3, [...], 1, [3]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 sctp_getpaddrs(3, 3, [...]) = 1
++0.0 sctp_freepaddrs([...]) = 0
+
++0.0 sctp_getpaddrs(3, 3, [{sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}]) = 1
++0.0 sctp_freepaddrs([...]) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_peeloff/sctp_peeloff.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_peeloff/sctp_peeloff.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..de7c9edfe1119689b45e514f6427d0e58c4944d3
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_peeloff/sctp_peeloff.pkt
@@ -0,0 +1,15 @@
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+
++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0
+
+// Check the handshake with an empty(!) cookie
++0.1 sctp_connectx(3, [...], 1, [3]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 sctp_peeloff(3, 3) = 4
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_1.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..569fae58952a350ebbbf755449b608e449e90305
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_1.pkt
@@ -0,0 +1,20 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvmsg(3, ..., 1000, ..., ..., ..., MSG_EOR) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..be3e3314acdb8ce52ec672ac92986b51858c1e29
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_2.pkt
@@ -0,0 +1,28 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=1234]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvmsg(3, ..., 1000, ..., ..., {sinfo_stream=0,
+                                           sinfo_ssn=...,
+                                           sinfo_flags=0,
+                                           sinfo_ppid=htonl(1234),
+                                           sinfo_context=0,
+                                           sinfo_timetolive=0,
+                                           sinfo_tsn=1,
+                                           sinfo_cumtsn=1,
+                                           sinfo_assoc_id=...}, 8) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_3.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_3.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..36b5c445b31e92b5e51dd2a140fec42a4b27a804
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_3.pkt
@@ -0,0 +1,49 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvmsg(3, ..., 1000,
+                  {sa_family=AF_INET,
+                   sin_port=htons(8080),
+                   sin_addr=inet_addr("192.0.2.1")},
+                  16,
+                  {sinfo_stream=0,
+                   sinfo_ssn=0,
+                   sinfo_flags=0,
+                   sinfo_ppid=htonl(0),
+                   sinfo_context=0,
+                   sinfo_timetolive=0,
+                   sinfo_tsn=1,
+                   sinfo_cumtsn=1,
+                   sinfo_assoc_id=...}, MSG_EOR) = 1000
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvmsg(3, ..., 1000,
+                  {sa_family=AF_INET,
+                   sin_port=htons(8080),
+                   sin_addr=inet_addr("192.0.2.1")},
+                  16,
+                  {sinfo_stream=0,
+                   sinfo_ssn=1,
+                   sinfo_flags=0,
+                   sinfo_ppid=htonl(0),
+                   sinfo_context=0,
+                   sinfo_timetolive=0,
+                   sinfo_tsn=2,
+                   sinfo_cumtsn=2}, MSG_EOR) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=2]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_1.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..85825263004432971c20b95b5f656d77177cf4af
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_1.pkt
@@ -0,0 +1,21 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//base test
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_EOR]) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..0eea4a1950d98143386dfd4657f32f13eb333675
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_2.pkt
@@ -0,0 +1,23 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, {sa_family=AF_INET,
+						       sin_port=htons(8080),
+						       sin_addr=inet_addr("192.0.2.1")},
+	        16, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_EOR]) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_3.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_3.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..71ecfe4c913f80270b682279aa0e30b000de70cd
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_3.pkt
@@ -0,0 +1,20 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, NULL, 0, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_EOR]) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_4.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_4.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..3742f14891cb6089af9c54c1e323aee4419368e8
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_4.pkt
@@ -0,0 +1,31 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//base SCTP_RECVV_RCVINFO
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=123]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {rcv_sid=0,
+								rcv_ssn=0,
+								rcv_flags=0,
+								rcv_ppid=htonl(123),
+								rcv_tsn=1,
+								rcv_cumtsn=1,
+								rcv_context=0, 
+								rcv_assoc_id=...},
+		[28], [SCTP_RECVV_RCVINFO], [MSG_EOR]) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_5.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_5.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..af38f796f0bb7a086457b45cd4303c8cebd252d7
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_5.pkt
@@ -0,0 +1,31 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//base SCTP_RECVV_NXTINFO
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=10]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {nxt_sid=0,
+								nxt_flags=32,
+								nxt_ppid=htonl(10),
+								nxt_length=1000,
+								nxt_assoc_id=3},
+	[16], [SCTP_RECVV_NXTINFO], [MSG_EOR]) = 1000
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL, [0], [0], [MSG_EOR]) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=2]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_6.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_6.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..d68c13f82fe03fed73763855810895eb360b0870
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_6.pkt
@@ -0,0 +1,55 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//base SCTP_RECVV_RN
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=10]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo={rcv_sid=0,
+									       rcv_ssn=0,
+									       rcv_flags=0,
+									       rcv_ppid=htonl(0),
+									       rcv_tsn=1,
+									       rcv_cumtsn=2,
+									       rcv_context=0,
+									       rcv_assoc_id=3},
+								recvv_nxtinfo={nxt_sid=0,
+									       nxt_flags=32,
+									       nxt_ppid=htonl(10),
+									       nxt_length=1000,
+									       nxt_assoc_id=3}},
+		[44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=2, ppid=11]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo={rcv_sid=0,
+									       rcv_ssn=1,
+									       rcv_flags=0,
+									       rcv_ppid=htonl(10),
+									       rcv_tsn=2,
+									       rcv_cumtsn=3,
+									       rcv_context=0},
+								recvv_nxtinfo={nxt_sid=0,
+									       nxt_flags=32,
+									       nxt_ppid=htonl(11),
+									       nxt_length=1000}},
+		[44],[SCTP_RECVV_RN], [MSG_EOR]) = 1000
+
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL ,[0],[SCTP_RECVV_NOINFO], [MSG_EOR]) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=3]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_7.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_7.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..0d2620581f980450a7e79605480ea1f3ca7699fb
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_7.pkt
@@ -0,0 +1,46 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=10]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=10]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo={rcv_sid=0,
+									       rcv_ssn=0,
+									       rcv_flags=0,
+									       rcv_ppid=htonl(10),
+									       rcv_tsn=1,
+									       rcv_cumtsn=2,
+									       rcv_context=0},
+								recvv_nxtinfo=...},
+		[44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000
+
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=2, ppid=10]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo=...,
+								recvv_nxtinfo={nxt_sid=0,
+									       nxt_flags=32,
+									       nxt_ppid=htonl(10),
+									       nxt_length=1000,
+									       nxt_assoc_id=3}},
+		[44], [SCTP_RECVV_RN], [8]) = 1000
+
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL,[0], [SCTP_RECVV_NOINFO], [8]) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=3]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_1.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..ceff10fc530e27fdcb245ec691d348a3cf0c0e2d
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_1.pkt
@@ -0,0 +1,42 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++1.0 sctp_send(3, ..., 1000, {sinfo_stream=3,
+                              sinfo_ssn=3,
+                              sinfo_flags=0,
+                              sinfo_ppid=htonl(7),
+                              sinfo_context=0,
+                              sinfo_timetolive=0,
+                              sinfo_tsn=1,
+                              sinfo_cumtsn=6,
+                              sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..940f5485eeeb3f949cc05899ad3764e49147388a
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_2.pkt
@@ -0,0 +1,55 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++1.0 sctp_send(3, ..., 1000, {sinfo_stream=3,
+                              sinfo_ssn=3,
+                              sinfo_flags=0,
+                              sinfo_ppid=htonl(7),
+                              sinfo_context=0,
+                              sinfo_timetolive=0,
+                              sinfo_tsn=1,
+                              sinfo_cumtsn=6,
+                              sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++1.0 sctp_send(3, ..., 1000, {sinfo_stream=3,
+                              sinfo_ssn=3,
+                              sinfo_flags=0,
+                              sinfo_ppid=htonl(7),
+                              sinfo_context=0,
+                              sinfo_timetolive=0,
+                              sinfo_tsn=1,
+                              sinfo_cumtsn=6,
+                              sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=3, ssn=1, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_1.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..2144bf4d295c4e7600160d8c39d3b015f4a78615
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_1.pkt
@@ -0,0 +1,20 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 sctp_sendmsg(3, ..., 1000, ..., ..., htonl(1234), SCTP_UNORDERED, 1, 0, 0) = 1000
++0.0 > sctp: DATA[flgs=UBE, len=1016, tsn=1, sid=1, ssn=0, ppid=1234]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..4e916dca4981c3ea01a7ff47854dd63f0397d60c
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_2.pkt
@@ -0,0 +1,23 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 sctp_sendmsg(3, ..., 1000, {sa_family=AF_INET,
+				 sin_port=htons(8080),
+				 sin_addr=inet_addr("192.0.2.1")},
+		 16, htonl(0x1234), 0, 0, 0, 0) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0x1234]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_3.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_3.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b02ac279aaae3b92db943cb7e2fc8e6827440f12
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_3.pkt
@@ -0,0 +1,20 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 sctp_sendmsg(3, ..., 1000, NULL, 0, 0, 0, 0, 0, 0) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..8c00dcc9bd103b222e83025b4753366aa4b6ec16
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv.pkt
@@ -0,0 +1,103 @@
+--tolerance_usecs=100000
+
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//sctp_sendv(int sd, const struct iovec *iov, int iovcnt, struct sockaddr *addrs, int addrcnt, void *info, socklen_t infolen, unsigned int infotype, int flags);
+
+//test with sctp_sendv_authinfo
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=500}, {iov_base=..., iov_len=500}], 2, NULL, 0, {auth_keynumber=123}, 2, SCTP_SENDV_AUTHINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
+//base test
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
+//base test
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=2, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
+
+//base test
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=0, ssn=3, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]]
+
+//TEST NULL as sockaddr
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=500}], 1, NULL, 0, NULL, 0, SCTP_SENDV_NOINFO, 0) = 500
+*    > sctp: DATA[flgs=BE, len=516, tsn=5, sid=0, ssn=4, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=1500, gaps=[], dups=[]]
+
+//TEST with two structs iov
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=500},{iov_base=..., iov_len=500}], 2, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=6, sid=0, ssn=5, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=1500, gaps=[], dups=[]]
+
+//test with sctp_sendv_prinfo
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=500}, {iov_base=..., iov_len=500}], 2, ..., 1, {pr_policy=0, pr_value=0}, 8, SCTP_SENDV_PRINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=7, sid=0, ssn=6, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=7, a_rwnd=1500, gaps=[], dups=[]]
+
+//test with all sctp_sendv_spainfo
++0.1 sctp_sendv(3, [{..., 500}, {..., 500}], 2, ..., 1, {sendv_flags=SCTP_SEND_SNDINFO_VALID,
+							 sendv_sndinfo={snd_sid=2,
+									snd_flags=0,
+									snd_ppid=htonl(0),
+									snd_context=0,
+									snd_assoc_id=0},
+							 sendv_prinfo={pr_policy=SCTP_PR_SCTP_TTL,
+								       pr_value=10},
+							 sendv_authinfo={auth_keynumber=123}}, 32, SCTP_SENDV_SPA, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=8, sid=2, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=8, a_rwnd=1500, gaps=[], dups=[]]
+
+//test with sctp_sendv_sndinfo
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, {snd_sid=1,
+							       snd_flags=0,
+							       snd_ppid=htonl(1234),
+							       snd_context=0,
+							       snd_assoc_id=0}, 16, SCTP_SENDV_SNDINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=9, sid=1, ssn=0, ppid=1234]
++0.0 < sctp: SACK[flgs=0, cum_tsn=9, a_rwnd=1500, gaps=[], dups=[]]
+
+//test with struct sockaddr
++0.1 sctp_sendv(3, [{..., 1000}], 1, [{sa_family=AF_INET,
+				       sin_port=htons(8080),
+				       sin_addr=inet_addr("192.0.2.1")}], 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=10, sid=0, ssn=7, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=10, a_rwnd=1500, gaps=[], dups=[]]
+
++0.1 sctp_sendv(3, [{..., 500}, {..., 500}], 2, ..., 1, {sendv_flags=SCTP_SEND_SNDINFO_VALID,
+							 sendv_sndinfo={snd_sid=2,
+									snd_flags=0,
+									snd_ppid=htonl(0),
+									snd_context=0},
+							 sendv_prinfo={pr_policy=SCTP_PR_SCTP_TTL,
+								       pr_value=10},
+							 sendv_authinfo={auth_keynumber=123}}, 32, SCTP_SENDV_SPA, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=11, sid=2, ssn=1, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=11, a_rwnd=1500, gaps=[], dups=[]]
+
+//test with sctp_sendv_sndinfo
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, {snd_sid=1,
+							       snd_flags=0,
+							       snd_ppid=htonl(1234),
+							       snd_context=0}, 16, SCTP_SENDV_SNDINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=12, sid=1, ssn=1, ppid=1234]
++0.0 < sctp: SACK[flgs=0, cum_tsn=12, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_1.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..e649f4daa15d8d3f73a6f1d502eb2e583496c931
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_1.pkt
@@ -0,0 +1,33 @@
+
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=2, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
+
++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=0, ssn=3, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..025b9296eb2f774f7eb51a35eb21ca4611e33581
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_2.pkt
@@ -0,0 +1,24 @@
+
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//sctp_sendv(int sd, const struct iovec *iov, int iovcnt, struct sockaddr *addrs, int addrcnt, void *info, socklen_t infolen, unsigned int infotype, int flags);
+
+//test with sctp_sendv_authinfo
++0.0 sctp_sendv(3, [{iov_base=..., iov_len=500}, {iov_base=..., iov_len=500}], 2, NULL, 0, {auth_keynumber=123}, 2, SCTP_SENDV_AUTHINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_3.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_3.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..6362b962777ae39996aa86762cd31ffbd18cd755
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_3.pkt
@@ -0,0 +1,22 @@
+
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//TEST NULL as sockaddr
++0.0 sctp_sendv(3, [{iov_base=..., iov_len=500}], 1, NULL, 0, NULL, 0, SCTP_SENDV_NOINFO, 0) = 500
+*    > sctp: DATA[flgs=BE, len=516, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_4.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_4.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..6e651a98bcbd19de06cbf7a7ff87c4a171ce0f67
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_4.pkt
@@ -0,0 +1,22 @@
+
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//TEST with two structs iov
++0.0 sctp_sendv(3, [{iov_base=..., iov_len=500},{iov_base=..., iov_len=500}], 2, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_5.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_5.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..d65e9123eb0da4c8df515de81a775b3982c84c8d
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_5.pkt
@@ -0,0 +1,22 @@
+
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//test with sctp_sendv_prinfo
++0.0 sctp_sendv(3, [{iov_base=..., iov_len=500}, {iov_base=..., iov_len=500}], 2, ..., 1, {pr_policy=0, pr_value=0}, 8, SCTP_SENDV_PRINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_6.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_6.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..68fc8e3660e8a94c6c42f5807f533dd6bb7f8743
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_6.pkt
@@ -0,0 +1,42 @@
+
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//test with all sctp_sendv_spainfo
++0.0 sctp_sendv(3, [{..., 500}, {..., 500}], 2, ..., 1, {sendv_flags=SCTP_SEND_SNDINFO_VALID,
+							 sendv_sndinfo={snd_sid=2,
+									snd_flags=0,
+									snd_ppid=htonl(0),
+									snd_context=0,
+									snd_assoc_id=0},
+							 sendv_prinfo={pr_policy=SCTP_PR_SCTP_TTL,
+								       pr_value=10},
+							 sendv_authinfo={auth_keynumber=123}}, 32, SCTP_SENDV_SPA, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
+//test with all sctp_sendv_spainfo
++0.0 sctp_sendv(3, [{..., 500}, {..., 500}], 2, ..., 1, {sendv_flags=SCTP_SEND_SNDINFO_VALID,
+							 sendv_sndinfo={snd_sid=2,
+									snd_flags=0,
+									snd_ppid=htonl(0),
+									snd_context=0},
+							 sendv_prinfo={pr_policy=SCTP_PR_SCTP_TTL,
+								       pr_value=10},
+							 sendv_authinfo={auth_keynumber=123}}, 32, SCTP_SENDV_SPA, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=1, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_7.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_7.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..2d56698428634d3326df5d5b3c4c59016927033f
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_7.pkt
@@ -0,0 +1,32 @@
+
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, {snd_sid=1,
+							       snd_flags=0,
+							       snd_ppid=htonl(1234),
+							       snd_context=0,
+							       snd_assoc_id=0}, 16, SCTP_SENDV_SNDINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=1, ssn=0, ppid=1234]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, {snd_sid=1,
+							       snd_flags=0,
+							       snd_ppid=htonl(1234),
+							       snd_context=0}, 16, SCTP_SENDV_SNDINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=1, ssn=1, ppid=1234]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_8.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_8.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c9ebd3b7b108cd0d447a8f1115f055db79734acd
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_8.pkt
@@ -0,0 +1,21 @@
+
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 sctp_sendv(3, [{..., 1000}], 1, [{sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}], 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_1.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..e89e65533032c7ea83c058b0abf8ac325644fa59
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_1.pkt
@@ -0,0 +1,43 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//Disable Heartbeats
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sctp_sendx(3, ..., 1000, ..., 1, {sinfo_stream=3,
+                                       sinfo_ssn=3,
+                                       sinfo_flags=0,
+                                       sinfo_ppid=htonl(1234),
+                                       sinfo_context=0,
+                                       sinfo_timetolive=0,
+                                       sinfo_tsn=2,
+                                       sinfo_cumtsn=2,
+                                       sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=1234]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b2e4362a7d5d464a38286a06fc928df122f32f4c
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_2.pkt
@@ -0,0 +1,45 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//Disable Heartbeats
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sctp_sendx(3, ..., 1000, {sa_family=AF_INET,
+                               sin_port=htons(8080),
+                               sin_addr=inet_addr("192.0.2.1")}, 1,
+			      {sinfo_stream=3,
+                               sinfo_ssn=3,
+                               sinfo_flags=0,
+                               sinfo_ppid=htonl(7),
+                               sinfo_context=0,
+                               sinfo_timetolive=0,
+                               sinfo_tsn=1,
+                               sinfo_cumtsn=6,
+                               sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_1.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..1a6fe6762e9cf441ad426da25915b5a532e0e457
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_1.pkt
@@ -0,0 +1,9 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+
+// Check sctp_rtoinfo before connection startup
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=..., srto_max=..., srto_min=...}, [16]) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..80305cd4fb022a8b65f08aa9f847ddd08b11b96e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_2.pkt
@@ -0,0 +1,10 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+
+// Check sctp_rtoinfo before connection startup
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, [16]) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_3.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_3.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..164ace174e5380211078cf1eb8b541825b2c1be4
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_3.pkt
@@ -0,0 +1,11 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+
+// Check sctp_rtoinfo for one-to-one style check if srto_assoc_id is ignored
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=200, srto_max=400, srto_min=100}, 16) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=3, srto_initial=100, srto_max=200, srto_min=50}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, [16]) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_adaptation_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_adaptation_event.pkt
index 282b383885d289485e3e1b9d225fd6387131e6bf..6a3a663b916a0543f451d1dd829aa62698a5b6de 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_adaptation_event.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_adaptation_event.pkt
@@ -6,8 +6,8 @@
 +0.0 listen(3, 1) = 0
 
 // Enable Event notification
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0
 
 // Send Adaptation Indication with Init chunk
 +0.0 < sctp: INIT[flgs=0, tag=1, a_rwnd=1500, os=1, is=1, tsn=0,
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt
index 78467aad5dacfba214c238767bc8a1f831f938fb..f110cab2989614c5b5b299738950d857e10833d6 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt
@@ -3,8 +3,8 @@
 +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
 // Check the handshake with an empty(!) cookie
 +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ASSOC_CHANGE, se_on=1}, 8) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ASSOC_CHANGE, se_on=1}, [8]) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ASSOC_CHANGE, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ASSOC_CHANGE, se_on=1}, [8]) = 0
 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
 +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_authentication_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_authentication_event.pkt
index cf7a4ce7ec91e5ddd463685b57cb12342a8c4595..4b216e9877183a0104c96f4216955d6829fce983 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_authentication_event.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_authentication_event.pkt
@@ -3,8 +3,8 @@
 +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
 // Check the handshake with an empty(!) cookie
 +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, 8) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, [8]) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, [8]) = 0
 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
 +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications.pkt
deleted file mode 100644
index 6df07beeb907fdf8d0cd3fa52e0797af1252b672..0000000000000000000000000000000000000000
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications.pkt
+++ /dev/null
@@ -1,60 +0,0 @@
-+0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
-+0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
-+0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
-// Check the handshake with an empty(!) cookie
-+0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
-+0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
-+0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
-+0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
-+0.1 < sctp: COOKIE_ACK[flgs=0]
-+0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
-//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, 8) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0
-
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=1, sctp_address_event=0, sctp_send_failure_event=1,
-sctp_peer_error_event=0, sctp_shutdown_event=1, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0,
-sctp_sender_dry_event=0}, 11) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
-
-//Deactivate all EVENTS
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0, sctp_association_event=0, sctp_address_event=0, sctp_send_failure_event=0,
-sctp_peer_error_event=0, sctp_shutdown_event=0, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0,
-sctp_sender_dry_event=0}, 11) = 0
-
-//test for SENDER_DRY_EVENT
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0
-+0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT, sender_dry_flags=0, sender_dry_length=12, sender_dry_assoc_id=3}, iov_len=1000}],
-1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0
-
-//test for SEND_FAILED_EVENT
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SEND_FAILED_EVENT, se_on=1}, 8) = 0
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=150, srto_min=50}, 16) = 0
-+0.0 write(3, ..., 1000) = 1000
-+0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
-*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
-*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
-*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
-*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
-*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
-*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
-*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
-+1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT, ssfe_flags=SCTP_DATA_SENT, ssfe_length=1032, ssfe_error=0,
-ssfe_info={snd_sid=0, snd_flags=3, snd_ppid=htonl(0), snd_context=0, snd_assoc_id=...}, ssfe_assoc_id=3, ssfe_data=...}, iov_len=1000}],
-1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SEND_FAILED_EVENT, se_on=0}, 8) = 0
-
-//+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0
-//+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
-// Tear down the association
-//+0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
-//*    > sctp: SHUTDOWN_ACK[flgs=0]
-//+0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
-//+0.0 recvmsg(3, {msg_name(...)=..., 
-//		 msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=0, sse_length=12}, iov_len=1000}],
-//		 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12
-//+0.0 sctp_recvv(3, [{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=1, sse_length=12}, iov_len=1000}], 1,
-//..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications_stopped_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications_stopped_event.pkt
index 6adecb8f05d09a6964e5db5d966391bbfe01e71b..65a7771b77639237c0e5b8b27846dccc007f1bd3 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications_stopped_event.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications_stopped_event.pkt
@@ -3,9 +3,9 @@
 +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
 // Check the handshake with an empty(!) cookie
 +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_NOTIFICATIONS_STOPPED_EVENT, se_on=1}, 8) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_NOTIFICATIONS_STOPPED_EVENT, se_on=1}, 8) = 0
 
 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
 +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_partial_delivery_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_partial_delivery_event.pkt
index b1c619e8dfcb773fed123181ce3e1774165ebdba..68ffb5bba20a025be8a21d819098957a32e38dda 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_partial_delivery_event.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_partial_delivery_event.pkt
@@ -3,18 +3,24 @@
 +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
 // Check the handshake with an empty(!) cookie
 +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, 8) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, [8]) = 0
 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
 +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
 +0.1 < sctp: COOKIE_ACK[flgs=0]
+//Enable Partial delivery event
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, [8]) = 0
 
 +0.0 < sctp: DATA[flgs=B, len=300, tsn=1, sid=0, ssn=0, ppid=0]
 +0.0 > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
 +0.0 < sctp: DATA[flgs=0, len=300, tsn=2, sid=0, ssn=0, ppid=0]
 *    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
 +0.0 < sctp: ABORT[flgs=0]
-+1.5 sctp_recvv(3, [{iov_base=..., iov_len=1000}, {iov_base={pdapi_type=SCTP_PARTIAL_DELIVERY_EVENT, pdapi_flags=0,pdapi_length=24,
-pdapi_indication=SCTP_PARTIAL_DELIVERY_ABORTED, pdapi_stream=0, pdapi_seq=0, pdapi_assoc_id=3 }, iov_len=1000}], 2, ..., 20, NULL, [0],
-[SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21
++1.5 sctp_recvv(3, [{iov_base=..., iov_len=1000},
+		    {iov_base={pdapi_type=SCTP_PARTIAL_DELIVERY_EVENT,
+			       pdapi_flags=0,
+			       pdapi_length=24,
+			       pdapi_indication=SCTP_PARTIAL_DELIVERY_ABORTED,
+			       pdapi_stream=0,
+			       pdapi_seq=0,
+			       pdapi_assoc_id=3 }, iov_len=1000}], 2, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_peer_addr_change.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_peer_addr_change.pkt
index ffd6eabc1bdaa607a7fae91a60e6e7b6c93ab3e9..1e9238b66c0356f596b239491ccaa5e2610a4a8c 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_peer_addr_change.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_peer_addr_change.pkt
@@ -3,8 +3,8 @@
 +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
 // Check the handshake with an empty(!) cookie
 +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, 8) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, [8]) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, [8]) = 0
 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
 +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_remote_error.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_remote_error.pkt
index 4d245235197b7f22585e70aa63536206b03cb82d..7479fdc1554e6a87cb508fad6418678d8b26e856 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_remote_error.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_remote_error.pkt
@@ -3,8 +3,8 @@
 +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
 // Check the handshake with an empty(!) cookie
 +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_REMOTE_ERROR, se_on=1}, 8) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_REMOTE_ERROR, se_on=1}, [8]) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, [8]) = 0
 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
 +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed.pkt
index 6a55b3dc6db8f738d6f1dc25008c0547089ca008..db09d5fd93e19fe1df8c6dbe55b9bb1b896d91a1 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed.pkt
@@ -13,8 +13,14 @@
 spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0
 
 //test for SEND_FAILED_EVENT
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SEND_FAILED, se_on=1}, 8) = 0
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=150, srto_min=50}, 16) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, [8]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+						srto_initial=100,
+						srto_max=150,
+						srto_min=50}, 16) = 0
+
 +0.0 write(3, ..., 1000) = 1000
 +0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
 *    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
@@ -24,7 +30,18 @@ spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0
 *    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
 *    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
 *    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
-+1.0 sctp_recvv(3, [{iov_base={ssf_type=SCTP_SEND_FAILED, ssf_flags=SCTP_DATA_SENT, ssf_length=1144, ssf_error=0,
-ssf_info={sinfo_stream=0, sinfo_ssn=0, sinfo_flags=3, sinfo_ppid=htonl(0), sinfo_context=0, sinfo_timetolive=0, sinfo_tsn=0, sinfo_cumtsn=0},
-ssf_assoc_id=3, ssf_data=...}, iov_len=1000}],
-1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
++1.0 sctp_recvv(3, [{iov_base={ssf_type=SCTP_SEND_FAILED,
+			       ssf_flags=SCTP_DATA_SENT,
+			       ssf_length=1144,
+			       ssf_error=0,
+			       ssf_info={sinfo_stream=0,
+					 sinfo_ssn=0,
+					 sinfo_flags=3,
+					 sinfo_ppid=htonl(0),
+					 sinfo_context=0,
+					 sinfo_timetolive=0,
+					 sinfo_tsn=0,
+					 sinfo_cumtsn=0,
+					 sinfo_assoc_id=3},
+			       ssf_assoc_id=3,
+			       ssf_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt
index 69780e2574b8fe6729948c558e8225cd930d268e..51cd97210d8ade8af2dd814c259eb5041a766240 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt
@@ -7,14 +7,26 @@
 +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
 +0.1 < sctp: COOKIE_ACK[flgs=0]
+
 +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address=..., spp_hbinterval=0, spp_pathmaxrxt=100, spp_pathmtu=1468, spp_flags=SPP_HB_DISABLE, 
-spp_ipv6_flowlabel=0, 
-spp_dscp=0}, 152) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address=...,
+						       spp_hbinterval=0,
+						       spp_pathmaxrxt=100,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_HB_DISABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, 152) = 0
 
 //test for SEND_FAILED_EVENT
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SEND_FAILED_EVENT, se_on=1}, 8) = 0
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=150, srto_min=50}, 16) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0,
+					      se_type=SCTP_SEND_FAILED_EVENT,
+					      se_on=1}, 8) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+						srto_initial=100,
+						srto_max=150,
+						srto_min=50}, 16) = 0
+
 +0.0 write(3, ..., 1000) = 1000
 +0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
 *    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
@@ -24,6 +36,14 @@ spp_dscp=0}, 152) = 0
 *    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
 *    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
 *    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
-+1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT, ssfe_flags=SCTP_DATA_SENT, ssfe_length=1032, ssfe_error=0,
-ssfe_info={snd_sid=0, snd_flags=3, snd_ppid=htonl(0), snd_context=0}, ssfe_assoc_id=3, ssfe_data=...}, iov_len=1000}],
-1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
++1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT,
+			       ssfe_flags=SCTP_DATA_SENT,
+			       ssfe_length=1032,
+			       ssfe_error=0,
+			       ssfe_info={snd_sid=0,
+					  snd_flags=3,
+                                          snd_ppid=htonl(0),
+                                          snd_context=0,
+					  snd_assoc_id=3},
+			       ssfe_assoc_id=3,
+			       ssfe_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt
index bbca55239d311473133ee2758b7f5125c5553db6..f060cbee7b38827f4911d3e33fc8726c2c70a954 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt
@@ -8,20 +8,27 @@
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
 +0.1 < sctp: COOKIE_ACK[flgs=0]
 +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
 //test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, 8) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1,
+					       sctp_association_event=1,
+					       sctp_address_event=0,
+					       sctp_send_failure_event=1,
+					       sctp_peer_error_event=0,
+					       sctp_shutdown_event=1,
+					       sctp_partial_delivery_event=0,
+					       sctp_adaptation_layer_event=0,
+					       sctp_authentication_event=0,
+					       sctp_sender_dry_event=0}, 11) = 0
 
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=1, sctp_address_event=0, sctp_send_failure_event=1,
-sctp_peer_error_event=0, sctp_shutdown_event=1, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0,
-sctp_sender_dry_event=0}, 11) = 0
-+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
 
 //test for SENDER_DRY_EVENT
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0
-+0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT, sender_dry_flags=0, sender_dry_length=12, sender_dry_assoc_id=3}, iov_len=1000}],
-1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0
++0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT,
+			       sender_dry_flags=0,
+			       sender_dry_length=12,
+			       sender_dry_assoc_id=3}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0
 
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt
index 5488096702167b2676227eb07311a68f16270323..9671000ddce4f8021868cd7a2e38d9caa8a01be6 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt
@@ -8,15 +8,21 @@
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
 +0.1 < sctp: COOKIE_ACK[flgs=0]
 +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
 //test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
 
 // Tear down the association
 +0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
 *    > sctp: SHUTDOWN_ACK[flgs=0]
 +0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
 +0.0 recvmsg(3, {msg_name(...)=..., 
-		 msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=0, sse_length=12}, iov_len=1000}],
+		 msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT,
+					sse_flags=0,
+					sse_length=12,
+					sse_assoc_id=3}, iov_len=1000}],
+		 msg_control(0)=[],
 		 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12
 //+0.0 sctp_recvv(3, [{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=1, sse_length=12}, iov_len=1000}], 1,
 //..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt
index e81c3d2844ad6afc21e959902ab3320a094da092..bf44947527a16a98c19550410182fff1011606e2 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt
@@ -13,7 +13,8 @@
 +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
 //recvmsg(sd, msghdr, flags)
 +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
-                {spp_address=...,
+                {spp_assoc_id=0,
+		 spp_address=...,
                  spp_hbinterval=0,
                  spp_pathmaxrxt=8,
                  spp_pathmtu=1468,
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt
index a33a6d1950fec9df17d13a79b78dd047d694a1fb..d0e775b51c49dcefbad4f5f3b68663db5d14ba7c 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt
@@ -8,72 +8,78 @@
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
 +0.1 < sctp: COOKIE_ACK[flgs=0]
 
-+0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
 
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=..., sstat_rwnd=..., sstat_unackdata=..., sstat_penddata=...,
-sstat_instrms=..., sstat_outstrms=..., sstat_fragmentation_point=..., sstat_primary=...}, 176) = -1
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=0, ssp_addr={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}}, 136) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=0, ssp_addr={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}}, [136]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, 
-sstat_unackdata=0, sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL, pr_value=5, pr_assoc_id=3}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL, pr_value=5, pr_assoc_id=3}, [12]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., sstat_state=..., sstat_rwnd=..., sstat_unackdata=..., sstat_penddata=...,
+sstat_instrms=..., sstat_outstrms=..., sstat_fragmentation_point=..., sstat_primary=...}, 176) = -1
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=..., sstat_rwnd=1500, sstat_unackdata=0, 
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., sstat_state=..., sstat_rwnd=1500, sstat_unackdata=0, 
 sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=..., sstat_unackdata=0, 
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, 
+sstat_unackdata=0, sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=..., sstat_unackdata=0, 
 sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=..., 
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=1500, sstat_unackdata=..., 
 sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, 
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, 
 sstat_penddata=..., sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, 
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, 
 sstat_penddata=0, sstat_instrms=..., sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, 
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, 
 sstat_penddata=0, sstat_instrms=1, sstat_outstrms=..., sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, 
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, 
 sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., sstat_primary=...}, [176]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0,
-sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., sstat_primary={spinfo_address={sa_family=AF_INET,sin_port=htons(8080), 
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0,
+sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., sstat_primary={spinfo_assoc_id=3, spinfo_address={sa_family=AF_INET,sin_port=htons(8080), 
 sin_addr=inet_addr("192.0.2.1")}, spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468} }, [176]) = 0
 
 
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 setsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=..., spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=111, spinfo_rto=1000, spinfo_mtu=1468}, 152) = -1 (ENOPROTOOPT)
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=3, spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spinfo_state=..., spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468}, [152]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=3, spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spinfo_state=SCTP_ACTIVE, spinfo_cwnd=..., spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468}, [152]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=3, spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=..., spinfo_mtu=1468}, [152]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=3, spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=...}, [152]) = 0
 
 
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=3, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spp_hbinterval=300, spp_pathmaxrxt=8, spp_pathmtu=1468, spp_flags=SPP_DSCP|SPP_HB_ENABLE, spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spp_hbinterval=300, spp_pathmaxrxt=8, spp_pathmtu=1468, spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE, spp_ipv6_flowlabel=0, spp_dscp=0}, [152]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spp_hbinterval=..., spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=..., spp_ipv6_flowlabel=0, spp_dscp=0}, [152]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=..., spp_flags=521, spp_ipv6_flowlabel=0, spp_dscp=0}, [152]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv6_flowlabel=..., spp_dscp=0}, [152]) = 0
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv6_flowlabel=0, spp_dscp=...}, [152]) = 0
 
 
@@ -83,12 +89,14 @@ spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv
 +0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=..., linger=30}, [8]) = 0
 +0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=..., linger=...}, [8]) = 0
 
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=50}, 16) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=50}, [16]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=..., srto_max=200, srto_min=50}, [16]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=..., srto_min=50}, [16]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=...}, [16]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1452}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, 16) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=100, srto_max=200, srto_min=50}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=..., srto_max=200, srto_min=50}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=..., srto_min=50}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=...}, [16]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1452}, [8]) = 0
 
 +0 setsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2, sinit_max_instreams=2, sinit_max_attempts=2, sinit_max_init_timeo=30}, 8) = 0
 +0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2, sinit_max_instreams=2, sinit_max_attempts=2, sinit_max_init_timeo=30}, [8]) = 0
@@ -96,24 +104,24 @@ spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv
 +0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2, sinit_max_instreams=..., sinit_max_attempts=2, sinit_max_init_timeo=30}, [8]) = 0
 +0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2, sinit_max_instreams=2, sinit_max_attempts=..., sinit_max_init_timeo=30}, [8]) = 0
 
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=3, sasoc_peer_rwnd=1800, sasoc_local_rwnd=2000, 
-sasoc_cookie_life=40000}, 20) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=1, sasoc_peer_rwnd=1500, sasoc_local_rwnd=1864135, 
-sasoc_cookie_life=40000}, [20]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=..., sasoc_number_peer_destinations=..., sasoc_peer_rwnd=..., sasoc_local_rwnd=..., 
-sasoc_cookie_life=40000}, [20]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=..., sasoc_peer_rwnd=..., sasoc_local_rwnd=..., 
-sasoc_cookie_life=40000}, [20]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=..., sasoc_peer_rwnd=..., sasoc_local_rwnd=..., 
-sasoc_cookie_life=...}, [20]) = 0
-
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=250, sack_freq=1}, 12) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=250, sack_freq=1}, [12]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=..., sack_freq=1}, [12]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=250, sack_freq=...}, [12]) = 0
-
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=0, sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=3, sasoc_peer_rwnd=1800,
+						sasoc_local_rwnd=2000, sasoc_cookie_life=40000}, 20) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=0, sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=1, sasoc_peer_rwnd=1500,
+						sasoc_local_rwnd=1864135, sasoc_cookie_life=40000}, [20]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=0, sasoc_asocmaxrxt=..., sasoc_number_peer_destinations=..., sasoc_peer_rwnd=...,
+						sasoc_local_rwnd=..., sasoc_cookie_life=40000}, [20]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=0, sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=..., sasoc_peer_rwnd=...,
+						sasoc_local_rwnd=..., sasoc_cookie_life=40000}, [20]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=0, sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=..., sasoc_peer_rwnd=...,
+						sasoc_local_rwnd=..., sasoc_cookie_life=...}, [20]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=250, sack_freq=1}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=..., sack_freq=1}, [12]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=..., sack_freq=1}, [12]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=250, sack_freq=...}, [12]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
 
 +0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=0, snd_ppid=htonl(1), snd_context=1, snd_assoc_id=0}, 16) = 0
 +0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=0, snd_ppid=htonl(1), snd_context=1, snd_assoc_id=0}, [16]) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_init_rtx.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_init_rtx.pkt
index ed3759cd09697ed5d1a6f876dabe4a7680eb9046..75debec3c601438cb50dd309b2d1b0b1e528b03a 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_init_rtx.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_init_rtx.pkt
@@ -9,7 +9,7 @@
 +0.0 bind(3, ..., ...) = 0
 +0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
 +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=50}, 16) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=100, srto_max=200, srto_min=50}, 16) = 0
 +0.0 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
 // Check the number and the timing of the restransmissions
 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=0, ...]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt
index 17f94900394fa8e5d1e1fc44c00d53120dcdc19f..e19e4f64bb4b4ceb1867ac2b8913264e5dbe129a 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt
@@ -56,20 +56,41 @@ rcv_assoc_id=...},
 *    > sctp: SACK[flgs=0, cum_tsn=7, a_rwnd=..., gaps=[], dups=[]]
 +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=8, sid=0, ssn=7, ppid=10]
 *    > sctp: SACK[flgs=0, cum_tsn=8, a_rwnd=..., gaps=[], dups=[]]
-+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {
-recvv_rcvinfo={rcv_sid=0, rcv_ssn=6, rcv_flags=0, rcv_ppid=htonl(0), rcv_tsn=7, rcv_cumtsn=8, rcv_context=0, rcv_assoc_id=3},
-recvv_nxtinfo={nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000, nxt_assoc_id=4}}, [44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo={rcv_sid=0,
+									       rcv_ssn=6,
+									       rcv_flags=0,
+									       rcv_ppid=htonl(0),
+									       rcv_tsn=7,
+									       rcv_cumtsn=8,
+									       rcv_context=0,
+									       rcv_assoc_id=3},
+								recvv_nxtinfo={nxt_sid=0,
+									       nxt_flags=32,
+									       nxt_ppid=htonl(10),
+									       nxt_length=1000,
+									       nxt_assoc_id=3}}, [44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000
 
 +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=9, sid=0, ssn=8, ppid=11]
 *    > sctp: SACK[flgs=0, cum_tsn=9, a_rwnd=..., gaps=[], dups=[]]
-+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {
-recvv_rcvinfo={rcv_sid=0, rcv_ssn=7, rcv_flags=0, rcv_ppid=htonl(10), rcv_tsn=8, rcv_cumtsn=9, rcv_context=0, rcv_assoc_id=...}, recvv_nxtinfo=...},
-[44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo={rcv_sid=0,
+									       rcv_ssn=7,
+									       rcv_flags=0,
+									       rcv_ppid=htonl(10),
+									       rcv_tsn=8,
+									       rcv_cumtsn=9,
+									       rcv_context=0,
+									       rcv_assoc_id=3},
+								recvv_nxtinfo=...}, [44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000
+
 
 +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=10, sid=0, ssn=9, ppid=10]
 *    > sctp: SACK[flgs=0, cum_tsn=10, a_rwnd=..., gaps=[], dups=[]]
-+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {
-recvv_rcvinfo=..., recvv_nxtinfo={nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000, nxt_assoc_id=3}}, [44], [SCTP_RECVV_RN], [8]) = 1000
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo=...,
+								recvv_nxtinfo={nxt_sid=0,
+									       nxt_flags=32,
+									       nxt_ppid=htonl(10),
+									       nxt_length=1000,
+									       nxt_assoc_id=3}}, [44], [SCTP_RECVV_RN], [8]) = 1000
 +0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_EOR]) = 1000
 
 +0.0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_send.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_send.pkt
index dd3e13911825b78a56cb92b365c497f847661f3b..7557027687e2b91999fe733de8cd29b01bbd8255 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_send.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_send.pkt
@@ -13,8 +13,16 @@
 +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
 //sendmsg(sd, msghdr, flags)
 
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
-spp_hbinterval=0, spp_pathmaxrxt=8, spp_pathmtu=1468, spp_flags=SPP_HB_DISABLE, spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=3,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0, 
+							 spp_dscp=0}, 152)= 0
 
 +1.0 sctp_send(3, ..., 1000, {sinfo_stream=3,
                               sinfo_ssn=3,
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_sendx.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_sendx.pkt
index 20b4eb9a6734766192c57c6cb71147925d9dbd43..ed2b27ba3325391f1e143c442830d3606f68a443 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_sendx.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_sendx.pkt
@@ -13,8 +13,16 @@
 +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
 //sendmsg(sd, msghdr, flags)
 
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
-spp_hbinterval=0, spp_pathmaxrxt=8, spp_pathmtu=1468, spp_flags=SPP_HB_DISABLE, spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=3,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0, 
+							 spp_dscp=0}, 152) = 0
 
 +1.0 sctp_sendx(3, ..., 1000, ..., 1, {sinfo_stream=3,
                                        sinfo_ssn=3,
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt
index af811a60bd4158cad8ed03642210684a2fde792f..d7fdcc7d2da222517d3d9ac8f60c50fe4ccef853 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt
@@ -1,14 +1,14 @@
 0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
 
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=50}, 16) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=50, srto_max=200, srto_min=50}, 16) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=200, srto_max=200, srto_min=50}, 16) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=50, srto_max=50, srto_min=50}, 16) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=50}, 17) = 0 
-//+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=..., srto_max=200, srto_min=50}, 15) = -1 EINVAL (Invalid argument)
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=25, srto_max=200, srto_min=50}, 16) = -1 EINVAL (Invalid argument)
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=225, srto_max=200, srto_min=50}, 16) = -1 EINVAL (Invalid argument)
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=50, srto_max=50, srto_min=200}, 16) = -1 EINVAL (Invalid argument)
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, 16) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=50, srto_max=200, srto_min=50}, 16) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=200, srto_max=200, srto_min=50}, 16) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=50, srto_max=50, srto_min=50}, 16) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=100, srto_max=200, srto_min=50}, 17) = 0 
+//+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=..., srto_max=200, srto_min=50}, 15) = -1 EINVAL (Invalid argument)
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=25, srto_max=200, srto_min=50}, 16) = -1 EINVAL (Invalid argument)
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=225, srto_max=200, srto_min=50}, 16) = -1 EINVAL (Invalid argument)
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=50, srto_max=50, srto_min=200}, 16) = -1 EINVAL (Invalid argument)
 
 +0 setsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=1024, sinit_max_instreams=1024, sinit_max_attempts=5, sinit_max_init_timeo=100}, 8) = 0
 +0 setsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=1024, sinit_max_instreams=1024, sinit_max_attempts=5, sinit_max_init_timeo=100}, 9) = 0
@@ -19,30 +19,30 @@
 +0 setsockopt(3, IPPROTO_SCTP, SCTP_NODELAY, [1], 5) = 0
 +0 setsockopt(3, IPPROTO_SCTP, SCTP_NODELAY, [1], 3) = -1 (Invalid argument)
 
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1}, 8) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=0}, 8) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1024}, 8) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1}, 9) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1}, 7) = -1 (Invalid argument)
-
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=1000, sack_freq=0}, 12) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=500, sack_freq=0}, 12) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=200, sack_freq=0}, 12) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=100, sack_freq=0}, 12) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=10, sack_freq=0}, 12) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=0, sack_freq=1}, 12) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=0, sack_freq=2}, 12) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=0, sack_freq=4}, 12) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=200, sack_freq=2}, 13) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=200, sack_freq=2}, 11) = -1 (Invalid argument)
-
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=1}, 8) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=0}, 8) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=1024}, 8) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=1}, 9) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=1}, 7) = -1 (Invalid argument)
-
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1}, 8) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=0}, 8) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1024}, 8) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1}, 9) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1}, 7) = -1 (Invalid argument)
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=1000, sack_freq=0}, 12) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=500, sack_freq=0}, 12) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=200, sack_freq=0}, 12) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=100, sack_freq=0}, 12) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=10, sack_freq=0}, 12) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=0, sack_freq=1}, 12) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=0, sack_freq=2}, 12) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=0, sack_freq=4}, 12) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=200, sack_freq=2}, 13) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=200, sack_freq=2}, 11) = -1 (Invalid argument)
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=1}, 8) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=0}, 8) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=1024}, 8) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=1}, 9) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=1}, 7) = -1 (Invalid argument)
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spp_hbinterval=30000, spp_pathmaxrxt=100, spp_pathmtu=1468, spp_flags=0, spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0
 
 +0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=0, sctp_address_event=0, sctp_send_failure_event=0,
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sendmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sendmsg.pkt
index 67d100db2f55d740ee8cc9868d7849dbc481ba8a..67f5857ff451ffa04e7d8fb676ce6411b124d6a0 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/sendmsg.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sendmsg.pkt
@@ -13,69 +13,138 @@
 +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
 //sendmsg(sd, msghdr, flags)
 
-+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
-spp_hbinterval=0, spp_pathmaxrxt=8, spp_pathmtu=1468, spp_flags=SPP_HB_DISABLE, spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
 
-+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(0)=[], msg_flags=0}, 0) = 1000
++1.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(0)=[],
+		 msg_flags=0}, 0) = 1000
 *    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
 +0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
 
 //base test
-+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(28)=
-	[{cmsg_len=28, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDINFO, cmsg_data=
-	 {snd_sid=2, snd_flags=0, snd_ppid=htonl(3), snd_context=2, snd_assoc_id=0}
-	}],
-	msg_flags=0}, 0) = 1000
++1.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(28)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(3),
+					      snd_context=2,
+					      snd_assoc_id=0}}],
+		 msg_flags=0}, 0) = 1000
 *    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=0, ppid=3]
 +0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
 
 // test with 2 cmsg
-+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(44)=
-	[{cmsg_len=28, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDINFO, cmsg_data=
-	 {snd_sid=2, snd_flags=0, snd_ppid=htonl(4), snd_context=2, snd_assoc_id=0}
-	},{cmsg_len=16, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_DSTADDRV4, cmsg_data=
-	 {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}
-	}],
-	msg_flags=0}, 0) = 1000
++1.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(44)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(4),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}}],
+		 msg_flags=0}, 0) = 1000
 *    > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=2, ssn=1, ppid=4]
 +0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
 
 // test with 2 cmsg
-+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(64)=
-	[{cmsg_len=28, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDINFO, cmsg_data=
-	 {snd_sid=2, snd_flags=0, snd_ppid=htonl(5), snd_context=2, snd_assoc_id=0}
-	},{cmsg_len=16, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_DSTADDRV4, cmsg_data=
-	 {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}
-	},{cmsg_len=18, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_PRINFO, cmsg_data=
-	 {pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}
-	}],
-	msg_flags=0}, 0) = 1000
++1.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(64)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(5),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}},
+				  {cmsg_len=18,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_PRINFO,
+				   cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}],
+		msg_flags=0}, 0) = 1000
 *    > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=2, ssn=2, ppid=5]
 +0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]]
 
-// test with 2 cmsg
-+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(80)=
-	[{cmsg_len=28, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDINFO, cmsg_data=
-	 {snd_sid=2, snd_flags=0, snd_ppid=htonl(6), snd_context=2, snd_assoc_id=0}
-	},{cmsg_len=16, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_DSTADDRV4, cmsg_data=
-	 {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}
-	},{cmsg_len=18, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_PRINFO, cmsg_data=
-	 {pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}
-	},{cmsg_len=14, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_AUTHINFO, cmsg_data=
-	 {auth_keynumber=123}
-	}],
-	msg_flags=0}, 0) = 1000
+// test with 4 cmsg
++1.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(80)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(6),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}},
+				  {cmsg_len=18,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_PRINFO,
+				   cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}},
+			          {cmsg_len=14,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_AUTHINFO,
+				   cmsg_data={auth_keynumber=123}}],
+		msg_flags=0}, 0) = 1000
 *    > sctp: DATA[flgs=BE, len=1016, tsn=5, sid=2, ssn=3, ppid=6]
 +0.0 < sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=1500, gaps=[], dups=[]]
 
 //test for sndrcvinfo
-+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(168)=
-	[{cmsg_len=28, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDINFO, cmsg_data=
-	 {snd_sid=2, snd_flags=0, snd_ppid=htonl(6), snd_context=2, snd_assoc_id=0}
-	},{cmsg_len=140, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDRCV, cmsg_data=
-	 {sinfo_stream=3, sinfo_ssn=3, sinfo_flags=0, sinfo_ppid=htonl(7), sinfo_context=0, sinfo_timetolive=0, sinfo_tsn=6, sinfo_cumtsn=6, sinfo_assoc_id=3}
-	}],
-	msg_flags=0}, 0) = 1000
++1.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(168)=[{cmsg_len=28,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDINFO,
+				    cmsg_data={snd_sid=2,
+					       snd_flags=0,
+					       snd_ppid=htonl(6),
+					       snd_context=2,
+					       snd_assoc_id=0}},
+				   {cmsg_len=140,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDRCV,
+				    cmsg_data={sinfo_stream=3,
+					       sinfo_ssn=3,
+					       sinfo_flags=0,
+					       sinfo_ppid=htonl(7),
+					       sinfo_context=0,
+					       sinfo_timetolive=0,
+					       sinfo_tsn=6,
+					       sinfo_cumtsn=6,
+					       sinfo_assoc_id=3}}],
+		msg_flags=0}, 0) = 1000
 *    > sctp: DATA[flgs=BE, len=1016, tsn=6, sid=3, ssn=0, ppid=7]
 +0.0 < sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=1500, gaps=[], dups=[]]