Skip to content
Snippets Groups Projects
Commit 73c32eef authored by hoelscher's avatar hoelscher
Browse files

Add [gs]etsockopt socketoptin sctp_associnfo

parent f3f7ad42
No related branches found
No related tags found
No related merge requests found
......@@ -210,6 +210,11 @@ sack_freq return SACK_FREQ;
srto_initial return SRTO_INITIAL;
srto_max return SRTO_MAX;
srto_min return SRTO_MIN;
sasoc_asocmaxrxt return SASOC_ASOCMAXRXT;
sasoc_number_peer_destinations return SASOC_NUMBER_PEER_DESTINATIONS;
sasoc_peer_rwnd return SASOC_PEER_RWND;
sasoc_local_rwnd return SASOC_LOCAL_RWND;
sasoc_cookie_life return SASOC_COOKIE_LIFE;
sinit_num_ostreams return SINIT_NUM_OSTREAMS;
sinit_max_instreams return SINIT_MAX_INSTREAMS;
sinit_max_attempts return SINIT_MAX_ATTEMPTS;
......
......@@ -534,6 +534,8 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
%token <reserved> STALENESS CHK PARAM UNRECOGNIZED_PARAMETERS
%token <reserved> SPP_ADDRESS SPP_HBINTERVAL SPP_PATHMAXRXT SPP_PATHMTU
%token <reserved> SPP_FLAGS SPP_IPV6_FLOWLABEL_ SPP_DSCP_
%token <reserved> SASOC_ASOCMAXRXT SASOC_NUMBER_PEER_DESTINATIONS SASOC_PEER_RWND
%token <reserved> SASOC_LOCAL_RWND SASOC_COOKIE_LIFE
%token <floating> FLOAT
%token <integer> INTEGER HEX_INTEGER
%token <string> WORD STRING BACK_QUOTED CODE IPV4_ADDR IPV6_ADDR
......@@ -579,6 +581,8 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
%type <expression> sctp_paddrparams spp_address spp_hbinterval spp_pathmtu spp_pathmaxrxt
%type <expression> spp_flags spp_ipv6_flowlabel spp_dscp
%type <expression> spinfo_state spinfo_cwnd spinfo_srtt spinfo_rto spinfo_mtu
%type <expression> sasoc_asocmaxrxt sasoc_number_peer_destinations sasoc_peer_rwnd
%type <expression> sasoc_local_rwnd sasoc_cookie_life sctp_assocparams
%type <errno_info> opt_errno
%type <chunk_list> sctp_chunk_list_spec
%type <chunk_list_item> sctp_chunk_spec
......@@ -2361,6 +2365,9 @@ expression
| sctp_paddrparams {
$$ = $1;
}
| sctp_assocparams {
$$ = $1;
}
;
decimal_integer
......@@ -2871,6 +2878,72 @@ sctp_paddrparams
}
;
sasoc_asocmaxrxt
: SASOC_ASOCMAXRXT '=' INTEGER {
if (!is_valid_u16($3)) {
semantic_error("sasoc_asocmaxrxt out of range");
}
$$ = new_integer_expression($3, "%hu");
}
| SASOC_ASOCMAXRXT '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
sasoc_number_peer_destinations
: SASOC_NUMBER_PEER_DESTINATIONS '=' INTEGER {
if (!is_valid_u16($3)) {
semantic_error("sasoc_number_peer_destinations out of range");
}
$$ = new_integer_expression($3, "%hu");
}
| SASOC_NUMBER_PEER_DESTINATIONS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
sasoc_peer_rwnd
: SASOC_PEER_RWND '=' INTEGER {
if (!is_valid_u32($3)) {
semantic_error("sasoc_peer_rwnd out of range");
}
$$ = new_integer_expression($3, "%u");
}
| SASOC_PEER_RWND '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
sasoc_local_rwnd
: SASOC_LOCAL_RWND '=' INTEGER {
if (!is_valid_u32($3)) {
semantic_error("sasoc_local_rwnd out of range");
}
$$ = new_integer_expression($3, "%u");
}
| SASOC_LOCAL_RWND '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
sasoc_cookie_life
: SASOC_COOKIE_LIFE '=' INTEGER {
if (!is_valid_u32($3)) {
semantic_error("sasoc_cookie_life out of range");
}
$$ = new_integer_expression($3, "%u");
}
| SASOC_COOKIE_LIFE '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
sctp_assocparams
: '{' sasoc_asocmaxrxt ',' sasoc_number_peer_destinations ',' sasoc_peer_rwnd ',' sasoc_local_rwnd ',' sasoc_cookie_life '}' {
#ifdef SCTP_ASSOCINFO
$$ = new_expression(EXPR_SCTP_ASSOCPARAMS);
$$->value.sctp_assocparams = calloc(1, sizeof(struct sctp_assocparams_expr));
$$->value.sctp_assocparams->sasoc_asocmaxrxt = $2;
$$->value.sctp_assocparams->sasoc_number_peer_destinations = $4;
$$->value.sctp_assocparams->sasoc_peer_rwnd = $6;
$$->value.sctp_assocparams->sasoc_local_rwnd = $8;
$$->value.sctp_assocparams->sasoc_cookie_life = $10;
#elif
$$ = NULL;
#endif
}
;
opt_errno
: { $$ = NULL; }
| WORD note {
......
......@@ -2121,6 +2121,76 @@ static int check_sctp_stream_value(struct sctp_stream_value_expr *expr,
}
#endif
#ifdef SCTP_ASSOCINFO
static int check_sctp_assocparams(struct sctp_assocparams_expr *expr,
struct sctp_assocparams *sctp_assocparams,
char **error)
{
if (expr->sasoc_asocmaxrxt->type != EXPR_ELLIPSIS) {
u16 sasoc_asocmaxrxt;
if (get_u16(expr->sasoc_asocmaxrxt, &sasoc_asocmaxrxt, error)) {
return STATUS_ERR;
}
if (sctp_assocparams->sasoc_asocmaxrxt != sasoc_asocmaxrxt) {
asprintf(error, "Bad getsockopt sctp_assocparams.sasoc_asocmaxrxt: expected: %hu actual: %hu",
sasoc_asocmaxrxt, sctp_assocparams->sasoc_asocmaxrxt);
return STATUS_ERR;
}
}
if (expr->sasoc_number_peer_destinations->type != EXPR_ELLIPSIS) {
u16 sasoc_number_peer_destinations;
if (get_u16(expr->sasoc_number_peer_destinations, &sasoc_number_peer_destinations, error)) {
return STATUS_ERR;
}
if (sctp_assocparams->sasoc_number_peer_destinations != sasoc_number_peer_destinations) {
asprintf(error, "Bad getsockopt sctp_assocparams.sasoc_number_peer_destinations: expected: %hu actual: %hu",
sasoc_number_peer_destinations, sctp_assocparams->sasoc_number_peer_destinations);
return STATUS_ERR;
}
}
if (expr->sasoc_peer_rwnd->type != EXPR_ELLIPSIS) {
u32 sasoc_peer_rwnd;
if (get_u32(expr->sasoc_peer_rwnd, &sasoc_peer_rwnd, error)) {
return STATUS_ERR;
}
if (sctp_assocparams->sasoc_peer_rwnd != sasoc_peer_rwnd) {
asprintf(error, "Bad getsockopt sctp_assocparams.sasoc_peer_rwnd: expected: %u actual: %u",
sasoc_peer_rwnd, sctp_assocparams->sasoc_peer_rwnd);
return STATUS_ERR;
}
}
if (expr->sasoc_local_rwnd->type != EXPR_ELLIPSIS) {
u32 sasoc_local_rwnd;
if (get_u32(expr->sasoc_local_rwnd, &sasoc_local_rwnd, error)) {
return STATUS_ERR;
}
if (sctp_assocparams->sasoc_local_rwnd != sasoc_local_rwnd) {
asprintf(error, "Bad getsockopt sctp_assocparams.sasoc_local_rwnd: expected: %u actual: %u",
sasoc_local_rwnd, sctp_assocparams->sasoc_local_rwnd);
return STATUS_ERR;
}
}
if (expr->sasoc_cookie_life->type != EXPR_ELLIPSIS) {
u32 sasoc_cookie_life;
if (get_u32(expr->sasoc_cookie_life, &sasoc_cookie_life, error)) {
return STATUS_ERR;
}
if (sctp_assocparams->sasoc_cookie_life != sasoc_cookie_life) {
asprintf(error, "Bad getsockopt sctp_assocparams.sasoc_cookie_life: expected: %u actual: %u",
sasoc_cookie_life, sctp_assocparams->sasoc_cookie_life);
return STATUS_ERR;
}
}
return STATUS_OK;
}
#endif
static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
struct expression_list *args, char **error)
{
......@@ -2156,6 +2226,12 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
live_optlen = (socklen_t)sizeof(struct sctp_rtoinfo);
((struct sctp_rtoinfo*)live_optval)->srto_assoc_id = 0;
#endif
#ifdef SCTP_ASSOCINFO
} else if (val_expression->type == EXPR_SCTP_ASSOCPARAMS) {
live_optval = malloc(sizeof(struct sctp_assocparams));
live_optlen = (socklen_t)sizeof(struct sctp_assocparams);
((struct sctp_assocparams*) live_optval)->sasoc_assoc_id = 0;
#endif
#ifdef SCTP_INITMSG
} else if (val_expression->type == EXPR_SCTP_INITMSG) {
live_optval = malloc(sizeof(struct sctp_initmsg));
......@@ -2175,7 +2251,7 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
if (expr_params->spp_address->type == EXPR_ELLIPSIS) {
socklen_t len_addr = sizeof(live_params->spp_address);
if (getpeername(live_fd, (struct sockaddr*) &live_params->spp_address, &len_addr)) {
asprintf(error, "Bad setsockopt, bad get primary peer address");
asprintf(error, "Bad getsockopt, bad get primary peer address");
free(live_params);
return STATUS_ERR;
}
......@@ -2184,7 +2260,7 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
} else if (expr_params->spp_address->type == EXPR_SOCKET_ADDRESS_IPV6) {
memcpy(&live_params->spp_address, expr_params->spp_address->value.socket_address_ipv6, sizeof(struct sockaddr_in6));
} else {
asprintf(error, "Bad setsockopt, bad get input for spp_address");
asprintf(error, "Bad getsockopt, bad get input for spp_address");
free(live_params);
return STATUS_ERR;
}
......@@ -2241,6 +2317,13 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
return STATUS_ERR;
}
#endif
#ifdef SCTP_ASSOCINFO
} else if (val_expression->type == EXPR_SCTP_ASSOCPARAMS) {
if (check_sctp_assocparams(val_expression->value.sctp_assocparams, live_optval, error)) {
free(live_optval);
return STATUS_ERR;
}
#endif
#ifdef SCTP_INITMSG
} else if (val_expression->type == EXPR_SCTP_INITMSG) {
if (check_sctp_initmsg(val_expression->value.sctp_initmsg, live_optval, error)) {
......@@ -2298,6 +2381,9 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
#ifdef SCTP_RTOINFO
struct sctp_rtoinfo rtoinfo;
#endif
#ifdef SCTP_ASSOCINFO
struct sctp_assocparams assocparams;
#endif
#ifdef SCTP_INITMSG
struct sctp_initmsg initmsg;
#endif
......@@ -2368,6 +2454,32 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
optval = &rtoinfo;
break;
#endif
#ifdef SCTP_ASSOCINFO
case EXPR_SCTP_ASSOCPARAMS:
assocparams.sasoc_assoc_id = 0;
if (get_u16(val_expression->value.sctp_assocparams->sasoc_asocmaxrxt,
&assocparams.sasoc_asocmaxrxt, error)) {
return STATUS_ERR;
}
if (get_u16(val_expression->value.sctp_assocparams->sasoc_number_peer_destinations,
&assocparams.sasoc_number_peer_destinations, error)) {
return STATUS_ERR;
}
if (get_u32(val_expression->value.sctp_assocparams->sasoc_peer_rwnd,
&assocparams.sasoc_peer_rwnd, error)) {
return STATUS_ERR;
}
if (get_u32(val_expression->value.sctp_assocparams->sasoc_local_rwnd,
&assocparams.sasoc_local_rwnd, error)) {
return STATUS_ERR;
}
if (get_u32(val_expression->value.sctp_assocparams->sasoc_cookie_life,
&assocparams.sasoc_cookie_life, error)) {
return STATUS_ERR;
}
optval = &assocparams;
break;
#endif
#ifdef SCTP_INITMSG
case EXPR_SCTP_INITMSG:
if (get_u16(val_expression->value.sctp_initmsg->sinit_num_ostreams,
......
......@@ -85,7 +85,10 @@ struct expression_type_entry expression_type_table[] = {
{ EXPR_SCTP_PEER_ADDR_PARAMS, "sctp_peer_addr_params"},
#endif
#ifdef SCTP_SS_VALUE
{ EXPR_SCTP_STREAM_VALUE, "sctp_stream_value"},
{ EXPR_SCTP_STREAM_VALUE, "sctp_stream_value"},
#endif
#ifdef SCTP_ASSOCINFO
{ EXPR_SCTP_ASSOCPARAMS, "sctp_assocparams"},
#endif
{ NUM_EXPR_TYPES, NULL}
};
......@@ -367,6 +370,15 @@ void free_expression(struct expression *expression)
free_expression(expression->value.sctp_stream_value->stream_id);
free_expression(expression->value.sctp_stream_value->stream_value);
break;
#endif
#ifdef SCTP_ASSOCINFO
case EXPR_SCTP_ASSOCPARAMS:
free_expression(expression->value.sctp_assocparams->sasoc_asocmaxrxt);
free_expression(expression->value.sctp_assocparams->sasoc_number_peer_destinations);
free_expression(expression->value.sctp_assocparams->sasoc_peer_rwnd);
free_expression(expression->value.sctp_assocparams->sasoc_local_rwnd);
free_expression(expression->value.sctp_assocparams->sasoc_cookie_life);
break;
#endif
case EXPR_WORD:
assert(expression->value.string);
......@@ -828,6 +840,48 @@ static int evaluate_sctp_stream_value_expression(struct expression *in,
}
#endif
#ifdef SCTP_ASSOCINFO
static int evaluate_sctp_accocparams_expression(struct expression *in,
struct expression *out,
char **error)
{
struct sctp_assocparams_expr *in_params;
struct sctp_assocparams_expr *out_params;
assert(in->type == EXPR_SCTP_ASSOCPARAMS);
assert(in->value.sctp_assocparams);
assert(out->type == EXPR_SCTP_ASSOCPARAMS);
out->value.sctp_assocparams = calloc(1, sizeof(struct sctp_assocparams_expr));
in_params = in->value.sctp_assocparams;
out_params = out->value.sctp_assocparams;
if (evaluate(in_params->sasoc_asocmaxrxt,
&out_params->sasoc_asocmaxrxt,
error))
return STATUS_ERR;
if (evaluate(in_params->sasoc_number_peer_destinations,
&out_params->sasoc_number_peer_destinations,
error))
return STATUS_ERR;
if (evaluate(in_params->sasoc_peer_rwnd,
&out_params->sasoc_peer_rwnd,
error))
return STATUS_ERR;
if (evaluate(in_params->sasoc_local_rwnd,
&out_params->sasoc_local_rwnd,
error))
return STATUS_ERR;
if (evaluate(in_params->sasoc_cookie_life,
&out_params->sasoc_cookie_life,
error))
return STATUS_ERR;
return STATUS_OK;
}
#endif
static int evaluate(struct expression *in,
struct expression **out_ptr, char **error)
{
......@@ -856,6 +910,11 @@ static int evaluate(struct expression *in,
evaluate_sctp_rtoinfo_expression(in, out, error);
break;
#endif
#ifdef SCTP_ASSOCINFO
case EXPR_SCTP_ASSOCPARAMS:
evaluate_sctp_accocparams_expression(in, out, error);
break;
#endif
#ifdef SCTP_INITMSG
case EXPR_SCTP_INITMSG:
evaluate_sctp_initmsg_expression(in, out, error);
......
......@@ -67,6 +67,9 @@ enum expression_t {
#endif
#ifdef SCTP_PEER_ADDR_PARAMS
EXPR_SCTP_PEER_ADDR_PARAMS, /* struct for sctp_paddrparams for SCTP_PEER_ADDR_PARAMS*/
#endif
#ifdef SCTP_ASSOCINFO
EXPR_SCTP_ASSOCPARAMS, /* struct sctp_assocparams for SCTP_ASSOCINFO */
#endif
NUM_EXPR_TYPES,
};
......@@ -108,6 +111,9 @@ struct expression {
#endif
#ifdef SCTP_SS_VALUE
struct sctp_stream_value_expr *sctp_stream_value;
#endif
#ifdef SCTP_ASSOCINFO
struct sctp_assocparams_expr *sctp_assocparams;
#endif
} value;
const char *format; /* the printf format for printing the value */
......@@ -164,7 +170,6 @@ struct sctp_rtoinfo_expr {
};
#endif
#ifdef SCTP_INITMSG
/* Parse tree for a sctp_initmsg struct in a [gs]etsockopt syscall. */
struct sctp_initmsg_expr {
......@@ -224,6 +229,17 @@ struct sctp_paddrparams_expr {
struct expression *spp_dscp;
};
#ifdef SCTP_ASSOCINFO
/* Parse tree for sctp_assocparams struct in [gs]etsockopt syscall. */
struct sctp_assocparams_expr {
struct expression *sasoc_asocmaxrxt;
struct expression *sasoc_number_peer_destinations;
struct expression *sasoc_peer_rwnd;
struct expression *sasoc_local_rwnd;
struct expression *sasoc_cookie_life;
};
#endif
/* The errno-related info from strace to summarize a system call error */
struct errno_spec {
const char *errno_macro; /* errno symbol (C macro name) */
......
......@@ -80,6 +80,7 @@ struct int_symbol platform_symbols_table[] = {
/* /usr/include/netinet/sctp.h and /usr/include/netinet/sctp_uio.h */
{ SCTP_RTOINFO, "SCTP_RTOINFO" },
{ SCTP_ASSOCINFO, "SCTP_ASSOCINFO" },
{ SCTP_INITMSG, "SCTP_INITMSG" },
{ SCTP_NODELAY, "SCTP_NODELAY" },
{ SCTP_MAXSEG, "SCTP_MAXSEG" },
......
......@@ -101,6 +101,7 @@ struct int_symbol platform_symbols_table[] = {
#endif
{ SCTP_RTOINFO, "SCTP_RTOINFO" },
{ SCTP_ASSOCINFO, "SCTP_ASSOCINFO" },
{ SCTP_INITMSG, "SCTP_INITMSG" },
{ SCTP_NODELAY, "SCTP_NODELAY" },
{ SCTP_MAXSEG, "SCTP_MAXSEG" },
......
......@@ -78,4 +78,11 @@ spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv
+0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=..., sinit_max_instreams=2, sinit_max_attempts=2, sinit_max_init_timeo=30}, [8]) = 0
+0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2, sinit_max_instreams=..., sinit_max_attempts=2, sinit_max_init_timeo=30}, [8]) = 0
+0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2, sinit_max_instreams=2, sinit_max_attempts=..., sinit_max_init_timeo=30}, [8]) = 0
+0 setsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=3, sasoc_peer_rwnd=1800, sasoc_local_rwnd=2000, sasoc_cookie_life=40000}, 20) = 0
+0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=1, sasoc_peer_rwnd=1500, sasoc_local_rwnd=1864135, sasoc_cookie_life=40000}, [20]) = 0
+0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=..., sasoc_number_peer_destinations=..., sasoc_peer_rwnd=..., sasoc_local_rwnd=..., sasoc_cookie_life=40000}, [20]) = 0
+0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=..., sasoc_peer_rwnd=..., sasoc_local_rwnd=..., sasoc_cookie_life=40000}, [20]) = 0
+0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=..., sasoc_peer_rwnd=..., sasoc_local_rwnd=..., sasoc_cookie_life=...}, [20]) = 0
+0 close(3) = 0
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