diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l
index a308a5720e05004033a48917cbebad037378c826..41035ebd6ad86e55ca6d230def89b4664d30da73 100644
--- a/gtests/net/packetdrill/lexer.l
+++ b/gtests/net/packetdrill/lexer.l
@@ -210,14 +210,18 @@ 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;
 stream_id			return STREAM_ID;
 stream_value			return STREAM_VALUE;
+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;
@@ -227,6 +231,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;
@@ -235,12 +240,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;
@@ -248,6 +255,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_;
@@ -265,6 +273,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;
@@ -283,6 +293,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;
@@ -312,6 +323,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;
diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index cb23b55eedfa2174d366821ca29f1aadb9a19fcf..3ee8ff41e39d472238bc4ca10b9f8522c0449120 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -503,16 +503,16 @@ 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
 %token <reserved> STREAM_ID STREAM_VALUE
-%token <reserved> SACK_DELAY SACK_FREQ
-%token <reserved> SSTAT_STATE SSTAT_RWND SSTAT_UNACKDATA SSTAT_PENDDATA
+%token <reserved> 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_ASSOC_ID SPINFO_ADDRESS SPINFO_STATE SPINFO_CWND SPINFO_SRTT SPINFO_RTO
 %token <reserved> SPINFO_MTU
 %token <reserved> CHUNK DATA INIT INIT_ACK HEARTBEAT HEARTBEAT_ACK ABORT
 %token <reserved> SHUTDOWN SHUTDOWN_ACK ERROR COOKIE_ECHO COOKIE_ACK ECNE CWR
@@ -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_
@@ -601,7 +602,7 @@ 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
@@ -613,26 +614,26 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %type <expression> spinfo_address spinfo_state spinfo_cwnd spinfo_srtt spinfo_rto spinfo_mtu
 %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> 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
 %type <errno_info> opt_errno
 %type <chunk_list> sctp_chunk_list_spec
@@ -2509,6 +2510,9 @@ expression
 | sctp_sndinfo      {
 	$$ = $1;
 }
+| sctp_setprim      {
+	$$ = $1;
+}
 | sctp_setadaptation{
 	$$ = $1;
 }
@@ -2518,6 +2522,9 @@ expression
 | sctp_prinfo       {
 	$$ = $1;
 }
+|sctp_default_prinfo{
+	$$ = $1;
+}
 | sctp_authinfo     {
 	$$ = $1;
 }
@@ -2796,13 +2803,28 @@ 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_initial = $2;
-	$$->value.sctp_rtoinfo->srto_max = $4;
-	$$->value.sctp_rtoinfo->srto_min = $6;
+	$$->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;
 }
 ;
 
@@ -2868,10 +2890,11 @@ 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_value = $4;
+	$$->value.sctp_assoc_value->assoc_id = $4;
+	$$->value.sctp_assoc_value->assoc_value = $8;
 }
 ;
 
@@ -2894,11 +2917,12 @@ 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_delay = $2;
-	$$->value.sctp_sack_info->sack_freq = $4;
+	$$->value.sctp_sack_info->sack_assoc_id = $4;
+	$$->value.sctp_sack_info->sack_delay = $6;
+	$$->value.sctp_sack_info->sack_freq = $8;
 }
 ;
 
@@ -3031,31 +3055,34 @@ 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_address = $2;
-	$$->value.sctp_paddrinfo->spinfo_state = $4;
-	$$->value.sctp_paddrinfo->spinfo_cwnd = $6;
-	$$->value.sctp_paddrinfo->spinfo_srtt = $8;
-	$$->value.sctp_paddrinfo->spinfo_rto = $10;
-	$$->value.sctp_paddrinfo->spinfo_mtu = $12;
+	$$->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;
 }
 ;
 
 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_state = $2;
-	$$->value.sctp_status->sstat_rwnd = $4;
-	$$->value.sctp_status->sstat_unackdata = $6;
-	$$->value.sctp_status->sstat_penddata = $8;
-	$$->value.sctp_status->sstat_instrms = $10;
-	$$->value.sctp_status->sstat_outstrms = $12;
-	$$->value.sctp_status->sstat_fragmentation_point = $14;
-	$$->value.sctp_status->sstat_primary = $16;
+	$$->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;
 }
 ;
 
@@ -3119,16 +3146,18 @@ 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_address = $2;
-	$$->value.sctp_paddrparams->spp_hbinterval = $4;
-	$$->value.sctp_paddrparams->spp_pathmaxrxt = $6;
-	$$->value.sctp_paddrparams->spp_pathmtu = $8;
-	$$->value.sctp_paddrparams->spp_flags = $10;
-	$$->value.sctp_paddrparams->spp_ipv6_flowlabel = $12;
-	$$->value.sctp_paddrparams->spp_dscp = $14;
+	$$->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;
 }
 ;
 
@@ -3183,14 +3212,16 @@ 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_asocmaxrxt = $2;
-        $$->value.sctp_assocparams->sasoc_number_peer_destinations = $4;
-        $$->value.sctp_assocparams->sasoc_peer_rwnd = $6;
-        $$->value.sctp_assocparams->sasoc_local_rwnd = $8;
-        $$->value.sctp_assocparams->sasoc_cookie_life = $10;
+        $$->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;
 }
 ;
 
@@ -3218,11 +3249,12 @@ 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_type = $2;
-	$$->value.sctp_event->se_on = $4;
+	$$->value.sctp_event->se_assoc_id = $4;
+	$$->value.sctp_event->se_type = $6;
+	$$->value.sctp_event->se_on = $8;
 }
 ;
 
@@ -3311,30 +3343,24 @@ 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 = $10;
+	$$->value.sctp_sndinfo->snd_assoc_id = $12;
+}
+;
+
+sctp_setprim
+: '{' SSP_ASSOC_ID '=' sctp_assoc_id ',' SSP_ADDR '=' sockaddr'}' {
+	$$ = 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 = $8;
 }
 ;
 
@@ -3423,18 +3449,9 @@ 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;
@@ -3445,7 +3462,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 = $20;
 };
 
 sinfo_pr_value
@@ -3502,7 +3519,7 @@ 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;
@@ -3518,10 +3535,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 = $30;
 };
 
-
 rcv_sid
 : RCV_SID '=' INTEGER {
 	if (!is_valid_u16($3)) {
@@ -3586,19 +3602,8 @@ 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;
@@ -3608,7 +3613,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 = $18;
 }
 ;
 
@@ -3624,8 +3629,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;
@@ -3692,25 +3710,15 @@ 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 = $10;
+	$$->value.sctp_nxtinfo->nxt_assoc_id = $12;
 }
 ;
 
@@ -3758,12 +3766,13 @@ 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;
 };
 
 pdapi_type
@@ -3833,18 +3842,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;
@@ -3853,7 +3852,7 @@ 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;
 }
 ;
 
@@ -3915,18 +3914,8 @@ 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;
@@ -3934,7 +3923,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 = $14;
 }
 ;
 
@@ -3972,26 +3961,17 @@ 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 = $8;
+	$$->value.sctp_sender_dry_event->sender_dry_assoc_id = $10;
 }
 ;
+
 ssfe_type
 : SSFE_TYPE '=' INTEGER {
 	if (!is_valid_u16($3)) {
@@ -4040,23 +4020,13 @@ 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;
@@ -4064,8 +4034,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 = $16;
+	$$->value.sctp_send_failed_event->ssfe_data = $18;
 };
 
 sac_type
@@ -4146,16 +4116,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; }
@@ -4163,7 +4123,7 @@ 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;
@@ -4173,8 +4133,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 = $18;
+	$$->value.sctp_assoc_change->sac_info = $20;
 }
 ;
 
@@ -4222,31 +4182,21 @@ 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 = $10;
-	$$->value.sctp_remote_error->sre_data = $12;
+	$$->value.sctp_remote_error->sre_assoc_id = $12;
+	$$->value.sctp_remote_error->sre_data = $14;
 }
 ;
 
@@ -4317,18 +4267,8 @@ 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;
@@ -4337,7 +4277,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 = $16;
 }
 ;
 ssf_type
@@ -4397,23 +4337,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;
@@ -4421,8 +4351,8 @@ 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;
 }
 ;
 
@@ -4470,25 +4400,15 @@ 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 = $10;
+	$$->value.sctp_adaptation_event->sai_assoc_id = $12;
 }
 ;
 
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 7403cc711344cc476b5e5a9e3639f708ba87488e..017b7ee7baef599ebc8b858243e1d73ec38b524e 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.
@@ -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;
@@ -2488,6 +2530,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;
@@ -2528,6 +2573,9 @@ 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 +2592,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 +2620,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 +2701,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 +2733,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 +2761,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 +2841,41 @@ 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 sctp_default_prinfo_expr *expr,
+				     struct sctp_default_prinfo *info,
+				     char **error)
+{
+	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;
+
+	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;
@@ -2835,14 +2931,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
@@ -2855,23 +2961,37 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 	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 +3008,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 +3025,11 @@ 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_SS_VALUE
@@ -2923,7 +3049,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)) {
@@ -2942,9 +3073,33 @@ 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_DEFAULT_PRINFO:
+		live_optval = malloc(sizeof(struct sctp_default_prinfo));
+		live_optlen = sizeof(struct 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;
+		}
+		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;
 		}
@@ -3047,6 +3202,16 @@ 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->value.sctp_default_prinfo, 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);
@@ -3108,6 +3273,12 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #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
@@ -3152,7 +3323,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 +3344,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 +3381,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;
@@ -3228,7 +3408,10 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #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 +3425,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 +3448,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;
@@ -3334,13 +3526,43 @@ 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_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,
@@ -3352,7 +3574,10 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #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");
@@ -3578,8 +3803,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 +3878,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;
@@ -3862,7 +4087,7 @@ static int parse_expression_to_sctp_sndrcvinfo(struct expression *expr,
 				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 +4114,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 {
@@ -4266,8 +4491,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 +4504,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 +4549,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 +4582,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 +4606,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 +4639,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 +4664,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 +4689,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 +4734,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 +4762,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 +4784,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 +4812,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 +5197,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 +5224,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 +5271,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 +5356,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..e51c89f6119fbc1cadfd60e5fb0ec8457864be9a 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -79,9 +79,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"    },
@@ -313,12 +315,14 @@ 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_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:
@@ -330,11 +334,13 @@ void free_expression(struct expression *expression)
 		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 +350,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 +362,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 +377,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 +385,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 +407,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 +430,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 +506,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);
@@ -787,6 +807,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))
@@ -854,6 +878,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))
@@ -878,6 +906,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 +938,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 +986,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 +1041,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 +1120,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 +1212,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 +1279,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 +1415,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 +1849,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;
 }
@@ -2125,6 +2241,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 +2253,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;
diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h
index 00ab1b4b1c1be7cad8b2a3084b82cfb7f03d0888..df4e1d763213dd9c5ba142f232c9c136daeebfb2 100644
--- a/gtests/net/packetdrill/script.h
+++ b/gtests/net/packetdrill/script.h
@@ -59,9 +59,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 */
@@ -111,9 +113,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;
@@ -190,6 +194,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;
@@ -205,6 +210,7 @@ struct sctp_initmsg_expr {
 
 /* 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;
 };
 
@@ -216,12 +222,14 @@ struct sctp_stream_value_expr {
 
 /* 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 +242,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 +253,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 +265,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 +275,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 +303,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 +333,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 +430,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. */
diff --git a/gtests/net/packetdrill/symbols_freebsd.c b/gtests/net/packetdrill/symbols_freebsd.c
index a3adfe351b873ca8a1ef0b973b198922e7852b75..4f4f2c1700edd8b10a27b7fd5a8a41eea2e3b90c 100644
--- a/gtests/net/packetdrill/symbols_freebsd.c
+++ b/gtests/net/packetdrill/symbols_freebsd.c
@@ -84,6 +84,7 @@ struct int_symbol platform_symbols_table[] = {
 	{ SCTP_INITMSG,                     "SCTP_INITMSG"                    },
 	{ SCTP_INIT,                        "SCTP_INIT"                       },
 	{ SCTP_NODELAY,                     "SCTP_NODELAY"                    },
+	{ SCTP_PRIMARY_ADDR,                "SCTP_PRIMARY_ADDR"               },
 	{ SCTP_ADAPTATION_LAYER,            "SCTP_ADAPTATION_LAYER"           },
 	{ SCTP_MAXSEG,                      "SCTP_MAXSEG"                     },
 	{ SCTP_DELAYED_SACK,                "SCTP_DELAYED_SACK"               },
@@ -92,6 +93,7 @@ struct int_symbol platform_symbols_table[] = {
 	{ SCTP_EVENT,                       "SCTP_EVENT"                      },
 	{ 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_FRAGMENT_INTERLEAVE,         "SCTP_FRAGMENT_INTERLEAVE"        },
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=[]]