diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l index 53e33af76bc44dcabe30c85ededd067c10791fc5..4980fdd81f2f576bbcdf50bc91dda24874571639 100644 --- a/gtests/net/packetdrill/lexer.l +++ b/gtests/net/packetdrill/lexer.l @@ -242,6 +242,10 @@ spp_ipv6_flowlabel return SPP_IPV6_FLOWLABEL_; /* avoid name clash */ spp_dscp return SPP_DSCP_; /* avoid name clash */ se_type return SE_TYPE; se_on return SE_ON; +snd_sid return SND_SID; +snd_flags return SND_FLAGS; +snd_ppid return SND_PPID; +snd_context return SND_CONTEXT; ssb_adaptation_ind return SSB_ADAPTATION_IND; CHUNK return CHUNK; DATA return DATA; diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y index 41fb913281f6a29f3a3db8640d0ec12b183aafaa..255215c654cdf1afaa10de300674e0eb77e85df9 100644 --- a/gtests/net/packetdrill/parser.y +++ b/gtests/net/packetdrill/parser.y @@ -536,7 +536,8 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, %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 SE_TYPE SE_ON SSB_ADAPTATION_IND +%token <reserved> SASOC_LOCAL_RWND SASOC_COOKIE_LIFE SE_TYPE SE_ON +%token <reserved> SND_SID SND_FLAGS SND_PPID SND_CONTEXT SSB_ADAPTATION_IND %token <floating> FLOAT %token <integer> INTEGER HEX_INTEGER %token <string> WORD STRING BACK_QUOTED CODE IPV4_ADDR IPV6_ADDR @@ -585,6 +586,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, %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_local_rwnd sasoc_cookie_life sctp_assocparams +%type <expression> sctp_sndinfo snd_sid snd_flags snd_ppid snd_context %type <expression> sctp_event se_type se_on sctp_setadaptation %type <errno_info> opt_errno %type <chunk_list> sctp_chunk_list_spec @@ -2374,6 +2376,9 @@ expression | sctp_event { $$ = $1; } +| sctp_sndinfo { + $$ = $1; +} | sctp_setadaptation{ $$ = $1; } @@ -3008,6 +3013,64 @@ sctp_event } ; +snd_sid +: SND_SID '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("snd_sid out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| SND_SID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +snd_flags +: SND_FLAGS '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("snd_flags out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| SND_FLAGS '=' WORD { + $$ = new_expression(EXPR_WORD); + $$->value.string = $3; +} +| SND_FLAGS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +snd_ppid +: SND_PPID '=' INTEGER { + if (!is_valid_u32($3)) { + semantic_error("snd_ppid out of range"); + } + $$ = new_integer_expression($3, "%u"); +} +| SND_PPID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +snd_context +: SND_CONTEXT '=' INTEGER { + if (!is_valid_u32($3)) { + semantic_error("snd_context out of range"); + } + $$ = new_integer_expression($3, "%u"); +} +| SND_CONTEXT '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sctp_sndinfo +: '{' snd_sid ',' snd_flags ',' snd_ppid ',' snd_context '}' { +#ifdef SCTP_DEFAULT_SNDINFO + $$ = new_expression(EXPR_SCTP_SNDINFO); + $$->value.sctp_sndinfo = calloc(1, sizeof(struct sctp_sndinfo)); + $$->value.sctp_sndinfo->snd_sid = $2; + $$->value.sctp_sndinfo->snd_flags = $4; + $$->value.sctp_sndinfo->snd_ppid = $6; + $$->value.sctp_sndinfo->snd_context = $8; +#else + $$ = NULL; +#endif +} + sctp_setadaptation : '{' SSB_ADAPTATION_IND '=' INTEGER '}' { #ifdef SCTP_ADAPTATION_LAYER diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index 27954fe7a5010c35ff8fbb69fc94ed7eaa232f08..1849fede9eb6aaefc6afcf48d6c01cf59bdd4105 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -2257,6 +2257,63 @@ static int check_sctp_event(struct sctp_event_expr *expr, } #endif +#ifdef SCTP_DEFAULT_SNDINFO +static int check_sctp_sndinfo(struct sctp_sndinfo_expr *expr, + struct sctp_sndinfo *sctp_sndinfo, + char **error) +{ + if (expr->snd_sid->type != EXPR_ELLIPSIS) { + u16 snd_sid; + + if (get_u16(expr->snd_sid, &snd_sid, error)) { + return STATUS_ERR; + } + if (sctp_sndinfo->snd_sid != snd_sid) { + asprintf(error, "Bad getsockopt sctp_sndinfo.snd_sid: expected: %hu actual: %hu", + snd_sid, sctp_sndinfo->snd_sid); + return STATUS_ERR; + } + } + if (expr->snd_flags->type != EXPR_ELLIPSIS) { + u16 snd_flags; + + if (get_u16(expr->snd_flags, &snd_flags, error)) { + return STATUS_ERR; + } + if (sctp_sndinfo->snd_flags != snd_flags) { + asprintf(error, "Bad getsockopt sctp_sndinfo.snd_flags: expected: %hu actual: %hu", + snd_flags, sctp_sndinfo->snd_flags); + return STATUS_ERR; + } + } + if (expr->snd_ppid->type != EXPR_ELLIPSIS) { + u32 snd_ppid; + + if (get_u32(expr->snd_ppid, &snd_ppid, error)) { + return STATUS_ERR; + } + if (sctp_sndinfo->snd_ppid != snd_ppid) { + asprintf(error, "Bad getsockopt sctp_sndinfo.snd_ppid: expected: %u actual: %u", + snd_ppid, sctp_sndinfo->snd_ppid); + return STATUS_ERR; + } + } + if (expr->snd_context->type != EXPR_ELLIPSIS) { + u32 snd_context; + + if (get_u32(expr->snd_context, &snd_context, error)) { + return STATUS_ERR; + } + if (sctp_sndinfo->snd_context != snd_context) { + asprintf(error, "Bad getsockopt sctp_sndinfo.snd_context: expected: %u actual: %u", + snd_context, sctp_sndinfo->snd_context); + return STATUS_ERR; + } + } + return STATUS_OK; +} +#endif + #ifdef SCTP_ADAPTATION_LAYER static int check_sctp_setadaptation(struct sctp_setadaptation_expr *expr, struct sctp_setadaptation *sctp_setadaptation, @@ -2346,7 +2403,7 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, if (expr_paddrinfo->spinfo_address->type == EXPR_ELLIPSIS) { socklen_t len_addr = sizeof(live_paddrinfo->spinfo_address); if (getpeername(live_fd, (struct sockaddr*) &live_paddrinfo->spinfo_address, &len_addr)) { - asprintf(error, "Bad setsockopt, bad get primary peer address"); + asprintf(error, "Bad getsockopt, bad get primary peer address"); free(live_paddrinfo); return STATUS_ERR; } @@ -2355,7 +2412,7 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, } else if (expr_paddrinfo->spinfo_address->type == EXPR_SOCKET_ADDRESS_IPV6) { memcpy(&live_paddrinfo->spinfo_address, expr_paddrinfo->spinfo_address->value.socket_address_ipv6, sizeof(struct sockaddr_in6)); } else { - asprintf(error, "Bad setsockopt, bad get input for spinfo_address"); + asprintf(error, "Bad getsockopt, bad get input for spinfo_address"); free(live_paddrinfo); return STATUS_ERR; } @@ -2416,6 +2473,12 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, return STATUS_ERR; } #endif +#ifdef SCTP_DEFAULT_SNDINFO + } else if (val_expression->type == EXPR_SCTP_SNDINFO) { + live_optval = malloc(sizeof(struct sctp_sndinfo)); + live_optlen = sizeof(struct sctp_sndinfo); + ((struct sctp_sndinfo *)live_optval)->snd_assoc_id = 0; +#endif #ifdef SCTP_ADAPTATION_LAYER } else if (val_expression->type == EXPR_SCTP_SETADAPTATION) { live_optval = malloc(sizeof(struct sctp_setadaptation)); @@ -2516,6 +2579,13 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, return STATUS_ERR; } #endif +#ifdef SCTP_DEFAULT_SNDINFO + } else if (val_expression->type == EXPR_SCTP_SNDINFO) { + if (check_sctp_sndinfo(val_expression->value.sctp_sndinfo, live_optval, error)) { + free(live_optval); + return STATUS_ERR; + } +#endif #ifdef SCTP_ADAPTATION_LAYER } else if (val_expression->type == EXPR_SCTP_SETADAPTATION) { if (check_sctp_setadaptation(val_expression->value.sctp_setadaptation, live_optval, error)) { @@ -2569,6 +2639,9 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, #ifdef SCTP_EVENT struct sctp_event event; #endif +#ifdef SCTP_DEFAULT_SNDINFO + struct sctp_sndinfo sndinfo; +#endif #ifdef SCTP_ADAPTATION_LAYER struct sctp_setadaptation setadaptation; #endif @@ -2761,6 +2834,28 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, optval = &event; break; #endif +#ifdef SCTP_DEFAULT_SNDINFO + case EXPR_SCTP_SNDINFO: + sndinfo.snd_assoc_id = 0; + if (get_u16(val_expression->value.sctp_sndinfo->snd_sid, + &sndinfo.snd_sid, error)) { + return STATUS_ERR; + } + if (get_u16(val_expression->value.sctp_sndinfo->snd_flags, + &sndinfo.snd_flags, error)) { + return STATUS_ERR; + } + if (get_u32(val_expression->value.sctp_sndinfo->snd_ppid, + &sndinfo.snd_ppid, error)) { + return STATUS_ERR; + } + if (get_u32(val_expression->value.sctp_sndinfo->snd_context, + &sndinfo.snd_context, error)) { + return STATUS_ERR; + } + optval = &sndinfo; + break; +#endif #ifdef SCTP_ADAPTATION_LAYER case EXPR_SCTP_SETADAPTATION: if (get_u32(val_expression->value.sctp_setadaptation->ssb_adaptation_ind, diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c index 43df660d900898db2a0a28e1867e6f401f970cf2..4f3b93549a30ddd6c21580542ad2630b5631abce 100644 --- a/gtests/net/packetdrill/script.c +++ b/gtests/net/packetdrill/script.c @@ -93,10 +93,12 @@ struct expression_type_entry expression_type_table[] = { #ifdef SCTP_EVENT { EXPR_SCTP_EVENT, "sctp_event" }, #endif +#ifdef SCTP_DEFAULT_SNDINFO + { EXPR_SCTP_SNDINFO, "sctp_sndinfo" }, +#endif #ifdef SCTP_ADAPTATION_LAYER { EXPR_SCTP_SETADAPTATION, "sctp_setadaptation"}, #endif - { NUM_EXPR_TYPES, NULL} }; @@ -394,6 +396,14 @@ void free_expression(struct expression *expression) free_expression(expression->value.sctp_event->se_on); break; #endif +#ifdef SCTP_DEFAULT_SNDINFO + case EXPR_SCTP_SNDINFO: + free_expression(expression->value.sctp_sndinfo->snd_sid); + free_expression(expression->value.sctp_sndinfo->snd_flags); + free_expression(expression->value.sctp_sndinfo->snd_ppid); + free_expression(expression->value.sctp_sndinfo->snd_context); + break; +#endif #ifdef SCTP_ADAPTATION_LAYER case EXPR_SCTP_SETADAPTATION: free_expression(expression->value.sctp_setadaptation->ssb_adaptation_ind); @@ -959,6 +969,43 @@ static int evaluate_sctp_accocparams_expression(struct expression *in, } #endif +#ifdef SCTP_DEFAULT_SNDINFO +static int evaluate_sctp_sndinfo_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_sndinfo_expr *in_sndinfo; + struct sctp_sndinfo_expr *out_sndinfo; + + assert(in->type == EXPR_SCTP_SNDINFO); + assert(in->value.sctp_sndinfo); + assert(out->type == EXPR_SCTP_SNDINFO); + + out->value.sctp_sndinfo = calloc(1, sizeof(struct sctp_sndinfo_expr)); + + in_sndinfo = in->value.sctp_sndinfo; + out_sndinfo = out->value.sctp_sndinfo; + + if (evaluate(in_sndinfo->snd_sid, + &out_sndinfo->snd_sid, + error)) + return STATUS_ERR; + if (evaluate(in_sndinfo->snd_flags, + &out_sndinfo->snd_flags, + error)) + return STATUS_ERR; + if (evaluate(in_sndinfo->snd_ppid, + &out_sndinfo->snd_ppid, + error)) + return STATUS_ERR; + if (evaluate(in_sndinfo->snd_context, + &out_sndinfo->snd_context, + error)) + return STATUS_ERR; + return STATUS_OK; +} +#endif + #ifdef SCTP_ADAPTATION_LAYER static int evaluate_sctp_setadaptation_expression(struct expression *in, struct expression *out, @@ -1056,6 +1103,11 @@ static int evaluate(struct expression *in, result = evaluate_sctp_event_expression(in, out, error); break; #endif +#ifdef SCTP_DEFAULT_SNDINFO + case EXPR_SCTP_SNDINFO: + result = evaluate_sctp_sndinfo_expression(in, out, error); + break; +#endif #ifdef SCTP_ADAPTATION_LAYER case EXPR_SCTP_SETADAPTATION: result = evaluate_sctp_setadaptation_expression(in, out, error); diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h index 3711795ebcbf12707db3d13d208e527ceca97ddb..ecd3a56d0a12762ac50a73371e9dca9cc368a6cb 100644 --- a/gtests/net/packetdrill/script.h +++ b/gtests/net/packetdrill/script.h @@ -72,7 +72,10 @@ enum expression_t { EXPR_SCTP_ASSOCPARAMS, /* struct sctp_assocparams for SCTP_ASSOCINFO */ #endif #ifdef SCTP_EVENT - EXPR_SCTP_EVENT, /* struct sctp_event to for SCTP_EVENT */ + EXPR_SCTP_EVENT, /* struct sctp_event for SCTP_EVENT */ +#endif +#ifdef SCTP_DEFAULT_SNDINFO + EXPR_SCTP_SNDINFO, /* struct sctp_sndinfo for SCTP_DEFAULT_SNDINFO */ #endif #ifdef SCTP_ADAPTATION_LAYER EXPR_SCTP_SETADAPTATION, /* struct sctp_setadaptation for SCTP_ADATTATION_LAYER */ @@ -124,10 +127,12 @@ struct expression { #ifdef SCTP_EVENT struct sctp_event_expr *sctp_event; #endif +#ifdef SCTP_DEFAULT_SNDINFO + struct sctp_sndinfo_expr *sctp_sndinfo; +#endif #ifdef SCTP_ADAPTATION_LAYER struct sctp_setadaptation_expr *sctp_setadaptation; #endif - } value; const char *format; /* the printf format for printing the value */ }; @@ -269,6 +274,16 @@ struct sctp_event_expr { }; #endif +#ifdef SCTP_DEFAULT_SNDINFO +/* Parse tree for sctp_sndinfo struct in [gs]etsockopt syscall. */ +struct sctp_sndinfo_expr { + struct expression *snd_sid; + struct expression *snd_flags; + struct expression *snd_ppid; + struct expression *snd_context; +}; +#endif + #ifdef SCTP_ADAPTATION_LAYER /* Parse tree for sctp_setadaptation struct in [gs]etsockopt syscall. */ struct sctp_setadaptation_expr { diff --git a/gtests/net/packetdrill/symbols_freebsd.c b/gtests/net/packetdrill/symbols_freebsd.c index 779c8aab75642cd6cc36e9672eeb921c8959442f..c5069e9e05412321ef90a316a64fbd42185feadf 100644 --- a/gtests/net/packetdrill/symbols_freebsd.c +++ b/gtests/net/packetdrill/symbols_freebsd.c @@ -89,6 +89,7 @@ struct int_symbol platform_symbols_table[] = { { SCTP_MAX_BURST, "SCTP_MAX_BURST" }, { SCTP_PEER_ADDR_PARAMS, "SCTP_PEER_ADDR_PARAMS" }, { SCTP_EVENT, "SCTP_EVENT" }, + { SCTP_DEFAULT_SNDINFO, "SCTP_DEFAULT_SNDINFO" }, { SCTP_STATUS, "SCTP_STATUS" }, { SCTP_GET_PEER_ADDR_INFO, "SCTP_GET_PEER_ADDR_INFO" }, { SCTP_FRAGMENT_INTERLEAVE, "SCTP_FRAGMENT_INTERLEAVE" }, @@ -177,6 +178,12 @@ struct int_symbol platform_symbols_table[] = { { 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" }, + { SCTP_ADDR_OVER, "SCTP_ADDR_OVER" }, + { SCTP_ABORT, "SCTP_ABORT" }, + { SCTP_EOF, "SCTP_EOF" }, + { SCTP_SENDALL, "SCTP_SENDALL" }, + /* /usr/include/netinet/tcp.h */ { TCP_NODELAY, "TCP_NODELAY" }, { TCP_MAXSEG, "TCP_MAXSEG" }, diff --git a/gtests/net/packetdrill/symbols_linux.c b/gtests/net/packetdrill/symbols_linux.c index 58f21acd6e31f31be5121d474b1d08c34ab30ce3..f41f1a7152cd93a951c64e3947faa0597947aa56 100644 --- a/gtests/net/packetdrill/symbols_linux.c +++ b/gtests/net/packetdrill/symbols_linux.c @@ -107,6 +107,7 @@ struct int_symbol platform_symbols_table[] = { { SCTP_MAXSEG, "SCTP_MAXSEG" }, { SCTP_DELAYED_SACK, "SCTP_DELAYED_SACK" }, { SCTP_MAX_BURST, "SCTP_MAX_BURST" }, + { SCTP_DEFAULT_SNDINFO, "SCTP_DEFAULT_SNDINFO" }, #if 0 { SCTP_EVENT, "SCTP_EVENT" }, #endif @@ -173,11 +174,20 @@ struct int_symbol platform_symbols_table[] = { #ifdef SCTP_ADAPTATION_LAYER { SCTP_ADAPTATION_LAYER, "SCTP_ADAPTATION_LAYER" }, #endif + #if 0 { SPP_IPV6_FLOWLABEL, "SPP_IPV6_FLOWLABEL" }, { SPP_DSCP, "SPP_DSCP" }, #endif - + { SCTP_UNORDERED, "SCTP_UNORDERED" }, + { SCTP_ADDR_OVER, "SCTP_ADDR_OVER" }, + { SCTP_ABORT, "SCTP_ABORT" }, + { SCTP_EOF, "SCTP_EOF" }, + { SCTP_SACK_IMMEDIATELY, "SCTP_SACK_IMMEDIATELY" }, + { SCTP_NOTIFICATION, "SCTP_NOTIFICATION" }, +#if 0 + { SCTP_SENDALL, "SCTP_SENDALL" }, +#endif { TCP_NODELAY, "TCP_NODELAY" }, { TCP_MAXSEG, "TCP_MAXSEG" }, { TCP_CORK, "TCP_CORK" }, 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 7671c7d28cbf64f9a3e5c352a3fb7440006ff4bd..0cd0e2782d3dac117cdea1e727f12af2c1a3b2c4 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 @@ -96,11 +96,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_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_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 @@ -110,6 +115,15 @@ spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv +0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 +0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=0, snd_ppid=1, snd_context=1}, 16) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=0, snd_ppid=1, snd_context=1}, [16]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=SCTP_UNORDERED, snd_ppid=2, snd_context=2}, 16) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=SCTP_UNORDERED, snd_ppid=2, snd_context=2}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=SCTP_UNORDERED, snd_ppid=2, snd_context=...}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=SCTP_UNORDERED, snd_ppid=..., snd_context=2}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=..., snd_ppid=2, snd_context=2}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=..., snd_flags=SCTP_UNORDERED, snd_ppid=2, snd_context=2}, [16]) = 0 + +0 setsockopt(3, IPPROTO_SCTP, SCTP_ADAPTATION_LAYER, {ssb_adaptation_ind=2}, 4) = 0 +0 getsockopt(3, IPPROTO_SCTP, SCTP_ADAPTATION_LAYER, {ssb_adaptation_ind=2}, [4]) = 0