From b6785b4776c2faa5ae2793c3721a7560fca787d0 Mon Sep 17 00:00:00 2001
From: hoelscher <jens.hoelscher@fh-muenster.de>
Date: Fri, 27 Nov 2015 10:49:39 +0100
Subject: [PATCH] add syntax with and without sctp_assoc_id for all sockopt
 structures

---
 gtests/net/packetdrill/parser.y               | 260 +++++++++++++++++-
 gtests/net/packetdrill/run_system_call.c      |  61 ++--
 .../tests/bsd/sctp/api_tests/run-all-tests    |  37 ++-
 3 files changed, 333 insertions(+), 25 deletions(-)

diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index 7f763ec7..569c9be5 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -610,7 +610,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %type <expression> sctp_sackinfo sack_delay sack_freq
 %type <expression> sctp_rtoinfo srto_initial srto_max srto_min sctp_paddrinfo
 %type <expression> sctp_paddrparams spp_address spp_hbinterval spp_pathmtu spp_pathmaxrxt
-%type <expression> spp_flags spp_ipv6_flowlabel spp_dscp
+%type <expression> spp_flags spp_ipv6_flowlabel spp_dscp ssp_addr
 %type <expression> spinfo_address spinfo_state spinfo_cwnd spinfo_srtt spinfo_rto spinfo_mtu
 %type <expression> sasoc_asocmaxrxt sasoc_number_peer_destinations sasoc_peer_rwnd
 %type <expression> sasoc_local_rwnd sasoc_cookie_life sctp_assocparams
@@ -2826,6 +2826,14 @@ sctp_rtoinfo
 	$$->value.sctp_rtoinfo->srto_max = $8;
 	$$->value.sctp_rtoinfo->srto_min = $10;
 }
+| '{' srto_initial ',' srto_max ',' srto_min '}' {
+	$$ = new_expression(EXPR_SCTP_RTOINFO);
+	$$->value.sctp_rtoinfo = calloc(1, sizeof(struct sctp_rtoinfo_expr));
+	$$->value.sctp_rtoinfo->srto_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_rtoinfo->srto_initial = $2;
+	$$->value.sctp_rtoinfo->srto_max = $4;
+	$$->value.sctp_rtoinfo->srto_min = $6;
+}
 ;
 
 sinit_num_ostreams
@@ -2896,6 +2904,12 @@ sctp_assoc_value
 	$$->value.sctp_assoc_value->assoc_id = $4;
 	$$->value.sctp_assoc_value->assoc_value = $8;
 }
+| '{' ASSOC_VALUE '=' expression '}' {
+	$$ = new_expression(EXPR_SCTP_ASSOC_VALUE);
+	$$->value.sctp_assoc_value = calloc(1, sizeof(struct sctp_assoc_value_expr));
+	$$->value.sctp_assoc_value->assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_assoc_value->assoc_value = $4;
+}
 ;
 
 sack_delay
@@ -2924,6 +2938,13 @@ sctp_sackinfo
 	$$->value.sctp_sack_info->sack_delay = $6;
 	$$->value.sctp_sack_info->sack_freq = $8;
 }
+| '{' sack_delay ',' sack_freq '}' {
+	$$ = new_expression(EXPR_SCTP_SACKINFO);
+	$$->value.sctp_sack_info = calloc(1, sizeof(struct sctp_sack_info_expr));
+	$$->value.sctp_sack_info->sack_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_sack_info->sack_delay = $2;
+	$$->value.sctp_sack_info->sack_freq = $4;
+}
 ;
 
 sstat_state
@@ -3067,6 +3088,18 @@ sctp_paddrinfo
 	$$->value.sctp_paddrinfo->spinfo_rto = $14;
 	$$->value.sctp_paddrinfo->spinfo_mtu = $16;
 }
+| '{' spinfo_address ',' spinfo_state ',' spinfo_cwnd ','
+      spinfo_srtt ',' spinfo_rto ',' spinfo_mtu '}' {
+	$$ = new_expression(EXPR_SCTP_PADDRINFO);
+	$$->value.sctp_paddrinfo = calloc(1, sizeof(struct sctp_paddrinfo_expr));
+	$$->value.sctp_paddrinfo->spinfo_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_paddrinfo->spinfo_address = $2;
+	$$->value.sctp_paddrinfo->spinfo_state = $4;
+	$$->value.sctp_paddrinfo->spinfo_cwnd = $6;
+	$$->value.sctp_paddrinfo->spinfo_srtt = $8;
+	$$->value.sctp_paddrinfo->spinfo_rto = $10;
+	$$->value.sctp_paddrinfo->spinfo_mtu = $12;
+}
 ;
 
 sctp_status
@@ -3084,6 +3117,20 @@ sctp_status
 	$$->value.sctp_status->sstat_fragmentation_point = $18;
 	$$->value.sctp_status->sstat_primary = $20;
 }
+| '{' sstat_state ',' sstat_rwnd ',' sstat_unackdata ',' sstat_penddata ',' sstat_instrms ',' sstat_outstrms ','
+	sstat_fragmentation_point ',' sstat_primary '}' {
+	$$ = new_expression(EXPR_SCTP_STATUS);
+	$$->value.sctp_status = calloc(1, sizeof(struct sctp_status_expr));
+	$$->value.sctp_status->sstat_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_status->sstat_state = $2;
+	$$->value.sctp_status->sstat_rwnd = $4;
+	$$->value.sctp_status->sstat_unackdata = $6;
+	$$->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_address
@@ -3159,6 +3206,19 @@ sctp_paddrparams
 	$$->value.sctp_paddrparams->spp_ipv6_flowlabel = $16;
 	$$->value.sctp_paddrparams->spp_dscp = $18;
 }
+| '{' spp_address ',' spp_hbinterval ',' spp_pathmaxrxt ',' spp_pathmtu ','spp_flags ','
+      spp_ipv6_flowlabel ',' spp_dscp'}' {
+	$$ = new_expression(EXPR_SCTP_PEER_ADDR_PARAMS);
+	$$->value.sctp_paddrparams = calloc(1, sizeof(struct sctp_paddrparams_expr));
+	$$->value.sctp_paddrparams->spp_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_paddrparams->spp_address = $2;
+	$$->value.sctp_paddrparams->spp_hbinterval = $4;
+	$$->value.sctp_paddrparams->spp_pathmaxrxt = $6;
+	$$->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;
+}
 ;
 
 sasoc_asocmaxrxt
@@ -3223,6 +3283,17 @@ sctp_assocparams
         $$->value.sctp_assocparams->sasoc_local_rwnd = $12;
         $$->value.sctp_assocparams->sasoc_cookie_life = $14;
 }
+| '{' sasoc_asocmaxrxt ',' sasoc_number_peer_destinations ','
+      sasoc_peer_rwnd ',' sasoc_local_rwnd ',' sasoc_cookie_life '}' {
+	$$ = new_expression(EXPR_SCTP_ASSOCPARAMS);
+        $$->value.sctp_assocparams = calloc(1, sizeof(struct sctp_assocparams_expr));
+        $$->value.sctp_assocparams->sasoc_assoc_id = new_expression(EXPR_ELLIPSIS);
+        $$->value.sctp_assocparams->sasoc_asocmaxrxt = $2;
+        $$->value.sctp_assocparams->sasoc_number_peer_destinations = $4;
+        $$->value.sctp_assocparams->sasoc_peer_rwnd = $6;
+        $$->value.sctp_assocparams->sasoc_local_rwnd = $8;
+        $$->value.sctp_assocparams->sasoc_cookie_life = $10;
+}
 ;
 
 se_type
@@ -3256,6 +3327,13 @@ sctp_event
 	$$->value.sctp_event->se_type = $6;
 	$$->value.sctp_event->se_on = $8;
 }
+| '{' se_type ',' se_on '}' {
+	$$ = new_expression(EXPR_SCTP_EVENT);
+	$$->value.sctp_event = calloc(1, sizeof(struct sctp_event_expr));
+	$$->value.sctp_event->se_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_event->se_type = $2;
+	$$->value.sctp_event->se_on = $4;
+}
 ;
 
 sctp_event_subscribe
@@ -3353,20 +3431,33 @@ sctp_sndinfo
 	$$->value.sctp_sndinfo->snd_context = $8;
 	$$->value.sctp_sndinfo->snd_assoc_id = $12;
 }
+| '{' snd_sid ',' snd_flags ',' snd_ppid ',' snd_context '}' {
+	$$ = new_expression(EXPR_SCTP_SNDINFO);
+	$$->value.sctp_sndinfo = calloc(1, sizeof(struct sctp_sndinfo_expr));
+	$$->value.sctp_sndinfo->snd_sid = $2;
+	$$->value.sctp_sndinfo->snd_flags = $4;
+	$$->value.sctp_sndinfo->snd_ppid = $6;
+	$$->value.sctp_sndinfo->snd_context = $8;
+	$$->value.sctp_sndinfo->snd_assoc_id = new_expression(EXPR_ELLIPSIS);
+}
+;
+ssp_addr
+: SSP_ADDR '=' sockaddr { $$ = $3; }
+| SSP_ADDR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
 sctp_setprim
-: '{' SSP_ASSOC_ID '=' sctp_assoc_id ',' SSP_ADDR '=' sockaddr'}' {
+: '{' SSP_ASSOC_ID '=' sctp_assoc_id ',' ssp_addr '}' {
 	$$ = new_expression(EXPR_SCTP_SETPRIM);
 	$$->value.sctp_setprim = calloc(1, sizeof(struct sctp_setprim_expr));
 	$$->value.sctp_setprim->ssp_assoc_id = $4;
-	$$->value.sctp_setprim->ssp_addr = $8;
+	$$->value.sctp_setprim->ssp_addr = $6;
 }
-| '{' SSP_ASSOC_ID '=' sctp_assoc_id ',' SSP_ADDR '=' ELLIPSIS'}' {
+| '{' ssp_addr '}' {
 	$$ = new_expression(EXPR_SCTP_SETPRIM);
 	$$->value.sctp_setprim = calloc(1, sizeof(struct sctp_setprim_expr));
-	$$->value.sctp_setprim->ssp_assoc_id = $4;
-	$$->value.sctp_setprim->ssp_addr = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_setprim->ssp_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_setprim->ssp_addr = $2;
 }
 ;
 
@@ -3474,6 +3565,20 @@ sctp_sndrcvinfo
 	$$->value.sctp_sndrcvinfo->sinfo_tsn = $14;
 	$$->value.sctp_sndrcvinfo->sinfo_cumtsn = $16;
 	$$->value.sctp_sndrcvinfo->sinfo_assoc_id = $20;
+}
+| '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_timetolive ','
+      sinfo_tsn ',' sinfo_cumtsn '}' {
+	$$ = new_expression(EXPR_SCTP_SNDRCVINFO);
+	$$->value.sctp_sndrcvinfo = calloc(1, sizeof(struct sctp_sndrcvinfo_expr));
+	$$->value.sctp_sndrcvinfo->sinfo_stream = $2;
+	$$->value.sctp_sndrcvinfo->sinfo_ssn = $4;
+	$$->value.sctp_sndrcvinfo->sinfo_flags = $6;
+	$$->value.sctp_sndrcvinfo->sinfo_ppid = $8;
+	$$->value.sctp_sndrcvinfo->sinfo_context = $10;
+	$$->value.sctp_sndrcvinfo->sinfo_timetolive = $12;
+	$$->value.sctp_sndrcvinfo->sinfo_tsn = $14;
+	$$->value.sctp_sndrcvinfo->sinfo_cumtsn = $16;
+	$$->value.sctp_sndrcvinfo->sinfo_assoc_id = new_expression(EXPR_ELLIPSIS);
 };
 
 sinfo_pr_value
@@ -3547,6 +3652,25 @@ serinfo_next_flags ',' serinfo_next_stream ',' serinfo_next_aid ',' serinfo_next
 	$$->value.sctp_extrcvinfo->serinfo_next_length = $24;
 	$$->value.sctp_extrcvinfo->serinfo_next_ppid = $26;
 	$$->value.sctp_extrcvinfo->sinfo_assoc_id = $30;
+}
+| '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_pr_value ',' sinfo_tsn ',' sinfo_cumtsn ','
+serinfo_next_flags ',' serinfo_next_stream ',' serinfo_next_aid ',' serinfo_next_length ',' serinfo_next_ppid '}' {
+	$$ = new_expression(EXPR_SCTP_EXTRCVINFO);
+	$$->value.sctp_extrcvinfo = calloc(1, sizeof(struct sctp_extrcvinfo_expr));
+	$$->value.sctp_extrcvinfo->sinfo_stream = $2;
+	$$->value.sctp_extrcvinfo->sinfo_ssn = $4;
+	$$->value.sctp_extrcvinfo->sinfo_flags = $6;
+	$$->value.sctp_extrcvinfo->sinfo_ppid = $8;
+	$$->value.sctp_extrcvinfo->sinfo_context = $10;
+	$$->value.sctp_extrcvinfo->sinfo_pr_value = $12;
+	$$->value.sctp_extrcvinfo->sinfo_tsn = $14;
+	$$->value.sctp_extrcvinfo->sinfo_cumtsn = $16;
+	$$->value.sctp_extrcvinfo->serinfo_next_flags = $18;
+	$$->value.sctp_extrcvinfo->serinfo_next_stream = $20;
+	$$->value.sctp_extrcvinfo->serinfo_next_aid = $22;
+	$$->value.sctp_extrcvinfo->serinfo_next_length = $24;
+	$$->value.sctp_extrcvinfo->serinfo_next_ppid = $26;
+	$$->value.sctp_extrcvinfo->sinfo_assoc_id = new_expression(EXPR_ELLIPSIS);
 };
 
 rcv_sid
@@ -3626,6 +3750,18 @@ sctp_rcvinfo
 	$$->value.sctp_rcvinfo->rcv_context = $14;
 	$$->value.sctp_rcvinfo->rcv_assoc_id = $18;
 }
+| '{' rcv_sid ',' rcv_ssn ',' rcv_flags ',' rcv_ppid ',' rcv_tsn ',' rcv_cumtsn ',' rcv_context '}' {
+	$$ = new_expression(EXPR_SCTP_RCVINFO);
+	$$->value.sctp_rcvinfo = calloc(1, sizeof(struct sctp_rcvinfo_expr));
+	$$->value.sctp_rcvinfo->rcv_sid = $2;
+	$$->value.sctp_rcvinfo->rcv_ssn = $4;
+	$$->value.sctp_rcvinfo->rcv_flags = $6;
+	$$->value.sctp_rcvinfo->rcv_ppid = $8;
+	$$->value.sctp_rcvinfo->rcv_tsn = $10;
+	$$->value.sctp_rcvinfo->rcv_cumtsn = $12;
+	$$->value.sctp_rcvinfo->rcv_context = $14;
+	$$->value.sctp_rcvinfo->rcv_assoc_id = new_expression(EXPR_ELLIPSIS);
+}
 ;
 
 pr_policy
@@ -3731,6 +3867,15 @@ sctp_nxtinfo
 	$$->value.sctp_nxtinfo->nxt_length = $8;
 	$$->value.sctp_nxtinfo->nxt_assoc_id = $12;
 }
+| '{' nxt_sid ',' nxt_flags ',' nxt_ppid ',' nxt_length '}' {
+	$$ = new_expression(EXPR_SCTP_NXTINFO);
+	$$->value.sctp_sendv_spa = calloc(1, sizeof(struct sctp_nxtinfo_expr));
+	$$->value.sctp_nxtinfo->nxt_sid = $2;
+	$$->value.sctp_nxtinfo->nxt_flags = $4;
+	$$->value.sctp_nxtinfo->nxt_ppid = $6;
+	$$->value.sctp_nxtinfo->nxt_length = $8;
+	$$->value.sctp_nxtinfo->nxt_assoc_id = new_expression(EXPR_ELLIPSIS);
+}
 ;
 
 sctp_recvv_rn
@@ -3784,6 +3929,14 @@ sctp_shutdown_event
 	$$->value.sctp_shutdown_event->sse_flags = $4;
 	$$->value.sctp_shutdown_event->sse_length = $6;
 	$$->value.sctp_shutdown_event->sse_assoc_id = $10;
+}
+| '{' sse_type ',' sse_flags ',' sse_length '}' {
+	$$ = new_expression(EXPR_SCTP_SHUTDOWN_EVENT);
+	$$->value.sctp_shutdown_event = calloc(1, sizeof(struct sctp_shutdown_event_expr));
+	$$->value.sctp_shutdown_event->sse_type = $2;
+	$$->value.sctp_shutdown_event->sse_flags = $4;
+	$$->value.sctp_shutdown_event->sse_length = $6;
+	$$->value.sctp_shutdown_event->sse_assoc_id = new_expression(EXPR_ELLIPSIS);
 };
 
 pdapi_type
@@ -3865,6 +4018,17 @@ sctp_pdapi_event
 	$$->value.sctp_pdapi_event->pdapi_seq = $12;
 	$$->value.sctp_pdapi_event->pdapi_assoc_id = $16;
 }
+| '{' pdapi_type',' pdapi_flags ',' pdapi_length ',' pdapi_indication ',' pdapi_stream ',' pdapi_seq '}' {
+	$$ = new_expression(EXPR_SCTP_PDAPI_EVENT);
+	$$->value.sctp_pdapi_event = calloc(1, sizeof(struct sctp_pdapi_event_expr));
+	$$->value.sctp_pdapi_event->pdapi_type = $2;
+	$$->value.sctp_pdapi_event->pdapi_flags = $4;
+	$$->value.sctp_pdapi_event->pdapi_length = $6;
+	$$->value.sctp_pdapi_event->pdapi_indication = $8;
+	$$->value.sctp_pdapi_event->pdapi_stream = $10;
+	$$->value.sctp_pdapi_event->pdapi_seq = $12;
+	$$->value.sctp_pdapi_event->pdapi_assoc_id = new_expression(EXPR_ELLIPSIS);
+}
 ;
 
 auth_type
@@ -3936,6 +4100,16 @@ sctp_authkey_event
 	$$->value.sctp_authkey_event->auth_indication = $10;
 	$$->value.sctp_authkey_event->auth_assoc_id = $14;
 }
+| '{' auth_type ',' auth_flags ',' auth_length ',' auth_keynumber ',' auth_indication '}' {
+	$$ = new_expression(EXPR_SCTP_AUTHKEY_EVENT);
+	$$->value.sctp_authkey_event = calloc(1, sizeof(struct sctp_authkey_event_expr));
+	$$->value.sctp_authkey_event->auth_type = $2;
+	$$->value.sctp_authkey_event->auth_flags = $4;
+	$$->value.sctp_authkey_event->auth_length = $6;
+	$$->value.sctp_authkey_event->auth_keynumber = $8;
+	$$->value.sctp_authkey_event->auth_indication = $10;
+	$$->value.sctp_authkey_event->auth_assoc_id = new_expression(EXPR_ELLIPSIS);
+}
 ;
 
 sender_dry_type
@@ -3981,6 +4155,14 @@ sctp_sender_dry_event
 	$$->value.sctp_sender_dry_event->sender_dry_length = $6;
 	$$->value.sctp_sender_dry_event->sender_dry_assoc_id = $10;
 }
+| '{'sender_dry_type ',' sender_dry_flags ',' sender_dry_length '}' {
+	$$ = new_expression(EXPR_SCTP_SENDER_DRY_EVENT);
+	$$->value.sctp_sender_dry_event = calloc(1, sizeof(struct sctp_sender_dry_event_expr));
+	$$->value.sctp_sender_dry_event->sender_dry_type = $2;
+	$$->value.sctp_sender_dry_event->sender_dry_flags = $4;
+	$$->value.sctp_sender_dry_event->sender_dry_length = $6;
+	$$->value.sctp_sender_dry_event->sender_dry_assoc_id = new_expression(EXPR_ELLIPSIS);
+}
 ;
 
 ssfe_type
@@ -4047,6 +4229,17 @@ sctp_send_failed_event
 	$$->value.sctp_send_failed_event->ssfe_info = $12;
 	$$->value.sctp_send_failed_event->ssfe_assoc_id = $16;
 	$$->value.sctp_send_failed_event->ssfe_data = $18;
+}
+| '{' ssfe_type ',' ssfe_flags ',' ssfe_length ',' ssfe_error ',' SSFE_INFO '=' sctp_sndinfo ',' ssfe_data '}' {
+	$$ = new_expression(EXPR_SCTP_SEND_FAILED_EVENT);
+	$$->value.sctp_send_failed_event = calloc(1, sizeof(struct sctp_send_failed_event_expr));
+	$$->value.sctp_send_failed_event->ssfe_type = $2;
+	$$->value.sctp_send_failed_event->ssfe_flags = $4;
+	$$->value.sctp_send_failed_event->ssfe_length = $6;
+	$$->value.sctp_send_failed_event->ssfe_error = $8;
+	$$->value.sctp_send_failed_event->ssfe_info = $12;
+	$$->value.sctp_send_failed_event->ssfe_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_send_failed_event->ssfe_data = $14;
 };
 
 sac_type
@@ -4147,6 +4340,20 @@ sac_inbound_streams ',' SAC_ASSOC_ID '=' sctp_assoc_id ',' sac_info '}' {
 	$$->value.sctp_assoc_change->sac_assoc_id = $18;
 	$$->value.sctp_assoc_change->sac_info = $20;
 }
+| '{' sac_type ',' sac_flags ',' sac_length ',' sac_state ',' sac_error ',' sac_outbound_streams ','
+sac_inbound_streams ',' sac_info '}' {
+	$$ = new_expression(EXPR_SCTP_ASSOC_CHANGE);
+	$$->value.sctp_assoc_change = calloc(1, sizeof(struct sctp_assoc_change_expr));
+	$$->value.sctp_assoc_change->sac_type = $2;
+	$$->value.sctp_assoc_change->sac_flags = $4;
+	$$->value.sctp_assoc_change->sac_length = $6;
+	$$->value.sctp_assoc_change->sac_state = $8;
+	$$->value.sctp_assoc_change->sac_error = $10;
+	$$->value.sctp_assoc_change->sac_outbound_streams = $12;
+	$$->value.sctp_assoc_change->sac_inbound_streams = $14;
+	$$->value.sctp_assoc_change->sac_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_assoc_change->sac_info = $16;
+}
 ;
 
 sre_type
@@ -4209,6 +4416,16 @@ sctp_remote_error
 	$$->value.sctp_remote_error->sre_assoc_id = $12;
 	$$->value.sctp_remote_error->sre_data = $14;
 }
+| '{' sre_type ',' sre_flags ',' sre_length ',' sre_error ',' sre_data '}' {
+	$$ = new_expression(EXPR_SCTP_REMOTE_ERROR);
+	$$->value.sctp_remote_error = calloc(1, sizeof(struct sctp_remote_error_expr));
+	$$->value.sctp_remote_error->sre_type = $2;
+	$$->value.sctp_remote_error->sre_flags = $4;
+	$$->value.sctp_remote_error->sre_length = $6;
+	$$->value.sctp_remote_error->sre_error = $8;
+	$$->value.sctp_remote_error->sre_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_remote_error->sre_data = $10;
+}
 ;
 
 spc_type
@@ -4290,6 +4507,17 @@ sctp_paddr_change
 	$$->value.sctp_paddr_change->spc_error = $12;
 	$$->value.sctp_paddr_change->spc_assoc_id = $16;
 }
+| '{' spc_type ',' spc_flags ',' spc_length ',' spc_aaddr ',' spc_state ',' spc_error '}' {
+	$$ = new_expression(EXPR_SCTP_PADDR_CHANGE);
+	$$->value.sctp_paddr_change = calloc(1, sizeof(struct sctp_paddr_change_expr));
+	$$->value.sctp_paddr_change->spc_type = $2;
+	$$->value.sctp_paddr_change->spc_flags = $4;
+	$$->value.sctp_paddr_change->spc_length = $6;
+	$$->value.sctp_paddr_change->spc_aaddr = $8;
+	$$->value.sctp_paddr_change->spc_state = $10;
+	$$->value.sctp_paddr_change->spc_error = $12;
+	$$->value.sctp_paddr_change->spc_assoc_id = new_expression(EXPR_ELLIPSIS);
+}
 ;
 ssf_type
 : SSF_TYPE '=' INTEGER {
@@ -4365,6 +4593,17 @@ sctp_send_failed
 	$$->value.sctp_send_failed->ssf_assoc_id = $14;
 	$$->value.sctp_send_failed->ssf_data = $16;
 }
+| '{' ssf_type ',' ssf_flags ',' ssf_length ',' ssf_error ',' ssf_info ',' ssf_data '}' {
+	$$ = new_expression(EXPR_SCTP_SEND_FAILED);
+	$$->value.sctp_send_failed = calloc(1, sizeof(struct sctp_send_failed_expr));
+	$$->value.sctp_send_failed->ssf_type = $2;
+	$$->value.sctp_send_failed->ssf_flags = $4;
+	$$->value.sctp_send_failed->ssf_length = $6;
+	$$->value.sctp_send_failed->ssf_error = $8;
+	$$->value.sctp_send_failed->ssf_info = $10;
+	$$->value.sctp_send_failed->ssf_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_send_failed->ssf_data = $12;
+}
 ;
 
 sai_type
@@ -4421,6 +4660,15 @@ sctp_adaptation_event
 	$$->value.sctp_adaptation_event->sai_adaptation_ind = $8;
 	$$->value.sctp_adaptation_event->sai_assoc_id = $12;
 }
+| '{' sai_type ',' sai_flags ',' sai_length ',' sai_adaptation_ind '}' {
+	$$ = new_expression(EXPR_SCTP_ADAPTATION_EVENT);
+	$$->value.sctp_adaptation_event = calloc(1, sizeof(struct sctp_adaptation_event_expr));
+	$$->value.sctp_adaptation_event->sai_type = $2;
+	$$->value.sctp_adaptation_event->sai_flags = $4;
+	$$->value.sctp_adaptation_event->sai_length = $6;
+	$$->value.sctp_adaptation_event->sai_adaptation_ind = $8;
+	$$->value.sctp_adaptation_event->sai_assoc_id = new_expression(EXPR_ELLIPSIS);
+}
 ;
 
 sn_type
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 017b7ee7..1fd9bf35 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -2849,20 +2849,32 @@ static int check_sctp_sndinfo(struct sctp_sndinfo_expr *expr,
 }
 #endif
 #ifdef SCTP_DEFAULT_PRINFO
-static int check_sctp_default_prinfo(struct sctp_default_prinfo_expr *expr,
+static int check_sctp_default_prinfo(struct expression *expression,
 				     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))
+	if (expression->type == EXPR_SCTP_DEFAULT_PRINFO) {
+		struct sctp_default_prinfo_expr *expr = expression->value.sctp_default_prinfo;
+		if (check_sctp_assoc_t_expr(expr->pr_assoc_id, info->pr_assoc_id,
+					   "sctp_default_prinfo.pr_assoc_id", error))
+			return STATUS_ERR;
+		if (check_u16_expr(expr->pr_policy, info->pr_policy,
+				   "sctp_default_prinfo.pr_policy", error))
+			return STATUS_ERR;
+		if (check_u32_expr(expr->pr_value, info->pr_value,
+				   "sctp_default_prinfo.pr_value", error))
+			return STATUS_ERR;
+	} else if (expression->type == EXPR_SCTP_PRINFO) {
+		struct sctp_prinfo_expr *expr = expression->value.sctp_prinfo;
+		if (check_u16_expr(expr->pr_policy, info->pr_policy,
+				   "sctp_default_prinfo.pr_policy", error))
+			return STATUS_ERR;
+		if (check_u32_expr(expr->pr_value, info->pr_value,
+				   "sctp_default_prinfo.pr_value", error))
+			return STATUS_ERR;	
+	} else {
 		return STATUS_ERR;
-
+	}
 	return STATUS_OK;
 }
 #endif
@@ -3082,14 +3094,19 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		break;
 #endif
 #ifdef SCTP_DEFAULT_PRINFO
+	case EXPR_SCTP_PRINFO:
 	case EXPR_SCTP_DEFAULT_PRINFO:
 		live_optval = malloc(sizeof(struct sctp_default_prinfo));
 		live_optlen = sizeof(struct sctp_default_prinfo);
-		if (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;
+		if (EXPR_SCTP_DEFAULT_PRINFO) {
+			if (get_sctp_assoc_t(val_expression->value.sctp_default_prinfo->pr_assoc_id,
+					     &((struct sctp_default_prinfo *)live_optval)->pr_assoc_id,
+					     error)) {
+				free(live_optval);
+				return STATUS_ERR;
+			}
+		}else{
+			((struct sctp_default_prinfo *)live_optval)->pr_assoc_id = 0;
 		}
 		break;
 #endif
@@ -3204,7 +3221,7 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 #endif
 #ifdef SCTP_DEFAULT_PRINFO
 	case EXPR_SCTP_DEFAULT_PRINFO:
-		result = check_sctp_default_prinfo(val_expression->value.sctp_default_prinfo, live_optval, error);
+		result = check_sctp_default_prinfo(val_expression, live_optval, error);
 		break;
 #endif
 #ifdef SCTP_PRIMARY_ADDR
@@ -3534,6 +3551,18 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		break;
 #endif
 #ifdef SCTP_DEFAULT_PRINFO
+	case EXPR_SCTP_PRINFO:
+		if (get_u16(val_expression->value.sctp_prinfo->pr_policy,
+			    &default_prinfo.pr_policy, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u32(val_expression->value.sctp_prinfo->pr_value,
+			    &default_prinfo.pr_value, error)) {
+			return STATUS_ERR;
+		}
+		default_prinfo.pr_assoc_id = 0;
+		optval = &default_prinfo;
+		break;
 	case EXPR_SCTP_DEFAULT_PRINFO:
 		if (get_u16(val_expression->value.sctp_default_prinfo->pr_policy,
 			    &default_prinfo.pr_policy, error)) {
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests
index 19404d05..24ee914c 100755
--- a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests
@@ -63,6 +63,15 @@ set testcases = (setsockopt/sctp_rtoinfo_1 \
 		 getsockopt/sctp_default_prinfo \
 		 getsockopt/sctp_status \
 		 getsockopt/sctp_get_peer_addr_info \
+		 getsockopt/sctp_peer_auth_chunks \
+		 getsockopt/sctp_local_auth_chunks \
+		 getsockopt/sctp_get_assoc_number \
+		 getsockopt/sctp_get_assoc_id_list \
+		 getsockopt/sctp_set_peer_primary_addr \
+		 getsockopt/sctp_auth_chunk \
+		 getsockopt/sctp_auth_key \
+		 getsockopt/sctp_auth_deactivate_key \
+		 getsockopt/sctp_auth_delete_key \
 		 notifications/sctp_adaptation_event \
                  notifications/sctp_notifications_stopped_event \
                  notifications/sctp_remote_error \
@@ -74,9 +83,31 @@ set testcases = (setsockopt/sctp_rtoinfo_1 \
                  notifications/sctp_authentication_event \
                  notifications/sctp_peer_addr_change \
                  notifications/sctp_send_failed_event \
-		 sctp_send/sctp_send_1     \
-		 sctp_send/sctp_send_2     \
-		 sctp_sendx/sctp_sendx_1 )
+		 cmsgs/sendmsg_sctp_init \
+		 cmsgs/sendmsg_sctp_sndrcv \
+		 cmsgs/sendmsg_sctp_sndinfo \
+		 cmsgs/sendmsg_sctp_authinfo \
+		 cmsgs/sendmsg_sctp_prinfo \
+		 cmsgs/sendmsg_sctp_dstaddrv4 \
+		 cmsgs/sendmsg_sctp_dstaddrv6 \
+		 cmsgs/recvmsg_sctp_extrcv \
+		 cmsgs/recvmsg_sctp_nxtinfo \
+		 cmsgs/recvmsg_sctp_rcvinfo \
+		 cmsgs/recvmsg_sctp_sndrcv \
+		 cmsgs/recvmsg \
+		 cmsgs/sendmsg \
+		 sctp_send/sctp_send_1 \
+		 sctp_send/sctp_send_2 \
+		 sctp_sendx/sctp_sendx_1 \
+		 sctp_sendv/sctp_sendv \
+		 sctp_sendv/sctp_sendv_1 \
+		 sctp_sendv/sctp_sendv_2 \
+		 sctp_sendv/sctp_sendv_3 \
+		 sctp_sendv/sctp_sendv_4 \
+		 sctp_sendv/sctp_sendv_5 \
+		 sctp_sendv/sctp_sendv_6 \
+		 sctp_sendv/sctp_sendv_7 \
+		 sctp_sendv/sctp_sendv_8 )
 
 set rootdir = `/usr/bin/dirname $0`
 set os = `uname -s | tr '[A-Z]' '[a-z]'`
-- 
GitLab