diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l
index 1244636e640f55631833deeaf5e96884b3785888..9521fed2eddd06237cbe92a334e2d3969122dae7 100644
--- a/gtests/net/packetdrill/lexer.l
+++ b/gtests/net/packetdrill/lexer.l
@@ -506,6 +506,13 @@ sca_assoc_id			return SCA_ASSOC_ID;
 sca_keynumber			return SCA_KEYNUMBER;
 sca_keylength			return SCA_KEYLENGTH;
 sca_key				return SCA_KEY;
+srs_assoc_id			return SRS_ASSOC_ID;
+srs_flags			return SRS_FLAGS;
+srs_number_streams		return SRS_NUMBER_STREAMS;
+srs_stream_list			return SRS_STREAM_LIST;
+sas_assoc_id			return SAS_ASSOC_ID;
+sas_instrms			return SAS_INSTRMS;
+sas_outstrms			return SAS_OUTSTRMS;
 CHUNK				return CHUNK;
 DATA				return DATA;
 INIT				return INIT;
diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index f5c85b66fe083778b3a6556f247c61649b1f9dae..c4af6bf1fef35e7d91ba00e71fe706dc24cf9f9a 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -567,6 +567,8 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %token <reserved> GAIDS_NUMBER_OF_IDS GAIDS_ASSOC_ID SSPP_ASSOC_ID SSPP_ADDR
 %token <reserved> SN_TYPE SN_FLAGS SN_LENGTH SAUTH_CHUNK
 %token <reserved> SCA_ASSOC_ID SCA_KEYNUMBER SCA_KEYLENGTH SCA_KEY
+%token <reserved> SRS_ASSOC_ID SRS_FLAGS SRS_NUMBER_STREAMS SRS_STREAM_LIST
+%token <reserved> SAS_ASSOC_ID SAS_INSTRMS SAS_OUTSTRMS
 %token <floating> FLOAT
 %token <integer> INTEGER HEX_INTEGER
 %token <string> WORD STRING BACK_QUOTED CODE IPV4_ADDR IPV6_ADDR
@@ -640,6 +642,8 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %type <expression> sctp_adaptation_event sai_type sai_flags sai_length sai_adaptation_ind
 %type <expression> sctp_tlv sn_type sn_flags sn_length sctp_assoc_ids gaids_number_of_ids
 %type <expression> sctp_setpeerprim sctp_authchunk sctp_authkey
+%type <expression> sctp_reset_streams srs_flags
+%type <expression> sctp_add_streams
 %type <errno_info> opt_errno
 %type <chunk_list> sctp_chunk_list_spec
 %type <chunk_list_item> sctp_chunk_spec
@@ -2632,6 +2636,12 @@ expression
 | sctp_authkey      {
 	$$ = $1;
 }
+| sctp_reset_streams{
+	$$ = $1;
+}
+| sctp_add_streams  {
+	$$ = $1;
+}
 | null              {
 	$$ = $1;
 }
@@ -4946,6 +4956,73 @@ sctp_authkey
 	$$->value.sctp_authkey->sca_key = $12;
 };
 
+srs_flags
+: SRS_FLAGS '=' INTEGER {
+	if (!is_valid_u16($3)) {
+		semantic_error("srs_flags out of range");
+	}
+	$$ = new_integer_expression($3, "%hu");
+}
+| SRS_FLAGS '=' WORD {
+	$$ = new_expression(EXPR_WORD);
+	$$->value.string = $3;
+}
+;
+
+sctp_reset_streams
+: '{' SRS_ASSOC_ID '=' sctp_assoc_id ',' srs_flags ',' SRS_NUMBER_STREAMS '=' INTEGER ',' SRS_STREAM_LIST '=' array '}' {
+	$$ = new_expression(EXPR_SCTP_RESET_STREAMS);
+	$$->value.sctp_reset_streams = calloc(1, sizeof(struct sctp_reset_streams_expr));
+	$$->value.sctp_reset_streams->srs_assoc_id = $4;
+	$$->value.sctp_reset_streams->srs_flags = $6;
+	if (!is_valid_u16($10)) {
+		semantic_error("srs_number_streams out of range");
+	}
+	$$->value.sctp_reset_streams->srs_number_streams = new_integer_expression($10, "%hu");
+	$$->value.sctp_reset_streams->srs_stream_list = $14;
+}
+| '{' srs_flags ',' SRS_NUMBER_STREAMS '=' INTEGER ',' SRS_STREAM_LIST '=' array '}' {
+	$$ = new_expression(EXPR_SCTP_RESET_STREAMS);
+	$$->value.sctp_reset_streams = calloc(1, sizeof(struct sctp_reset_streams_expr));
+	$$->value.sctp_reset_streams->srs_assoc_id = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_reset_streams->srs_flags = $2;
+	if (!is_valid_u16($6)) {
+		semantic_error("srs_number_streams out of range");
+	}
+	$$->value.sctp_reset_streams->srs_number_streams = new_integer_expression($6, "%hu");
+	$$->value.sctp_reset_streams->srs_stream_list = $10;
+}
+;
+
+sctp_add_streams
+: '{' SAS_ASSOC_ID '=' sctp_assoc_id ',' SAS_INSTRMS '=' INTEGER ',' SAS_OUTSTRMS '=' INTEGER '}' {
+	$$ = new_expression(EXPR_SCTP_ADD_STREAMS);
+	$$->value.sctp_add_streams = calloc(1, sizeof(struct sctp_add_streams_expr));
+	$$->value.sctp_add_streams->sas_assoc_id = $4;
+	if (!is_valid_u16($8)) {
+		semantic_error("sas_instrms out of range");
+	}
+	$$->value.sctp_add_streams->sas_instrms = new_integer_expression($8, "%hu");
+	if (!is_valid_u16($12)) {
+		semantic_error("sas_outstrms out of range");
+	}
+	$$->value.sctp_add_streams->sas_outstrms = new_integer_expression($12, "%hu");
+}
+| '{' SAS_INSTRMS '=' INTEGER ',' SAS_OUTSTRMS '=' INTEGER '}' {
+	$$ = new_expression(EXPR_SCTP_ADD_STREAMS);
+	$$->value.sctp_add_streams = calloc(1, sizeof(struct sctp_add_streams_expr));
+	$$->value.sctp_add_streams->sas_assoc_id = new_expression(EXPR_ELLIPSIS);
+	if (!is_valid_u16($4)) {
+		semantic_error("sas_instrms out of range");
+	}
+	$$->value.sctp_add_streams->sas_instrms = new_integer_expression($4, "%hu");
+	if (!is_valid_u16($8)) {
+		semantic_error("sas_outstrms out of range");
+	}
+	$$->value.sctp_add_streams->sas_outstrms = new_integer_expression($8, "%hu");
+}
+;
+
 opt_errno
 :                   { $$ = NULL; }
 | WORD note         {
diff --git a/gtests/net/packetdrill/run_packet.c b/gtests/net/packetdrill/run_packet.c
index c6ad48e279c0cb002ee1a0b4b912a1b189715fd8..b4d4a43bf020d77fd751e5ac7b6ddcce3b81c122 100644
--- a/gtests/net/packetdrill/run_packet.c
+++ b/gtests/net/packetdrill/run_packet.c
@@ -2697,8 +2697,8 @@ static int do_inbound_script_packet(
 	}
 
 	if (live_packet->ipv6 != NULL) {
-		uint32_t null_ip[4] = {0x00, 0x00, 0x00, 0x00};
-		if (memcmp(&(live_packet->ipv6->src_ip.__in6_u.__u6_addr32), &null_ip, sizeof(uint32_t) * 4) == 0) {
+		if (IN6_IS_ADDR_UNSPECIFIED(&live_packet->ipv6->src_ip)) {
+			DEBUGP("live_packet->ipv6->src_ip.s_addr == 0\n");
 			state->socket_under_test = setup_new_child_socket(state, packet);
 			struct tuple live_inbound;
 			socket_get_inbound(&state->socket_under_test->live, &live_inbound);
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index b365bbc70a91d1b11500faf048ac2a1871330ce1..ab467780101fff7ad6ce48fa9942297cf476bc29 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -3175,7 +3175,7 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		break;
 	}
 #endif
-#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
+#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED) || defined(SCTP_ENABLE_STREAM_RESET)
 	case EXPR_SCTP_ASSOC_VALUE:
 		live_optval = malloc(sizeof(struct sctp_assoc_value));
 		live_optlen = (socklen_t)sizeof(struct sctp_assoc_value);
@@ -3375,7 +3375,7 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		result = check_sctp_paddrparams(val_expression->value.sctp_paddrparams, live_optval, error);
 		break;
 #endif
-#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
+#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED) || defined(SCTP_ENABLE_STREAM_RESET)
 	case EXPR_SCTP_ASSOC_VALUE:
 		result = check_sctp_assoc_value(val_expression->value.sctp_assoc_value, live_optval, error);
 		break;
@@ -3467,7 +3467,7 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #ifdef SCTP_INITMSG
 	struct sctp_initmsg initmsg;
 #endif
-#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
+#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED) || defined(SCTP_ENABLE_STREAM_RESET)
 	struct sctp_assoc_value assoc_value;
 #endif
 #ifdef SCTP_AUTH_ACTIVE_KEY
@@ -3518,6 +3518,9 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 	u32 spp_ipv6_flowlabel;
 	u8 spp_dscp;
 #endif
+#endif
+#ifdef SCTP_ADD_STREAMS
+	struct sctp_add_streams add_streams;
 #endif
 	if (check_arg_count(args, 5, error))
 		return STATUS_ERR;
@@ -3609,7 +3612,7 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		optval = &initmsg;
 		break;
 #endif
-#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
+#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED) || defined(SCTP_ENABLE_STREAM_RESET)
 	case EXPR_SCTP_ASSOC_VALUE:
 		if (get_sctp_assoc_t(val_expression->value.sctp_assoc_value->assoc_id,
 				     &assoc_value.assoc_id, error)) {
@@ -3981,6 +3984,60 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #endif
 		optval = &paddrparams;
 		break;
+#endif
+#ifdef SCTP_RESET_STREAMS
+	case EXPR_SCTP_RESET_STREAMS: {
+		struct sctp_reset_streams *reset_streams;
+		struct expression_list *list;
+		int len = 0, i = 0;
+
+		if (check_type(val_expression->value.sctp_reset_streams->srs_stream_list, EXPR_LIST, error)) {
+			return STATUS_ERR;
+		}
+		list = val_expression->value.sctp_reset_streams->srs_stream_list->value.list;
+		len = expression_list_length(list);
+		reset_streams = malloc(sizeof(u32) + sizeof(u16) + sizeof(u16) + (sizeof(u16) * len));
+
+		if (get_sctp_assoc_t(val_expression->value.sctp_reset_streams->srs_assoc_id,
+				     &reset_streams->srs_assoc_id, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u16(val_expression->value.sctp_reset_streams->srs_flags,
+			    &reset_streams->srs_flags, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u16(val_expression->value.sctp_reset_streams->srs_number_streams,
+			    &reset_streams->srs_number_streams, error)) {
+			return STATUS_ERR;
+		}
+
+                for (i = 0; i < len; i++) {
+                        struct expression *expr;
+                        expr = get_arg(list, i, error);
+                        get_u16(expr, &(reset_streams->srs_stream_list[i]), error);
+                }
+
+		optval = &reset_streams;
+		break;
+	}
+#endif
+#ifdef SCTP_ADD_STREAMS
+	case EXPR_SCTP_ADD_STREAMS:
+		if (get_sctp_assoc_t(val_expression->value.sctp_add_streams->sas_assoc_id,
+				     &add_streams.sas_assoc_id, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u16(val_expression->value.sctp_add_streams->sas_instrms,
+			    &add_streams.sas_instrms, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u16(val_expression->value.sctp_add_streams->sas_outstrms,
+			    &add_streams.sas_outstrms, error)) {
+			return STATUS_ERR;
+		}
+
+		optval = &add_streams;
+		break;
 #endif
 	default:
 		asprintf(error, "unsupported value type: %s",
@@ -3993,7 +4050,7 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 	result = setsockopt(live_fd, level, optname, optval, optlen);
 
 	return end_syscall(state, syscall, CHECK_EXACT, result, error);
-#if defined(SCTP_HMAC_IDENT) || defined(SCTP_AUTH_KEY)
+#if defined(SCTP_HMAC_IDENT) || defined(SCTP_AUTH_KEY) || defined(SCTP_RESET_STREAMS)
 	free(optval);
 #endif
 }
diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c
index 1b78fccfec74215093642b6e0833afbbf83e1a41..8200496b47fb85664e5bf03586e296c9d56c228f 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -108,6 +108,8 @@ struct expression_type_entry expression_type_table[] = {
 	{ EXPR_SCTP_SETPEERPRIM,     "sctp_setpeerprim"},
 	{ EXPR_SCTP_AUTHCHUNK,       "sctp_authchunk"  },
 	{ EXPR_SCTP_AUTHKEY,         "sctp_authkey"    },
+	{ EXPR_SCTP_RESET_STREAMS,   "sctp_reset_streams"},
+	{ EXPR_SCTP_ADD_STREAMS,     "sctp_add_streams"},
 	{ NUM_EXPR_TYPES,            NULL}
 };
 
@@ -607,6 +609,17 @@ void free_expression(struct expression *expression)
 		free_expression(expression->value.sctp_authkey->sca_keylength);
 		free_expression(expression->value.sctp_authkey->sca_key);
 		break;
+	case EXPR_SCTP_RESET_STREAMS:
+		free_expression(expression->value.sctp_reset_streams->srs_assoc_id);
+		free_expression(expression->value.sctp_reset_streams->srs_flags);
+		free_expression(expression->value.sctp_reset_streams->srs_number_streams);
+		free_expression(expression->value.sctp_reset_streams->srs_stream_list);
+		break;
+	case EXPR_SCTP_ADD_STREAMS:
+		free_expression(expression->value.sctp_add_streams->sas_assoc_id);
+		free_expression(expression->value.sctp_add_streams->sas_instrms);
+		free_expression(expression->value.sctp_add_streams->sas_outstrms);
+		break;
 	case EXPR_WORD:
 		assert(expression->value.string);
 		free(expression->value.string);
@@ -2418,6 +2431,74 @@ static int evaluate_sctp_authkey_expression(struct expression *in,
 	return STATUS_OK;
 }
 
+static int evaluate_sctp_reset_streams_expression(struct expression *in,
+						  struct expression *out,
+						  char **error)
+{
+	struct sctp_reset_streams_expr *in_reset_streams;
+	struct sctp_reset_streams_expr *out_reset_streams;
+
+	assert(in->type == EXPR_SCTP_RESET_STREAMS);
+	assert(in->value.sctp_reset_streams);
+	assert(out->type == EXPR_SCTP_RESET_STREAMS);
+
+	out->value.sctp_reset_streams = calloc(1, sizeof(struct sctp_reset_streams_expr));
+
+	in_reset_streams = in->value.sctp_reset_streams;
+	out_reset_streams = out->value.sctp_reset_streams;
+
+	if (evaluate(in_reset_streams->srs_assoc_id,
+		     &out_reset_streams->srs_assoc_id,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_reset_streams->srs_flags,
+		     &out_reset_streams->srs_flags,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_reset_streams->srs_number_streams,
+		     &out_reset_streams->srs_number_streams,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_reset_streams->srs_stream_list,
+		     &out_reset_streams->srs_stream_list,
+		     error))
+		return STATUS_ERR;
+
+	return STATUS_OK;
+}
+
+static int evaluate_sctp_add_streams_expression(struct expression *in,
+						struct expression *out,
+						char **error)
+{
+	struct sctp_add_streams_expr *in_add_streams;
+	struct sctp_add_streams_expr *out_add_streams;
+
+	assert(in->type == EXPR_SCTP_ADD_STREAMS);
+	assert(in->value.sctp_add_streams);
+	assert(out->type == EXPR_SCTP_ADD_STREAMS);
+
+	out->value.sctp_add_streams = calloc(1, sizeof(struct sctp_add_streams_expr));
+
+	in_add_streams = in->value.sctp_add_streams;
+	out_add_streams = out->value.sctp_add_streams;
+
+	if (evaluate(in_add_streams->sas_assoc_id,
+		     &out_add_streams->sas_assoc_id,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_add_streams->sas_instrms,
+		     &out_add_streams->sas_instrms,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_add_streams->sas_outstrms,
+		     &out_add_streams->sas_outstrms,
+		     error))
+		return STATUS_ERR;
+
+	return STATUS_OK;
+}
+
 static int evaluate(struct expression *in,
 		    struct expression **out_ptr, char **error)
 {
@@ -2566,6 +2647,12 @@ static int evaluate(struct expression *in,
 	case EXPR_SCTP_AUTHKEY:
 		result = evaluate_sctp_authkey_expression(in, out, error);
 		break;
+	case EXPR_SCTP_RESET_STREAMS:
+		result = evaluate_sctp_reset_streams_expression(in, out, error);
+		break;
+	case EXPR_SCTP_ADD_STREAMS:
+		result = evaluate_sctp_add_streams_expression(in, out, error);
+		break;
 	case EXPR_WORD:
 		out->type = EXPR_INTEGER;
 		if (symbol_to_int(in->value.string,
diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h
index 6769d095c235523409f84915806502704ee57d23..97a9ce4deb124616c6e7de387a971dca8e0c4e47 100644
--- a/gtests/net/packetdrill/script.h
+++ b/gtests/net/packetdrill/script.h
@@ -88,6 +88,8 @@ enum expression_t {
 	EXPR_SCTP_SETPEERPRIM,    /* expression tree for sctp_setpeerprim struct for [gs]etsockopt */
 	EXPR_SCTP_AUTHCHUNK,      /* expression tree for sctp_authchunk struct for setsockopt */
 	EXPR_SCTP_AUTHKEY,        /* expression tree for sctp_authkey struct for setsockopt */
+	EXPR_SCTP_RESET_STREAMS,  /* expression tree for sctp_reset_stream struct for [gs]etsockopt */
+	EXPR_SCTP_ADD_STREAMS,    /* expression tree for sctp_add_streams struct for [gs]etsockopt */
 	NUM_EXPR_TYPES,
 };
 /* Convert an expression type to a human-readable string */
@@ -149,6 +151,8 @@ struct expression {
 		struct sctp_setpeerprim_expr *sctp_setpeerprim;
 		struct sctp_authchunk_expr *sctp_authchunk;
 		struct sctp_authkey_expr *sctp_authkey;
+		struct sctp_reset_streams_expr *sctp_reset_streams;
+		struct sctp_add_streams_expr *sctp_add_streams;
 	} value;
 	const char *format;	/* the printf format for printing the value */
 };
@@ -565,6 +569,21 @@ struct sctp_authkey_expr {
 	struct expression *sca_key;
 };
 
+/* Parse tree for sctp_reset_stream struct for setsockopt. */
+struct sctp_reset_streams_expr {
+	struct expression *srs_assoc_id;
+	struct expression *srs_flags;
+	struct expression *srs_number_streams;
+	struct expression *srs_stream_list;
+};
+
+/* Parse tree for sctp_add_stream struct for setsockopt. */
+struct sctp_add_streams_expr {
+	struct expression *sas_assoc_id;
+	struct expression *sas_instrms;
+	struct expression *sas_outstrms;
+};
+
 /* The errno-related info from strace to summarize a system call error */
 struct errno_spec {
 	const char *errno_macro;	/* errno symbol (C macro name) */
diff --git a/gtests/net/packetdrill/symbols_freebsd.c b/gtests/net/packetdrill/symbols_freebsd.c
index 3d245a68dfe9f0aff27794814ad55e638c4692f0..a84937712785cdc4a75d2af91122aceb74917fcf 100644
--- a/gtests/net/packetdrill/symbols_freebsd.c
+++ b/gtests/net/packetdrill/symbols_freebsd.c
@@ -264,6 +264,18 @@ struct int_symbol platform_symbols_table[] = {
 	{ SCTP_USE_EXT_RCVINFO,             "SCTP_USE_EXT_RCVINFO"            },
 	{ SCTP_AUTH_HMAC_ID_SHA1,           "SCTP_AUTH_HMAC_ID_SHA1"          },
 	{ SCTP_AUTH_HMAC_ID_SHA256,         "SCTP_AUTH_HMAC_ID_SHA256"        },
+
+	/* sctp stream reconfiguration */
+	{ SCTP_ENABLE_STREAM_RESET,         "SCTP_ENABLE_STREAM_RESET"        },
+	{ SCTP_ENABLE_RESET_STREAM_REQ,     "SCTP_ENABLE_RESET_STREAM_REQ"    },
+	{ SCTP_ENABLE_RESET_ASSOC_REQ,      "SCTP_ENABLE_RESET_ASSOC_REQ"     },
+	{ SCTP_ENABLE_CHANGE_ASSOC_REQ,     "SCTP_ENABLE_CHANGE_ASSOC_REQ"    },
+	{ SCTP_RESET_STREAMS,               "SCTP_RESET_STREAMS"              },
+	{ SCTP_STREAM_RESET_INCOMING,       "SCTP_STREAM_RESET_INCOMING"      },
+	{ SCTP_STREAM_RESET_OUTGOING,       "SCTP_STREAM_RESET_OUTGOING"      },
+	{ SCTP_RESET_ASSOC,                 "SCTP_RESET_ASSOC"                },
+	{ SCTP_ADD_STREAMS,                 "SCTP_ADD_STREAMS"                },
+
 	/* /usr/include/netinet/tcp.h */
 	{ TCP_NODELAY,                      "TCP_NODELAY"                     },
 	{ TCP_MAXSEG,                       "TCP_MAXSEG"                      },
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_add_streams.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_add_streams.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..1f7a50af99366ce8936f34a439d1b17b17d79f48
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_add_streams.pkt
@@ -0,0 +1,20 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ}, 8) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ADD_STREAMS, {sas_instrms=20,
+						  sas_outstrms=20}, 8) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_enable_stream_reset.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_enable_stream_reset.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..7bcf95857e55622c661e3fe29b40d0bae3c40391
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_enable_stream_reset.pkt
@@ -0,0 +1,30 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=0}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_RESET_ASSOC_REQ}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_RESET_ASSOC_REQ}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_CHANGE_ASSOC_REQ}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_CHANGE_ASSOC_REQ}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ|SCTP_ENABLE_RESET_ASSOC_REQ}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ|SCTP_ENABLE_RESET_ASSOC_REQ}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ|SCTP_ENABLE_RESET_ASSOC_REQ|SCTP_ENABLE_CHANGE_ASSOC_REQ}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ|SCTP_ENABLE_RESET_ASSOC_REQ|SCTP_ENABLE_CHANGE_ASSOC_REQ}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_assoc.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_assoc.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..e5081031c5f958664afc9b60c7e594d931f4a321
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_assoc.pkt
@@ -0,0 +1,57 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_RESET_ASSOC_REQ}, 8) = 0
+
++0.0 sctp_sendx(3, ..., 1000, ..., 1, {sinfo_stream=3,
+                                       sinfo_ssn=3,
+                                       sinfo_flags=0,
+                                       sinfo_ppid=htonl(1234),
+                                       sinfo_context=0,
+                                       sinfo_timetolive=0,
+                                       sinfo_tsn=2,
+                                       sinfo_cumtsn=2,
+                                       sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=1234]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
+
++0.0 sctp_sendx(3, ..., 1000, ..., 1, {sinfo_stream=3,
+				       sinfo_ssn=3,
+				       sinfo_flags=0,
+				       sinfo_ppid=htonl(7),
+				       sinfo_context=0,
+	                               sinfo_timetolive=0,
+				       sinfo_tsn=1,
+				       sinfo_cumtsn=6,
+				       sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=3, ssn=1, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sctp_sendx(3, ..., 1000, ..., 1,
+                              {sinfo_stream=3,
+                               sinfo_ssn=3,
+                               sinfo_flags=0,
+                               sinfo_ppid=htonl(7),
+                               sinfo_context=0,
+                               sinfo_timetolive=0,
+                               sinfo_tsn=1,
+                               sinfo_cumtsn=6,
+                               sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=3, ssn=2, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RESET_ASSOC, [0], 4) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_streams.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_streams.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..1e6e1969ac3939a4179facc91b64da9e24d439c1
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_streams.pkt
@@ -0,0 +1,59 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ}, 8) = 0
+
++0.0 sctp_sendx(3, ..., 1000, ..., 1, {sinfo_stream=3,
+                                       sinfo_ssn=3,
+                                       sinfo_flags=0,
+                                       sinfo_ppid=htonl(1234),
+                                       sinfo_context=0,
+                                       sinfo_timetolive=0,
+                                       sinfo_tsn=2,
+                                       sinfo_cumtsn=2,
+                                       sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=1234]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
+
++0.0 sctp_sendx(3, ..., 1000, ..., 1, {sinfo_stream=3,
+				       sinfo_ssn=3,
+				       sinfo_flags=0,
+				       sinfo_ppid=htonl(7),
+				       sinfo_context=0,
+	                               sinfo_timetolive=0,
+				       sinfo_tsn=1,
+				       sinfo_cumtsn=6,
+				       sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=3, ssn=1, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sctp_sendx(3, ..., 1000, ..., 1,
+                              {sinfo_stream=3,
+                               sinfo_ssn=3,
+                               sinfo_flags=0,
+                               sinfo_ppid=htonl(7),
+                               sinfo_context=0,
+                               sinfo_timetolive=0,
+                               sinfo_tsn=1,
+                               sinfo_cumtsn=6,
+                               sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=3, ssn=2, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RESET_STREAMS, {srs_flags=SCTP_STREAM_RESET_OUTGOING,
+						    srs_number_streams=1,
+						    srs_stream_list=[0]}, 10) = 0
+
++0 close(3) = 0