From b21dfa833826389dbe47d7e2aaba70a5627ed999 Mon Sep 17 00:00:00 2001 From: Hoelscher <jens.hoelscher@fh-muenster.de> Date: Wed, 9 Mar 2016 09:58:05 +0100 Subject: [PATCH] add support for sctp_assoc_reset_event --- gtests/net/packetdrill/lexer.l | 6 ++ gtests/net/packetdrill/parser.y | 79 +++++++++++++++++++++++- gtests/net/packetdrill/run_system_call.c | 38 +++++++++++- gtests/net/packetdrill/script.c | 56 +++++++++++++++++ gtests/net/packetdrill/script.h | 12 ++++ gtests/net/packetdrill/symbols_freebsd.c | 5 +- 6 files changed, 192 insertions(+), 4 deletions(-) diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l index 657f7f42..a9b94843 100644 --- a/gtests/net/packetdrill/lexer.l +++ b/gtests/net/packetdrill/lexer.l @@ -518,6 +518,12 @@ strreset_flags return STRRESET_FLAGS; strreset_length return STRRESET_LENGTH; strreset_assoc_id return STRRESET_ASSOC_ID; strreset_stream_list return STRRESET_STREAM_LIST; +assocreset_type return ASSOCRESET_TYPE; +assocreset_flags return ASSOCRESET_FLAGS; +assocreset_length return ASSOCRESET_LENGTH; +assocreset_assoc_id return ASSOCRESET_ASSOC_ID; +assocreset_local_tsn return ASSOCRESET_LOCAL_TSN; +assocreset_remote_tsn return ASSOCRESET_REMOTE_TSN; CHUNK return CHUNK; DATA return DATA; INIT return INIT; diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y index af0e3e9b..0b5c90e8 100644 --- a/gtests/net/packetdrill/parser.y +++ b/gtests/net/packetdrill/parser.y @@ -570,6 +570,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, %token <reserved> SRS_ASSOC_ID SRS_FLAGS SRS_NUMBER_STREAMS SRS_STREAM_LIST %token <reserved> SAS_ASSOC_ID SAS_INSTRMS SAS_OUTSTRMS %token <reserved> STRRESET_TYPE STRRESET_FLAGS STRRESET_LENGTH STRRESET_ASSOC_ID STRRESET_STREAM_LIST +%token <reserved> ASSOCRESET_TYPE ASSOCRESET_FLAGS ASSOCRESET_LENGTH ASSOCRESET_ASSOC_ID ASSOCRESET_LOCAL_TSN ASSOCRESET_REMOTE_TSN %token <floating> FLOAT %token <integer> INTEGER HEX_INTEGER %token <string> WORD STRING BACK_QUOTED CODE IPV4_ADDR IPV6_ADDR @@ -645,6 +646,8 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, %type <expression> sctp_setpeerprim sctp_authchunk sctp_authkey %type <expression> sctp_reset_streams srs_flags %type <expression> sctp_stream_reset_event strreset_type strreset_flags strreset_length +%type <expression> sctp_assoc_reset_event assocreset_type assocreset_flags assocreset_length +%type <expression> assocreset_local_tsn assocreset_remote_tsn %type <expression> sctp_add_streams %type <errno_info> opt_errno %type <chunk_list> sctp_chunk_list_spec @@ -2743,6 +2746,7 @@ data | sctp_authkey_event { $$ = $1; } | sctp_tlv { $$ = $1; } | sctp_stream_reset_event { $$ = $1; } +| sctp_assoc_reset_event { $$ = $1; } ; msghdr @@ -5060,7 +5064,7 @@ strreset_length if (!is_valid_u32($3)) { semantic_error("strreset_length out of range"); } - $$ = new_integer_expression($3, "%hu"); + $$ = new_integer_expression($3, "%u"); } | STRRESET_LENGTH '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; @@ -5077,6 +5081,79 @@ sctp_stream_reset_event } ; +assocreset_type +: ASSOCRESET_TYPE '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("assocreset_type out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| ASSOCRESET_TYPE '=' WORD { + $$ = new_expression(EXPR_WORD); + $$->value.string = $3; +} +| ASSOCRESET_TYPE '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +assocreset_flags +: ASSOCRESET_FLAGS '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("assocreset_flags out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| ASSOCRESET_FLAGS '=' WORD { + $$ = new_expression(EXPR_WORD); + $$->value.string = $3; +} +| ASSOCRESET_FLAGS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +| ASSOCRESET_FLAGS '=' binary_expression { $$ = $3; } +; + +assocreset_length +: ASSOCRESET_LENGTH '=' INTEGER { + if (!is_valid_u32($3)) { + semantic_error("assocreset_length out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| ASSOCRESET_LENGTH '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +assocreset_local_tsn +: ASSOCRESET_LOCAL_TSN '=' INTEGER { + if (!is_valid_u32($3)) { + semantic_error("assocreset_local_tsn out of range"); + } + $$ = new_integer_expression($3, "%u"); +} +| ASSOCRESET_LOCAL_TSN '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +assocreset_remote_tsn +: ASSOCRESET_REMOTE_TSN '=' INTEGER { + if (!is_valid_u32($3)) { + semantic_error("assocreset_remote_tsn out of range"); + } + $$ = new_integer_expression($3, "%u"); +} +| ASSOCRESET_REMOTE_TSN '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sctp_assoc_reset_event +: '{' assocreset_type ',' assocreset_flags ',' assocreset_length ',' ASSOCRESET_ASSOC_ID '=' sctp_assoc_id ',' + assocreset_local_tsn ',' assocreset_remote_tsn '}' { + $$ = new_expression(EXPR_SCTP_ASSOC_RESET_EVENT); + $$->value.sctp_assoc_reset_event = calloc(1, sizeof(struct sctp_assoc_reset_event_expr)); + $$->value.sctp_assoc_reset_event->assocreset_type = $2; + $$->value.sctp_assoc_reset_event->assocreset_flags = $4; + $$->value.sctp_assoc_reset_event->assocreset_length = $6; + $$->value.sctp_assoc_reset_event->assocreset_assoc_id = $10; + $$->value.sctp_assoc_reset_event->assocreset_local_tsn = $12; + $$->value.sctp_assoc_reset_event->assocreset_remote_tsn = $14; +} +; + opt_errno : { $$ = NULL; } | WORD note { diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index 4cbd38ce..7af2664b 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -854,7 +854,8 @@ static int iovec_new(struct expression *expression, iov_expr->iov_base->type == EXPR_SCTP_SENDER_DRY_EVENT || iov_expr->iov_base->type == EXPR_SCTP_SEND_FAILED_EVENT || iov_expr->iov_base->type == EXPR_SCTP_TLV || - iov_expr->iov_base->type == EXPR_SCTP_STREAM_RESET_EVENT); + iov_expr->iov_base->type == EXPR_SCTP_STREAM_RESET_EVENT || + iov_expr->iov_base->type == EXPR_SCTP_ASSOC_RESET_EVENT); assert(iov_expr->iov_len->type == EXPR_INTEGER); len = iov_expr->iov_len->value.num; @@ -5262,6 +5263,33 @@ static int check_sctp_stream_reset_event(struct sctp_stream_reset_event_expr *ex } #endif +#if defined(__FreeBSD__) +static int check_sctp_assoc_reset_event(struct sctp_assoc_reset_event_expr *expr, + struct sctp_assoc_reset_event *sctp_assoc_reset_event, + char **error) { + if (check_u16_expr(expr->assocreset_type, sctp_assoc_reset_event->assocreset_type, + "sctp_assoc_reset_event.assocreset_type", error)) + return STATUS_ERR; + if (check_u16_expr(expr->assocreset_flags, sctp_assoc_reset_event->assocreset_flags, + "sctp_assoc_reset_event.assocreset_flags", error)) + return STATUS_ERR; + if (check_u32_expr(expr->assocreset_length, sctp_assoc_reset_event->assocreset_length, + "sctp_assoc_reset_event.assocreset_length", error)) + return STATUS_ERR; + if (check_sctp_assoc_t_expr(expr->assocreset_assoc_id, sctp_assoc_reset_event->assocreset_assoc_id, + "sctp_assoc_reset_event.assocreset_assoc_id", error)) + return STATUS_ERR; + if (check_u32_expr(expr->assocreset_local_tsn, sctp_assoc_reset_event->assocreset_local_tsn, + "sctp_assoc_reset_event.assocreset_local_tsn", error)) + return STATUS_ERR; + if (check_u32_expr(expr->assocreset_remote_tsn, sctp_assoc_reset_event->assocreset_remote_tsn, + "sctp_assoc_reset_event.assocreset_remote_tsn", error)) + return STATUS_ERR; + + return STATUS_OK; +} +#endif + #if defined(__FreeBSD__) || defined(linux) static int check_sctp_notification(struct iovec *iov, struct expression *iovec_expr, @@ -5355,6 +5383,14 @@ static int check_sctp_notification(struct iovec *iov, error)) return STATUS_ERR; break; +#endif +#if defined(__FreeBSD__) + case EXPR_SCTP_ASSOC_RESET_EVENT: + if (check_sctp_assoc_reset_event(script_iov_base->value.sctp_assoc_reset_event, + (struct sctp_assoc_reset_event *) iov[i].iov_base, + error)) + return STATUS_ERR; + break; #endif case EXPR_ELLIPSIS: break; diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c index 45877609..bb16a64a 100644 --- a/gtests/net/packetdrill/script.c +++ b/gtests/net/packetdrill/script.c @@ -111,6 +111,7 @@ struct expression_type_entry expression_type_table[] = { { EXPR_SCTP_RESET_STREAMS, "sctp_reset_streams"}, { EXPR_SCTP_ADD_STREAMS, "sctp_add_streams"}, { EXPR_SCTP_STREAM_RESET_EVENT, "sctp_stream_reset_event"}, + { EXPR_SCTP_ASSOC_RESET_EVENT, "sctp_assoc_reset_event"}, { NUM_EXPR_TYPES, NULL} }; @@ -628,6 +629,14 @@ void free_expression(struct expression *expression) free_expression(expression->value.sctp_stream_reset_event->strreset_assoc_id); free_expression(expression->value.sctp_stream_reset_event->strreset_stream_list); break; + case EXPR_SCTP_ASSOC_RESET_EVENT: + free_expression(expression->value.sctp_assoc_reset_event->assocreset_type); + free_expression(expression->value.sctp_assoc_reset_event->assocreset_flags); + free_expression(expression->value.sctp_assoc_reset_event->assocreset_length); + free_expression(expression->value.sctp_assoc_reset_event->assocreset_assoc_id); + free_expression(expression->value.sctp_assoc_reset_event->assocreset_local_tsn); + free_expression(expression->value.sctp_assoc_reset_event->assocreset_remote_tsn); + break; case EXPR_WORD: assert(expression->value.string); free(expression->value.string); @@ -2547,6 +2556,50 @@ static int evaluate_sctp_stream_reset_event_expression(struct expression *in, return STATUS_OK; } +static int evaluate_sctp_assoc_reset_event_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_assoc_reset_event_expr *in_event; + struct sctp_assoc_reset_event_expr *out_event; + + assert(in->type == EXPR_SCTP_ASSOC_RESET_EVENT); + assert(in->value.sctp_assoc_reset_event); + assert(out->type == EXPR_SCTP_ASSOC_RESET_EVENT); + + out->value.sctp_assoc_reset_event = calloc(1, sizeof(struct sctp_assoc_reset_event_expr)); + + in_event = in->value.sctp_assoc_reset_event; + out_event = out->value.sctp_assoc_reset_event; + + if (evaluate(in_event->assocreset_type, + &out_event->assocreset_type, + error)) + return STATUS_ERR; + if (evaluate(in_event->assocreset_flags, + &out_event->assocreset_flags, + error)) + return STATUS_ERR; + if (evaluate(in_event->assocreset_length, + &out_event->assocreset_length, + error)) + return STATUS_ERR; + if (evaluate(in_event->assocreset_assoc_id, + &out_event->assocreset_assoc_id, + error)) + return STATUS_ERR; + if (evaluate(in_event->assocreset_local_tsn, + &out_event->assocreset_local_tsn, + error)) + return STATUS_ERR; + if (evaluate(in_event->assocreset_remote_tsn, + &out_event->assocreset_remote_tsn, + error)) + return STATUS_ERR; + + return STATUS_OK; +} + static int evaluate(struct expression *in, struct expression **out_ptr, char **error) { @@ -2704,6 +2757,9 @@ static int evaluate(struct expression *in, case EXPR_SCTP_STREAM_RESET_EVENT: result = evaluate_sctp_stream_reset_event_expression(in, out, error); break; + case EXPR_SCTP_ASSOC_RESET_EVENT: + result = evaluate_sctp_assoc_reset_event_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 5e372249..9556a841 100644 --- a/gtests/net/packetdrill/script.h +++ b/gtests/net/packetdrill/script.h @@ -91,6 +91,7 @@ enum expression_t { 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 */ EXPR_SCTP_STREAM_RESET_EVENT, /* expression tree for sctp_stream_reset_event struct for sctp notifications */ + EXPR_SCTP_ASSOC_RESET_EVENT, /* expression tree for sctp_assoc_reset_event struct for sctp notifications */ NUM_EXPR_TYPES, }; /* Convert an expression type to a human-readable string */ @@ -155,6 +156,7 @@ struct expression { struct sctp_reset_streams_expr *sctp_reset_streams; struct sctp_add_streams_expr *sctp_add_streams; struct sctp_stream_reset_event_expr *sctp_stream_reset_event; + struct sctp_assoc_reset_event_expr *sctp_assoc_reset_event; } value; const char *format; /* the printf format for printing the value */ }; @@ -595,6 +597,16 @@ struct sctp_stream_reset_event_expr { struct expression *strreset_stream_list; }; +/* Parse tree for sctp_assoc_reset_event struct for sctp notifications. */ +struct sctp_assoc_reset_event_expr { + struct expression *assocreset_type; + struct expression *assocreset_flags; + struct expression *assocreset_length; + struct expression *assocreset_assoc_id; + struct expression *assocreset_local_tsn; + struct expression *assocreset_remote_tsn; +}; + /* 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 ed6b6ef5..9e7e2f5f 100644 --- a/gtests/net/packetdrill/symbols_freebsd.c +++ b/gtests/net/packetdrill/symbols_freebsd.c @@ -199,9 +199,7 @@ struct int_symbol platform_symbols_table[] = { { SCTP_ADAPTION_INDICATION, "SCTP_ADAPTION_INDICATION" }, { SCTP_PARTIAL_DELIVERY_EVENT, "SCTP_PARTIAL_DELIVERY_EVENT" }, { SCTP_AUTHENTICATION_EVENT, "SCTP_AUTHENTICATION_EVENT" }, - { SCTP_STREAM_RESET_EVENT, "SCTP_STREAM_RESET_EVENT" }, { SCTP_NOTIFICATIONS_STOPPED_EVENT, "SCTP_NOTIFICATIONS_STOPPED_EVENT"}, - { SCTP_ASSOC_RESET_EVENT, "SCTP_ASSOC_RESET_EVENT" }, { SCTP_STREAM_CHANGE_EVENT, "SCTP_STREAM_CHANGE_EVENT" }, { SCTP_SEND_FAILED_EVENT, "SCTP_SEND_FAILED_EVENT" }, { SCTP_UNORDERED, "SCTP_UNORDERED" }, @@ -280,6 +278,9 @@ struct int_symbol platform_symbols_table[] = { { SCTP_STREAM_RESET_OUTGOING_SSN, "SCTP_STREAM_RESET_OUTGOING_SSN" }, { SCTP_STREAM_RESET_DENIED, "SCTP_STREAM_RESET_DENIED" }, { SCTP_STREAM_RESET_FAILED, "SCTP_STREAM_RESET_FAILED" }, + { SCTP_ASSOC_RESET_EVENT, "SCTP_ASSOC_RESET_EVENT" }, + { SCTP_ASSOC_RESET_DENIED, "SCTP_ASSOC_RESET_DENIED" }, + { SCTP_ASSOC_RESET_FAILED, "SCTP_ASSOC_RESET_FAILED" }, /* /usr/include/netinet/tcp.h */ { TCP_NODELAY, "TCP_NODELAY" }, -- GitLab