diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l
index 9d0f88664a339769743a81b80772ffca8b34e67f..95d44be0a6c201ea4e0843d90b1bc26d649a5450 100644
--- a/gtests/net/packetdrill/lexer.l
+++ b/gtests/net/packetdrill/lexer.l
@@ -231,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;
diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index db0fd2cdd6adfa1cb8d889db9dc8c97d02402427..eca3d27cc76c9a892f16c0298ccd55adea389ea4 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -509,7 +509,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %token <reserved> ASSOC_ID ASSOC_VALUE
 %token <reserved> STREAM_ID STREAM_VALUE
 %token <reserved> SACK_ASSOC_ID SACK_DELAY SACK_FREQ
-%token <reserved> SSTAT_STATE SSTAT_RWND SSTAT_UNACKDATA SSTAT_PENDDATA
+%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
@@ -602,38 +602,38 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %type <expression> decimal_integer hex_integer data
 %type <expression> inaddr sockaddr msghdr cmsghdr cmsg_level cmsg_type cmsg_data
 %type <expression> iovec pollfd opt_revents
-%type <expression> linger l_onoff l_linger
+%type <expression> linger l_onoff l_linger sctp_assoc_id
 %type <expression> sctp_status sstat_state sstat_rwnd sstat_unackdata sstat_penddata
 %type <expression> sstat_instrms sstat_outstrms sstat_fragmentation_point sstat_primary
 %type <expression> sctp_initmsg sinit_num_ostreams sinit_max_instreams sinit_max_attempts
 %type <expression> sinit_max_init_timeo sctp_assoc_value sctp_stream_value
 %type <expression> sctp_sackinfo sack_delay sack_freq
-%type <expression> sctp_rtoinfo srto_assoc_id srto_initial srto_max srto_min sctp_paddrinfo
-%type <expression> sctp_paddrparams spp_assoc_id spp_address spp_hbinterval spp_pathmtu spp_pathmaxrxt
+%type <expression> sctp_rtoinfo srto_initial srto_max srto_min sctp_paddrinfo
+%type <expression> sctp_paddrparams spp_address spp_hbinterval spp_pathmtu spp_pathmaxrxt
 %type <expression> spp_flags spp_ipv6_flowlabel spp_dscp
 %type <expression> spinfo_address spinfo_state spinfo_cwnd spinfo_srtt spinfo_rto spinfo_mtu
-%type <expression> sasoc_assoc_id sasoc_asocmaxrxt sasoc_number_peer_destinations sasoc_peer_rwnd
+%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_assoc_id se_type se_on sctp_setadaptation sctp_setprim ssp_assoc_id 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 sctp_default_prinfo
-%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_shutdown_event sse_type sse_flags sse_length sse_assoc_id
-%type <expression> sctp_sender_dry_event sender_dry_type sender_dry_flags sender_dry_length sender_dry_assoc_id
+%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
 %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
@@ -2773,16 +2773,6 @@ linger
 }
 ;
 
-srto_assoc_id
-: SRTO_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)){
-		semantic_error("srto_assoc_id out of range");
-	}
-        $$ = new_integer_expression($3, "%u");
-}
-| SRTO_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 srto_initial
 : SRTO_INITIAL '=' INTEGER {
 	if (!is_valid_u32($3)){
@@ -2813,14 +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_assoc_id ',' srto_initial ',' srto_max ',' srto_min '}' {
+: '{' SRTO_ASSOC_ID '=' sctp_assoc_id ',' srto_initial ',' srto_max ',' srto_min '}' {
 	$$ = new_expression(EXPR_SCTP_RTOINFO);
 	$$->value.sctp_rtoinfo = calloc(1, sizeof(struct sctp_rtoinfo_expr));
-	$$->value.sctp_rtoinfo->srto_assoc_id = $2;
-	$$->value.sctp_rtoinfo->srto_initial = $4;
-	$$->value.sctp_rtoinfo->srto_max = $6;
-	$$->value.sctp_rtoinfo->srto_min = $8;
+	$$->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;
 }
 ;
 
@@ -2886,7 +2890,7 @@ sctp_stream_value
 ;
 
 sctp_assoc_value
-: '{' ASSOC_ID '=' expression ',' ASSOC_VALUE '=' expression '}' {
+: '{' ASSOC_ID '=' sctp_assoc_id ',' ASSOC_VALUE '=' expression '}' {
 	$$ = new_expression(EXPR_SCTP_ASSOC_VALUE);
 	$$->value.sctp_assoc_value = calloc(1, sizeof(struct sctp_assoc_value_expr));
 	$$->value.sctp_assoc_value->assoc_id = $4;
@@ -2913,7 +2917,7 @@ sack_freq
 | SACK_FREQ '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 
 sctp_sackinfo
-: '{' SACK_ASSOC_ID '=' expression ',' sack_delay ',' sack_freq '}' {
+: '{' SACK_ASSOC_ID '=' sctp_assoc_id ',' sack_delay ',' sack_freq '}' {
 	$$ = new_expression(EXPR_SCTP_SACKINFO);
 	$$->value.sctp_sack_info = calloc(1, sizeof(struct sctp_sack_info_expr));
 	$$->value.sctp_sack_info->sack_assoc_id = $4;
@@ -3064,29 +3068,20 @@ sctp_paddrinfo
 ;
 
 sctp_status
-: '{' sstat_state ',' sstat_rwnd ',' sstat_unackdata ',' sstat_penddata ',' sstat_instrms ',' sstat_outstrms ','
-	sstat_fragmentation_point ',' sstat_primary  '}' {
+: '{' SSTAT_ASSOC_ID '=' sctp_assoc_id ',' sstat_state ',' sstat_rwnd ',' sstat_unackdata ',' sstat_penddata ',' sstat_instrms ',' sstat_outstrms ','
+	sstat_fragmentation_point ',' sstat_primary '}' {
 	$$ = new_expression(EXPR_SCTP_STATUS);
 	$$->value.sctp_status = calloc(1, sizeof(struct sctp_status_expr));
-	$$->value.sctp_status->sstat_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;
-}
-;
-
-spp_assoc_id
-: SPP_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("spp_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
+	$$->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;
 }
-| SPP_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
 spp_address
@@ -3149,31 +3144,21 @@ spp_dscp
 ;
 
 sctp_paddrparams
-: '{' spp_assoc_id ',' spp_address ',' spp_hbinterval ',' spp_pathmaxrxt ',' spp_pathmtu ','spp_flags ','
+: '{' SPP_ASSOC_ID '=' sctp_assoc_id ',' spp_address ',' spp_hbinterval ',' spp_pathmaxrxt ',' spp_pathmtu ','spp_flags ','
       spp_ipv6_flowlabel ',' spp_dscp'}' {
 	$$ = new_expression(EXPR_SCTP_PEER_ADDR_PARAMS);
 	$$->value.sctp_paddrparams = calloc(1, sizeof(struct sctp_paddrparams_expr));
-	$$->value.sctp_paddrparams->spp_assoc_id = $2;
-	$$->value.sctp_paddrparams->spp_address = $4;
-	$$->value.sctp_paddrparams->spp_hbinterval = $6;
-	$$->value.sctp_paddrparams->spp_pathmaxrxt = $8;
-	$$->value.sctp_paddrparams->spp_pathmtu = $10;
-	$$->value.sctp_paddrparams->spp_flags = $12;
-	$$->value.sctp_paddrparams->spp_ipv6_flowlabel = $14;
-	$$->value.sctp_paddrparams->spp_dscp = $16;
+	$$->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;
 }
 ;
 
-sasoc_assoc_id
-: SASOC_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("sasoc_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SASOC_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 sasoc_asocmaxrxt
 : SASOC_ASOCMAXRXT '=' INTEGER {
 	if (!is_valid_u16($3)) {
@@ -3225,27 +3210,17 @@ sasoc_cookie_life
 ;
 
 sctp_assocparams
-: '{' sasoc_assoc_id ',' sasoc_asocmaxrxt ',' sasoc_number_peer_destinations ','
+: '{' SASOC_ASSOC_ID '=' sctp_assoc_id ',' sasoc_asocmaxrxt ',' sasoc_number_peer_destinations ','
       sasoc_peer_rwnd ',' sasoc_local_rwnd ',' sasoc_cookie_life '}' {
 	$$ = new_expression(EXPR_SCTP_ASSOCPARAMS);
         $$->value.sctp_assocparams = calloc(1, sizeof(struct sctp_assocparams_expr));
-        $$->value.sctp_assocparams->sasoc_assoc_id = $2;
-        $$->value.sctp_assocparams->sasoc_asocmaxrxt = $4;
-        $$->value.sctp_assocparams->sasoc_number_peer_destinations = $6;
-        $$->value.sctp_assocparams->sasoc_peer_rwnd = $8;
-        $$->value.sctp_assocparams->sasoc_local_rwnd = $10;
-        $$->value.sctp_assocparams->sasoc_cookie_life = $12;
-}
-;
-
-se_assoc_id
-: SE_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("se_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
+        $$->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;
 }
-| SE_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
 se_type
@@ -3272,12 +3247,12 @@ se_on
 ;
 
 sctp_event
-: '{' se_assoc_id ',' se_type ',' se_on '}' {
+: '{' SE_ASSOC_ID '=' sctp_assoc_id ',' se_type ',' se_on '}' {
 	$$ = new_expression(EXPR_SCTP_EVENT);
 	$$->value.sctp_event = calloc(1, sizeof(struct sctp_event_expr));
-	$$->value.sctp_event->se_assoc_id = $2;
-	$$->value.sctp_event->se_type = $4;
-	$$->value.sctp_event->se_on = $6;
+	$$->value.sctp_event->se_assoc_id = $4;
+	$$->value.sctp_event->se_type = $6;
+	$$->value.sctp_event->se_on = $8;
 }
 ;
 
@@ -3366,54 +3341,27 @@ 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;
-}
-;
-ssp_assoc_id
-: SSP_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("ssp_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SSP_ASSOC_ID '=' WORD {
-	$$ = new_expression(EXPR_WORD);
-	$$->value.string = $3;
+	$$->value.sctp_sndinfo->snd_assoc_id = $12;
 }
-| SSP_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
 sctp_setprim
-: '{' ssp_assoc_id ',' SSP_ADDR '=' sockaddr'}' {
+: '{' 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 = $2;
-	$$->value.sctp_setprim->ssp_addr = $6;
+	$$->value.sctp_setprim->ssp_assoc_id = $4;
+	$$->value.sctp_setprim->ssp_addr = $8;
 }
 ;
+
 sctp_setadaptation
 : '{' SSB_ADAPTATION_IND '=' INTEGER '}' {
 	$$ = new_expression(EXPR_SCTP_SETADAPTATION);
@@ -3499,18 +3447,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;
@@ -3521,7 +3460,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
@@ -3578,7 +3517,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;
@@ -3594,10 +3533,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)) {
@@ -3662,19 +3600,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;
@@ -3684,7 +3611,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;
 }
 ;
 
@@ -3701,7 +3628,7 @@ pr_policy
 };
 
 sctp_default_prinfo
-: '{' pr_policy ',' PR_VALUE '=' INTEGER ',' PR_ASSOC_ID '=' expression'}' {
+: '{' 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;
@@ -3781,25 +3708,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;
 }
 ;
 
@@ -3812,16 +3729,6 @@ sctp_recvv_rn
 }
 ;
 
-sse_assoc_id
-: SSE_ASSOC_ID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("sse_assoc_id out of range");
-	}
-	$$ = new_integer_expression($3, "%u");
-}
-| SSE_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-;
-
 sse_type
 : SSE_TYPE '=' INTEGER {
 	if (!is_valid_u16($3)) {
@@ -3857,13 +3764,13 @@ sse_length
 ;
 
 sctp_shutdown_event
-: '{' sse_type ',' sse_flags ',' sse_length ',' sse_assoc_id '}' {
+: '{' 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 = $8;
+	$$->value.sctp_shutdown_event->sse_assoc_id = $10;
 };
 
 pdapi_type
@@ -3933,18 +3840,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;
@@ -3953,7 +3850,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;
 }
 ;
 
@@ -4015,18 +3912,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;
@@ -4034,7 +3921,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;
 }
 ;
 
@@ -4072,26 +3959,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)) {
@@ -4140,23 +4018,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;
@@ -4164,8 +4032,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
@@ -4246,16 +4114,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; }
@@ -4263,7 +4121,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;
@@ -4273,8 +4131,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;
 }
 ;
 
@@ -4322,31 +4180,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;
 }
 ;
 
@@ -4417,18 +4265,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;
@@ -4437,7 +4275,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
@@ -4497,23 +4335,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;
@@ -4521,8 +4349,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;
 }
 ;
 
@@ -4570,25 +4398,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 40c26cb47fac457cd5ede35781c598c69f7c6523..87b6e9ecd320a149a31a890c0182909422426207 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -2613,6 +2613,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;
@@ -2963,7 +2966,12 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 	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;
+		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
@@ -3393,7 +3401,6 @@ 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;
@@ -3411,7 +3418,10 @@ 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
diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c
index 887b1a0b5ead5d9db444de495fa8c4deec015121..c6159bba745c5defe5b9724ea57647803beb8143 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -349,6 +349,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);
@@ -980,6 +981,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))
diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h
index b2b1580390df545334ab7f0c2763064e2db53630..99876144b95df136282343b1cdefd3f6ec3dabbb 100644
--- a/gtests/net/packetdrill/script.h
+++ b/gtests/net/packetdrill/script.h
@@ -229,6 +229,7 @@ struct sctp_sack_info_expr {
 
 /* 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;
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 d11d2c327910f0eeaf5a7768bfe75bf432a8d544..1315c9f3e54706d98531fa8213613a7dc70f8f23 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
@@ -16,34 +16,34 @@
 +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_state=..., sstat_rwnd=..., sstat_unackdata=..., sstat_penddata=...,
++0 setsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=..., sstat_rwnd=..., sstat_unackdata=..., sstat_penddata=...,
 sstat_instrms=..., sstat_outstrms=..., sstat_fragmentation_point=..., sstat_primary=...}, 176) = -1
 
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, 
-sstat_unackdata=0, sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0
-
-+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=3, 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,
++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_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
 
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,