From 61a57e42ac24b3439de46de816ffa94540973460 Mon Sep 17 00:00:00 2001 From: hoelscher <jens.hoelscher@fh-muenster.de> Date: Thu, 26 Nov 2015 20:42:33 +0100 Subject: [PATCH] add sasoc_assoc_id in struct sctp_assocparams --- gtests/net/packetdrill/lexer.l | 1 + gtests/net/packetdrill/parser.y | 28 +++++++++++++------ gtests/net/packetdrill/run_system_call.c | 19 +++++++++++-- gtests/net/packetdrill/script.c | 5 ++++ gtests/net/packetdrill/script.h | 1 + .../bsd/sctp/sctp_get_socket_options.pkt | 20 ++++++------- 6 files changed, 54 insertions(+), 20 deletions(-) diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l index a0888dd1..213bae88 100644 --- a/gtests/net/packetdrill/lexer.l +++ b/gtests/net/packetdrill/lexer.l @@ -219,6 +219,7 @@ srto_assoc_id return SRTO_ASSOC_ID; srto_initial return SRTO_INITIAL; srto_max return SRTO_MAX; srto_min return SRTO_MIN; +sasoc_assoc_id return SASOC_ASSOC_ID; sasoc_asocmaxrxt return SASOC_ASOCMAXRXT; sasoc_number_peer_destinations return SASOC_NUMBER_PEER_DESTINATIONS; sasoc_peer_rwnd return SASOC_PEER_RWND; diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y index 0e897986..3f6a6fa0 100644 --- a/gtests/net/packetdrill/parser.y +++ b/gtests/net/packetdrill/parser.y @@ -536,7 +536,7 @@ 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_ASOCMAXRXT SASOC_ASSOC_ID SASOC_NUMBER_PEER_DESTINATIONS SASOC_PEER_RWND %token <reserved> SASOC_LOCAL_RWND SASOC_COOKIE_LIFE SE_ASSOC_ID SE_TYPE SE_ON %token <reserved> SND_SID SND_FLAGS SND_PPID SND_CONTEXT SND_ASSOC_ID SSB_ADAPTATION_IND %token <reserved> BAD_CRC32C NULL_ @@ -611,7 +611,7 @@ 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_address spinfo_state spinfo_cwnd spinfo_srtt spinfo_rto spinfo_mtu -%type <expression> sasoc_asocmaxrxt sasoc_number_peer_destinations sasoc_peer_rwnd +%type <expression> sasoc_assoc_id sasoc_asocmaxrxt sasoc_number_peer_destinations sasoc_peer_rwnd %type <expression> sasoc_local_rwnd sasoc_cookie_life sctp_assocparams %type <expression> sctp_sndinfo snd_sid snd_flags snd_ppid snd_assoc_id snd_context %type <expression> sctp_event se_assoc_id se_type se_on sctp_setadaptation null @@ -3143,6 +3143,16 @@ sctp_paddrparams } ; +sasoc_assoc_id +: SASOC_ASSOC_ID '=' INTEGER { + if (!is_valid_u32($3)) { + semantic_error("sasoc_assoc_id out of range"); + } + $$ = new_integer_expression($3, "%u"); +} +| SASOC_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + sasoc_asocmaxrxt : SASOC_ASOCMAXRXT '=' INTEGER { if (!is_valid_u16($3)) { @@ -3194,14 +3204,16 @@ sasoc_cookie_life ; sctp_assocparams -: '{' sasoc_asocmaxrxt ',' sasoc_number_peer_destinations ',' sasoc_peer_rwnd ',' sasoc_local_rwnd ',' sasoc_cookie_life '}' { +: '{' sasoc_assoc_id ',' sasoc_asocmaxrxt ',' sasoc_number_peer_destinations ',' + sasoc_peer_rwnd ',' sasoc_local_rwnd ',' sasoc_cookie_life '}' { $$ = 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; + $$->value.sctp_assocparams->sasoc_assoc_id = $2; + $$->value.sctp_assocparams->sasoc_asocmaxrxt = $4; + $$->value.sctp_assocparams->sasoc_number_peer_destinations = $6; + $$->value.sctp_assocparams->sasoc_peer_rwnd = $8; + $$->value.sctp_assocparams->sasoc_local_rwnd = $10; + $$->value.sctp_assocparams->sasoc_cookie_life = $12; } ; diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index 7e0e290a..4e1d3cd8 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -2679,6 +2679,9 @@ static int check_sctp_assocparams(struct sctp_assocparams_expr *expr, struct sctp_assocparams *sctp_assocparams, char **error) { + if (check_u32_expr(expr->sasoc_assoc_id, sctp_assocparams->sasoc_assoc_id, + "sctp_assocparams.sasoc_assoc_id", error)) + return STATUS_ERR; if (check_u16_expr(expr->sasoc_asocmaxrxt, sctp_assocparams->sasoc_asocmaxrxt, "sctp_assocparams.sasoc_asocmaxrxt", error)) return STATUS_ERR; @@ -2857,7 +2860,16 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, case 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; + if (val_expression->value.sctp_rtoinfo->srto_assoc_id->type != EXPR_ELLIPSIS) { + if (get_u32(val_expression->value.sctp_assocparams->sasoc_assoc_id, + &((struct sctp_assocparams*) live_optval)->sasoc_assoc_id, + error)) { + free(live_optval); + return STATUS_ERR; + } + } else { + ((struct sctp_assocparams*) live_optval)->sasoc_assoc_id = 0; + } break; #endif #ifdef SCTP_INITMSG @@ -3201,7 +3213,10 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, #endif #ifdef SCTP_ASSOCINFO case EXPR_SCTP_ASSOCPARAMS: - assocparams.sasoc_assoc_id = 0; + if (get_u32(val_expression->value.sctp_assocparams->sasoc_assoc_id, + &assocparams.sasoc_assoc_id, error)) { + return STATUS_ERR; + } if (get_u16(val_expression->value.sctp_assocparams->sasoc_asocmaxrxt, &assocparams.sasoc_asocmaxrxt, error)) { return STATUS_ERR; diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c index b4d5463a..6e3b76ec 100644 --- a/gtests/net/packetdrill/script.c +++ b/gtests/net/packetdrill/script.c @@ -370,6 +370,7 @@ void free_expression(struct expression *expression) free_expression(expression->value.sctp_stream_value->stream_value); break; case EXPR_SCTP_ASSOCPARAMS: + free_expression(expression->value.sctp_assocparams->sasoc_assoc_id); 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); @@ -1175,6 +1176,10 @@ static int evaluate_sctp_accocparams_expression(struct expression *in, in_params = in->value.sctp_assocparams; out_params = out->value.sctp_assocparams; + if (evaluate(in_params->sasoc_assoc_id, + &out_params->sasoc_assoc_id, + error)) + return STATUS_ERR; if (evaluate(in_params->sasoc_asocmaxrxt, &out_params->sasoc_asocmaxrxt, error)) diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h index 64243b97..8b9cbf0c 100644 --- a/gtests/net/packetdrill/script.h +++ b/gtests/net/packetdrill/script.h @@ -256,6 +256,7 @@ struct sctp_paddrparams_expr { /* Parse tree for sctp_assocparams struct in [gs]etsockopt syscall. */ struct sctp_assocparams_expr { + struct expression *sasoc_assoc_id; struct expression *sasoc_asocmaxrxt; struct expression *sasoc_number_peer_destinations; struct expression *sasoc_peer_rwnd; diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt index ffb390ab..e83ad2af 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt @@ -98,16 +98,16 @@ spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv +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 setsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=0, 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_assoc_id=0, 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_assoc_id=0, 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_assoc_id=0, 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_assoc_id=0, sasoc_asocmaxrxt=5, sasoc_number_peer_destinations=..., sasoc_peer_rwnd=..., + sasoc_local_rwnd=..., sasoc_cookie_life=...}, [20]) = 0 +0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=250, sack_freq=1}, 12) = 0 +0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=250, sack_freq=1}, [12]) = 0 -- GitLab