Skip to content
Snippets Groups Projects
Commit d2746f84 authored by Hoelscher's avatar Hoelscher
Browse files

add support for sctp_stream_reset_event

parent 1b348d28
No related branches found
No related tags found
No related merge requests found
......@@ -513,6 +513,11 @@ srs_stream_list return SRS_STREAM_LIST;
sas_assoc_id return SAS_ASSOC_ID;
sas_instrms return SAS_INSTRMS;
sas_outstrms return SAS_OUTSTRMS;
strreset_type return STRRESET_TYPE;
strreset_flags return STRRESET_FLAGS;
strreset_length return STRRESET_LENGTH;
strreset_assoc_id return STRRESET_ASSOC_ID;
strreset_stream_list return STRRESET_STREAM_LIST;
CHUNK return CHUNK;
DATA return DATA;
INIT return INIT;
......
......@@ -569,6 +569,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
%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 <reserved> STRRESET_TYPE STRRESET_FLAGS STRRESET_LENGTH STRRESET_ASSOC_ID STRRESET_STREAM_LIST
%token <floating> FLOAT
%token <integer> INTEGER HEX_INTEGER
%token <string> WORD STRING BACK_QUOTED CODE IPV4_ADDR IPV6_ADDR
......@@ -643,6 +644,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
%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_stream_reset_event strreset_type strreset_flags strreset_length
%type <expression> sctp_add_streams
%type <errno_info> opt_errno
%type <chunk_list> sctp_chunk_list_spec
......@@ -2740,6 +2742,7 @@ data
| sctp_send_failed_event { $$ = $1; }
| sctp_authkey_event { $$ = $1; }
| sctp_tlv { $$ = $1; }
| sctp_stream_reset_event { $$ = $1; }
;
msghdr
......@@ -5023,6 +5026,57 @@ sctp_add_streams
}
;
strreset_type
: STRRESET_TYPE '=' INTEGER {
if (!is_valid_u16($3)) {
semantic_error("strreset_type out of range");
}
$$ = new_integer_expression($3, "%hu");
}
| STRRESET_TYPE '=' WORD {
$$ = new_expression(EXPR_WORD);
$$->value.string = $3;
}
| STRRESET_TYPE '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
strreset_flags
: STRRESET_FLAGS '=' INTEGER {
if (!is_valid_u16($3)) {
semantic_error("strreset_flags out of range");
}
$$ = new_integer_expression($3, "%hu");
}
| STRRESET_FLAGS '=' WORD {
$$ = new_expression(EXPR_WORD);
$$->value.string = $3;
}
| STRRESET_FLAGS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
| STRRESET_FLAGS '=' binary_expression { $$ = $3; }
;
strreset_length
: STRRESET_LENGTH '=' INTEGER {
if (!is_valid_u32($3)) {
semantic_error("strreset_length out of range");
}
$$ = new_integer_expression($3, "%hu");
}
| STRRESET_LENGTH '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
sctp_stream_reset_event
: '{' strreset_type ',' strreset_flags ',' strreset_length ',' STRRESET_ASSOC_ID '=' sctp_assoc_id ',' STRRESET_STREAM_LIST '=' array '}' {
$$ = new_expression(EXPR_SCTP_STREAM_RESET_EVENT);
$$->value.sctp_stream_reset_event = calloc(1, sizeof(struct sctp_stream_reset_event_expr));
$$->value.sctp_stream_reset_event->strreset_type = $2;
$$->value.sctp_stream_reset_event->strreset_flags = $4;
$$->value.sctp_stream_reset_event->strreset_length = $6;
$$->value.sctp_stream_reset_event->strreset_assoc_id = $10;
$$->value.sctp_stream_reset_event->strreset_stream_list = $14;
}
;
opt_errno
: { $$ = NULL; }
| WORD note {
......
......@@ -853,7 +853,8 @@ static int iovec_new(struct expression *expression,
iov_expr->iov_base->type == EXPR_SCTP_AUTHKEY_EVENT ||
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_TLV ||
iov_expr->iov_base->type == EXPR_SCTP_STREAM_RESET_EVENT);
assert(iov_expr->iov_len->type == EXPR_INTEGER);
len = iov_expr->iov_len->value.num;
......@@ -5236,6 +5237,31 @@ static int check_sctp_tlv(struct sctp_tlv_expr *expr, struct sctp_tlv *sctp_tlv,
}
#endif
#if defined(__FreeBSD__)
static int check_sctp_stream_reset_event(struct sctp_stream_reset_event_expr *expr,
struct sctp_stream_reset_event *sctp_stream_reset_event,
char **error) {
if (check_u16_expr(expr->strreset_type, sctp_stream_reset_event->strreset_type,
"sctp_stream_reset_event.strreset_type", error))
return STATUS_ERR;
if (check_u16_expr(expr->strreset_flags, sctp_stream_reset_event->strreset_flags,
"sctp_stream_reset_event.strreset_flags", error))
return STATUS_ERR;
if (check_u32_expr(expr->strreset_length, sctp_stream_reset_event->strreset_length,
"sctp_stream_reset_event.strreset_length", error))
return STATUS_ERR;
if (check_sctp_assoc_t_expr(expr->strreset_assoc_id, sctp_stream_reset_event->strreset_assoc_id,
"sctp_stream_reset_event.strreset_assoc_id", error))
return STATUS_ERR;
if (check_u16array_expr(expr->strreset_stream_list, sctp_stream_reset_event->strreset_stream_list,
sctp_stream_reset_event->strreset_length - sizeof(u16) - sizeof(u16) - sizeof(u32) - sizeof(sctp_assoc_t),
"sctp_stream_reset_event.strreset_stream_list", 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,
......@@ -5322,6 +5348,14 @@ static int check_sctp_notification(struct iovec *iov,
error))
return STATUS_ERR;
break;
#if defined(__FreeBSD__)
case EXPR_SCTP_STREAM_RESET_EVENT:
if (check_sctp_stream_reset_event(script_iov_base->value.sctp_stream_reset_event,
(struct sctp_stream_reset_event *) iov[i].iov_base,
error))
return STATUS_ERR;
break;
#endif
case EXPR_ELLIPSIS:
break;
default:
......
......@@ -110,6 +110,7 @@ struct expression_type_entry expression_type_table[] = {
{ EXPR_SCTP_AUTHKEY, "sctp_authkey" },
{ EXPR_SCTP_RESET_STREAMS, "sctp_reset_streams"},
{ EXPR_SCTP_ADD_STREAMS, "sctp_add_streams"},
{ EXPR_SCTP_STREAM_RESET_EVENT, "sctp_stream_reset_event"},
{ NUM_EXPR_TYPES, NULL}
};
......@@ -620,6 +621,13 @@ void free_expression(struct expression *expression)
free_expression(expression->value.sctp_add_streams->sas_instrms);
free_expression(expression->value.sctp_add_streams->sas_outstrms);
break;
case EXPR_SCTP_STREAM_RESET_EVENT:
free_expression(expression->value.sctp_stream_reset_event->strreset_type);
free_expression(expression->value.sctp_stream_reset_event->strreset_flags);
free_expression(expression->value.sctp_stream_reset_event->strreset_length);
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_WORD:
assert(expression->value.string);
free(expression->value.string);
......@@ -2499,6 +2507,46 @@ static int evaluate_sctp_add_streams_expression(struct expression *in,
return STATUS_OK;
}
static int evaluate_sctp_stream_reset_event_expression(struct expression *in,
struct expression *out,
char **error)
{
struct sctp_stream_reset_event_expr *in_event;
struct sctp_stream_reset_event_expr *out_event;
assert(in->type == EXPR_SCTP_STREAM_RESET_EVENT);
assert(in->value.sctp_stream_reset_event);
assert(out->type == EXPR_SCTP_STREAM_RESET_EVENT);
out->value.sctp_stream_reset_event = calloc(1, sizeof(struct sctp_stream_reset_event_expr));
in_event = in->value.sctp_stream_reset_event;
out_event = out->value.sctp_stream_reset_event;
if (evaluate(in_event->strreset_type,
&out_event->strreset_type,
error))
return STATUS_ERR;
if (evaluate(in_event->strreset_flags,
&out_event->strreset_flags,
error))
return STATUS_ERR;
if (evaluate(in_event->strreset_length,
&out_event->strreset_length,
error))
return STATUS_ERR;
if (evaluate(in_event->strreset_assoc_id,
&out_event->strreset_assoc_id,
error))
return STATUS_ERR;
if (evaluate(in_event->strreset_stream_list,
&out_event->strreset_stream_list,
error))
return STATUS_ERR;
return STATUS_OK;
}
static int evaluate(struct expression *in,
struct expression **out_ptr, char **error)
{
......@@ -2653,6 +2701,9 @@ static int evaluate(struct expression *in,
case EXPR_SCTP_ADD_STREAMS:
result = evaluate_sctp_add_streams_expression(in, out, error);
break;
case EXPR_SCTP_STREAM_RESET_EVENT:
result = evaluate_sctp_stream_reset_event_expression(in, out, error);
break;
case EXPR_WORD:
out->type = EXPR_INTEGER;
if (symbol_to_int(in->value.string,
......
......@@ -90,6 +90,7 @@ enum expression_t {
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 */
EXPR_SCTP_STREAM_RESET_EVENT, /* expression tree for sctp_stream_reset_event struct for sctp notifications */
NUM_EXPR_TYPES,
};
/* Convert an expression type to a human-readable string */
......@@ -153,6 +154,7 @@ struct expression {
struct sctp_authkey_expr *sctp_authkey;
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;
} value;
const char *format; /* the printf format for printing the value */
};
......@@ -584,6 +586,15 @@ struct sctp_add_streams_expr {
struct expression *sas_outstrms;
};
/* Parse tree for sctp_stream_reset_event struct for sctp notifications. */
struct sctp_stream_reset_event_expr {
struct expression *strreset_type;
struct expression *strreset_flags;
struct expression *strreset_length;
struct expression *strreset_assoc_id;
struct expression *strreset_stream_list;
};
/* The errno-related info from strace to summarize a system call error */
struct errno_spec {
const char *errno_macro; /* errno symbol (C macro name) */
......
......@@ -275,6 +275,7 @@ struct int_symbol platform_symbols_table[] = {
{ SCTP_STREAM_RESET_OUTGOING, "SCTP_STREAM_RESET_OUTGOING" },
{ SCTP_RESET_ASSOC, "SCTP_RESET_ASSOC" },
{ SCTP_ADD_STREAMS, "SCTP_ADD_STREAMS" },
{ SCTP_STREAM_RESET_EVENT, "SCTP_STREAM_RESET_EVENT" },
/* /usr/include/netinet/tcp.h */
{ TCP_NODELAY, "TCP_NODELAY" },
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment