diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l
index a0888dd15dab2a5f66fad31650e5d7d0acf8c167..213bae88f2ba1ad3c2aa76176c39d2108929741c 100644
--- a/gtests/net/packetdrill/lexer.l
+++ b/gtests/net/packetdrill/lexer.l
@@ -219,6 +219,7 @@ 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;
diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index 0e8979864c2c025e0dcda48669db058588d81ecb..3f6a6fa0d84b31e9d93659269f6ae0980e56235b 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -536,7 +536,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %token <reserved> STALENESS CHK PARAM UNRECOGNIZED_PARAMETERS
 %token <reserved> 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_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> SND_SID SND_FLAGS SND_PPID SND_CONTEXT SND_ASSOC_ID SSB_ADAPTATION_IND
 %token <reserved> BAD_CRC32C NULL_
@@ -611,7 +611,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %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_asocmaxrxt sasoc_number_peer_destinations sasoc_peer_rwnd
+%type <expression> sasoc_assoc_id 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 null
@@ -3143,6 +3143,16 @@ sctp_paddrparams
 }
 ;
 
+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)) {
@@ -3194,14 +3204,16 @@ sasoc_cookie_life
 ;
 
 sctp_assocparams
-: '{' sasoc_asocmaxrxt ',' sasoc_number_peer_destinations ',' sasoc_peer_rwnd ',' sasoc_local_rwnd ',' sasoc_cookie_life '}' {
+: '{' sasoc_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 = $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;
 }
 ;
 
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 7e0e290a91239fd73033fe95e1c88786fd97e259..4e1d3cd8a1412e35383a3deb627e425c9b62911d 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -2679,6 +2679,9 @@ static int check_sctp_assocparams(struct sctp_assocparams_expr *expr,
 			     struct sctp_assocparams *sctp_assocparams,
 			     char **error)
 {
+	if (check_u32_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;
@@ -2857,7 +2860,16 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 	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 (val_expression->value.sctp_rtoinfo->srto_assoc_id->type != EXPR_ELLIPSIS) {
+			if (get_u32(val_expression->value.sctp_assocparams->sasoc_assoc_id,
+				    &((struct sctp_assocparams*) live_optval)->sasoc_assoc_id,
+				    error)) {
+				free(live_optval);
+				return STATUS_ERR;
+			}
+		} else {
+			((struct sctp_assocparams*) live_optval)->sasoc_assoc_id = 0;
+		}
 		break;
 #endif
 #ifdef SCTP_INITMSG
@@ -3201,7 +3213,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_u32(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;
diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c
index b4d5463afb2a3593e4cdaeeac413f4a9cecef0b9..6e3b76ecc57c3762f33b63dd5d32f570d579098e 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -370,6 +370,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);
@@ -1175,6 +1176,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))
diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h
index 64243b9796bf1ccfa721f7a128ca2a1a2fe55977..8b9cbf0cf6623ffbf85af2a05442129c1b9fd0b5 100644
--- a/gtests/net/packetdrill/script.h
+++ b/gtests/net/packetdrill/script.h
@@ -256,6 +256,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;
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 ffb390ab0dc03c30f63aa46ef403bd01e5f5d403..e83ad2af1cdf81d3d3f6ebf8bf9f01cb0759e4e1 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
@@ -98,16 +98,16 @@ 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_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_delay=250, sack_freq=1}, 12) = 0
 +0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=250, sack_freq=1}, [12]) = 0