diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l index dcfc8bb9a6c870e6cc7e94bdb9568191dd1696bf..647f775b17c4192112df7b9fb20dfeab5f0acaf1 100644 --- a/gtests/net/packetdrill/lexer.l +++ b/gtests/net/packetdrill/lexer.l @@ -298,6 +298,15 @@ recvv_nxtinfo return RECVV_NXTINFO; sse_type return SSE_TYPE; sse_flags return SSE_FLAGS; sse_length return SSE_LENGTH; +sac_type return SAC_TYPE; +sac_flags return SAC_FLAGS; +sac_length return SAC_LENGTH; +sac_state return SAC_STATE; +sac_error return SAC_ERROR; +sac_outbound_streams return SAC_OUTBOUND_STREAMS; +sac_inbound_streams return SAC_INBOUND_STREAMS; +sac_assoc_id return SAC_ASSOC_ID; +sac_info return SAC_INFO; sender_dry_type return SENDER_DRY_TYPE; sender_dry_flags return SENDER_DRY_FLAGS; sender_dry_length return SENDER_DRY_LENGTH; diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y index 443cbd589a6f1ae2120c074f04d36fac895add8a..a224bc494d2a75d78eec22da076781ef0ea2bd0c 100644 --- a/gtests/net/packetdrill/parser.y +++ b/gtests/net/packetdrill/parser.y @@ -549,10 +549,12 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, %token <reserved> RECVV_RCVINFO RECVV_NXTINFO %token <reserved> SSE_TYPE SSE_FLAGS SSE_LENGTH %token <reserved> SENDER_DRY_TYPE SENDER_DRY_FLAGS SENDER_DRY_LENGTH SENDER_DRY_ASSOC_ID -%token <rexerved> _SCTP_DATA_IO_EVENT_ _SCTP_ASSOCIATION_EVENT_ _SCTP_ADDRESS_EVENT_ +%token <reserved> _SCTP_DATA_IO_EVENT_ _SCTP_ASSOCIATION_EVENT_ _SCTP_ADDRESS_EVENT_ %token <reserved> _SCTP_SEND_FAILURE_EVENT_ _SCTP_PEER_ERROR_EVENT_ _SCTP_SHUTDOWN_EVENT_ %token <reserved> _SCTP_PARTIAL_DELIVERY_EVENT_ _SCTP_ADAPTATION_LAYER_EVENT_ %token <reserved> _SCTP_AUTHENTICATION_EVENT_ _SCTP_SENDER_DRY_EVENT_ +%token <reserved> SAC_TYPE SAC_FLAGS SAC_LENGTH SAC_STATE SAC_ERROR SAC_OUTBOUND_STREAMS +%token <reserved> SAC_INBOUND_STREAMS SAC_ASSOC_ID SAC_INFO %token <reserved> SSFE_TYPE SSFE_FLAGS SSFE_LENGTH SSFE_ERROR SSFE_INFO SSFE_ASSOC_ID SSFE_DATA %token <floating> FLOAT %token <integer> INTEGER HEX_INTEGER @@ -612,6 +614,8 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, %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 sender_dry_assoc_id %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 %type <errno_info> opt_errno %type <chunk_list> sctp_chunk_list_spec @@ -2586,10 +2590,11 @@ sockaddr ; data -: ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -| sctp_shutdown_event { $$ = $1; } -| sctp_sender_dry_event { $$ = $1; } -| sctp_send_failed_event { $$ = $1; } +: ELLIPSIS { new_expression(EXPR_ELLIPSIS); } +| sctp_assoc_change { $$ = $1; } +| sctp_shutdown_event { $$ = $1; } +| sctp_sender_dry_event { $$ = $1; } +| sctp_send_failed_event { $$ = $1; } ; msghdr @@ -3700,6 +3705,116 @@ sctp_send_failed_event $$->value.sctp_send_failed_event->ssfe_data = new_expression(EXPR_ELLIPSIS); }; +sac_type +: SAC_TYPE '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("sac_type out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| SAC_TYPE '=' WORD { + $$ = new_expression(EXPR_WORD); + $$->value.string = $3; +} +| SAC_TYPE '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sac_flags +: SAC_FLAGS '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("sac_flags out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| SAC_FLAGS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sac_length +: SAC_LENGTH '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("sac_length out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| SAC_LENGTH '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sac_state +: SAC_STATE '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("sac_state out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| SAC_STATE '=' WORD { + $$ = new_expression(EXPR_WORD); + $$->value.string = $3; +} +| SAC_STATE '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sac_error +: SAC_ERROR '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("sac_error out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| SAC_ERROR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sac_outbound_streams +: SAC_OUTBOUND_STREAMS '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("sac_outbound_streams out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| SAC_OUTBOUND_STREAMS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sac_inbound_streams +: SAC_INBOUND_STREAMS '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("sac_inbound_streams out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| 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; } +; + +sctp_assoc_change +: '{' sac_type ',' sac_flags ',' sac_length ',' sac_state ',' sac_error ',' sac_outbound_streams ',' +sac_inbound_streams ',' sac_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; + $$->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 = $16; + $$->value.sctp_assoc_change->sac_info = $18; +} +; + opt_errno : { $$ = NULL; } | WORD note { diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index f85ce8f5d60d353da0f9d2fdc3c11cdf5e049f3d..bb38680c19303cf5e3b1e0502ab2490395ca3dd5 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -526,6 +526,7 @@ static int iovec_new(struct expression *expression, iov_expr = list->expression->value.iovec; assert(iov_expr->iov_base->type == EXPR_ELLIPSIS || + iov_expr->iov_base->type == EXPR_SCTP_ASSOC_CHANGE || iov_expr->iov_base->type == EXPR_SCTP_SHUTDOWN_EVENT || iov_expr->iov_base->type == EXPR_SCTP_SENDER_DRY_EVENT || iov_expr->iov_base->type == EXPR_SCTP_SEND_FAILED_EVENT); @@ -3337,6 +3338,87 @@ static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr, } #endif +#if defined(__FreeBSD__) || defined(linux) +static int check_sctp_assoc_change(struct sctp_assoc_change_expr *expr, + struct sctp_assoc_change *sctp_event, + char **error) { + + if (check_u16_expr(expr->sac_type, sctp_event->sac_type, + "sctp_assoc_change.sac_type", error)) + return STATUS_ERR; + if (check_u16_expr(expr->sac_flags, sctp_event->sac_flags, + "sctp_assoc_change.sac_flags", error)) + return STATUS_ERR; + if (check_u32_expr(expr->sac_length, sctp_event->sac_length, + "sctp_assoc_change.sac_length", error)) + return STATUS_ERR; + if (check_u16_expr(expr->sac_state, sctp_event->sac_state, + "sctp_assoc_change.sac_state", error)) + return STATUS_ERR; + if (check_u16_expr(expr->sac_error, sctp_event->sac_error, + "sctp_assoc_change.sac_error", error)) + return STATUS_ERR; + if (check_u16_expr(expr->sac_outbound_streams, sctp_event->sac_outbound_streams, + "sctp_assoc_change.sac_outbound_streams", error)) + return STATUS_ERR; + if (check_u16_expr(expr->sac_inbound_streams, sctp_event->sac_inbound_streams, + "sctp_assoc_change.sac_inbound_streams", error)) + return STATUS_ERR; + if (check_u32_expr(expr->sac_assoc_id, sctp_event->sac_assoc_id, + "sctp_assoc_change.sac_assoc_id", error)) + return STATUS_ERR; + if ( expr->sac_info->type != EXPR_ELLIPSIS) { + size_t infolen = 0; + struct expression *info_expr = NULL; + int i; + infolen = sizeof(sctp_event->sac_type); + infolen += sizeof(sctp_event->sac_flags); + infolen += sizeof(sctp_event->sac_length); + infolen += sizeof(sctp_event->sac_state); + infolen += sizeof(sctp_event->sac_error); + infolen += sizeof(sctp_event->sac_outbound_streams); + infolen += sizeof(sctp_event->sac_inbound_streams); + infolen += sizeof(sctp_event->sac_assoc_id); + infolen = sctp_event->sac_length - infolen + 1; + switch(expr->sac_info->type) { + case EXPR_LIST: + if (infolen != expression_list_length(expr->sac_info->value.list)) { + asprintf(error, "sctp_assoc_change. sac_list length unequal to sac_lenth expected: %u actual %u", + expression_list_length(expr->sac_info->value.list), infolen); + return STATUS_ERR; + } + for (i = 0; i < infolen; i++) { + info_expr = get_arg(expr->sac_info->value.list, i, error); + if (info_expr->type != EXPR_ELLIPSIS) { + u8 script_val; + + if (get_u8(info_expr, &script_val, error)) { + return STATUS_ERR; + } + if (script_val != sctp_event->sac_info[i]) { + asprintf(error, "sctp_assoc_change.sac_info. byte %d: expected: %hhu actual: %hhu", + i, script_val, sctp_event->sac_info[i]); + return STATUS_ERR; + } + } + + /*if (info_expr->type != EXPR_ELLIPSIS) { + + if (check_u8_expr(info_expr, sctp_event->sac_info[i], + "sctp_assoc_change.sac_info", error)) + return STATUS_ERR; + } + */ } + break; + default: asprintf(error, "Bad expressiontype for sac_info"); + return STATUS_ERR; + break; + } + } + return STATUS_OK; +} +#endif + #if defined(__FreeBSD__) || defined(linux) static int check_sctp_shutdown_event(struct sctp_shutdown_event_expr *expr, struct sctp_shutdown_event *sctp_event, @@ -3424,6 +3506,12 @@ static int check_sctp_notification(struct iovec *iov, return STATUS_ERR; script_iov_base = script_iov->value.iovec->iov_base; switch (script_iov_base->type) { + case EXPR_SCTP_ASSOC_CHANGE: + if (check_sctp_assoc_change(script_iov_base->value.sctp_assoc_change, + (struct sctp_assoc_change *) iov->iov_base, + error)) + return STATUS_ERR; + break; case EXPR_SCTP_SHUTDOWN_EVENT: if (check_sctp_shutdown_event(script_iov_base->value.sctp_shutdown_event, (struct sctp_shutdown_event *) iov->iov_base, diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c index 4e27b63b942809ddce56cb83ec7784549925ae1f..5ceb9c6d00475a120085b825197acaa434a0a46b 100644 --- a/gtests/net/packetdrill/script.c +++ b/gtests/net/packetdrill/script.c @@ -86,6 +86,7 @@ struct expression_type_entry expression_type_table[] = { { EXPR_SCTP_RCVINFO, "sctp_rcvinfo" }, { EXPR_SCTP_NXTINFO, "sctp_nxtinfo" }, { EXPR_SCTP_RECVV_RN, "sctp_recvv_rn " }, + { EXPR_SCTP_ASSOC_CHANGE, "sctp_assoc_change"}, { EXPR_SCTP_SHUTDOWN_EVENT, "sctp_shutdown_event"}, { EXPR_SCTP_SENDER_DRY_EVENT,"sctp_sender_dry_event"}, { EXPR_SCTP_SEND_FAILED_EVENT,"sctp_send_failed_event"}, @@ -432,6 +433,17 @@ void free_expression(struct expression *expression) free_expression(expression->value.sctp_recvv_rn->recvv_rcvinfo); free_expression(expression->value.sctp_recvv_rn->recvv_nxtinfo); break; + case EXPR_SCTP_ASSOC_CHANGE: + free_expression(expression->value.sctp_assoc_change->sac_type); + free_expression(expression->value.sctp_assoc_change->sac_flags); + free_expression(expression->value.sctp_assoc_change->sac_length); + free_expression(expression->value.sctp_assoc_change->sac_state); + free_expression(expression->value.sctp_assoc_change->sac_error); + free_expression(expression->value.sctp_assoc_change->sac_outbound_streams); + free_expression(expression->value.sctp_assoc_change->sac_inbound_streams); + free_expression(expression->value.sctp_assoc_change->sac_assoc_id); + free_expression(expression->value.sctp_assoc_change->sac_info); + break; case EXPR_SCTP_SHUTDOWN_EVENT: free_expression(expression->value.sctp_shutdown_event->sse_type); free_expression(expression->value.sctp_shutdown_event->sse_flags); @@ -1362,6 +1374,62 @@ static int evaluate_sctp_recvv_rn_expression(struct expression *in, return STATUS_OK; } +static int evaluate_sctp_assoc_change_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_assoc_change_expr *in_event; + struct sctp_assoc_change_expr *out_event; + + assert(in->type == EXPR_SCTP_ASSOC_CHANGE); + assert(in->value.sctp_assoc_change); + assert(out->type == EXPR_SCTP_ASSOC_CHANGE); + + out->value.sctp_assoc_change = calloc(1, sizeof(struct sctp_assoc_change_expr)); + + in_event = in->value.sctp_assoc_change; + out_event = out->value.sctp_assoc_change; + + if (evaluate(in_event->sac_type, + &out_event->sac_type, + error)) + return STATUS_ERR; + if (evaluate(in_event->sac_flags, + &out_event->sac_flags, + error)) + return STATUS_ERR; + if (evaluate(in_event->sac_length, + &out_event->sac_length, + error)) + return STATUS_ERR; + if (evaluate(in_event->sac_state, + &out_event->sac_state, + error)) + return STATUS_ERR; + if (evaluate(in_event->sac_error, + &out_event->sac_error, + error)) + return STATUS_ERR; + if (evaluate(in_event->sac_outbound_streams, + &out_event->sac_outbound_streams, + error)) + return STATUS_ERR; + if (evaluate(in_event->sac_inbound_streams, + &out_event->sac_inbound_streams, + error)) + return STATUS_ERR; + if (evaluate(in_event->sac_assoc_id, + &out_event->sac_assoc_id, + error)) + return STATUS_ERR; + if (evaluate(in_event->sac_info, + &out_event->sac_info, + error)) + return STATUS_ERR; + + return STATUS_OK; +} + static int evaluate_sctp_shutdown_event_expression(struct expression *in, struct expression *out, char **error) @@ -1563,6 +1631,9 @@ static int evaluate(struct expression *in, case EXPR_SCTP_RECVV_RN: result = evaluate_sctp_recvv_rn_expression(in, out, error); break; + case EXPR_SCTP_ASSOC_CHANGE: + result = evaluate_sctp_assoc_change_expression(in, out, error); + break; case EXPR_SCTP_SHUTDOWN_EVENT: result = evaluate_sctp_shutdown_event_expression(in, out, error); break; diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h index 0f0763dc0b6295ff0e7dda089650f05eae75a9b4..fe4463278ac4f5c7abd38274f148f0acc058b70d 100644 --- a/gtests/net/packetdrill/script.h +++ b/gtests/net/packetdrill/script.h @@ -66,6 +66,7 @@ enum expression_t { EXPR_SCTP_RCVINFO, /* struct sctp_rcvinfo for syscall sctp_recvv */ EXPR_SCTP_NXTINFO, /* struct sctp_nxtinfo for syscall sctp_recvv */ EXPR_SCTP_RECVV_RN, /* struct sctp_recvv_rn for syscall sctp_recvv */ + EXPR_SCTP_ASSOC_CHANGE, /* expression tree for sctp_assoc_change_event */ EXPR_SCTP_SHUTDOWN_EVENT, /* expression tree for sctp_shutdown_event */ EXPR_SCTP_SENDER_DRY_EVENT, /* expression tree for sctp_sender_dry_event */ EXPR_SCTP_SEND_FAILED_EVENT, /* expression tree for sctp_send_failed_event */ @@ -108,6 +109,7 @@ struct expression { struct sctp_rcvinfo_expr *sctp_rcvinfo; struct sctp_nxtinfo_expr *sctp_nxtinfo; struct sctp_recvv_rn_expr *sctp_recvv_rn; + struct sctp_assoc_change_expr *sctp_assoc_change; struct sctp_shutdown_event_expr *sctp_shutdown_event; struct sctp_sender_dry_event_expr *sctp_sender_dry_event; struct sctp_send_failed_event_expr *sctp_send_failed_event; @@ -321,6 +323,19 @@ struct sctp_recvv_rn_expr { struct expression *recvv_nxtinfo; }; +/* Parse tree for sctp_assoc_change for notifications. */ +struct sctp_assoc_change_expr { + struct expression *sac_type; + struct expression *sac_flags; + struct expression *sac_length; + struct expression *sac_state; + struct expression *sac_error; + struct expression *sac_outbound_streams; + struct expression *sac_inbound_streams; + struct expression *sac_assoc_id; + struct expression *sac_info; +}; + /* Parse tree for sctp_shutdown_event for notifications. */ struct sctp_shutdown_event_expr { struct expression *sse_type; diff --git a/gtests/net/packetdrill/symbols_freebsd.c b/gtests/net/packetdrill/symbols_freebsd.c index eef941bb2878ae2946b710a9dc88d6b1f791291e..a1aceb96f248cbfcd0b7e6d0fcf3572dc209391d 100644 --- a/gtests/net/packetdrill/symbols_freebsd.c +++ b/gtests/net/packetdrill/symbols_freebsd.c @@ -168,6 +168,7 @@ struct int_symbol platform_symbols_table[] = { { SCTP_PEER_ADDR_CHANGE, "SCTP_PEER_ADDR_CHANGE" }, { SCTP_REMOTE_ERROR, "SCTP_REMOTE_ERROR" }, { SCTP_SEND_FAILED, "SCTP_SEND_FAILED" }, + { SCTP_ASSOC_CHANGE, "SCTP_ASSOC_CHANGE" }, { SCTP_SHUTDOWN_EVENT, "SCTP_SHUTDOWN_EVENT" }, { SCTP_SENDER_DRY_EVENT, "SCTP_SENDER_DRY_EVENT" }, { SCTP_SEND_FAILED_EVENT, "SCTP_SEND_FAILED_EVENT" }, @@ -206,6 +207,15 @@ struct int_symbol platform_symbols_table[] = { { SCTP_RECVNXTINFO, "SCTP_RECVNXTINFO" }, { SCTP_DATA_SENT, "SCTP_DATA_SENT" }, { SCTP_DATA_UNSENT, "SCTP_DATA_UNSENT" }, + { SCTP_COMM_UP, "SCTP_COMM_UP" }, + { SCTP_COMM_LOST, "SCTP_COMM_LOST" }, + { SCTP_RESTART, "SCTP_RESTART" }, + { SCTP_SHUTDOWN_COMP, "SCTP_SHUTDOWN_COMP" }, + { SCTP_ASSOC_SUPPORTS_PR, "SCTP_ASSOC_SUPPORTS_PR" }, + { SCTP_ASSOC_SUPPORTS_AUTH, "SCTP_ASSOC_SUPPORTS_AUTH" }, + { SCTP_ASSOC_SUPPORTS_ASCONF, "SCTP_ASSOC_SUPPORTS_ASCONF" }, + { SCTP_ASSOC_SUPPORTS_MULTIBUF, "SCTP_ASSOC_SUPPORTS_MULTIBUF" }, + /* /usr/include/netinet/tcp.h */ { TCP_NODELAY, "TCP_NODELAY" }, { TCP_MAXSEG, "TCP_MAXSEG" }, diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..88a49593e833e1363063e09c5680a5fc20992183 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt @@ -0,0 +1,23 @@ ++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 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ASSOC_CHANGE, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ASSOC_CHANGE, se_on=1}, [8]) = 0 ++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.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE, sac_flags=0, sac_length=21, sac_state=SCTP_COMM_UP, sac_error=0, sac_outbound_streams=1, +sac_inbound_streams=1, sac_assoc_id=3, sac_info=[SCTP_ASSOC_SUPPORTS_MULTIBUF, 0x00]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], +[MSG_NOTIFICATION|MSG_EOR]) += 21 + ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 ++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0] +* > sctp: SHUTDOWN_ACK[flgs=0] ++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0] ++0.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE, sac_flags=0, sac_length=20, sac_state=SCTP_SHUTDOWN_COMP, sac_error=0, sac_outbound_streams=1, +sac_inbound_streams=1, sac_assoc_id=3, sac_info=[0]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20 + diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_notifications.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications.pkt similarity index 100% rename from gtests/net/packetdrill/tests/bsd/sctp/sctp_notifications.pkt rename to gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications.pkt diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..69780e2574b8fe6729948c558e8225cd930d268e --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt @@ -0,0 +1,29 @@ ++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 +// 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.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address=..., spp_hbinterval=0, spp_pathmaxrxt=100, spp_pathmtu=1468, spp_flags=SPP_HB_DISABLE, +spp_ipv6_flowlabel=0, +spp_dscp=0}, 152) = 0 + +//test for SEND_FAILED_EVENT ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SEND_FAILED_EVENT, se_on=1}, 8) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=150, srto_min=50}, 16) = 0 ++0.0 write(3, ..., 1000) = 1000 ++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT, ssfe_flags=SCTP_DATA_SENT, ssfe_length=1032, ssfe_error=0, +ssfe_info={snd_sid=0, snd_flags=3, snd_ppid=htonl(0), snd_context=0}, ssfe_assoc_id=3, ssfe_data=...}, iov_len=1000}], +1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..bbca55239d311473133ee2758b7f5125c5553db6 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt @@ -0,0 +1,27 @@ ++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 +// 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.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=1, sctp_address_event=0, sctp_send_failure_event=1, +sctp_peer_error_event=0, sctp_shutdown_event=1, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0, +sctp_sender_dry_event=0}, 11) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 + +//test for SENDER_DRY_EVENT ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0 ++0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT, sender_dry_flags=0, sender_dry_length=12, sender_dry_assoc_id=3}, iov_len=1000}], +1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0 + diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..5488096702167b2676227eb07311a68f16270323 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt @@ -0,0 +1,22 @@ ++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 +// 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.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 + +// Tear down the association ++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0] +* > sctp: SHUTDOWN_ACK[flgs=0] ++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=0, sse_length=12}, iov_len=1000}], + msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12 +//+0.0 sctp_recvv(3, [{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=1, sse_length=12}, iov_len=1000}], 1, +//..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12