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