diff --git a/gtests/net/packetdrill/README b/gtests/net/packetdrill/README index 026f6b956f72bc9689a8dfcb04e090057cdf6ba9..5caba0bc7544ced263a7fa8ea86ccd18b7cbf89e 100644 --- a/gtests/net/packetdrill/README +++ b/gtests/net/packetdrill/README @@ -32,7 +32,7 @@ Here's a quick example. On FreeBSD, OpenBSD, and NetBSD, try: -# ./packetdrill tests/bsd/fast_retransmit/fr-4pkt-sack-bsd.pkt +# ./packetdrill tests/bsd/tcp/fast_retransmit/fr-4pkt-sack-bsd.pkt On Linux try: diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l index bac85750dae609e5fc81857f270d86163c5dc6eb..f55833b12ab448d9a6b6fa3bb189b5c6e433f7d2 100644 --- a/gtests/net/packetdrill/lexer.l +++ b/gtests/net/packetdrill/lexer.l @@ -312,14 +312,22 @@ ce return CE; iov_base return IOV_BASE; iov_len return IOV_LEN; [.][.][.] return ELLIPSIS; +assoc_id return ASSOC_ID; assoc_value return ASSOC_VALUE; +shmac_number_of_idents return SHMAC_NUMBER_OF_IDENTS; +shmac_idents return SHMAC_IDENTS; stream_id return STREAM_ID; stream_value return STREAM_VALUE; +scact_assoc_id return SCACT_ASSOC_ID; +scact_keynumber return SCACT_KEYNUMBER; +sack_assoc_id return SACK_ASSOC_ID; sack_delay return SACK_DELAY; sack_freq return SACK_FREQ; +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; @@ -329,6 +337,7 @@ sinit_num_ostreams return SINIT_NUM_OSTREAMS; sinit_max_instreams return SINIT_MAX_INSTREAMS; sinit_max_attempts return SINIT_MAX_ATTEMPTS; sinit_max_init_timeo return SINIT_MAX_INIT_TIMEO; +sstat_assoc_id return SSTAT_ASSOC_ID; sstat_state return SSTAT_STATE; sstat_rwnd return SSTAT_RWND; sstat_unackdata return SSTAT_UNACKDATA; @@ -337,12 +346,14 @@ sstat_instrms return SSTAT_INSTRMS; sstat_outstrms return SSTAT_OUTSTRMS; sstat_fragmentation_point return SSTAT_FRAGMENTATION_POINT; sstat_primary return SSTAT_PRIMARY; +spinfo_assoc_id return SPINFO_ASSOC_ID; spinfo_address return SPINFO_ADDRESS; spinfo_state return SPINFO_STATE; spinfo_cwnd return SPINFO_CWND; spinfo_srtt return SPINFO_SRTT; spinfo_rto return SPINFO_RTO; spinfo_mtu return SPINFO_MTU; +spp_assoc_id return SPP_ASSOC_ID; spp_address return SPP_ADDRESS; spp_hbinterval return SPP_HBINTERVAL; spp_pathmaxrxt return SPP_PATHMAXRXT; @@ -350,6 +361,7 @@ spp_pathmtu return SPP_PATHMTU; spp_flags return SPP_FLAGS; spp_ipv6_flowlabel return SPP_IPV6_FLOWLABEL_; /* avoid name clash */ spp_dscp return SPP_DSCP_; /* avoid name clash */ +se_assoc_id return SE_ASSOC_ID; se_type return SE_TYPE; se_on return SE_ON; sctp_data_io_event return _SCTP_DATA_IO_EVENT_; @@ -367,6 +379,8 @@ snd_flags return SND_FLAGS; snd_ppid return SND_PPID; snd_context return SND_CONTEXT; snd_assoc_id return SND_ASSOC_ID; +ssp_assoc_id return SSP_ASSOC_ID; +ssp_addr return SSP_ADDR; ssb_adaptation_ind return SSB_ADAPTATION_IND; sinfo_stream return SINFO_STREAM; sinfo_ssn return SINFO_SSN; @@ -385,6 +399,7 @@ serinfo_next_length return SERINFO_NEXT_LENGTH; serinfo_next_ppid return SERINFO_NEXT_PPID; pr_policy return PR_POLICY; pr_value return PR_VALUE; +pr_assoc_id return PR_ASSOC_ID; sendv_flags return SENDV_FLAGS; sendv_sndinfo return SENDV_SNDINFO; sendv_prinfo return SENDV_PRINFO; @@ -414,6 +429,7 @@ recvv_nxtinfo return RECVV_NXTINFO; sse_type return SSE_TYPE; sse_flags return SSE_FLAGS; sse_length return SSE_LENGTH; +sse_assoc_id return SSE_ASSOC_ID; sac_type return SAC_TYPE; sac_flags return SAC_FLAGS; sac_length return SAC_LENGTH; @@ -468,6 +484,18 @@ sai_assoc_id return SAI_ASSOC_ID; sn_type return SN_TYPE; sn_length return SN_LENGTH; sn_flags return SN_FLAGS; +gaids_number_of_ids return GAIDS_NUMBER_OF_IDS; +gaids_assoc_id return GAIDS_ASSOC_ID; +gauth_assoc_id return GAUTH_ASSOC_ID; +gauth_number_of_chunks return GAUTH_NUMBER_OF_CHUNKS; +gauth_chunks return GAUTH_CHUNKS; +sspp_assoc_id return SSPP_ASSOC_ID; +sspp_addr return SSPP_ADDR; +sauth_chunk return SAUTH_CHUNK; +sca_assoc_id return SCA_ASSOC_ID; +sca_keynumber return SCA_KEYNUMBER; +sca_keylength return SCA_KEYLENGTH; +sca_key return SCA_KEY; CHUNK return CHUNK; DATA return DATA; INIT return INIT; diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y index a708d9ea995dc52a107bfd3e6c374df3aa883c09..f5c85b66fe083778b3a6556f247c61649b1f9dae 100644 --- a/gtests/net/packetdrill/parser.y +++ b/gtests/net/packetdrill/parser.y @@ -503,17 +503,17 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, %token <reserved> IPV4 IPV6 ICMP SCTP UDP UDPLITE GRE MTU %token <reserved> MPLS LABEL TC TTL %token <reserved> OPTION -%token <reserved> SRTO_INITIAL SRTO_MAX SRTO_MIN +%token <reserved> SRTO_ASSOC_ID SRTO_INITIAL SRTO_MAX SRTO_MIN %token <reserved> SINIT_NUM_OSTREAMS SINIT_MAX_INSTREAMS SINIT_MAX_ATTEMPTS %token <reserved> SINIT_MAX_INIT_TIMEO -%token <reserved> ASSOC_VALUE +%token <reserved> ASSOC_ID ASSOC_VALUE SHMAC_NUMBER_OF_IDENTS SHMAC_IDENTS %token <reserved> STREAM_ID STREAM_VALUE -%token <reserved> SACK_DELAY SACK_FREQ -%token <reserved> SSTAT_STATE SSTAT_RWND SSTAT_UNACKDATA SSTAT_PENDDATA +%token <reserved> SCACT_ASSOC_ID SCACT_KEYNUMBER SACK_ASSOC_ID SACK_DELAY SACK_FREQ +%token <reserved> SSTAT_ASSOC_ID SSTAT_STATE SSTAT_RWND SSTAT_UNACKDATA SSTAT_PENDDATA %token <reserved> SSTAT_INSTRMS SSTAT_OUTSTRMS SSTAT_FRAGMENTATION_POINT %token <reserved> SSTAT_PRIMARY -%token <reserved> SPINFO_ADDRESS SPINFO_STATE SPINFO_CWND SPINFO_SRTT SPINFO_RTO -%token <reserved> SPINFO_MTU +%token <reserved> SPINFO_ASSOC_ID SPINFO_ADDRESS SPINFO_STATE SPINFO_CWND SPINFO_SRTT SPINFO_RTO +%token <reserved> SPINFO_MTU GAUTH_ASSOC_ID GAUTH_NUMBER_OF_CHUNKS GAUTH_CHUNKS %token <reserved> CHUNK DATA INIT INIT_ACK HEARTBEAT HEARTBEAT_ACK ABORT %token <reserved> SHUTDOWN SHUTDOWN_ACK ERROR COOKIE_ECHO COOKIE_ACK ECNE CWR %token <reserved> SHUTDOWN_COMPLETE I_DATA PAD @@ -534,21 +534,22 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, %token <reserved> COOKIE_RECEIVED_WHILE_SHUTDOWN RESTART_WITH_NEW_ADDRESSES %token <reserved> USER_INITIATED_ABORT PROTOCOL_VIOLATION %token <reserved> STALENESS CHK PARAM UNRECOGNIZED_PARAMETERS -%token <reserved> SPP_ADDRESS SPP_HBINTERVAL SPP_PATHMAXRXT SPP_PATHMTU +%token <reserved> SPP_ASSOC_ID 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 +%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> SSP_ASSOC_ID SSP_ADDR %token <reserved> SND_SID SND_FLAGS SND_PPID SND_CONTEXT SND_ASSOC_ID SSB_ADAPTATION_IND %token <reserved> BAD_CRC32C NULL_ %token <reserved> SINFO_STREAM SINFO_SSN SINFO_FLAGS SINFO_PPID SINFO_CONTEXT SINFO_ASSOC_ID %token <reserved> SINFO_TIMETOLIVE SINFO_TSN SINFO_CUMTSN SINFO_PR_VALUE SERINFO_NEXT_FLAGS %token <reserved> SERINFO_NEXT_STREAM SERINFO_NEXT_AID SERINFO_NEXT_LENGTH SERINFO_NEXT_PPID -%token <reserved> PR_POLICY PR_VALUE AUTH_KEYNUMBER SENDV_FLAGS SENDV_SNDINFO +%token <reserved> PR_POLICY PR_VALUE PR_ASSOC_ID AUTH_KEYNUMBER SENDV_FLAGS SENDV_SNDINFO %token <reserved> SENDV_PRINFO SENDV_AUTHINFO %token <reserved> RCV_SID RCV_SSN RCV_FLAGS RCV_PPID RCV_TSN RCV_CUMTSN RCV_CONTEXT RCV_ASSOC_ID %token <reserved> NXT_SID NXT_FLAGS NXT_PPID NXT_LENGTH NXT_ASSOC_ID %token <reserved> RECVV_RCVINFO RECVV_NXTINFO -%token <reserved> SSE_TYPE SSE_FLAGS SSE_LENGTH +%token <reserved> SSE_TYPE SSE_FLAGS SSE_LENGTH SSE_ASSOC_ID %token <reserved> SENDER_DRY_TYPE SENDER_DRY_FLAGS SENDER_DRY_LENGTH SENDER_DRY_ASSOC_ID %token <reserved> _SCTP_DATA_IO_EVENT_ _SCTP_ASSOCIATION_EVENT_ _SCTP_ADDRESS_EVENT_ %token <reserved> _SCTP_SEND_FAILURE_EVENT_ _SCTP_PEER_ERROR_EVENT_ _SCTP_SHUTDOWN_EVENT_ @@ -563,7 +564,9 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, %token <reserved> SPC_TYPE SPC_FLAGS SPC_LENGTH SPC_AADDR SPC_STATE SPC_ERROR SPC_ASSOC_ID %token <reserved> SSF_TYPE SSF_LENGTH SSF_FLAGS SSF_ERROR SSF_INFO SSF_ASSOC_ID SSF_DATA %token <reserved> SAI_TYPE SAI_FLAGS SAI_LENGTH SAI_ADAPTATION_IND SAI_ASSOC_ID -%token <reserved> SN_TYPE SN_FLAGS SN_LENGTH +%token <reserved> GAIDS_NUMBER_OF_IDS GAIDS_ASSOC_ID SSPP_ASSOC_ID SSPP_ADDR +%token <reserved> SN_TYPE SN_FLAGS SN_LENGTH SAUTH_CHUNK +%token <reserved> SCA_ASSOC_ID SCA_KEYNUMBER SCA_KEYLENGTH SCA_KEY %token <floating> FLOAT %token <integer> INTEGER HEX_INTEGER %token <string> WORD STRING BACK_QUOTED CODE IPV4_ADDR IPV6_ADDR @@ -601,39 +604,42 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, %type <expression> decimal_integer hex_integer data %type <expression> inaddr sockaddr msghdr cmsghdr cmsg_level cmsg_type cmsg_data %type <expression> iovec pollfd opt_revents -%type <expression> linger l_onoff l_linger +%type <expression> linger l_onoff l_linger sctp_assoc_id %type <expression> sctp_status sstat_state sstat_rwnd sstat_unackdata sstat_penddata %type <expression> sstat_instrms sstat_outstrms sstat_fragmentation_point sstat_primary %type <expression> sctp_initmsg sinit_num_ostreams sinit_max_instreams sinit_max_attempts -%type <expression> sinit_max_init_timeo sctp_assoc_value sctp_stream_value -%type <expression> sctp_sackinfo sack_delay sack_freq +%type <expression> sinit_max_init_timeo sctp_assoc_value sctp_stream_value sctp_hmacalgo +%type <expression> shmac_number_of_idents +%type <expression> sctp_authkeyid scact_keynumber sctp_sackinfo sack_delay sack_freq %type <expression> sctp_rtoinfo srto_initial srto_max srto_min sctp_paddrinfo %type <expression> sctp_paddrparams spp_address spp_hbinterval spp_pathmtu spp_pathmaxrxt -%type <expression> spp_flags spp_ipv6_flowlabel spp_dscp +%type <expression> spp_flags spp_ipv6_flowlabel spp_dscp ssp_addr %type <expression> spinfo_address spinfo_state spinfo_cwnd spinfo_srtt spinfo_rto spinfo_mtu +%type <expression> sctp_authchunks gauth_number_of_chunks %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_assoc_id snd_context -%type <expression> sctp_event se_type se_on sctp_setadaptation null +%type <expression> sctp_sndinfo snd_sid snd_flags snd_ppid snd_context +%type <expression> sctp_event se_type se_on sctp_setadaptation sctp_setprim null %type <expression> sctp_sndrcvinfo sinfo_stream sinfo_ssn sinfo_flags sinfo_ppid sinfo_context -%type <expression> sinfo_timetolive sinfo_tsn sinfo_cumtsn sinfo_assoc_id sinfo_pr_value serinfo_next_flags +%type <expression> sinfo_timetolive sinfo_tsn sinfo_cumtsn sinfo_pr_value serinfo_next_flags %type <expression> serinfo_next_stream serinfo_next_aid serinfo_next_length serinfo_next_ppid sctp_extrcvinfo -%type <expression> sctp_prinfo sctp_authinfo pr_policy sctp_sendv_spa -%type <expression> sctp_rcvinfo rcv_sid rcv_ssn rcv_flags rcv_ppid rcv_tsn rcv_cumtsn rcv_context rcv_assoc_id -%type <expression> sctp_nxtinfo nxt_sid nxt_flags nxt_ppid nxt_length nxt_assoc_id sctp_recvv_rn +%type <expression> sctp_prinfo sctp_authinfo pr_policy sctp_sendv_spa sctp_default_prinfo +%type <expression> sctp_rcvinfo rcv_sid rcv_ssn rcv_flags rcv_ppid rcv_tsn rcv_cumtsn rcv_context +%type <expression> sctp_nxtinfo nxt_sid nxt_flags nxt_ppid nxt_length sctp_recvv_rn %type <expression> sctp_shutdown_event sse_type sse_flags sse_length -%type <expression> sctp_sender_dry_event sender_dry_type sender_dry_flags sender_dry_length sender_dry_assoc_id +%type <expression> sctp_sender_dry_event sender_dry_type sender_dry_flags sender_dry_length %type <expression> sctp_event_subscribe %type <expression> sctp_assoc_change sac_type sac_flags sac_length sac_state sac_error sac_outbound_streams -%type <expression> sac_inbound_streams sac_assoc_id sac_info -%type <expression> sctp_send_failed_event ssfe_type ssfe_flags ssfe_length ssfe_error ssfe_assoc_id ssfe_data -%type <expression> sctp_authkey_event auth_type auth_flags auth_length auth_keynumber auth_indication auth_assoc_id -%type <expression> sctp_remote_error sre_type sre_flags sre_length sre_error sre_assoc_id sre_data -%type <expression> sctp_pdapi_event pdapi_type pdapi_flags pdapi_length pdapi_indication pdapi_stream pdapi_seq pdapi_assoc_id -%type <expression> sctp_paddr_change spc_type spc_flags spc_length spc_aaddr spc_error spc_state spc_assoc_id -%type <expression> sctp_send_failed ssf_type ssf_length ssf_flags ssf_error ssf_info ssf_assoc_id ssf_data -%type <expression> sctp_adaptation_event sai_type sai_flags sai_length sai_adaptation_ind sai_assoc_id -%type <expression> sctp_tlv sn_type sn_flags sn_length +%type <expression> sac_inbound_streams sac_info +%type <expression> sctp_send_failed_event ssfe_type ssfe_flags ssfe_length ssfe_error ssfe_data +%type <expression> sctp_authkey_event auth_type auth_flags auth_length auth_keynumber auth_indication +%type <expression> sctp_remote_error sre_type sre_flags sre_length sre_error sre_data +%type <expression> sctp_pdapi_event pdapi_type pdapi_flags pdapi_length pdapi_indication pdapi_stream pdapi_seq +%type <expression> sctp_paddr_change spc_type spc_flags spc_length spc_aaddr spc_error spc_state +%type <expression> sctp_send_failed ssf_type ssf_length ssf_flags ssf_error ssf_info ssf_data +%type <expression> sctp_adaptation_event sai_type sai_flags sai_length sai_adaptation_ind +%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 <errno_info> opt_errno %type <chunk_list> sctp_chunk_list_spec %type <chunk_list_item> sctp_chunk_spec @@ -2548,7 +2554,13 @@ expression | sctp_assoc_value { $$ = $1; } -| sctp_stream_value { +| sctp_hmacalgo { + $$ = $1; +} +| sctp_stream_value { + $$ = $1; +} +| sctp_authkeyid { $$ = $1; } | sctp_sackinfo { @@ -2575,6 +2587,9 @@ expression | sctp_sndinfo { $$ = $1; } +| sctp_setprim { + $$ = $1; +} | sctp_setadaptation{ $$ = $1; } @@ -2584,6 +2599,9 @@ expression | sctp_prinfo { $$ = $1; } +|sctp_default_prinfo{ + $$ = $1; +} | sctp_authinfo { $$ = $1; } @@ -2599,6 +2617,21 @@ expression | sctp_recvv_rn { $$ = $1; } +| sctp_assoc_ids { + $$ = $1; +} +| sctp_authchunks { + $$ = $1; +} +| sctp_setpeerprim { + $$ = $1; +} +| sctp_authchunk { + $$ = $1; +} +| sctp_authkey { + $$ = $1; +} | null { $$ = $1; } @@ -2862,10 +2895,33 @@ srto_min | SRTO_MIN '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; +sctp_assoc_id +: INTEGER { + if (!is_valid_u32($1)) { + semantic_error("value for sctp_assoc_t out of range"); + } + $$ = new_integer_expression($1, "%u"); +} +| WORD { + $$ = new_expression(EXPR_WORD); + $$->value.string = $1; +} +| ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + sctp_rtoinfo -: '{' srto_initial ',' srto_max ',' srto_min '}' { +: '{' SRTO_ASSOC_ID '=' sctp_assoc_id ',' srto_initial ',' srto_max ',' srto_min '}' { + $$ = new_expression(EXPR_SCTP_RTOINFO); + $$->value.sctp_rtoinfo = calloc(1, sizeof(struct sctp_rtoinfo_expr)); + $$->value.sctp_rtoinfo->srto_assoc_id = $4; + $$->value.sctp_rtoinfo->srto_initial = $6; + $$->value.sctp_rtoinfo->srto_max = $8; + $$->value.sctp_rtoinfo->srto_min = $10; +} +| '{' srto_initial ',' srto_max ',' srto_min '}' { $$ = new_expression(EXPR_SCTP_RTOINFO); $$->value.sctp_rtoinfo = calloc(1, sizeof(struct sctp_rtoinfo_expr)); + $$->value.sctp_rtoinfo->srto_assoc_id = new_expression(EXPR_ELLIPSIS); $$->value.sctp_rtoinfo->srto_initial = $2; $$->value.sctp_rtoinfo->srto_max = $4; $$->value.sctp_rtoinfo->srto_min = $6; @@ -2934,13 +2990,61 @@ sctp_stream_value ; sctp_assoc_value -: '{' ASSOC_VALUE '=' expression '}' { +: '{' ASSOC_ID '=' sctp_assoc_id ',' ASSOC_VALUE '=' expression '}' { $$ = new_expression(EXPR_SCTP_ASSOC_VALUE); $$->value.sctp_assoc_value = calloc(1, sizeof(struct sctp_assoc_value_expr)); + $$->value.sctp_assoc_value->assoc_id = $4; + $$->value.sctp_assoc_value->assoc_value = $8; +} +| '{' ASSOC_VALUE '=' expression '}' { + $$ = new_expression(EXPR_SCTP_ASSOC_VALUE); + $$->value.sctp_assoc_value = calloc(1, sizeof(struct sctp_assoc_value_expr)); + $$->value.sctp_assoc_value->assoc_id = new_expression(EXPR_ELLIPSIS); $$->value.sctp_assoc_value->assoc_value = $4; } ; +shmac_number_of_idents +: SHMAC_NUMBER_OF_IDENTS '=' INTEGER { + if (!is_valid_u32($3)) { + semantic_error("shmac_number_of_idents out of range"); + } + $$ = new_integer_expression($3, "%u"); +} +| SHMAC_NUMBER_OF_IDENTS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sctp_hmacalgo +: '{' shmac_number_of_idents ',' SHMAC_IDENTS '=' array '}' { + $$ = new_expression(EXPR_SCTP_HMACALGO); + $$->value.sctp_hmacalgo = calloc(1, sizeof(struct sctp_assoc_value_expr)); + $$->value.sctp_hmacalgo->shmac_number_of_idents = $2; + $$->value.sctp_hmacalgo->shmac_idents = $6; +} + +scact_keynumber +: SCACT_KEYNUMBER '=' INTEGER { + if (!is_valid_u16($3)) { + semantic_error("scact_keynumber out of range"); + } + $$ = new_integer_expression($3, "%hu"); +} +| SCACT_KEYNUMBER '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } + +sctp_authkeyid +: '{' SCACT_ASSOC_ID '=' sctp_assoc_id ',' scact_keynumber '}' { + $$ = new_expression(EXPR_SCTP_AUTHKEYID); + $$->value.sctp_authkeyid = calloc(1, sizeof(struct sctp_authkeyid_expr)); + $$->value.sctp_authkeyid->scact_assoc_id = $4; + $$->value.sctp_authkeyid->scact_keynumber = $6; +} +| '{' scact_keynumber '}'{ + $$ = new_expression(EXPR_SCTP_AUTHKEYID); + $$->value.sctp_authkeyid = calloc(1, sizeof(struct sctp_authkeyid_expr)); + $$->value.sctp_authkeyid->scact_assoc_id = new_expression(EXPR_ELLIPSIS); + $$->value.sctp_authkeyid->scact_keynumber = $2; +} + sack_delay : SACK_DELAY '=' INTEGER { if (!is_valid_u32($3)) { @@ -2960,9 +3064,17 @@ sack_freq | SACK_FREQ '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } sctp_sackinfo -: '{' sack_delay ',' sack_freq '}' { +: '{' SACK_ASSOC_ID '=' sctp_assoc_id ',' sack_delay ',' sack_freq '}' { + $$ = new_expression(EXPR_SCTP_SACKINFO); + $$->value.sctp_sack_info = calloc(1, sizeof(struct sctp_sack_info_expr)); + $$->value.sctp_sack_info->sack_assoc_id = $4; + $$->value.sctp_sack_info->sack_delay = $6; + $$->value.sctp_sack_info->sack_freq = $8; +} +| '{' sack_delay ',' sack_freq '}' { $$ = new_expression(EXPR_SCTP_SACKINFO); $$->value.sctp_sack_info = calloc(1, sizeof(struct sctp_sack_info_expr)); + $$->value.sctp_sack_info->sack_assoc_id = new_expression(EXPR_ELLIPSIS); $$->value.sctp_sack_info->sack_delay = $2; $$->value.sctp_sack_info->sack_freq = $4; } @@ -3097,9 +3209,23 @@ spinfo_mtu ; sctp_paddrinfo -: '{' spinfo_address ',' spinfo_state ',' spinfo_cwnd ',' spinfo_srtt ',' spinfo_rto ',' spinfo_mtu '}' { +: '{' SPINFO_ASSOC_ID '=' sctp_assoc_id ',' spinfo_address ',' spinfo_state ',' spinfo_cwnd ',' + spinfo_srtt ',' spinfo_rto ',' spinfo_mtu '}' { $$ = new_expression(EXPR_SCTP_PADDRINFO); $$->value.sctp_paddrinfo = calloc(1, sizeof(struct sctp_paddrinfo_expr)); + $$->value.sctp_paddrinfo->spinfo_assoc_id = $4; + $$->value.sctp_paddrinfo->spinfo_address = $6; + $$->value.sctp_paddrinfo->spinfo_state = $8; + $$->value.sctp_paddrinfo->spinfo_cwnd = $10; + $$->value.sctp_paddrinfo->spinfo_srtt = $12; + $$->value.sctp_paddrinfo->spinfo_rto = $14; + $$->value.sctp_paddrinfo->spinfo_mtu = $16; +} +| '{' spinfo_address ',' spinfo_state ',' spinfo_cwnd ',' + spinfo_srtt ',' spinfo_rto ',' spinfo_mtu '}' { + $$ = new_expression(EXPR_SCTP_PADDRINFO); + $$->value.sctp_paddrinfo = calloc(1, sizeof(struct sctp_paddrinfo_expr)); + $$->value.sctp_paddrinfo->spinfo_assoc_id = new_expression(EXPR_ELLIPSIS); $$->value.sctp_paddrinfo->spinfo_address = $2; $$->value.sctp_paddrinfo->spinfo_state = $4; $$->value.sctp_paddrinfo->spinfo_cwnd = $6; @@ -3110,10 +3236,25 @@ sctp_paddrinfo ; sctp_status -: '{' sstat_state ',' sstat_rwnd ',' sstat_unackdata ',' sstat_penddata ',' sstat_instrms ',' sstat_outstrms ',' - sstat_fragmentation_point ',' sstat_primary '}' { +: '{' SSTAT_ASSOC_ID '=' sctp_assoc_id ',' sstat_state ',' sstat_rwnd ',' sstat_unackdata ',' sstat_penddata ',' sstat_instrms ',' sstat_outstrms ',' + sstat_fragmentation_point ',' sstat_primary '}' { + $$ = new_expression(EXPR_SCTP_STATUS); + $$->value.sctp_status = calloc(1, sizeof(struct sctp_status_expr)); + $$->value.sctp_status->sstat_assoc_id = $4; + $$->value.sctp_status->sstat_state = $6; + $$->value.sctp_status->sstat_rwnd = $8; + $$->value.sctp_status->sstat_unackdata = $10; + $$->value.sctp_status->sstat_penddata = $12; + $$->value.sctp_status->sstat_instrms = $14; + $$->value.sctp_status->sstat_outstrms = $16; + $$->value.sctp_status->sstat_fragmentation_point = $18; + $$->value.sctp_status->sstat_primary = $20; +} +| '{' sstat_state ',' sstat_rwnd ',' sstat_unackdata ',' sstat_penddata ',' sstat_instrms ',' sstat_outstrms ',' + sstat_fragmentation_point ',' sstat_primary '}' { $$ = new_expression(EXPR_SCTP_STATUS); $$->value.sctp_status = calloc(1, sizeof(struct sctp_status_expr)); + $$->value.sctp_status->sstat_assoc_id = new_expression(EXPR_ELLIPSIS); $$->value.sctp_status->sstat_state = $2; $$->value.sctp_status->sstat_rwnd = $4; $$->value.sctp_status->sstat_unackdata = $6; @@ -3185,9 +3326,24 @@ spp_dscp ; sctp_paddrparams -: '{' spp_address ',' spp_hbinterval ',' spp_pathmaxrxt ',' spp_pathmtu ','spp_flags ',' spp_ipv6_flowlabel ',' spp_dscp'}' { +: '{' SPP_ASSOC_ID '=' sctp_assoc_id ',' spp_address ',' spp_hbinterval ',' spp_pathmaxrxt ',' spp_pathmtu ','spp_flags ',' + spp_ipv6_flowlabel ',' spp_dscp'}' { + $$ = new_expression(EXPR_SCTP_PEER_ADDR_PARAMS); + $$->value.sctp_paddrparams = calloc(1, sizeof(struct sctp_paddrparams_expr)); + $$->value.sctp_paddrparams->spp_assoc_id = $4; + $$->value.sctp_paddrparams->spp_address = $6; + $$->value.sctp_paddrparams->spp_hbinterval = $8; + $$->value.sctp_paddrparams->spp_pathmaxrxt = $10; + $$->value.sctp_paddrparams->spp_pathmtu = $12; + $$->value.sctp_paddrparams->spp_flags = $14; + $$->value.sctp_paddrparams->spp_ipv6_flowlabel = $16; + $$->value.sctp_paddrparams->spp_dscp = $18; +} +| '{' spp_address ',' spp_hbinterval ',' spp_pathmaxrxt ',' spp_pathmtu ','spp_flags ',' + spp_ipv6_flowlabel ',' spp_dscp'}' { $$ = new_expression(EXPR_SCTP_PEER_ADDR_PARAMS); $$->value.sctp_paddrparams = calloc(1, sizeof(struct sctp_paddrparams_expr)); + $$->value.sctp_paddrparams->spp_assoc_id = new_expression(EXPR_ELLIPSIS); $$->value.sctp_paddrparams->spp_address = $2; $$->value.sctp_paddrparams->spp_hbinterval = $4; $$->value.sctp_paddrparams->spp_pathmaxrxt = $6; @@ -3249,9 +3405,22 @@ sasoc_cookie_life ; sctp_assocparams -: '{' sasoc_asocmaxrxt ',' sasoc_number_peer_destinations ',' sasoc_peer_rwnd ',' sasoc_local_rwnd ',' sasoc_cookie_life '}' { +: '{' SASOC_ASSOC_ID '=' sctp_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_assoc_id = $4; + $$->value.sctp_assocparams->sasoc_asocmaxrxt = $6; + $$->value.sctp_assocparams->sasoc_number_peer_destinations = $8; + $$->value.sctp_assocparams->sasoc_peer_rwnd = $10; + $$->value.sctp_assocparams->sasoc_local_rwnd = $12; + $$->value.sctp_assocparams->sasoc_cookie_life = $14; +} +| '{' 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_assoc_id = new_expression(EXPR_ELLIPSIS); $$->value.sctp_assocparams->sasoc_asocmaxrxt = $2; $$->value.sctp_assocparams->sasoc_number_peer_destinations = $4; $$->value.sctp_assocparams->sasoc_peer_rwnd = $6; @@ -3284,9 +3453,17 @@ se_on ; sctp_event -: '{' se_type ',' se_on '}' { +: '{' SE_ASSOC_ID '=' sctp_assoc_id ',' se_type ',' se_on '}' { $$ = new_expression(EXPR_SCTP_EVENT); $$->value.sctp_event = calloc(1, sizeof(struct sctp_event_expr)); + $$->value.sctp_event->se_assoc_id = $4; + $$->value.sctp_event->se_type = $6; + $$->value.sctp_event->se_on = $8; +} +| '{' se_type ',' se_on '}' { + $$ = new_expression(EXPR_SCTP_EVENT); + $$->value.sctp_event = calloc(1, sizeof(struct sctp_event_expr)); + $$->value.sctp_event->se_assoc_id = new_expression(EXPR_ELLIPSIS); $$->value.sctp_event->se_type = $2; $$->value.sctp_event->se_on = $4; } @@ -3377,30 +3554,43 @@ snd_context | SND_CONTEXT '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -snd_assoc_id -: SND_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("snd_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| SND_ASSOC_ID '=' WORD { - $$ = new_expression(EXPR_WORD); - $$->value.string = $3; -} -| SND_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - - sctp_sndinfo -: '{' snd_sid ',' snd_flags ',' snd_ppid ',' snd_context ',' snd_assoc_id'}' { +: '{' snd_sid ',' snd_flags ',' snd_ppid ',' snd_context ',' SND_ASSOC_ID '=' sctp_assoc_id'}' { + $$ = new_expression(EXPR_SCTP_SNDINFO); + $$->value.sctp_sndinfo = calloc(1, sizeof(struct sctp_sndinfo_expr)); + $$->value.sctp_sndinfo->snd_sid = $2; + $$->value.sctp_sndinfo->snd_flags = $4; + $$->value.sctp_sndinfo->snd_ppid = $6; + $$->value.sctp_sndinfo->snd_context = $8; + $$->value.sctp_sndinfo->snd_assoc_id = $12; +} +| '{' snd_sid ',' snd_flags ',' snd_ppid ',' snd_context '}' { $$ = new_expression(EXPR_SCTP_SNDINFO); $$->value.sctp_sndinfo = calloc(1, sizeof(struct sctp_sndinfo_expr)); $$->value.sctp_sndinfo->snd_sid = $2; $$->value.sctp_sndinfo->snd_flags = $4; $$->value.sctp_sndinfo->snd_ppid = $6; $$->value.sctp_sndinfo->snd_context = $8; - $$->value.sctp_sndinfo->snd_assoc_id = $10; + $$->value.sctp_sndinfo->snd_assoc_id = new_expression(EXPR_ELLIPSIS); +} +; +ssp_addr +: SSP_ADDR '=' sockaddr { $$ = $3; } +| SSP_ADDR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sctp_setprim +: '{' SSP_ASSOC_ID '=' sctp_assoc_id ',' ssp_addr '}' { + $$ = new_expression(EXPR_SCTP_SETPRIM); + $$->value.sctp_setprim = calloc(1, sizeof(struct sctp_setprim_expr)); + $$->value.sctp_setprim->ssp_assoc_id = $4; + $$->value.sctp_setprim->ssp_addr = $6; +} +| '{' ssp_addr '}' { + $$ = new_expression(EXPR_SCTP_SETPRIM); + $$->value.sctp_setprim = calloc(1, sizeof(struct sctp_setprim_expr)); + $$->value.sctp_setprim->ssp_assoc_id = new_expression(EXPR_ELLIPSIS); + $$->value.sctp_setprim->ssp_addr = $2; } ; @@ -3413,6 +3603,11 @@ sctp_setadaptation } $$->value.sctp_setadaptation->ssb_adaptation_ind = new_integer_expression($4, "%u"); } +| '{' SSB_ADAPTATION_IND '=' ELLIPSIS '}' { + $$ = new_expression(EXPR_SCTP_SETADAPTATION); + $$->value.sctp_setadaptation = calloc(1, sizeof(struct sctp_setadaptation_expr)); + $$->value.sctp_setadaptation->ssb_adaptation_ind = new_expression(EXPR_ELLIPSIS); +} ; sinfo_stream @@ -3489,18 +3684,23 @@ sinfo_cumtsn | SINFO_CUMTSN '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -sinfo_assoc_id -: SINFO_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("sinfo_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| SINFO_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - sctp_sndrcvinfo -: '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_timetolive ',' sinfo_tsn ',' sinfo_cumtsn ',' sinfo_assoc_id '}' { +: '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_timetolive ',' + sinfo_tsn ',' sinfo_cumtsn ',' SINFO_ASSOC_ID '=' sctp_assoc_id '}' { + $$ = new_expression(EXPR_SCTP_SNDRCVINFO); + $$->value.sctp_sndrcvinfo = calloc(1, sizeof(struct sctp_sndrcvinfo_expr)); + $$->value.sctp_sndrcvinfo->sinfo_stream = $2; + $$->value.sctp_sndrcvinfo->sinfo_ssn = $4; + $$->value.sctp_sndrcvinfo->sinfo_flags = $6; + $$->value.sctp_sndrcvinfo->sinfo_ppid = $8; + $$->value.sctp_sndrcvinfo->sinfo_context = $10; + $$->value.sctp_sndrcvinfo->sinfo_timetolive = $12; + $$->value.sctp_sndrcvinfo->sinfo_tsn = $14; + $$->value.sctp_sndrcvinfo->sinfo_cumtsn = $16; + $$->value.sctp_sndrcvinfo->sinfo_assoc_id = $20; +} +| '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_timetolive ',' + sinfo_tsn ',' sinfo_cumtsn '}' { $$ = new_expression(EXPR_SCTP_SNDRCVINFO); $$->value.sctp_sndrcvinfo = calloc(1, sizeof(struct sctp_sndrcvinfo_expr)); $$->value.sctp_sndrcvinfo->sinfo_stream = $2; @@ -3511,7 +3711,7 @@ sctp_sndrcvinfo $$->value.sctp_sndrcvinfo->sinfo_timetolive = $12; $$->value.sctp_sndrcvinfo->sinfo_tsn = $14; $$->value.sctp_sndrcvinfo->sinfo_cumtsn = $16; - $$->value.sctp_sndrcvinfo->sinfo_assoc_id = $18; + $$->value.sctp_sndrcvinfo->sinfo_assoc_id = new_expression(EXPR_ELLIPSIS); }; sinfo_pr_value @@ -3568,7 +3768,26 @@ serinfo_next_ppid sctp_extrcvinfo : '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_pr_value ',' sinfo_tsn ',' sinfo_cumtsn ',' -serinfo_next_flags ',' serinfo_next_stream ',' serinfo_next_aid ',' serinfo_next_length ',' serinfo_next_ppid ',' sinfo_assoc_id '}' { +serinfo_next_flags ',' serinfo_next_stream ',' serinfo_next_aid ',' serinfo_next_length ',' serinfo_next_ppid ',' SINFO_ASSOC_ID '=' sctp_assoc_id '}' { + $$ = new_expression(EXPR_SCTP_EXTRCVINFO); + $$->value.sctp_extrcvinfo = calloc(1, sizeof(struct sctp_extrcvinfo_expr)); + $$->value.sctp_extrcvinfo->sinfo_stream = $2; + $$->value.sctp_extrcvinfo->sinfo_ssn = $4; + $$->value.sctp_extrcvinfo->sinfo_flags = $6; + $$->value.sctp_extrcvinfo->sinfo_ppid = $8; + $$->value.sctp_extrcvinfo->sinfo_context = $10; + $$->value.sctp_extrcvinfo->sinfo_pr_value = $12; + $$->value.sctp_extrcvinfo->sinfo_tsn = $14; + $$->value.sctp_extrcvinfo->sinfo_cumtsn = $16; + $$->value.sctp_extrcvinfo->serinfo_next_flags = $18; + $$->value.sctp_extrcvinfo->serinfo_next_stream = $20; + $$->value.sctp_extrcvinfo->serinfo_next_aid = $22; + $$->value.sctp_extrcvinfo->serinfo_next_length = $24; + $$->value.sctp_extrcvinfo->serinfo_next_ppid = $26; + $$->value.sctp_extrcvinfo->sinfo_assoc_id = $30; +} +| '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_pr_value ',' sinfo_tsn ',' sinfo_cumtsn ',' +serinfo_next_flags ',' serinfo_next_stream ',' serinfo_next_aid ',' serinfo_next_length ',' serinfo_next_ppid '}' { $$ = new_expression(EXPR_SCTP_EXTRCVINFO); $$->value.sctp_extrcvinfo = calloc(1, sizeof(struct sctp_extrcvinfo_expr)); $$->value.sctp_extrcvinfo->sinfo_stream = $2; @@ -3584,10 +3803,9 @@ serinfo_next_flags ',' serinfo_next_stream ',' serinfo_next_aid ',' serinfo_next $$->value.sctp_extrcvinfo->serinfo_next_aid = $22; $$->value.sctp_extrcvinfo->serinfo_next_length = $24; $$->value.sctp_extrcvinfo->serinfo_next_ppid = $26; - $$->value.sctp_extrcvinfo->sinfo_assoc_id = $28; + $$->value.sctp_extrcvinfo->sinfo_assoc_id = new_expression(EXPR_ELLIPSIS); }; - rcv_sid : RCV_SID '=' INTEGER { if (!is_valid_u16($3)) { @@ -3652,19 +3870,20 @@ rcv_context | RCV_CONTEXT '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -rcv_assoc_id -: RCV_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("rcv_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| RCV_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - - sctp_rcvinfo -: '{' rcv_sid ',' rcv_ssn ',' rcv_flags ',' rcv_ppid ',' rcv_tsn ',' rcv_cumtsn ',' rcv_context ',' rcv_assoc_id'}' { +: '{' rcv_sid ',' rcv_ssn ',' rcv_flags ',' rcv_ppid ',' rcv_tsn ',' rcv_cumtsn ',' rcv_context ',' RCV_ASSOC_ID '=' sctp_assoc_id'}' { + $$ = new_expression(EXPR_SCTP_RCVINFO); + $$->value.sctp_rcvinfo = calloc(1, sizeof(struct sctp_rcvinfo_expr)); + $$->value.sctp_rcvinfo->rcv_sid = $2; + $$->value.sctp_rcvinfo->rcv_ssn = $4; + $$->value.sctp_rcvinfo->rcv_flags = $6; + $$->value.sctp_rcvinfo->rcv_ppid = $8; + $$->value.sctp_rcvinfo->rcv_tsn = $10; + $$->value.sctp_rcvinfo->rcv_cumtsn = $12; + $$->value.sctp_rcvinfo->rcv_context = $14; + $$->value.sctp_rcvinfo->rcv_assoc_id = $18; +} +| '{' rcv_sid ',' rcv_ssn ',' rcv_flags ',' rcv_ppid ',' rcv_tsn ',' rcv_cumtsn ',' rcv_context '}' { $$ = new_expression(EXPR_SCTP_RCVINFO); $$->value.sctp_rcvinfo = calloc(1, sizeof(struct sctp_rcvinfo_expr)); $$->value.sctp_rcvinfo->rcv_sid = $2; @@ -3674,7 +3893,7 @@ sctp_rcvinfo $$->value.sctp_rcvinfo->rcv_tsn = $10; $$->value.sctp_rcvinfo->rcv_cumtsn = $12; $$->value.sctp_rcvinfo->rcv_context = $14; - $$->value.sctp_rcvinfo->rcv_assoc_id = $16; + $$->value.sctp_rcvinfo->rcv_assoc_id = new_expression(EXPR_ELLIPSIS); } ; @@ -3690,8 +3909,21 @@ pr_policy $$ = new_integer_expression($3, "%hu"); }; +sctp_default_prinfo +: '{' pr_policy ',' PR_VALUE '=' INTEGER ',' PR_ASSOC_ID '=' sctp_assoc_id '}' { + $$ = new_expression(EXPR_SCTP_DEFAULT_PRINFO); + $$->value.sctp_default_prinfo = calloc(1, sizeof(struct sctp_default_prinfo_expr)); + $$->value.sctp_default_prinfo->pr_policy = $2; + if (!is_valid_u32($6)) { + semantic_error("pr_value out of range"); + } + $$->value.sctp_default_prinfo->pr_value = new_integer_expression($6, "%u"); + $$->value.sctp_default_prinfo->pr_assoc_id = $10; +} +; + sctp_prinfo -: '{' pr_policy ',' PR_VALUE '=' INTEGER'}' { +: '{' pr_policy ',' PR_VALUE '=' INTEGER '}' { $$ = new_expression(EXPR_SCTP_PRINFO); $$->value.sctp_prinfo = calloc(1, sizeof(struct sctp_prinfo_expr)); $$->value.sctp_prinfo->pr_policy = $2; @@ -3758,25 +3990,24 @@ nxt_length | NXT_LENGTH '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -nxt_assoc_id -: NXT_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("nxt_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| NXT_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - sctp_nxtinfo -: '{' nxt_sid ',' nxt_flags ',' nxt_ppid ',' nxt_length ',' nxt_assoc_id '}' { +: '{' nxt_sid ',' nxt_flags ',' nxt_ppid ',' nxt_length ',' NXT_ASSOC_ID '=' sctp_assoc_id '}' { + $$ = new_expression(EXPR_SCTP_NXTINFO); + $$->value.sctp_sendv_spa = calloc(1, sizeof(struct sctp_nxtinfo_expr)); + $$->value.sctp_nxtinfo->nxt_sid = $2; + $$->value.sctp_nxtinfo->nxt_flags = $4; + $$->value.sctp_nxtinfo->nxt_ppid = $6; + $$->value.sctp_nxtinfo->nxt_length = $8; + $$->value.sctp_nxtinfo->nxt_assoc_id = $12; +} +| '{' nxt_sid ',' nxt_flags ',' nxt_ppid ',' nxt_length '}' { $$ = new_expression(EXPR_SCTP_NXTINFO); $$->value.sctp_sendv_spa = calloc(1, sizeof(struct sctp_nxtinfo_expr)); $$->value.sctp_nxtinfo->nxt_sid = $2; $$->value.sctp_nxtinfo->nxt_flags = $4; $$->value.sctp_nxtinfo->nxt_ppid = $6; $$->value.sctp_nxtinfo->nxt_length = $8; - $$->value.sctp_nxtinfo->nxt_assoc_id = $10; + $$->value.sctp_nxtinfo->nxt_assoc_id = new_expression(EXPR_ELLIPSIS); } ; @@ -3824,12 +4055,21 @@ sse_length ; sctp_shutdown_event -: '{' sse_type ',' sse_flags ',' sse_length '}' { +: '{' sse_type ',' sse_flags ',' sse_length ',' SSE_ASSOC_ID '=' sctp_assoc_id '}' { $$ = new_expression(EXPR_SCTP_SHUTDOWN_EVENT); $$->value.sctp_shutdown_event = calloc(1, sizeof(struct sctp_shutdown_event_expr)); $$->value.sctp_shutdown_event->sse_type = $2; $$->value.sctp_shutdown_event->sse_flags = $4; $$->value.sctp_shutdown_event->sse_length = $6; + $$->value.sctp_shutdown_event->sse_assoc_id = $10; +} +| '{' sse_type ',' sse_flags ',' sse_length '}' { + $$ = new_expression(EXPR_SCTP_SHUTDOWN_EVENT); + $$->value.sctp_shutdown_event = calloc(1, sizeof(struct sctp_shutdown_event_expr)); + $$->value.sctp_shutdown_event->sse_type = $2; + $$->value.sctp_shutdown_event->sse_flags = $4; + $$->value.sctp_shutdown_event->sse_length = $6; + $$->value.sctp_shutdown_event->sse_assoc_id = new_expression(EXPR_ELLIPSIS); }; pdapi_type @@ -3899,18 +4139,8 @@ pdapi_seq | PDAPI_SEQ '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -pdapi_assoc_id -: PDAPI_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("pdapi_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| PDAPI_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - sctp_pdapi_event -: '{' pdapi_type',' pdapi_flags ',' pdapi_length ',' pdapi_indication ',' pdapi_stream ',' pdapi_seq ',' pdapi_assoc_id '}' { +: '{' pdapi_type',' pdapi_flags ',' pdapi_length ',' pdapi_indication ',' pdapi_stream ',' pdapi_seq ',' PDAPI_ASSOC_ID '=' sctp_assoc_id '}' { $$ = new_expression(EXPR_SCTP_PDAPI_EVENT); $$->value.sctp_pdapi_event = calloc(1, sizeof(struct sctp_pdapi_event_expr)); $$->value.sctp_pdapi_event->pdapi_type = $2; @@ -3919,7 +4149,18 @@ sctp_pdapi_event $$->value.sctp_pdapi_event->pdapi_indication = $8; $$->value.sctp_pdapi_event->pdapi_stream = $10; $$->value.sctp_pdapi_event->pdapi_seq = $12; - $$->value.sctp_pdapi_event->pdapi_assoc_id = $14; + $$->value.sctp_pdapi_event->pdapi_assoc_id = $16; +} +| '{' pdapi_type',' pdapi_flags ',' pdapi_length ',' pdapi_indication ',' pdapi_stream ',' pdapi_seq '}' { + $$ = new_expression(EXPR_SCTP_PDAPI_EVENT); + $$->value.sctp_pdapi_event = calloc(1, sizeof(struct sctp_pdapi_event_expr)); + $$->value.sctp_pdapi_event->pdapi_type = $2; + $$->value.sctp_pdapi_event->pdapi_flags = $4; + $$->value.sctp_pdapi_event->pdapi_length = $6; + $$->value.sctp_pdapi_event->pdapi_indication = $8; + $$->value.sctp_pdapi_event->pdapi_stream = $10; + $$->value.sctp_pdapi_event->pdapi_seq = $12; + $$->value.sctp_pdapi_event->pdapi_assoc_id = new_expression(EXPR_ELLIPSIS); } ; @@ -3981,18 +4222,18 @@ auth_indication | AUTH_INDICATION '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -auth_assoc_id -: AUTH_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("auth_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| AUTH_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - sctp_authkey_event -: '{' auth_type ',' auth_flags ',' auth_length ',' auth_keynumber ',' auth_indication ',' auth_assoc_id '}' { +: '{' auth_type ',' auth_flags ',' auth_length ',' auth_keynumber ',' auth_indication ',' AUTH_ASSOC_ID '=' sctp_assoc_id '}' { + $$ = new_expression(EXPR_SCTP_AUTHKEY_EVENT); + $$->value.sctp_authkey_event = calloc(1, sizeof(struct sctp_authkey_event_expr)); + $$->value.sctp_authkey_event->auth_type = $2; + $$->value.sctp_authkey_event->auth_flags = $4; + $$->value.sctp_authkey_event->auth_length = $6; + $$->value.sctp_authkey_event->auth_keynumber = $8; + $$->value.sctp_authkey_event->auth_indication = $10; + $$->value.sctp_authkey_event->auth_assoc_id = $14; +} +| '{' auth_type ',' auth_flags ',' auth_length ',' auth_keynumber ',' auth_indication '}' { $$ = new_expression(EXPR_SCTP_AUTHKEY_EVENT); $$->value.sctp_authkey_event = calloc(1, sizeof(struct sctp_authkey_event_expr)); $$->value.sctp_authkey_event->auth_type = $2; @@ -4000,7 +4241,7 @@ sctp_authkey_event $$->value.sctp_authkey_event->auth_length = $6; $$->value.sctp_authkey_event->auth_keynumber = $8; $$->value.sctp_authkey_event->auth_indication = $10; - $$->value.sctp_authkey_event->auth_assoc_id = $12; + $$->value.sctp_authkey_event->auth_assoc_id = new_expression(EXPR_ELLIPSIS); } ; @@ -4038,26 +4279,25 @@ sender_dry_length | SENDER_DRY_LENGTH '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -sender_dry_assoc_id -: SENDER_DRY_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("sender_dry_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| SENDER_DRY_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - sctp_sender_dry_event -: '{'sender_dry_type ',' sender_dry_flags ',' sender_dry_length ',' sender_dry_assoc_id '}' { +: '{'sender_dry_type ',' sender_dry_flags ',' sender_dry_length ',' SENDER_DRY_ASSOC_ID '=' sctp_assoc_id '}' { + $$ = new_expression(EXPR_SCTP_SENDER_DRY_EVENT); + $$->value.sctp_sender_dry_event = calloc(1, sizeof(struct sctp_sender_dry_event_expr)); + $$->value.sctp_sender_dry_event->sender_dry_type = $2; + $$->value.sctp_sender_dry_event->sender_dry_flags = $4; + $$->value.sctp_sender_dry_event->sender_dry_length = $6; + $$->value.sctp_sender_dry_event->sender_dry_assoc_id = $10; +} +| '{'sender_dry_type ',' sender_dry_flags ',' sender_dry_length '}' { $$ = new_expression(EXPR_SCTP_SENDER_DRY_EVENT); $$->value.sctp_sender_dry_event = calloc(1, sizeof(struct sctp_sender_dry_event_expr)); $$->value.sctp_sender_dry_event->sender_dry_type = $2; $$->value.sctp_sender_dry_event->sender_dry_flags = $4; $$->value.sctp_sender_dry_event->sender_dry_length = $6; - $$->value.sctp_sender_dry_event->sender_dry_assoc_id = $8; + $$->value.sctp_sender_dry_event->sender_dry_assoc_id = new_expression(EXPR_ELLIPSIS); } ; + ssfe_type : SSFE_TYPE '=' INTEGER { if (!is_valid_u16($3)) { @@ -4106,23 +4346,24 @@ ssfe_error | SSFE_ERROR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -ssfe_assoc_id -: SSFE_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("ssfe_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| SSFE_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - ssfe_data : SSFE_DATA '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } | SSFE_DATA '=' array { $$ = $3; } ; sctp_send_failed_event -: '{' ssfe_type ',' ssfe_flags ',' ssfe_length ',' ssfe_error ',' SSFE_INFO '=' sctp_sndinfo ',' ssfe_assoc_id ',' ssfe_data '}' { +: '{' ssfe_type ',' ssfe_flags ',' ssfe_length ',' ssfe_error ',' SSFE_INFO '=' sctp_sndinfo ',' SSFE_ASSOC_ID '=' sctp_assoc_id ',' ssfe_data '}' { + $$ = new_expression(EXPR_SCTP_SEND_FAILED_EVENT); + $$->value.sctp_send_failed_event = calloc(1, sizeof(struct sctp_send_failed_event_expr)); + $$->value.sctp_send_failed_event->ssfe_type = $2; + $$->value.sctp_send_failed_event->ssfe_flags = $4; + $$->value.sctp_send_failed_event->ssfe_length = $6; + $$->value.sctp_send_failed_event->ssfe_error = $8; + $$->value.sctp_send_failed_event->ssfe_info = $12; + $$->value.sctp_send_failed_event->ssfe_assoc_id = $16; + $$->value.sctp_send_failed_event->ssfe_data = $18; +} +| '{' ssfe_type ',' ssfe_flags ',' ssfe_length ',' ssfe_error ',' SSFE_INFO '=' sctp_sndinfo ',' ssfe_data '}' { $$ = new_expression(EXPR_SCTP_SEND_FAILED_EVENT); $$->value.sctp_send_failed_event = calloc(1, sizeof(struct sctp_send_failed_event_expr)); $$->value.sctp_send_failed_event->ssfe_type = $2; @@ -4130,8 +4371,8 @@ sctp_send_failed_event $$->value.sctp_send_failed_event->ssfe_length = $6; $$->value.sctp_send_failed_event->ssfe_error = $8; $$->value.sctp_send_failed_event->ssfe_info = $12; - $$->value.sctp_send_failed_event->ssfe_assoc_id = $14; - $$->value.sctp_send_failed_event->ssfe_data = $16; + $$->value.sctp_send_failed_event->ssfe_assoc_id = new_expression(EXPR_ELLIPSIS); + $$->value.sctp_send_failed_event->ssfe_data = $14; }; sac_type @@ -4212,16 +4453,6 @@ sac_inbound_streams | SAC_INBOUND_STREAMS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -sac_assoc_id -: SAC_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("sac_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| SAC_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - sac_info : SAC_INFO '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } | SAC_INFO '=' array { $$ = $3; } @@ -4229,7 +4460,21 @@ sac_info sctp_assoc_change : '{' sac_type ',' sac_flags ',' sac_length ',' sac_state ',' sac_error ',' sac_outbound_streams ',' -sac_inbound_streams ',' sac_assoc_id ',' sac_info '}' { +sac_inbound_streams ',' SAC_ASSOC_ID '=' sctp_assoc_id ',' sac_info '}' { + $$ = new_expression(EXPR_SCTP_ASSOC_CHANGE); + $$->value.sctp_assoc_change = calloc(1, sizeof(struct sctp_assoc_change_expr)); + $$->value.sctp_assoc_change->sac_type = $2; + $$->value.sctp_assoc_change->sac_flags = $4; + $$->value.sctp_assoc_change->sac_length = $6; + $$->value.sctp_assoc_change->sac_state = $8; + $$->value.sctp_assoc_change->sac_error = $10; + $$->value.sctp_assoc_change->sac_outbound_streams = $12; + $$->value.sctp_assoc_change->sac_inbound_streams = $14; + $$->value.sctp_assoc_change->sac_assoc_id = $18; + $$->value.sctp_assoc_change->sac_info = $20; +} +| '{' sac_type ',' sac_flags ',' sac_length ',' sac_state ',' sac_error ',' sac_outbound_streams ',' +sac_inbound_streams ',' sac_info '}' { $$ = new_expression(EXPR_SCTP_ASSOC_CHANGE); $$->value.sctp_assoc_change = calloc(1, sizeof(struct sctp_assoc_change_expr)); $$->value.sctp_assoc_change->sac_type = $2; @@ -4239,8 +4484,8 @@ sac_inbound_streams ',' sac_assoc_id ',' sac_info '}' { $$->value.sctp_assoc_change->sac_error = $10; $$->value.sctp_assoc_change->sac_outbound_streams = $12; $$->value.sctp_assoc_change->sac_inbound_streams = $14; - $$->value.sctp_assoc_change->sac_assoc_id = $16; - $$->value.sctp_assoc_change->sac_info = $18; + $$->value.sctp_assoc_change->sac_assoc_id = new_expression(EXPR_ELLIPSIS); + $$->value.sctp_assoc_change->sac_info = $16; } ; @@ -4288,31 +4533,31 @@ sre_error | SRE_ERROR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -sre_assoc_id -: SRE_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("sre_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| SRE_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - sre_data : SRE_DATA '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } | SRE_DATA '=' array { $$ = $3; } ; sctp_remote_error -: '{' sre_type ',' sre_flags ',' sre_length ',' sre_error ',' sre_assoc_id ',' sre_data '}' { +: '{' sre_type ',' sre_flags ',' sre_length ',' sre_error ',' SRE_ASSOC_ID '=' sctp_assoc_id ',' sre_data '}' { + $$ = new_expression(EXPR_SCTP_REMOTE_ERROR); + $$->value.sctp_remote_error = calloc(1, sizeof(struct sctp_remote_error_expr)); + $$->value.sctp_remote_error->sre_type = $2; + $$->value.sctp_remote_error->sre_flags = $4; + $$->value.sctp_remote_error->sre_length = $6; + $$->value.sctp_remote_error->sre_error = $8; + $$->value.sctp_remote_error->sre_assoc_id = $12; + $$->value.sctp_remote_error->sre_data = $14; +} +| '{' sre_type ',' sre_flags ',' sre_length ',' sre_error ',' sre_data '}' { $$ = new_expression(EXPR_SCTP_REMOTE_ERROR); $$->value.sctp_remote_error = calloc(1, sizeof(struct sctp_remote_error_expr)); $$->value.sctp_remote_error->sre_type = $2; $$->value.sctp_remote_error->sre_flags = $4; $$->value.sctp_remote_error->sre_length = $6; $$->value.sctp_remote_error->sre_error = $8; - $$->value.sctp_remote_error->sre_assoc_id = $10; - $$->value.sctp_remote_error->sre_data = $12; + $$->value.sctp_remote_error->sre_assoc_id = new_expression(EXPR_ELLIPSIS); + $$->value.sctp_remote_error->sre_data = $10; } ; @@ -4383,18 +4628,19 @@ spc_error | SPC_ERROR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -spc_assoc_id -: SPC_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("spc_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| SPC_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - sctp_paddr_change -: '{' spc_type ',' spc_flags ',' spc_length ',' spc_aaddr ',' spc_state ',' spc_error ',' spc_assoc_id '}' { +: '{' spc_type ',' spc_flags ',' spc_length ',' spc_aaddr ',' spc_state ',' spc_error ',' SPC_ASSOC_ID '=' sctp_assoc_id '}' { + $$ = new_expression(EXPR_SCTP_PADDR_CHANGE); + $$->value.sctp_paddr_change = calloc(1, sizeof(struct sctp_paddr_change_expr)); + $$->value.sctp_paddr_change->spc_type = $2; + $$->value.sctp_paddr_change->spc_flags = $4; + $$->value.sctp_paddr_change->spc_length = $6; + $$->value.sctp_paddr_change->spc_aaddr = $8; + $$->value.sctp_paddr_change->spc_state = $10; + $$->value.sctp_paddr_change->spc_error = $12; + $$->value.sctp_paddr_change->spc_assoc_id = $16; +} +| '{' spc_type ',' spc_flags ',' spc_length ',' spc_aaddr ',' spc_state ',' spc_error '}' { $$ = new_expression(EXPR_SCTP_PADDR_CHANGE); $$->value.sctp_paddr_change = calloc(1, sizeof(struct sctp_paddr_change_expr)); $$->value.sctp_paddr_change->spc_type = $2; @@ -4403,7 +4649,7 @@ sctp_paddr_change $$->value.sctp_paddr_change->spc_aaddr = $8; $$->value.sctp_paddr_change->spc_state = $10; $$->value.sctp_paddr_change->spc_error = $12; - $$->value.sctp_paddr_change->spc_assoc_id = $14; + $$->value.sctp_paddr_change->spc_assoc_id = new_expression(EXPR_ELLIPSIS); } ; ssf_type @@ -4463,23 +4709,13 @@ ssf_info | SSF_INFO '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -ssf_assoc_id -: SSF_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("ssf_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| SSF_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - ssf_data : SSF_DATA '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } | SSF_DATA '=' array { $$ = $3; } ; sctp_send_failed -: '{' ssf_type ',' ssf_flags ',' ssf_length ',' ssf_error ',' ssf_info ',' ssf_assoc_id ',' ssf_data '}' { +: '{' ssf_type ',' ssf_flags ',' ssf_length ',' ssf_error ',' ssf_info ',' SSF_ASSOC_ID '=' sctp_assoc_id ',' ssf_data '}' { $$ = new_expression(EXPR_SCTP_SEND_FAILED); $$->value.sctp_send_failed = calloc(1, sizeof(struct sctp_send_failed_expr)); $$->value.sctp_send_failed->ssf_type = $2; @@ -4487,8 +4723,19 @@ sctp_send_failed $$->value.sctp_send_failed->ssf_length = $6; $$->value.sctp_send_failed->ssf_error = $8; $$->value.sctp_send_failed->ssf_info = $10; - $$->value.sctp_send_failed->ssf_assoc_id = $12; - $$->value.sctp_send_failed->ssf_data = $14; + $$->value.sctp_send_failed->ssf_assoc_id = $14; + $$->value.sctp_send_failed->ssf_data = $16; +} +| '{' ssf_type ',' ssf_flags ',' ssf_length ',' ssf_error ',' ssf_info ',' ssf_data '}' { + $$ = new_expression(EXPR_SCTP_SEND_FAILED); + $$->value.sctp_send_failed = calloc(1, sizeof(struct sctp_send_failed_expr)); + $$->value.sctp_send_failed->ssf_type = $2; + $$->value.sctp_send_failed->ssf_flags = $4; + $$->value.sctp_send_failed->ssf_length = $6; + $$->value.sctp_send_failed->ssf_error = $8; + $$->value.sctp_send_failed->ssf_info = $10; + $$->value.sctp_send_failed->ssf_assoc_id = new_expression(EXPR_ELLIPSIS); + $$->value.sctp_send_failed->ssf_data = $12; } ; @@ -4536,25 +4783,24 @@ sai_adaptation_ind | SAI_ADAPTATION_IND '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; -sai_assoc_id -: SAI_ASSOC_ID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("sai_assoc_id out of range"); - } - $$ = new_integer_expression($3, "%u"); -} -| SAI_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } -; - sctp_adaptation_event -: '{' sai_type ',' sai_flags ',' sai_length ',' sai_adaptation_ind ',' sai_assoc_id '}' { +: '{' sai_type ',' sai_flags ',' sai_length ',' sai_adaptation_ind ',' SAI_ASSOC_ID '=' sctp_assoc_id '}' { + $$ = new_expression(EXPR_SCTP_ADAPTATION_EVENT); + $$->value.sctp_adaptation_event = calloc(1, sizeof(struct sctp_adaptation_event_expr)); + $$->value.sctp_adaptation_event->sai_type = $2; + $$->value.sctp_adaptation_event->sai_flags = $4; + $$->value.sctp_adaptation_event->sai_length = $6; + $$->value.sctp_adaptation_event->sai_adaptation_ind = $8; + $$->value.sctp_adaptation_event->sai_assoc_id = $12; +} +| '{' sai_type ',' sai_flags ',' sai_length ',' sai_adaptation_ind '}' { $$ = new_expression(EXPR_SCTP_ADAPTATION_EVENT); $$->value.sctp_adaptation_event = calloc(1, sizeof(struct sctp_adaptation_event_expr)); $$->value.sctp_adaptation_event->sai_type = $2; $$->value.sctp_adaptation_event->sai_flags = $4; $$->value.sctp_adaptation_event->sai_length = $6; $$->value.sctp_adaptation_event->sai_adaptation_ind = $8; - $$->value.sctp_adaptation_event->sai_assoc_id = $10; + $$->value.sctp_adaptation_event->sai_assoc_id = new_expression(EXPR_ELLIPSIS); } ; @@ -4602,6 +4848,104 @@ sctp_tlv } ; +gaids_number_of_ids +: GAIDS_NUMBER_OF_IDS '=' INTEGER { + if (!is_valid_u32($3)) { + semantic_error("gaids_number_of_ids out of range"); + } + $$ = new_integer_expression($3, "%u"); +} +| GAIDS_NUMBER_OF_IDS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sctp_assoc_ids +: '{' gaids_number_of_ids ',' GAIDS_ASSOC_ID '=' array '}' { + $$ = new_expression(EXPR_SCTP_ASSOC_IDS); + $$->value.sctp_assoc_ids = calloc(1, sizeof(struct sctp_assoc_ids_expr)); + $$->value.sctp_assoc_ids->gaids_number_of_ids = $2; + $$->value.sctp_assoc_ids->gaids_assoc_id = $6; +}; + +gauth_number_of_chunks +: GAUTH_NUMBER_OF_CHUNKS '=' INTEGER { + if (!is_valid_u32($3)) { + semantic_error("gauth_number_of_chunks out of range"); + } + $$ = new_integer_expression($3, "%u"); +} +| GAUTH_NUMBER_OF_CHUNKS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } +; + +sctp_authchunks +: '{' GAUTH_ASSOC_ID '=' sctp_assoc_id ',' gauth_number_of_chunks ',' GAUTH_CHUNKS '=' array '}' { + $$ = new_expression(EXPR_SCTP_AUTHCHUNKS); + $$->value.sctp_authchunks = calloc(1, sizeof(struct sctp_authchunks_expr)); + $$->value.sctp_authchunks->gauth_assoc_id = $4; + $$->value.sctp_authchunks->gauth_number_of_chunks = $6; + $$->value.sctp_authchunks->gauth_chunks = $10; +} +| '{' gauth_number_of_chunks ',' GAUTH_CHUNKS '=' array '}' { + $$ = new_expression(EXPR_SCTP_AUTHCHUNKS); + $$->value.sctp_authchunks = calloc(1, sizeof(struct sctp_authchunks_expr)); + $$->value.sctp_authchunks->gauth_assoc_id = new_expression(EXPR_ELLIPSIS); + $$->value.sctp_authchunks->gauth_number_of_chunks = $2; + $$->value.sctp_authchunks->gauth_chunks = $6; +}; + +sctp_setpeerprim +: '{' SSPP_ASSOC_ID '=' sctp_assoc_id ',' SSPP_ADDR '=' sockaddr '}' { + $$ = new_expression(EXPR_SCTP_SETPEERPRIM); + $$->value.sctp_setpeerprim = calloc(1, sizeof(struct sctp_setpeerprim_expr)); + $$->value.sctp_setpeerprim->sspp_assoc_id = $4; + $$->value.sctp_setpeerprim->sspp_addr = $8; +} +| '{' SSPP_ADDR '=' sockaddr '}' { + $$ = new_expression(EXPR_SCTP_SETPEERPRIM); + $$->value.sctp_setpeerprim = calloc(1, sizeof(struct sctp_setpeerprim_expr)); + $$->value.sctp_setpeerprim->sspp_assoc_id = new_expression(EXPR_ELLIPSIS); + $$->value.sctp_setpeerprim->sspp_addr = $4; +}; + +sctp_authchunk +: '{' SAUTH_CHUNK '=' INTEGER '}' { + $$ = new_expression(EXPR_SCTP_AUTHCHUNK); + $$->value.sctp_authchunk = calloc(1, sizeof(struct sctp_authchunk_expr)); + if (!is_valid_u8($4)) { + semantic_error("sauth_chunk out of range"); + } + $$->value.sctp_authchunk->sauth_chunk = new_integer_expression($4, "%hhu"); +}; + +sctp_authkey +: '{' SCA_ASSOC_ID '=' sctp_assoc_id ',' SCA_KEYNUMBER '=' INTEGER ',' SCA_KEYLENGTH '=' INTEGER ',' SCA_KEY '=' array '}' { + $$ = new_expression(EXPR_SCTP_AUTHKEY); + $$->value.sctp_authkey = calloc(1, sizeof(struct sctp_authkey_expr)); + $$->value.sctp_authkey->sca_assoc_id = $4; + if (!is_valid_u16($8)) { + semantic_error("sca_keynumber out of range"); + } + $$->value.sctp_authkey->sca_keynumber = new_integer_expression($8, "%hu"); + if (!is_valid_u16($12)) { + semantic_error("sca_keylength out of range"); + } + $$->value.sctp_authkey->sca_keylength = new_integer_expression($12, "%hu"); + $$->value.sctp_authkey->sca_key = $16; +} +| '{' SCA_KEYNUMBER '=' INTEGER ',' SCA_KEYLENGTH '=' INTEGER ',' SCA_KEY '=' array '}' { + $$ = new_expression(EXPR_SCTP_AUTHKEY); + $$->value.sctp_authkey = calloc(1, sizeof(struct sctp_authkey_expr)); + $$->value.sctp_authkey->sca_assoc_id = new_expression(EXPR_ELLIPSIS); + if (!is_valid_u16($4)) { + semantic_error("sca_keynumber out of range"); + } + $$->value.sctp_authkey->sca_keynumber = new_integer_expression($4, "%hu"); + if (!is_valid_u16($8)) { + semantic_error("sca_keylength out of range"); + } + $$->value.sctp_authkey->sca_keylength = new_integer_expression($8, "%hu"); + $$->value.sctp_authkey->sca_key = $12; +}; + opt_errno : { $$ = NULL; } | WORD note { diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index 7403cc711344cc476b5e5a9e3639f708ba87488e..3aca62574383932bb1f9e0e08f1dea0304dbc479 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -269,6 +269,31 @@ static int get_size_t(struct expression *expression, } #endif +#if defined(linux) || defined(__FreeBSD__) +/* Sets the value from the expression argument, checking that it is a + * valid sctp_assoc_t, and matches the expected type. Returns STATUS_OK on + * success; on failure returns STATUS_ERR and sets error message. + */ +static int get_sctp_assoc_t(struct expression *expression, + sctp_assoc_t *value, char **error) +{ + if (expression->type == EXPR_ELLIPSIS) { + value = 0; + } else { + if (check_type(expression, EXPR_INTEGER, error)) + return STATUS_ERR; + if (expression->value.num < 0) { + asprintf(error, + "Value out of range for sctp_assoc_t: %lld", + expression->value.num); + return STATUS_ERR; + } + *value = expression->value.num; + } + return STATUS_OK; +} +#endif + /* Sets the value from the expression argument, checking that it is a * valid u32, and matches the expected type. Returns STATUS_OK on * success; on failure returns STATUS_ERR and sets error message. @@ -470,7 +495,7 @@ static int ellipsis_arg(struct expression_list *args, int index, char **error) return STATUS_OK; } -#if defined(SCTP_GET_PEER_ADDR_INFO) || defined(SCTP_PEER_ADDR_PARAMS) +#if defined(SCTP_GET_PEER_ADDR_INFO) || defined(SCTP_PEER_ADDR_PARAMS) || defined(SCTP_SET_PEER_PRIMARY_ADDR) /* Return STATUS_OK if the argument in from type sockaddr_in or * sockaddr_in6 */ @@ -639,6 +664,23 @@ int check_u32_expr(struct expression *expr, u32 value, char *val_name, char **er return STATUS_OK; } +#if defined(__FreeBSD__) || defined(linux) +int check_sctp_assoc_t_expr(struct expression *expr, sctp_assoc_t value, char *val_name, char **error) { + if (expr->type != EXPR_ELLIPSIS) { + sctp_assoc_t script_val; + + if (get_sctp_assoc_t(expr, &script_val, error)) { + return STATUS_ERR; + } + if (script_val != value) { + asprintf(error, "%s: expected: %u actual: %u", val_name, script_val, value); + return STATUS_ERR; + } + } + return STATUS_OK; +} +#endif + int check_socklen_t_expr(struct expression *expr, socklen_t value, char *val_name, char **error) { if (expr->type != EXPR_ELLIPSIS) { socklen_t script_val; @@ -713,6 +755,48 @@ static int check_u8array_expr(struct expression *expr_list, u8 *data, size_t dat } #endif +#if defined(__FreeBSD__) || defined(linux) +static int check_u16array_expr(struct expression *expr_list, u16 *data, int data_len, char *val_name, char **error) { + if ( expr_list->type != EXPR_ELLIPSIS) { + struct expression *expr = NULL; + unsigned int i; + + switch(expr_list->type) { + case EXPR_LIST: + if (data_len != expression_list_length(expr_list->value.list)) { + asprintf(error, "%s length: expected: %u actual %d", + val_name, expression_list_length(expr_list->value.list), data_len); + return STATUS_ERR; + } + for (i = 0; i < data_len; i++) { + expr = get_arg(expr_list->value.list, i, error); + if (expr->type != EXPR_ELLIPSIS) { + u16 script_val; + + if (get_u16(expr, &script_val, error)) { + return STATUS_ERR; + } + if (script_val != data[i]) { + asprintf(error, "%s[%d]: expected: %hu actual: %hu", + val_name, i, script_val, data[i]); + return STATUS_ERR; + } + } + } + break; + case EXPR_NULL: + if (data != NULL) + return STATUS_ERR; + break; + default: asprintf(error, "Bad expressiontype for %s", val_name); + return STATUS_ERR; + break; + } + } + return STATUS_OK; +} +#endif + /* Free all the space used by the given iovec. */ static void iovec_free(struct iovec *iov, size_t iov_len) { @@ -2488,6 +2572,9 @@ static int check_linger(struct linger_expr *expr, static int check_sctp_rtoinfo(struct sctp_rtoinfo_expr *expr, struct sctp_rtoinfo *sctp_rtoinfo, char **error) { + if (check_sctp_assoc_t_expr(expr->srto_assoc_id, sctp_rtoinfo->srto_assoc_id, + "sctp_rtoinfo.srto_assoc_id", error)) + return STATUS_ERR; if (check_u32_expr(expr->srto_initial, sctp_rtoinfo->srto_initial, "sctp_rtoinfo.srto_initial", error)) return STATUS_ERR; @@ -2523,11 +2610,30 @@ static int check_sctp_initmsg(struct sctp_initmsg_expr *expr, } #endif +#if defined(SCTP_AUTH_ACTIVE_KEY) || defined(SCTP_AUTH_DEACTIVATE_KEY) || defined(SCTP_AUTH_DELETE_KEY) +static int check_sctp_authkeyid(struct sctp_authkeyid_expr *expr, + struct sctp_authkeyid *sctp_authkeyid, + char **error) +{ + if (check_sctp_assoc_t_expr(expr->scact_assoc_id, sctp_authkeyid->scact_assoc_id, + "sctp_authkeyid.scact_assoc_id", error)) + return STATUS_ERR; + if (check_u16_expr(expr->scact_keynumber, sctp_authkeyid->scact_keynumber, + "sctp_authkeyid.scact_keynumber", error)) + return STATUS_ERR; + + return STATUS_OK; +} +#endif + #ifdef SCTP_DELAYED_SACK static int check_sctp_sack_info(struct sctp_sack_info_expr *expr, struct sctp_sack_info *sctp_sack_info, char **error) { + if (check_sctp_assoc_t_expr(expr->sack_assoc_id, sctp_sack_info->sack_assoc_id, + "sctp_sack_info.sack_assoc_id", error)) + return STATUS_ERR; if (check_u32_expr(expr->sack_delay, sctp_sack_info->sack_delay, "sctp_sack_info.sack_delay", error)) return STATUS_ERR; @@ -2544,6 +2650,9 @@ static int check_sctp_paddrinfo(struct sctp_paddrinfo_expr *expr, struct sctp_paddrinfo *sctp_paddrinfo, char **error) { + if (check_sctp_assoc_t_expr(expr->spinfo_assoc_id, sctp_paddrinfo->spinfo_assoc_id, + "sctp_paddrinfo.spinfo_assoc_id", error)) + return STATUS_ERR; if (check_s32_expr(expr->spinfo_state, sctp_paddrinfo->spinfo_state, "sctp_paddrinfo.spinfo_state", error)) return STATUS_ERR; @@ -2569,6 +2678,9 @@ static int check_sctp_status(struct sctp_status_expr *expr, struct sctp_status *sctp_status, char **error) { + if (check_sctp_assoc_t_expr(expr->sstat_assoc_id, sctp_status->sstat_assoc_id, + "sctp_status.sstat_assoc_id", error)) + return STATUS_ERR; if (check_s32_expr(expr->sstat_state, sctp_status->sstat_state, "sctp_status.sstat_state", error)) return STATUS_ERR; @@ -2647,6 +2759,9 @@ static int check_sctp_assoc_value(struct sctp_assoc_value_expr *expr, struct sctp_assoc_value *sctp_assoc_value, char **error) { + if (check_sctp_assoc_t_expr(expr->assoc_id, sctp_assoc_value->assoc_id, + "sctp_assoc_value.assoc_id", error)) + return STATUS_ERR; if (check_u16_expr(expr->assoc_value, sctp_assoc_value->assoc_value, "sctp_assoc_value.stream_id", error)) return STATUS_ERR; @@ -2676,6 +2791,9 @@ static int check_sctp_assocparams(struct sctp_assocparams_expr *expr, struct sctp_assocparams *sctp_assocparams, char **error) { + if (check_sctp_assoc_t_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; @@ -2701,6 +2819,9 @@ static int check_sctp_event(struct sctp_event_expr *expr, struct sctp_event *sctp_event, char **error) { + if (check_sctp_assoc_t_expr(expr->se_assoc_id, sctp_event->se_assoc_id, + "sctp_event.se_assoc_id", error)) + return STATUS_ERR; if (check_u16_expr(expr->se_type, sctp_event->se_type, "sctp_event.se_type", error)) return STATUS_ERR; @@ -2778,8 +2899,53 @@ static int check_sctp_sndinfo(struct sctp_sndinfo_expr *expr, if (check_u32_expr(expr->snd_context, sctp_sndinfo->snd_context, "sctp_sndinfo.snd_context", error)) return STATUS_ERR; - if (check_u32_expr(expr->snd_assoc_id, sctp_sndinfo->snd_assoc_id, - "sctp_sndinfo.snd_assoc_id", error)) + if (check_sctp_assoc_t_expr(expr->snd_assoc_id, sctp_sndinfo->snd_assoc_id, + "sctp_sndinfo.snd_assoc_id", error)) + return STATUS_ERR; + + return STATUS_OK; +} +#endif +#ifdef SCTP_DEFAULT_PRINFO +static int check_sctp_default_prinfo(struct expression *expression, + struct sctp_default_prinfo *info, + char **error) +{ + if (expression->type == EXPR_SCTP_DEFAULT_PRINFO) { + struct sctp_default_prinfo_expr *expr = expression->value.sctp_default_prinfo; + if (check_sctp_assoc_t_expr(expr->pr_assoc_id, info->pr_assoc_id, + "sctp_default_prinfo.pr_assoc_id", error)) + return STATUS_ERR; + if (check_u16_expr(expr->pr_policy, info->pr_policy, + "sctp_default_prinfo.pr_policy", error)) + return STATUS_ERR; + if (check_u32_expr(expr->pr_value, info->pr_value, + "sctp_default_prinfo.pr_value", error)) + return STATUS_ERR; + } else if (expression->type == EXPR_SCTP_PRINFO) { + struct sctp_prinfo_expr *expr = expression->value.sctp_prinfo; + if (check_u16_expr(expr->pr_policy, info->pr_policy, + "sctp_default_prinfo.pr_policy", error)) + return STATUS_ERR; + if (check_u32_expr(expr->pr_value, info->pr_value, + "sctp_default_prinfo.pr_value", error)) + return STATUS_ERR; + } else { + return STATUS_ERR; + } + return STATUS_OK; +} +#endif + +#ifdef SCTP_PRIMARY_ADDR +static int check_sctp_setprim(struct sctp_setprim_expr *expr, + struct sctp_setprim *sctp_setprim, + char **error) +{ + if (check_sctp_assoc_t_expr(expr->ssp_assoc_id, sctp_setprim->ssp_assoc_id, + "sctp_setprim.ssp_assoc_id", error)) + return STATUS_ERR; + if (check_sockaddr(expr->ssp_addr, (struct sockaddr *)&sctp_setprim->ssp_addr, error)) return STATUS_ERR; return STATUS_OK; @@ -2799,6 +2965,85 @@ static int check_sctp_setadaptation(struct sctp_setadaptation_expr *expr, } #endif +#ifdef SCTP_HMAC_IDENT +static int check_sctp_hamcalgo(struct sctp_hmacalgo_expr *expr, + struct sctp_hmacalgo *sctp_hmacalgo, + char **error) { + if (check_u32_expr(expr->shmac_number_of_idents, sctp_hmacalgo->shmac_number_of_idents, + "sctp_hmacalgo.shmac_number_of_idents", error)) + return STATUS_ERR; + if (check_type(expr->shmac_idents, EXPR_LIST, error)) { + return STATUS_ERR; + } + if (check_u16array_expr(expr->shmac_idents, sctp_hmacalgo->shmac_idents, + sctp_hmacalgo->shmac_number_of_idents, + "sctp_hmacalgo.shmac_idents", error)) + return STATUS_ERR; + + return STATUS_OK; +} +#endif + +#ifdef SCTP_GET_ASSOC_ID_LIST +static int check_sctp_assoc_ids(struct sctp_assoc_ids_expr *expr, + struct sctp_assoc_ids *sctp_assoc_ids, + char **error) { + int list_len = 0, i = 0; + struct expression *assoc_id; + struct expression_list *ids; + + if (check_u32_expr(expr->gaids_number_of_ids, sctp_assoc_ids->gaids_number_of_ids, + "sctp_assoc_ids.gaids_number_of_ids", error)) { + return STATUS_ERR; + } + ids = expr->gaids_assoc_id->value.list; + list_len = expression_list_length(ids); + if (list_len != sctp_assoc_ids->gaids_number_of_ids) { + asprintf(error, "live gaids_number_if_ids unequal to length if expected gaids_assoc_id. actual %u, expected %d", + sctp_assoc_ids->gaids_number_of_ids, list_len); + return STATUS_ERR; + } + if (list_len == 1) { + assoc_id = get_arg(ids, 0, error); + if (assoc_id->type == EXPR_ELLIPSIS) { + return STATUS_OK; + } + } + for (i = 0; i < list_len; i++) { + assoc_id = get_arg(ids, i, error); + sctp_assoc_t script_id; + if (get_sctp_assoc_t(assoc_id, &script_id, error)) { + return STATUS_ERR; + } + if (script_id != sctp_assoc_ids->gaids_assoc_id[i]) { + asprintf(error, "sctp_assoc_ids.gaids_assoc_id[%d]. expected %u, actual %u", + i, script_id, sctp_assoc_ids->gaids_assoc_id[i]); + return STATUS_ERR; + } + } + return STATUS_OK; +} +#endif + +#if defined(SCTP_PEER_AUTH_CHUNKS) || defined(SCTP_LOCAL_AUTH_CHUNKS) +static int check_sctp_authchunks(struct sctp_authchunks_expr *expr, + struct sctp_authchunks *sctp_authchunks, + char **error) { + if (check_sctp_assoc_t_expr(expr->gauth_assoc_id, sctp_authchunks->gauth_assoc_id, + "sctp_authchunks.gauth_assoc_id", error)) + return STATUS_ERR; + if (check_u32_expr(expr->gauth_number_of_chunks, sctp_authchunks->gauth_number_of_chunks, + "sctp_authchunks.gauth_number_of_chunks", error)) + return STATUS_ERR; + if (check_u8array_expr(expr->gauth_chunks, sctp_authchunks->gauth_chunks, + sctp_authchunks->gauth_number_of_chunks, + "sctp_authchunks.gauth_chunks", error)) + return STATUS_ERR; + + return STATUS_OK; +} +#endif + static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, struct expression_list *args, char **error) { @@ -2835,14 +3080,24 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, case EXPR_SCTP_RTOINFO: live_optval = malloc(sizeof(struct sctp_rtoinfo)); live_optlen = (socklen_t)sizeof(struct sctp_rtoinfo); - ((struct sctp_rtoinfo*)live_optval)->srto_assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_rtoinfo->srto_assoc_id, + &((struct sctp_rtoinfo*)live_optval)->srto_assoc_id, + error)) { + free(live_optval); + return STATUS_ERR; + } break; #endif #ifdef SCTP_ASSOCINFO 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 (get_sctp_assoc_t(val_expression->value.sctp_assocparams->sasoc_assoc_id, + &((struct sctp_assocparams*) live_optval)->sasoc_assoc_id, + error)) { + free(live_optval); + return STATUS_ERR; + } break; #endif #ifdef SCTP_INITMSG @@ -2851,27 +3106,53 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, live_optlen = (socklen_t)sizeof(struct sctp_initmsg); break; #endif +#if defined(SCTP_AUTH_ACTIVE_KEY) || defined(SCTP_AUTH_DEACTIVATE_KEY) || defined(SCTP_AUTH_DELETE_KEY) + case EXPR_SCTP_AUTHKEYID: + live_optval = malloc(sizeof(struct sctp_authkeyid)); + live_optlen = (socklen_t)sizeof(struct sctp_authkeyid); + if (get_sctp_assoc_t(val_expression->value.sctp_authkeyid->scact_assoc_id, + &((struct sctp_authkeyid*) live_optval)->scact_assoc_id, + error)) { + free(live_optval); + return STATUS_ERR; + } + break; +#endif #ifdef SCTP_DELAYED_SACK case EXPR_SCTP_SACKINFO: live_optval = malloc(sizeof(struct sctp_sack_info)); live_optlen = (socklen_t)sizeof(struct sctp_sack_info); - ((struct sctp_sack_info*) live_optval)->sack_assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_sack_info->sack_assoc_id, + &((struct sctp_sack_info*) live_optval)->sack_assoc_id, + error)) { + free(live_optval); + return STATUS_ERR; + } break; #endif #ifdef SCTP_STATUS case EXPR_SCTP_STATUS: live_optval = malloc(sizeof(struct sctp_status)); - live_optlen = (socklen_t)sizeof(struct sctp_status); - ((struct sctp_status*) live_optval)->sstat_assoc_id = 0; + live_optlen = (socklen_t) sizeof(struct sctp_status); + if (get_sctp_assoc_t(val_expression->value.sctp_status->sstat_assoc_id, + &((struct sctp_status*) live_optval)->sstat_assoc_id, + error)) { + free(live_optval); + return STATUS_ERR; + } break; #endif #ifdef SCTP_GET_PEER_ADDR_INFO case EXPR_SCTP_PADDRINFO: { struct sctp_paddrinfo_expr *expr_paddrinfo = val_expression->value.sctp_paddrinfo; struct sctp_paddrinfo *live_paddrinfo = malloc(sizeof(struct sctp_paddrinfo)); - live_optlen = (socklen_t)sizeof(struct sctp_paddrinfo); + live_optlen = (socklen_t) sizeof(struct sctp_paddrinfo); memset(live_paddrinfo, 0, sizeof(struct sctp_paddrinfo)); - live_paddrinfo->spinfo_assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_paddrinfo->spinfo_assoc_id, + &(live_paddrinfo->spinfo_assoc_id), error)) { + free(live_paddrinfo); + return STATUS_ERR; + } if (get_sockstorage_arg(expr_paddrinfo->spinfo_address, &(live_paddrinfo->spinfo_address), live_fd)) { asprintf(error, "can't determine spinfo_address"); @@ -2888,13 +3169,15 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, struct sctp_paddrparams *live_params = malloc(sizeof(struct sctp_paddrparams)); memset(live_params, 0, sizeof(struct sctp_paddrparams)); live_optlen = sizeof(struct sctp_paddrparams); - if (get_sockstorage_arg(expr_params->spp_address, &live_params->spp_address, - live_fd)) { + if (get_sockstorage_arg(expr_params->spp_address, &live_params->spp_address, live_fd)) { asprintf(error, "can't determine spp_address"); free(live_params); return STATUS_ERR; } - live_params->spp_assoc_id = 0; + if (get_sctp_assoc_t(expr_params->spp_assoc_id, &live_params->spp_assoc_id, error)) { + free(live_params); + return STATUS_ERR; + } live_optval = live_params; break; } @@ -2903,7 +3186,17 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, case EXPR_SCTP_ASSOC_VALUE: live_optval = malloc(sizeof(struct sctp_assoc_value)); live_optlen = (socklen_t)sizeof(struct sctp_assoc_value); - ((struct sctp_assoc_value *) live_optval)->assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_assoc_value->assoc_id, + &((struct sctp_assoc_value *) live_optval)->assoc_id, error)) { + free(live_optval); + return STATUS_ERR; + } + break; +#endif +#ifdef SCTP_HMAC_IDENT + case EXPR_SCTP_HMACALGO: + live_optval = malloc(sizeof(struct sctp_hmacalgo)); + live_optlen = sizeof(struct sctp_hmacalgo); break; #endif #ifdef SCTP_SS_VALUE @@ -2923,7 +3216,12 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, case EXPR_SCTP_EVENT: live_optval = malloc(sizeof(struct sctp_event)); live_optlen = sizeof(struct sctp_event); - ((struct sctp_event *)live_optval)->se_assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_event->se_assoc_id, + &((struct sctp_event *)live_optval)->se_assoc_id, + error)) { + free(live_optval); + return STATUS_ERR; + } if (get_u16(val_expression->value.sctp_event->se_type, &((struct sctp_event *)live_optval)->se_type, error)) { @@ -2932,6 +3230,12 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, } break; #endif +#ifdef SCTP_DEFAULT_SEND_PARAM + case EXPR_SCTP_SNDRCVINFO: + live_optval = malloc(sizeof(struct sctp_sndrcvinfo)); + live_optlen = sizeof(struct sctp_sndrcvinfo); + break; +#endif #ifdef SCTP_EVENTS case EXPR_SCTP_EVENT_SUBSCRIBE: live_optval = malloc(sizeof(struct sctp_event_subscribe)); @@ -2942,9 +3246,38 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, case EXPR_SCTP_SNDINFO: live_optval = malloc(sizeof(struct sctp_sndinfo)); live_optlen = sizeof(struct sctp_sndinfo); - if (get_u32(val_expression->value.sctp_sndinfo->snd_assoc_id, - &((struct sctp_sndinfo *)live_optval)->snd_assoc_id, - error)) { + if (get_sctp_assoc_t(val_expression->value.sctp_sndinfo->snd_assoc_id, + &((struct sctp_sndinfo *)live_optval)->snd_assoc_id, + error)) { + free(live_optval); + return STATUS_ERR; + } + break; +#endif +#ifdef SCTP_DEFAULT_PRINFO + case EXPR_SCTP_PRINFO: + case EXPR_SCTP_DEFAULT_PRINFO: + live_optval = malloc(sizeof(struct sctp_default_prinfo)); + live_optlen = sizeof(struct sctp_default_prinfo); + if (EXPR_SCTP_DEFAULT_PRINFO) { + if (get_sctp_assoc_t(val_expression->value.sctp_default_prinfo->pr_assoc_id, + &((struct sctp_default_prinfo *)live_optval)->pr_assoc_id, + error)) { + free(live_optval); + return STATUS_ERR; + } + }else{ + ((struct sctp_default_prinfo *)live_optval)->pr_assoc_id = 0; + } + break; +#endif +#ifdef SCTP_PRIMARY_ADDR + case EXPR_SCTP_SETPRIM: + live_optval = malloc(sizeof(struct sctp_setprim)); + live_optlen = sizeof(struct sctp_setprim); + if (get_sctp_assoc_t(val_expression->value.sctp_setprim->ssp_assoc_id, + &((struct sctp_setprim *)live_optval)->ssp_assoc_id, + error)) { free(live_optval); return STATUS_ERR; } @@ -2955,6 +3288,28 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, live_optval = malloc(sizeof(struct sctp_setadaptation)); live_optlen = sizeof(struct sctp_setadaptation); break; +#endif +#ifdef SCTP_GET_ASSOC_ID_LIST + case EXPR_SCTP_ASSOC_IDS: { + int len = expression_list_length(val_expression->value.sctp_assoc_ids->gaids_assoc_id->value.list); + live_optval = malloc(sizeof(u32) + (sizeof(sctp_assoc_t) * len)); + live_optlen = sizeof(u32) + (sizeof(sctp_assoc_t) * len); + break; + } +#endif +#if defined(SCTP_PEER_AUTH_CHUNKS) || defined(SCTP_LOCAL_AUTH_CHUNKS) + case EXPR_SCTP_AUTHCHUNKS: { + int len = expression_list_length(val_expression->value.sctp_authchunks->gauth_chunks->value.list); + live_optval = malloc(sizeof(sctp_assoc_t) + sizeof(u32) + (sizeof(u8) * len)); + live_optlen = sizeof(sctp_assoc_t) + sizeof(u32) + (sizeof(u8) * len); + if (get_sctp_assoc_t(val_expression->value.sctp_authchunks->gauth_assoc_id, + &((struct sctp_authchunks *)live_optval)->gauth_assoc_id, + error)) { + free(live_optval); + return STATUS_ERR; + } + break; + } #endif case EXPR_LIST: s32_bracketed_arg(args, 3, &script_optval, error); @@ -3002,6 +3357,11 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, result = check_sctp_initmsg(val_expression->value.sctp_initmsg, live_optval, error); break; #endif +#if defined(SCTP_AUTH_ACTIVE_KEY) || defined(SCTP_AUTH_DEACTIVATE_KEY) || defined(SCTP_AUTH_DELETE_KEY) + case EXPR_SCTP_AUTHKEYID: + result = check_sctp_authkeyid(val_expression->value.sctp_authkeyid, live_optval, error); + break; +#endif #ifdef SCTP_DELAYED_SACK case EXPR_SCTP_SACKINFO: result = check_sctp_sack_info(val_expression->value.sctp_sack_info, live_optval, error); @@ -3027,6 +3387,11 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, result = check_sctp_assoc_value(val_expression->value.sctp_assoc_value, live_optval, error); break; #endif +#ifdef SCTP_HMAC_IDENT + case EXPR_SCTP_HMACALGO: + result = check_sctp_hamcalgo(val_expression->value.sctp_hmacalgo, live_optval, error); + break; +#endif #ifdef SCTP_SS_VALUE case EXPR_SCTP_STREAM_VALUE: result = check_sctp_stream_value(val_expression->value.sctp_stream_value, live_optval, error); @@ -3037,6 +3402,11 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, result = check_sctp_event(val_expression->value.sctp_event, live_optval, error); break; #endif +#ifdef SCTP_DEFAULT_SEND_PARAM + case EXPR_SCTP_SNDRCVINFO: + result = check_sctp_sndrcvinfo(val_expression->value.sctp_sndrcvinfo, live_optval, error); + break; +#endif #ifdef SCTP_EVENTS case EXPR_SCTP_EVENT_SUBSCRIBE: result = check_sctp_event_subscribe(val_expression->value.sctp_event_subscribe, live_optval, error); @@ -3047,10 +3417,30 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, result = check_sctp_sndinfo(val_expression->value.sctp_sndinfo, live_optval, error); break; #endif +#ifdef SCTP_DEFAULT_PRINFO + case EXPR_SCTP_DEFAULT_PRINFO: + result = check_sctp_default_prinfo(val_expression, live_optval, error); + break; +#endif +#ifdef SCTP_PRIMARY_ADDR + case EXPR_SCTP_SETPRIM: + result = check_sctp_setprim(val_expression->value.sctp_setprim, live_optval, error); + break; +#endif #ifdef SCTP_ADAPTATION_LAYER case EXPR_SCTP_SETADAPTATION: result = check_sctp_setadaptation(val_expression->value.sctp_setadaptation, live_optval, error); break; +#endif +#ifdef SCTP_GET_ASSOC_ID_LIST + case EXPR_SCTP_ASSOC_IDS: + result = check_sctp_assoc_ids(val_expression->value.sctp_assoc_ids, live_optval, error); + break; +#endif +#if defined(SCTP_PEER_AUTH_CHUNKS) || defined(SCTP_LOCAL_AUTH_CHUNKS) + case EXPR_SCTP_AUTHCHUNKS: + result = check_sctp_authchunks(val_expression->value.sctp_authchunks, live_optval, error); + break; #endif case EXPR_LIST: if (*(int*)live_optval != script_optval) { @@ -3087,6 +3477,9 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, #if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED) struct sctp_assoc_value assoc_value; #endif +#ifdef SCTP_AUTH_ACTIVE_KEY + struct sctp_authkeyid authkeyid; +#endif #ifdef SCTP_DELAYED_SACK struct sctp_sack_info sack_info; #endif @@ -3105,12 +3498,27 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, #ifdef SCTP_EVENTS struct sctp_event_subscribe event_subscribe; #endif +#ifdef SCTP_DEFAULT_SEND_PARAM + struct sctp_sndrcvinfo sndrcvinfo; +#endif #ifdef SCTP_DEFAULT_SNDINFO struct sctp_sndinfo sndinfo; #endif +#ifdef SCTP_DEFAULT_PRINFO + struct sctp_default_prinfo default_prinfo; +#endif +#ifdef SCTP_PRIMARY_ADDR + struct sctp_setprim setprim; +#endif #ifdef SCTP_ADAPTATION_LAYER struct sctp_setadaptation setadaptation; #endif +#ifdef SCTP_SET_PEER_PRIMARY_ADDR + struct sctp_setpeerprim setpeerprim; +#endif +#ifdef SCTP_AUTH_CHUNK + struct sctp_authchunk authchunk; +#endif #ifdef SCTP_PEER_ADDR_PARAMS struct sctp_paddrparams paddrparams; #ifdef linux @@ -3152,7 +3560,10 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, break; #ifdef SCTP_RTOINFO case EXPR_SCTP_RTOINFO: - rtoinfo.srto_assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_rtoinfo->srto_assoc_id, + &rtoinfo.srto_assoc_id, error)) { + return STATUS_ERR; + } if (get_u32(val_expression->value.sctp_rtoinfo->srto_initial, &rtoinfo.srto_initial, error)) { return STATUS_ERR; @@ -3170,7 +3581,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_sctp_assoc_t(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; @@ -3204,7 +3618,10 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, #endif #if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED) case EXPR_SCTP_ASSOC_VALUE: - assoc_value.assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_assoc_value->assoc_id, + &assoc_value.assoc_id, error)) { + return STATUS_ERR; + } if (get_u32(val_expression->value.sctp_assoc_value->assoc_value, &assoc_value.assoc_value, error)) { return STATUS_ERR; @@ -3212,6 +3629,33 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, optval = &assoc_value; break; #endif +#ifdef SCTP_HMAC_IDENT + case EXPR_SCTP_HMACALGO: { + int len, i; + struct sctp_hmacalgo *hmacalgo; + struct expression_list *list; + + if (check_type(val_expression->value.sctp_hmacalgo->shmac_idents, EXPR_LIST, error)) { + return STATUS_ERR; + } + list = val_expression->value.sctp_hmacalgo->shmac_idents->value.list; + len = expression_list_length(list); + hmacalgo = malloc(sizeof(u32) + (sizeof(u16) * len)); + + if (get_u32(val_expression->value.sctp_hmacalgo->shmac_number_of_idents, + &hmacalgo->shmac_number_of_idents, error)) { + free(hmacalgo); + return STATUS_ERR; + } + for (i = 0; i < len; i++) { + struct expression *expr; + expr = get_arg(list, i, error); + get_u16(expr, &(hmacalgo->shmac_idents[i]), error); + } + optval = &hmacalgo; + break; + } +#endif #ifdef SCTP_SS_VALUE case EXPR_SCTP_STREAM_VALUE: stream_value.assoc_id = 0; @@ -3226,9 +3670,25 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, optval = &stream_value; break; #endif +#if defined(SCTP_AUTH_ACTIVE_KEY) || defined(SCTP_AUTH_DEACTIVATE_KEY) || defined(SCTP_AUTH_DELETE_KEY) + case EXPR_SCTP_AUTHKEYID: + if (get_sctp_assoc_t(val_expression->value.sctp_authkeyid->scact_assoc_id, + &authkeyid.scact_assoc_id, error)) { + return STATUS_ERR; + } + if (get_u16(val_expression->value.sctp_authkeyid->scact_keynumber, + &authkeyid.scact_keynumber, error)) { + return STATUS_ERR; + } + optval = &authkeyid; + break; +#endif #ifdef SCTP_DELAYED_SACK case EXPR_SCTP_SACKINFO: - sack_info.sack_assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_sack_info->sack_assoc_id, + &sack_info.sack_assoc_id, error)) { + return STATUS_ERR; + } if (get_u32(val_expression->value.sctp_sack_info->sack_delay, &sack_info.sack_delay, error)) { return STATUS_ERR; @@ -3242,13 +3702,19 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, #endif #ifdef SCTP_STATUS case EXPR_SCTP_STATUS: - status.sstat_assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_status->sstat_assoc_id, + &status.sstat_assoc_id, error)) { + return STATUS_ERR; + } optval = &status; break; #endif #ifdef SCTP_GET_PEER_ADDR_INFO case EXPR_SCTP_PADDRINFO: - paddrinfo.spinfo_assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_paddrinfo->spinfo_assoc_id, + &paddrinfo.spinfo_assoc_id, error)) { + return STATUS_ERR; + } if (get_sockstorage_arg(val_expression->value.sctp_paddrinfo->spinfo_address, &paddrinfo.spinfo_address, live_fd)) { asprintf(error, "can't determine spp_address"); @@ -3259,7 +3725,10 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, #endif #ifdef SCTP_EVENT case EXPR_SCTP_EVENT: - event.se_assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_event->se_assoc_id, + &event.se_assoc_id, error)) { + return STATUS_ERR; + } if (get_u16(val_expression->value.sctp_event->se_type, &event.se_type, error)) { return STATUS_ERR; @@ -3316,6 +3785,14 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, optval = &event_subscribe; break; #endif +#ifdef SCTP_DEFAULT_SEND_PARAM + case EXPR_SCTP_SNDRCVINFO: + if (parse_expression_to_sctp_sndrcvinfo(val_expression, &sndrcvinfo, true, error)) { + return STATUS_ERR; + } + optval = &sndrcvinfo; + break; +#endif #ifdef SCTP_DEFAULT_SNDINFO case EXPR_SCTP_SNDINFO: if (get_u16(val_expression->value.sctp_sndinfo->snd_sid, @@ -3334,13 +3811,55 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, &sndinfo.snd_context, error)) { return STATUS_ERR; } - if (get_u32(val_expression->value.sctp_sndinfo->snd_assoc_id, - &sndinfo.snd_assoc_id, error)) { + if (get_sctp_assoc_t(val_expression->value.sctp_sndinfo->snd_assoc_id, + &sndinfo.snd_assoc_id, error)) { return STATUS_ERR; } optval = &sndinfo; break; #endif +#ifdef SCTP_DEFAULT_PRINFO + case EXPR_SCTP_PRINFO: + if (get_u16(val_expression->value.sctp_prinfo->pr_policy, + &default_prinfo.pr_policy, error)) { + return STATUS_ERR; + } + if (get_u32(val_expression->value.sctp_prinfo->pr_value, + &default_prinfo.pr_value, error)) { + return STATUS_ERR; + } + default_prinfo.pr_assoc_id = 0; + optval = &default_prinfo; + break; + case EXPR_SCTP_DEFAULT_PRINFO: + if (get_u16(val_expression->value.sctp_default_prinfo->pr_policy, + &default_prinfo.pr_policy, error)) { + return STATUS_ERR; + } + if (get_u32(val_expression->value.sctp_default_prinfo->pr_value, + &default_prinfo.pr_value, error)) { + return STATUS_ERR; + } + if (get_sctp_assoc_t(val_expression->value.sctp_default_prinfo->pr_assoc_id, + &default_prinfo.pr_assoc_id, error)) { + return STATUS_ERR; + } + optval = &default_prinfo; + break; +#endif +#ifdef SCTP_PRIMARY_ADDR + case EXPR_SCTP_SETPRIM: + if (get_sctp_assoc_t(val_expression->value.sctp_setprim->ssp_assoc_id, + &setprim.ssp_assoc_id, error)) { + return STATUS_ERR; + } + if (get_sockstorage_arg(val_expression->value.sctp_setprim->ssp_addr, + &setprim.ssp_addr, live_fd)) { + return STATUS_ERR; + } + optval = &setprim; + break; +#endif #ifdef SCTP_ADAPTATION_LAYER case EXPR_SCTP_SETADAPTATION: if (get_u32(val_expression->value.sctp_setadaptation->ssb_adaptation_ind, @@ -3350,9 +3869,75 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, optval = &setadaptation; break; #endif +#ifdef SCTP_SET_PEER_PRIMARY_ADDR + case EXPR_SCTP_SETPEERPRIM: + if (get_sctp_assoc_t(val_expression->value.sctp_setpeerprim->sspp_assoc_id, + &setpeerprim.sspp_assoc_id, error)) { + return STATUS_ERR; + } + if (get_sockstorage_arg(val_expression->value.sctp_setpeerprim->sspp_addr, + &setpeerprim.sspp_addr, live_fd)) { + return STATUS_ERR; + } + optval = &setpeerprim; + break; +#endif +#ifdef SCTP_AUTH_CHUNK + case EXPR_SCTP_AUTHCHUNK: + if (get_u8(val_expression->value.sctp_authchunk->sauth_chunk, + &authchunk.sauth_chunk, error)) { + return STATUS_ERR; + } + optval = &authchunk; + break; +#endif +#ifdef SCTP_AUTH_KEY + case EXPR_SCTP_AUTHKEY: { + struct sctp_authkey *key; + int i = 0, len = 0; + struct expression *key_expr; + struct expression_list *list; + + if (check_type(val_expression->value.sctp_authkey->sca_key, EXPR_LIST, error)) { + return STATUS_ERR; + } + list = val_expression->value.sctp_authkey->sca_key->value.list; + len = expression_list_length(list); + key = malloc(sizeof(sctp_assoc_t) + sizeof(u16) + sizeof(u16) + (sizeof(u8) * len)); + + if (get_sctp_assoc_t(val_expression->value.sctp_authkey->sca_assoc_id, + &key->sca_assoc_id, error)) { + free(key); + return STATUS_ERR; + } + if (get_u16(val_expression->value.sctp_authkey->sca_keynumber, + &key->sca_keynumber, error)) { + free(key); + return STATUS_ERR; + } + if (get_u16(val_expression->value.sctp_authkey->sca_keylength, + &key->sca_keylength, error)) { + free(key); + return STATUS_ERR; + } + for (i = 0; i < len; i++) { + key_expr = get_arg(list, i, error); + if (get_u8(key_expr, &(key->sca_key[i]), error)) { + free(key); + return STATUS_ERR; + } + } + key->sca_keylength = len; + optval = key; + break; + } +#endif #ifdef SCTP_PEER_ADDR_PARAMS case EXPR_SCTP_PEER_ADDR_PARAMS: - paddrparams.spp_assoc_id = 0; + if (get_sctp_assoc_t(val_expression->value.sctp_paddrparams->spp_assoc_id, + &paddrparams.spp_assoc_id, error)) { + return STATUS_ERR; + } if (get_sockstorage_arg(val_expression->value.sctp_paddrparams->spp_address, &paddrparams.spp_address, live_fd)) { asprintf(error, "can't determine spp_address"); @@ -3415,6 +4000,9 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, result = setsockopt(live_fd, level, optname, optval, optlen); return end_syscall(state, syscall, CHECK_EXACT, result, error); +#if defined(SCTP_HMAC_IDENT) || defined(SCTP_AUTH_KEY) + free(optval); +#endif } static int syscall_poll(struct state *state, struct syscall_spec *syscall, @@ -3578,8 +4166,8 @@ static int check_sctp_sndrcvinfo(struct sctp_sndrcvinfo_expr *expr, if (check_u32_expr(expr->sinfo_cumtsn, sctp_sndrcvinfo->sinfo_cumtsn, "sctp_sndrcvinfo.sinfo_cumtsn", error)) return STATUS_ERR; - if (check_u32_expr(expr->sinfo_assoc_id, sctp_sndrcvinfo->sinfo_assoc_id, - "sctp_sndrcvinfo.sinfo_assoc_id", error)) + if (check_sctp_assoc_t_expr(expr->sinfo_assoc_id, sctp_sndrcvinfo->sinfo_assoc_id, + "sctp_sndrcvinfo.sinfo_assoc_id", error)) return STATUS_ERR; return STATUS_OK; @@ -3653,8 +4241,8 @@ static int check_sctp_extrcvinfo(struct sctp_extrcvinfo_expr *expr, "sctp_extrcvinfo.serinfo_next_ppid", error)) return STATUS_ERR; #endif - if (check_u32_expr(expr->sinfo_assoc_id, sctp_extrcvinfo->sinfo_assoc_id, - "sctp_extrcvinfo.sinfo_assoc_id", error)) + if (check_sctp_assoc_t_expr(expr->sinfo_assoc_id, sctp_extrcvinfo->sinfo_assoc_id, + "sctp_extrcvinfo.sinfo_assoc_id", error)) return STATUS_ERR; return STATUS_OK; @@ -3855,14 +4443,9 @@ static int parse_expression_to_sctp_sndrcvinfo(struct expression *expr, } } if (sndrcvinfo_expr->sinfo_assoc_id->type == EXPR_ELLIPSIS) { - if (send) { - asprintf(error, "sinfo_assoc_id must be specified"); - return STATUS_ERR; - } else { - info->sinfo_assoc_id = 0; - } + info->sinfo_assoc_id = 0; } else { - if (get_u32(sndrcvinfo_expr->sinfo_assoc_id, (u32 *)&info->sinfo_assoc_id, error)) { + if (get_sctp_assoc_t(sndrcvinfo_expr->sinfo_assoc_id, &info->sinfo_assoc_id, error)) { return STATUS_ERR; } } @@ -3889,7 +4472,7 @@ static int parse_expression_to_sctp_sndinfo(struct expression *expr, struct sctp if (get_u32(sndinfo_expr->snd_context, &info->snd_context, error)) { return STATUS_ERR; } - if (get_u32(sndinfo_expr->snd_assoc_id, &info->snd_assoc_id, error)) { + if (get_sctp_assoc_t(sndinfo_expr->snd_assoc_id, &info->snd_assoc_id, error)) { return STATUS_ERR; } } else { @@ -4078,7 +4661,7 @@ static int syscall_sctp_sendx(struct state *state, struct syscall_spec *syscall, if (ellipsis_arg(args, 1, error)) return STATUS_ERR; len_expr = get_arg(args, 2, error); - if (get_u32(len_expr, &len, error)) { + if (get_size_t(len_expr, &len, error)) { return STATUS_ERR; } addrs_expr = get_arg(args, 3, error); @@ -4266,8 +4849,8 @@ static int check_sctp_rcvinfo(struct sctp_rcvinfo_expr *expr, if (check_u32_expr(expr->rcv_context, sctp_rcvinfo->rcv_context, "sctp_rcvinfo.rcv_context", error)) return STATUS_ERR; - if (check_u32_expr(expr->rcv_assoc_id, sctp_rcvinfo->rcv_assoc_id, - "sctp_rcvinfo.rcv_assoc_id", error)) + if (check_sctp_assoc_t_expr(expr->rcv_assoc_id, sctp_rcvinfo->rcv_assoc_id, + "sctp_rcvinfo.rcv_assoc_id", error)) return STATUS_ERR; return STATUS_OK; @@ -4279,15 +4862,20 @@ static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr, struct sctp_nxtinfo *sctp_nxtinfo, char **error) { - if (check_u16_expr(expr->nxt_sid, sctp_nxtinfo->nxt_sid, "sctp_nxtinfo.nxt_sid", error)) + if (check_u16_expr(expr->nxt_sid, sctp_nxtinfo->nxt_sid, + "sctp_nxtinfo.nxt_sid", error)) return STATUS_ERR; - if (check_u16_expr(expr->nxt_flags, sctp_nxtinfo->nxt_flags, "sctp_nxtinfo.nxt_flags", error)) + if (check_u16_expr(expr->nxt_flags, sctp_nxtinfo->nxt_flags, + "sctp_nxtinfo.nxt_flags", error)) return STATUS_ERR; - if (check_u32_hton_expr(expr->nxt_ppid, sctp_nxtinfo->nxt_ppid, "sctp_nxtinfo.nxt_ppid", error)) + if (check_u32_hton_expr(expr->nxt_ppid, sctp_nxtinfo->nxt_ppid, + "sctp_nxtinfo.nxt_ppid", error)) return STATUS_ERR; - if (check_u32_expr(expr->nxt_length, sctp_nxtinfo->nxt_length, "sctp_nxtinfo.nxt_length", error)) + if (check_u32_expr(expr->nxt_length, sctp_nxtinfo->nxt_length, + "sctp_nxtinfo.nxt_length", error)) return STATUS_ERR; - if (check_u32_expr(expr->nxt_assoc_id, sctp_nxtinfo->nxt_assoc_id, "sctp_nxtinfo.nxt_assoc_id", error)) + if (check_sctp_assoc_t_expr(expr->nxt_assoc_id, sctp_nxtinfo->nxt_assoc_id, + "sctp_nxtinfo.nxt_assoc_id", error)) return STATUS_ERR; return STATUS_OK; @@ -4319,7 +4907,7 @@ static int check_sctp_assoc_change(struct sctp_assoc_change_expr *expr, if (check_u16_expr(expr->sac_inbound_streams, sctp_event->sac_inbound_streams, "sctp_assoc_change.sac_inbound_streams", error)) return STATUS_ERR; - if (check_u32_expr(expr->sac_assoc_id, sctp_event->sac_assoc_id, + if (check_sctp_assoc_t_expr(expr->sac_assoc_id, sctp_event->sac_assoc_id, "sctp_assoc_change.sac_assoc_id", error)) return STATUS_ERR; if (check_u8array_expr(expr->sac_info, sctp_event->sac_info, sctp_event->sac_length - sizeof(struct sctp_assoc_change), @@ -4352,7 +4940,7 @@ static int check_sctp_paddr_change(struct sctp_paddr_change_expr *expr, if (check_u32_expr(expr->spc_error, sctp_event->spc_error, "sctp_paddr_change.spc_error", error)) return STATUS_ERR; - if (check_u32_expr(expr->spc_assoc_id, sctp_event->spc_assoc_id, + if (check_sctp_assoc_t_expr(expr->spc_assoc_id, sctp_event->spc_assoc_id, "sctp_paddr_change.spc_assoc_id", error)) return STATUS_ERR; @@ -4376,7 +4964,7 @@ static int check_sctp_remote_error(struct sctp_remote_error_expr *expr, if (check_u16_expr(expr->sre_error, sctp_event->sre_error, "sctp_remote_error.sre_error", error)) return STATUS_ERR; - if (check_u32_expr(expr->sre_assoc_id, sctp_event->sre_assoc_id, + if (check_sctp_assoc_t_expr(expr->sre_assoc_id, sctp_event->sre_assoc_id, "sctp_remote_error.sre_assoc_id", error)) return STATUS_ERR; if (check_u8array_expr(expr->sre_data, sctp_event->sre_data, sctp_event->sre_length - sizeof(struct sctp_remote_error), @@ -4409,7 +4997,7 @@ static int check_sctp_send_failed(struct sctp_send_failed_expr *expr, &sctp_event->ssf_info, error)) return STATUS_ERR; } - if (check_u32_expr(expr->ssf_assoc_id, sctp_event->ssf_assoc_id, + if (check_sctp_assoc_t_expr(expr->ssf_assoc_id, sctp_event->ssf_assoc_id, "sctp_send_failed.ssf_assoc_id", error)) return STATUS_ERR; if (check_u8array_expr(expr->ssf_data, sctp_event->ssf_data, sctp_event->ssf_length - sizeof(struct sctp_send_failed), @@ -4434,6 +5022,9 @@ static int check_sctp_shutdown_event(struct sctp_shutdown_event_expr *expr, if (check_u32_expr(expr->sse_length, sctp_event->sse_length, "sctp_shutdown_event.sse_length", error)) return STATUS_ERR; + if (check_sctp_assoc_t_expr(expr->sse_assoc_id, sctp_event->sse_assoc_id, + "sctp_shutdown_event.sse_assoc_id", error)) + return STATUS_ERR; return STATUS_OK; } @@ -4456,7 +5047,7 @@ static int check_sctp_adaptation_event(struct sctp_adaptation_event_expr *expr, if (check_u32_expr(expr->sai_adaptation_ind, sctp_event->sai_adaptation_ind, "sctp_adaptation_event.sai_adaptation_ind", error)) return STATUS_ERR; - if (check_u32_expr(expr->sai_assoc_id, sctp_event->sai_assoc_id, + if (check_sctp_assoc_t_expr(expr->sai_assoc_id, sctp_event->sai_assoc_id, "sctp_adaptation_event.sai_assoc_id", error)) return STATUS_ERR; @@ -4501,7 +5092,7 @@ static int check_sctp_pdapi_event(struct sctp_pdapi_event_expr *expr, "sctp_pdapi_event.pdapi_seq", error)) return STATUS_ERR; #endif - if (check_u32_expr(expr->pdapi_assoc_id, sctp_event->pdapi_assoc_id, + if (check_sctp_assoc_t_expr(expr->pdapi_assoc_id, sctp_event->pdapi_assoc_id, "sctp_pdapi_event.pdapi_assoc_id", error)) return STATUS_ERR; @@ -4529,7 +5120,7 @@ static int check_sctp_authkey_event(struct sctp_authkey_event_expr *expr, if (check_u32_expr(expr->auth_indication, sctp_event->auth_indication, "sctp_authkey_event.auth_indication", error)) return STATUS_ERR; - if (check_u32_expr(expr->auth_assoc_id, sctp_event->auth_assoc_id, + if (check_sctp_assoc_t_expr(expr->auth_assoc_id, sctp_event->auth_assoc_id, "sctp_authkey_event.auth_assoc_id", error)) return STATUS_ERR; @@ -4551,7 +5142,7 @@ static int check_sctp_sender_dry_event(struct sctp_sender_dry_event_expr *expr, if (check_u32_expr(expr->sender_dry_length, sctp_event->sender_dry_length, "sctp_sender_dry.sender_dry_length", error)) return STATUS_ERR; - if (check_u32_expr(expr->sender_dry_assoc_id, sctp_event->sender_dry_assoc_id, + if (check_sctp_assoc_t_expr(expr->sender_dry_assoc_id, sctp_event->sender_dry_assoc_id, "sctp_sender_dry.sender_dry_assoc_id", error)) return STATUS_ERR; @@ -4579,7 +5170,7 @@ static int check_sctp_send_failed_event(struct sctp_send_failed_event_expr *expr if (check_sctp_sndinfo(expr->ssfe_info->value.sctp_sndinfo, &sctp_event->ssfe_info, error)) return STATUS_ERR; } - if (check_u32_expr(expr->ssfe_assoc_id, sctp_event->ssfe_assoc_id, + if (check_sctp_assoc_t_expr(expr->ssfe_assoc_id, sctp_event->ssfe_assoc_id, "sctp_send_failed.ssfe_assoc_id", error)) return STATUS_ERR; if (check_u8array_expr(expr->ssfe_data, sctp_event->ssfe_data, @@ -4964,7 +5555,7 @@ static int syscall_sctp_connectx(struct state *state, struct syscall_spec *sysca if (check_arg_count(assoc_expr->value.list, 1, error)) return STATUS_ERR; assoc_expr = get_arg(assoc_expr->value.list, 0, error); - if (check_u32_expr(assoc_expr, (u32)live_associd, + if (check_sctp_assoc_t_expr(assoc_expr, live_associd, "sctp_connectx assoc_id", error)) return STATUS_ERR; @@ -4991,7 +5582,7 @@ static int syscall_sctp_peeloff(struct state *state, struct syscall_spec *syscal if (to_live_fd(state, script_fd, &live_fd, error)) return STATUS_ERR; expr_assoc = get_arg(args, 1, error); - if (get_u32(expr_assoc, (u32 *)&assoc_id, error)) + if (get_sctp_assoc_t(expr_assoc, &assoc_id, error)) return STATUS_ERR; //check connection Type and set assoc_id if one-to-many style socket @@ -5038,7 +5629,7 @@ static int syscall_sctp_getpaddrs(struct state *state, struct syscall_spec *sysc if (to_live_fd(state, script_fd, &live_fd, error)) return STATUS_ERR; assoc_expr = get_arg(args, 1, error); - if (get_u32(assoc_expr, (u32 *)&assoc_id, error)) + if (get_sctp_assoc_t(assoc_expr, &assoc_id, error)) return STATUS_ERR; begin_syscall(state, syscall); @@ -5123,7 +5714,7 @@ static int syscall_sctp_getladdrs(struct state *state, struct syscall_spec *sysc if (to_live_fd(state, script_fd, &live_fd, error)) return STATUS_ERR; assoc_expr = get_arg(args, 1, error); - if (get_u32(assoc_expr, (u32 *)&assoc_id, error)) + if (get_sctp_assoc_t(assoc_expr, &assoc_id, error)) return STATUS_ERR; begin_syscall(state, syscall); diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c index 47d6c43b72f57f6699bec8c45031b025e24c7218..1b78fccfec74215093642b6e0833afbbf83e1a41 100644 --- a/gtests/net/packetdrill/script.c +++ b/gtests/net/packetdrill/script.c @@ -70,6 +70,8 @@ struct expression_type_entry expression_type_table[] = { { EXPR_SCTP_RTOINFO, "sctp_rtoinfo"}, { EXPR_SCTP_INITMSG, "sctp_initmsg"}, { EXPR_SCTP_ASSOC_VALUE, "sctp_assoc_value"}, + { EXPR_SCTP_HMACALGO, "sctp_hmacalgo"}, + { EXPR_SCTP_AUTHKEYID, "sctp_authkeyid"}, { EXPR_SCTP_SACKINFO, "sctp_sackinfo"}, { EXPR_SCTP_STATUS, "sctp_status"}, { EXPR_SCTP_PADDRINFO, "sctp_paddrinfo"}, @@ -79,9 +81,11 @@ struct expression_type_entry expression_type_table[] = { { EXPR_SCTP_EVENT, "sctp_event" }, { EXPR_SCTP_EVENT_SUBSCRIBE, "sctp_event_subscribe"}, { EXPR_SCTP_SNDINFO, "sctp_sndinfo" }, + { EXPR_SCTP_SETPRIM, "sctp_setprim" }, { EXPR_SCTP_SETADAPTATION, "sctp_setadaptation"}, { EXPR_SCTP_SNDRCVINFO, "sctp_sndrcvinfo" }, { EXPR_SCTP_PRINFO, "sctp_prinfo" }, + { EXPR_SCTP_DEFAULT_PRINFO, "sctp_default_prinfo"}, { EXPR_SCTP_AUTHINFO, "sctp_authinfo" }, { EXPR_SCTP_SENDV_SPA, "sctp_sendv_spa" }, { EXPR_SCTP_RCVINFO, "sctp_rcvinfo" }, @@ -99,6 +103,11 @@ struct expression_type_entry expression_type_table[] = { { EXPR_SCTP_SEND_FAILED_EVENT,"sctp_send_failed_event"}, { EXPR_SCTP_TLV, "sctp_tlv" }, { EXPR_SCTP_EXTRCVINFO, "sctp_extrcvinfo" }, + { EXPR_SCTP_ASSOC_IDS, "sctp_assoc_ids" }, + { EXPR_SCTP_AUTHCHUNKS, "sctp_authchunks" }, + { EXPR_SCTP_SETPEERPRIM, "sctp_setpeerprim"}, + { EXPR_SCTP_AUTHCHUNK, "sctp_authchunk" }, + { EXPR_SCTP_AUTHKEY, "sctp_authkey" }, { NUM_EXPR_TYPES, NULL} }; @@ -313,12 +322,19 @@ void free_expression(struct expression *expression) break; case EXPR_SCTP_RTOINFO: assert(expression->value.sctp_rtoinfo); + free_expression(expression->value.sctp_rtoinfo->srto_assoc_id); free_expression(expression->value.sctp_rtoinfo->srto_initial); free_expression(expression->value.sctp_rtoinfo->srto_max); free_expression(expression->value.sctp_rtoinfo->srto_min); break; + case EXPR_SCTP_HMACALGO: + assert(expression->value.sctp_hmacalgo); + free_expression(expression->value.sctp_hmacalgo->shmac_number_of_idents); + free_expression(expression->value.sctp_hmacalgo->shmac_idents); + break; case EXPR_SCTP_ASSOC_VALUE: assert(expression->value.sctp_assoc_value); + free_expression(expression->value.sctp_assoc_value->assoc_id); free_expression(expression->value.sctp_assoc_value->assoc_value); break; case EXPR_SCTP_INITMSG: @@ -328,13 +344,20 @@ void free_expression(struct expression *expression) free_expression(expression->value.sctp_initmsg->sinit_max_attempts); free_expression(expression->value.sctp_initmsg->sinit_max_init_timeo); break; + case EXPR_SCTP_AUTHKEYID: + assert(expression->value.sctp_authkeyid); + free_expression(expression->value.sctp_authkeyid->scact_assoc_id); + free_expression(expression->value.sctp_authkeyid->scact_keynumber); + break; case EXPR_SCTP_SACKINFO: assert(expression->value.sctp_sack_info); + free_expression(expression->value.sctp_sack_info->sack_assoc_id); free_expression(expression->value.sctp_sack_info->sack_delay); - free_expression(expression->value.sctp_sack_info->sack_freq); + free_expression(expression->value.sctp_sack_info->sack_freq); break; case EXPR_SCTP_PADDRINFO: assert(expression->value.sctp_paddrinfo); + free_expression(expression->value.sctp_paddrinfo->spinfo_assoc_id); free_expression(expression->value.sctp_paddrinfo->spinfo_address); free_expression(expression->value.sctp_paddrinfo->spinfo_state); free_expression(expression->value.sctp_paddrinfo->spinfo_cwnd); @@ -344,6 +367,7 @@ void free_expression(struct expression *expression) break; case EXPR_SCTP_STATUS: assert(expression->value.sctp_status); + free_expression(expression->value.sctp_status->sstat_assoc_id); free_expression(expression->value.sctp_status->sstat_state); free_expression(expression->value.sctp_status->sstat_rwnd); free_expression(expression->value.sctp_status->sstat_unackdata); @@ -355,6 +379,7 @@ void free_expression(struct expression *expression) break; case EXPR_SCTP_PEER_ADDR_PARAMS: assert(expression->value.sctp_paddrparams); + free_expression(expression->value.sctp_paddrparams->spp_assoc_id); free_expression(expression->value.sctp_paddrparams->spp_address); free_expression(expression->value.sctp_paddrparams->spp_hbinterval); free_expression(expression->value.sctp_paddrparams->spp_pathmaxrxt); @@ -369,6 +394,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); @@ -376,6 +402,7 @@ void free_expression(struct expression *expression) free_expression(expression->value.sctp_assocparams->sasoc_cookie_life); break; case EXPR_SCTP_EVENT: + free_expression(expression->value.sctp_event->se_assoc_id); free_expression(expression->value.sctp_event->se_type); free_expression(expression->value.sctp_event->se_on); break; @@ -397,6 +424,10 @@ void free_expression(struct expression *expression) free_expression(expression->value.sctp_sndinfo->snd_ppid); free_expression(expression->value.sctp_sndinfo->snd_context); free_expression(expression->value.sctp_sndinfo->snd_assoc_id); + break; + case EXPR_SCTP_SETPRIM: + free_expression(expression->value.sctp_setprim->ssp_assoc_id); + free_expression(expression->value.sctp_setprim->ssp_addr); break; case EXPR_SCTP_SETADAPTATION: free_expression(expression->value.sctp_setadaptation->ssb_adaptation_ind); @@ -416,6 +447,11 @@ void free_expression(struct expression *expression) free_expression(expression->value.sctp_prinfo->pr_policy); free_expression(expression->value.sctp_prinfo->pr_value); break; + case EXPR_SCTP_DEFAULT_PRINFO: + free_expression(expression->value.sctp_default_prinfo->pr_policy); + free_expression(expression->value.sctp_default_prinfo->pr_value); + free_expression(expression->value.sctp_default_prinfo->pr_assoc_id); + break; case EXPR_SCTP_AUTHINFO: free_expression(expression->value.sctp_authinfo->auth_keynumber); break; @@ -487,6 +523,7 @@ void free_expression(struct expression *expression) free_expression(expression->value.sctp_shutdown_event->sse_type); free_expression(expression->value.sctp_shutdown_event->sse_flags); free_expression(expression->value.sctp_shutdown_event->sse_length); + free_expression(expression->value.sctp_shutdown_event->sse_assoc_id); break; case EXPR_SCTP_ADAPTATION_EVENT: free_expression(expression->value.sctp_adaptation_event->sai_type); @@ -548,6 +585,28 @@ void free_expression(struct expression *expression) free_expression(expression->value.sctp_extrcvinfo->serinfo_next_ppid); free_expression(expression->value.sctp_extrcvinfo->sinfo_assoc_id); break; + case EXPR_SCTP_ASSOC_IDS: + free_expression(expression->value.sctp_assoc_ids->gaids_number_of_ids); + free_expression(expression->value.sctp_assoc_ids->gaids_assoc_id); + break; + case EXPR_SCTP_AUTHCHUNKS: + free_expression(expression->value.sctp_authchunks->gauth_assoc_id); + free_expression(expression->value.sctp_authchunks->gauth_number_of_chunks); + free_expression(expression->value.sctp_authchunks->gauth_chunks); + break; + case EXPR_SCTP_SETPEERPRIM: + free_expression(expression->value.sctp_setpeerprim->sspp_assoc_id); + free_expression(expression->value.sctp_setpeerprim->sspp_addr); + break; + case EXPR_SCTP_AUTHCHUNK: + free_expression(expression->value.sctp_authchunk->sauth_chunk); + break; + case EXPR_SCTP_AUTHKEY: + free_expression(expression->value.sctp_authkey->sca_assoc_id); + free_expression(expression->value.sctp_authkey->sca_keynumber); + free_expression(expression->value.sctp_authkey->sca_keylength); + free_expression(expression->value.sctp_authkey->sca_key); + break; case EXPR_WORD: assert(expression->value.string); free(expression->value.string); @@ -787,6 +846,10 @@ static int evaluate_sctp_rtoinfo_expression(struct expression *in, in_rtoinfo = in->value.sctp_rtoinfo; out_rtoinfo = out->value.sctp_rtoinfo; + if (evaluate(in_rtoinfo->srto_assoc_id, + &out_rtoinfo->srto_assoc_id, + error)) + return STATUS_ERR; if (evaluate(in_rtoinfo->srto_initial, &out_rtoinfo->srto_initial, error)) @@ -838,6 +901,34 @@ static int evaluate_sctp_initmsg_expression(struct expression *in, return STATUS_OK; } +static int evaluate_sctp_hmacalgo_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_hmacalgo_expr *in_hmac; + struct sctp_hmacalgo_expr *out_hmac; + + assert(in->type == EXPR_SCTP_HMACALGO); + assert(in->value.sctp_hmacalgo); + assert(out->type == EXPR_SCTP_HMACALGO); + + out->value.sctp_hmacalgo = calloc(1, sizeof(struct sctp_hmacalgo_expr)); + + in_hmac = in->value.sctp_hmacalgo; + out_hmac = out->value.sctp_hmacalgo; + + if (evaluate(in_hmac->shmac_number_of_idents, + &out_hmac->shmac_number_of_idents, + error)) + return STATUS_ERR; + if (evaluate(in_hmac->shmac_idents, + &out_hmac->shmac_idents, + error)) + return STATUS_ERR; + + return STATUS_OK; +} + static int evaluate_sctp_assoc_value_expression(struct expression *in, struct expression *out, char **error) @@ -854,6 +945,10 @@ static int evaluate_sctp_assoc_value_expression(struct expression *in, in_value = in->value.sctp_assoc_value; out_value = out->value.sctp_assoc_value; + if (evaluate(in_value->assoc_id, + &out_value->assoc_id, + error)) + return STATUS_ERR; if (evaluate(in_value->assoc_value, &out_value->assoc_value, error)) @@ -862,6 +957,33 @@ static int evaluate_sctp_assoc_value_expression(struct expression *in, return STATUS_OK; } +static int evaluate_sctp_authkeyid_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_authkeyid_expr *in_authkeyid; + struct sctp_authkeyid_expr *out_authkeyid; + + assert(in->type == EXPR_SCTP_AUTHKEYID); + assert(in->value.sctp_authkeyid); + assert(out->type == EXPR_SCTP_AUTHKEYID); + + out->value.sctp_authkeyid = calloc(1, sizeof(struct sctp_authkeyid_expr)); + + in_authkeyid = in->value.sctp_authkeyid; + out_authkeyid = out->value.sctp_authkeyid; + + if (evaluate(in_authkeyid->scact_assoc_id, + &out_authkeyid->scact_assoc_id, + error)) + return STATUS_ERR; + if (evaluate(in_authkeyid->scact_keynumber, + &out_authkeyid->scact_keynumber, + error)) + return STATUS_ERR; + return STATUS_OK; +} + static int evaluate_sctp_sack_info_expression(struct expression *in, struct expression *out, char **error) @@ -878,6 +1000,10 @@ static int evaluate_sctp_sack_info_expression(struct expression *in, in_sack_info = in->value.sctp_sack_info; out_sack_info = out->value.sctp_sack_info; + if (evaluate(in_sack_info->sack_assoc_id, + &out_sack_info->sack_assoc_id, + error)) + return STATUS_ERR; if (evaluate(in_sack_info->sack_delay, &out_sack_info->sack_delay, error)) @@ -906,6 +1032,10 @@ static int evaluate_sctp_paddrinfo_expression(struct expression *in, in_paddrinfo = in->value.sctp_paddrinfo; out_paddrinfo = out->value.sctp_paddrinfo; + if (evaluate(in_paddrinfo->spinfo_assoc_id, + &out_paddrinfo->spinfo_assoc_id, + error)) + return STATUS_ERR; if (evaluate(in_paddrinfo->spinfo_address, &out_paddrinfo->spinfo_address, error)) @@ -950,6 +1080,10 @@ static int evaluate_sctp_status_expression(struct expression *in, in_status = in->value.sctp_status; out_status = out->value.sctp_status; + if (evaluate(in_status->sstat_assoc_id, + &out_status->sstat_assoc_id, + error)) + return STATUS_ERR; if (evaluate(in_status->sstat_state, &out_status->sstat_state, error)) @@ -1001,6 +1135,10 @@ static int evaluate_sctp_peer_addr_param_expression(struct expression *in, in_paddrparams = in->value.sctp_paddrparams; out_paddrparams = out->value.sctp_paddrparams; + if (evaluate(in_paddrparams->spp_assoc_id, + &out_paddrparams->spp_assoc_id, + error)) + return STATUS_ERR; if (evaluate(in_paddrparams->spp_address, &out_paddrparams->spp_address, error)) @@ -1076,6 +1214,10 @@ static int evaluate_sctp_event_expression(struct expression *in, in_event = in->value.sctp_event; out_event = out->value.sctp_event; + if (evaluate(in_event->se_assoc_id, + &out_event->se_assoc_id, + error)) + return STATUS_ERR; if (evaluate(in_event->se_type, &out_event->se_type, error)) @@ -1164,6 +1306,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)) @@ -1227,6 +1373,34 @@ static int evaluate_sctp_sndinfo_expression(struct expression *in, return STATUS_OK; } +static int evaluate_sctp_setprim_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_setprim_expr *in_prim; + struct sctp_setprim_expr *out_prim; + + assert(in->type == EXPR_SCTP_SETPRIM); + assert(in->value.sctp_setprim); + assert(out->type == EXPR_SCTP_SETPRIM); + + out->value.sctp_setprim = calloc(1, sizeof(struct sctp_setprim_expr)); + + in_prim = in->value.sctp_setprim; + out_prim = out->value.sctp_setprim; + + if (evaluate(in_prim->ssp_assoc_id, + &out_prim->ssp_assoc_id, + error)) + return STATUS_ERR; + if (evaluate(in_prim->ssp_addr, + &out_prim->ssp_addr, + error)) + return STATUS_ERR; + + return STATUS_OK; +} + static int evaluate_sctp_setadaptation_expression(struct expression *in, struct expression *out, char **error) @@ -1335,6 +1509,38 @@ static int evaluate_sctp_prinfo_expression(struct expression *in, return STATUS_OK; } +static int evaluate_sctp_default_prinfo_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_default_prinfo_expr *in_info; + struct sctp_default_prinfo_expr *out_info; + + assert(in->type == EXPR_SCTP_DEFAULT_PRINFO); + assert(in->value.sctp_default_prinfo); + assert(out->type == EXPR_SCTP_DEFAULT_PRINFO); + + out->value.sctp_default_prinfo = calloc(1, sizeof(struct sctp_default_prinfo_expr)); + + in_info = in->value.sctp_default_prinfo; + out_info = out->value.sctp_default_prinfo; + + if (evaluate(in_info->pr_policy, + &out_info->pr_policy, + error)) + return STATUS_ERR; + if (evaluate(in_info->pr_value, + &out_info->pr_value, + error)) + return STATUS_ERR; + if (evaluate(in_info->pr_assoc_id, + &out_info->pr_assoc_id, + error)) + return STATUS_ERR; + + return STATUS_OK; +} + static int evaluate_sctp_authinfo_expression(struct expression *in, struct expression *out, char **error) @@ -1737,6 +1943,10 @@ static int evaluate_sctp_shutdown_event_expression(struct expression *in, &out_event->sse_length, error)) return STATUS_ERR; + if (evaluate(in_event->sse_assoc_id, + &out_event->sse_assoc_id, + error)) + return STATUS_ERR; return STATUS_OK; } @@ -2064,6 +2274,150 @@ static int evaluate_sctp_extrcvinfo_expression(struct expression *in, return STATUS_OK; } +static int evaluate_sctp_assoc_ids_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_assoc_ids_expr *in_ids; + struct sctp_assoc_ids_expr *out_ids; + + assert(in->type == EXPR_SCTP_ASSOC_IDS); + assert(in->value.sctp_assoc_ids); + assert(out->type == EXPR_SCTP_ASSOC_IDS); + + out->value.sctp_assoc_ids = calloc(1, sizeof(struct sctp_assoc_ids_expr)); + + in_ids = in->value.sctp_assoc_ids; + out_ids = out->value.sctp_assoc_ids; + + if (evaluate(in_ids->gaids_number_of_ids, + &out_ids->gaids_number_of_ids, + error)) + return STATUS_ERR; + if (evaluate(in_ids->gaids_assoc_id, + &out_ids->gaids_assoc_id, + error)) + return STATUS_ERR; + return STATUS_OK; +} + +static int evaluate_sctp_authchunks_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_authchunks_expr *in_chunks; + struct sctp_authchunks_expr *out_chunks; + + assert(in->type == EXPR_SCTP_AUTHCHUNKS); + assert(in->value.sctp_authchunks); + assert(out->type == EXPR_SCTP_AUTHCHUNKS); + + out->value.sctp_authchunks = calloc(1, sizeof(struct sctp_authchunks_expr)); + + in_chunks = in->value.sctp_authchunks; + out_chunks = out->value.sctp_authchunks; + + if (evaluate(in_chunks->gauth_assoc_id, + &out_chunks->gauth_assoc_id, + error)) + return STATUS_ERR; + if (evaluate(in_chunks->gauth_number_of_chunks, + &out_chunks->gauth_number_of_chunks, + error)) + return STATUS_ERR; + if (evaluate(in_chunks->gauth_chunks, + &out_chunks->gauth_chunks, + error)) + return STATUS_ERR; + return STATUS_OK; +} + +static int evaluate_sctp_setpeerprim_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_setpeerprim_expr *in_sspp; + struct sctp_setpeerprim_expr *out_sspp; + + assert(in->type == EXPR_SCTP_SETPEERPRIM); + assert(in->value.sctp_setpeerprim); + assert(out->type == EXPR_SCTP_SETPEERPRIM); + + out->value.sctp_setpeerprim = calloc(1, sizeof(struct sctp_setpeerprim_expr)); + + in_sspp = in->value.sctp_setpeerprim; + out_sspp = out->value.sctp_setpeerprim; + + if (evaluate(in_sspp->sspp_assoc_id, + &out_sspp->sspp_assoc_id, + error)) + return STATUS_ERR; + if (evaluate(in_sspp->sspp_addr, + &out_sspp->sspp_addr, + error)) + return STATUS_ERR; + return STATUS_OK; +} + +static int evaluate_sctp_authchunk_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_authchunk_expr *in_authchunk; + struct sctp_authchunk_expr *out_authchunk; + + assert(in->type == EXPR_SCTP_AUTHCHUNK); + assert(in->value.sctp_authchunk); + assert(out->type == EXPR_SCTP_AUTHCHUNK); + + out->value.sctp_authchunk = calloc(1, sizeof(struct sctp_authchunk_expr)); + + in_authchunk = in->value.sctp_authchunk; + out_authchunk = out->value.sctp_authchunk; + + if (evaluate(in_authchunk->sauth_chunk, + &out_authchunk->sauth_chunk, + error)) + return STATUS_ERR; + return STATUS_OK; +} + +static int evaluate_sctp_authkey_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_authkey_expr *in_authkey; + struct sctp_authkey_expr *out_authkey; + + assert(in->type == EXPR_SCTP_AUTHKEY); + assert(in->value.sctp_authkey); + assert(out->type == EXPR_SCTP_AUTHKEY); + + out->value.sctp_authkey = calloc(1, sizeof(struct sctp_authkey_expr)); + + in_authkey = in->value.sctp_authkey; + out_authkey = out->value.sctp_authkey; + + if (evaluate(in_authkey->sca_assoc_id, + &out_authkey->sca_assoc_id, + error)) + return STATUS_ERR; + if (evaluate(in_authkey->sca_keynumber, + &out_authkey->sca_keynumber, + error)) + return STATUS_ERR; + if (evaluate(in_authkey->sca_keylength, + &out_authkey->sca_keylength, + error)) + return STATUS_ERR; + if (evaluate(in_authkey->sca_key, + &out_authkey->sca_key, + error)) + return STATUS_ERR; + + return STATUS_OK; +} + static int evaluate(struct expression *in, struct expression **out_ptr, char **error) { @@ -2095,12 +2449,18 @@ static int evaluate(struct expression *in, case EXPR_SCTP_ASSOCPARAMS: result = evaluate_sctp_accocparams_expression(in, out, error); break; + case EXPR_SCTP_HMACALGO: + result = evaluate_sctp_hmacalgo_expression(in, out, error); + break; case EXPR_SCTP_INITMSG: result = evaluate_sctp_initmsg_expression(in, out, error); break; case EXPR_SCTP_ASSOC_VALUE: result = evaluate_sctp_assoc_value_expression(in, out, error); break; + case EXPR_SCTP_AUTHKEYID: + result = evaluate_sctp_authkeyid_expression(in, out, error); + break; case EXPR_SCTP_SACKINFO: result = evaluate_sctp_sack_info_expression(in, out, error); break; @@ -2125,6 +2485,9 @@ static int evaluate(struct expression *in, case EXPR_SCTP_SNDINFO: result = evaluate_sctp_sndinfo_expression(in, out, error); break; + case EXPR_SCTP_SETPRIM: + result = evaluate_sctp_setprim_expression(in, out, error); + break; case EXPR_SCTP_SETADAPTATION: result = evaluate_sctp_setadaptation_expression(in, out, error); break; @@ -2134,6 +2497,9 @@ static int evaluate(struct expression *in, case EXPR_SCTP_PRINFO: result = evaluate_sctp_prinfo_expression(in, out, error); break; + case EXPR_SCTP_DEFAULT_PRINFO: + result = evaluate_sctp_default_prinfo_expression(in, out, error); + break; case EXPR_SCTP_AUTHINFO: result = evaluate_sctp_authinfo_expression(in, out, error); break; @@ -2185,6 +2551,21 @@ static int evaluate(struct expression *in, case EXPR_SCTP_EXTRCVINFO: result = evaluate_sctp_extrcvinfo_expression(in, out, error); break; + case EXPR_SCTP_ASSOC_IDS: + result = evaluate_sctp_assoc_ids_expression(in, out, error); + break; + case EXPR_SCTP_AUTHCHUNKS: + result = evaluate_sctp_authchunks_expression(in, out, error); + break; + case EXPR_SCTP_SETPEERPRIM: + result = evaluate_sctp_setpeerprim_expression(in, out, error); + break; + case EXPR_SCTP_AUTHCHUNK: + result = evaluate_sctp_authchunk_expression(in, out, error); + break; + case EXPR_SCTP_AUTHKEY: + result = evaluate_sctp_authkey_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 00ab1b4b1c1be7cad8b2a3084b82cfb7f03d0888..6769d095c235523409f84915806502704ee57d23 100644 --- a/gtests/net/packetdrill/script.h +++ b/gtests/net/packetdrill/script.h @@ -50,6 +50,8 @@ enum expression_t { EXPR_SCTP_RTOINFO, /* struct sctp_rtoinfo for SCTP_RTOINFO */ EXPR_SCTP_INITMSG, /* struct sctp_initmsg for SCTP_INITMSG */ EXPR_SCTP_ASSOC_VALUE, /* struct sctp_assoc_value */ + EXPR_SCTP_HMACALGO, /* expression tree for sctp_hmacalgo struct for [gs]etsockopt */ + EXPR_SCTP_AUTHKEYID, /* expression tree for sctp_authkeyid struct for [gs]etsockopt */ EXPR_SCTP_SACKINFO, /* struct sctp_sack_info_expr for */ EXPR_SCTP_STATUS, /* struct sctp_status for SCTP_STATUS */ EXPR_SCTP_PADDRINFO, @@ -59,9 +61,11 @@ enum expression_t { EXPR_SCTP_EVENT, /* struct sctp_event for SCTP_EVENT */ EXPR_SCTP_EVENT_SUBSCRIBE,/* struct sctp_event_subscribe for SCTP_EVENTS */ EXPR_SCTP_SNDINFO, /* struct sctp_sndinfo for SCTP_DEFAULT_SNDINFO */ + EXPR_SCTP_SETPRIM, /* expression tree for sctp_setprim SCTP_PRIMARY_ADDR */ EXPR_SCTP_SETADAPTATION, /* struct sctp_setadaptation for SCTP_ADATTATION_LAYER */ EXPR_SCTP_SNDRCVINFO, /* struct sctp_sndrcvinfo for syscall sctp_recvmsg */ EXPR_SCTP_PRINFO, /* struct sctp_prinfo for syscall sctp_sendv */ + EXPR_SCTP_DEFAULT_PRINFO, /* expression tree for struct sctp_default_prinfo for syscall [gs]etsockopt */ EXPR_SCTP_AUTHINFO, /* struct sctp_authinfo for syscall sctp_sendv */ EXPR_SCTP_SENDV_SPA, /* struct sctp_sendv_spa for syscall sctp_sendv */ EXPR_SCTP_RCVINFO, /* struct sctp_rcvinfo for syscall sctp_recvv */ @@ -79,6 +83,11 @@ enum expression_t { EXPR_SCTP_SEND_FAILED_EVENT, /* expression tree for sctp_send_failed_event */ EXPR_SCTP_TLV, /* expression tree for sctp_notifications_stopped_event */ EXPR_SCTP_EXTRCVINFO, /* expression tree for sctp_extrcvinfo struct in cmsghdr */ + EXPR_SCTP_ASSOC_IDS, /* expression tree for sctp_assoc_ids struct for [gs]etsockopt */ + EXPR_SCTP_AUTHCHUNKS, /* expression tree for sctp_authchunks struct for [gs]etsockopt */ + EXPR_SCTP_SETPEERPRIM, /* expression tree for sctp_setpeerprim struct for [gs]etsockopt */ + EXPR_SCTP_AUTHCHUNK, /* expression tree for sctp_authchunk struct for setsockopt */ + EXPR_SCTP_AUTHKEY, /* expression tree for sctp_authkey struct for setsockopt */ NUM_EXPR_TYPES, }; /* Convert an expression type to a human-readable string */ @@ -101,7 +110,9 @@ struct expression { struct pollfd_expr *pollfd; struct sctp_rtoinfo_expr *sctp_rtoinfo; struct sctp_initmsg_expr *sctp_initmsg; + struct sctp_hmacalgo_expr *sctp_hmacalgo; struct sctp_assoc_value_expr *sctp_assoc_value; + struct sctp_authkeyid_expr *sctp_authkeyid; struct sctp_sack_info_expr *sctp_sack_info; struct sctp_status_expr *sctp_status; struct sctp_paddrinfo_expr *sctp_paddrinfo; @@ -111,9 +122,11 @@ struct expression { struct sctp_event_expr *sctp_event; struct sctp_event_subscribe_expr *sctp_event_subscribe; struct sctp_sndinfo_expr *sctp_sndinfo; + struct sctp_setprim_expr *sctp_setprim; struct sctp_setadaptation_expr *sctp_setadaptation; struct sctp_sndrcvinfo_expr *sctp_sndrcvinfo; struct sctp_prinfo_expr *sctp_prinfo; + struct sctp_default_prinfo_expr *sctp_default_prinfo; struct sctp_authinfo_expr *sctp_authinfo; struct sctp_sendv_spa_expr *sctp_sendv_spa; struct sctp_rcvinfo_expr *sctp_rcvinfo; @@ -131,6 +144,11 @@ struct expression { struct sctp_send_failed_event_expr *sctp_send_failed_event; struct sctp_tlv_expr *sctp_tlv; struct sctp_extrcvinfo_expr *sctp_extrcvinfo; + struct sctp_assoc_ids_expr *sctp_assoc_ids; + struct sctp_authchunks_expr *sctp_authchunks; + struct sctp_setpeerprim_expr *sctp_setpeerprim; + struct sctp_authchunk_expr *sctp_authchunk; + struct sctp_authkey_expr *sctp_authkey; } value; const char *format; /* the printf format for printing the value */ }; @@ -190,6 +208,7 @@ struct linger_expr { /* Parse tree for a sctp_rtoinfo struct in a [gs]etsockopt syscall. */ struct sctp_rtoinfo_expr { + struct expression *srto_assoc_id; struct expression *srto_initial; struct expression *srto_max; struct expression *srto_min; @@ -203,8 +222,15 @@ struct sctp_initmsg_expr { struct expression *sinit_max_init_timeo; }; +/* Parse tree for a sctp_hmacalgo struct in a [gs]etsockopt syscall. */ +struct sctp_hmacalgo_expr { + struct expression *shmac_number_of_idents; + struct expression *shmac_idents; +}; + /* Parse tree for a sctp_assoc_value struct in a [gs]etsockopt syscall. */ struct sctp_assoc_value_expr { + struct expression *assoc_id; struct expression *assoc_value; }; @@ -214,14 +240,22 @@ struct sctp_stream_value_expr { struct expression *stream_value; }; +/* Parse tree for a sctp_authkey struct in a [gs]etsockopt syscall. */ +struct sctp_authkeyid_expr { + struct expression *scact_assoc_id; + struct expression *scact_keynumber; +}; + /* Parse tree for a sctp_sack_info struct in a [gs]etsockopt syscall. */ struct sctp_sack_info_expr { + struct expression *sack_assoc_id; struct expression *sack_delay; struct expression *sack_freq; }; /* Parse tree for a sctp_status struct in a [gs]etsockopt syscall. */ struct sctp_status_expr { + struct expression *sstat_assoc_id; struct expression *sstat_state; struct expression *sstat_rwnd; struct expression *sstat_unackdata; @@ -234,6 +268,7 @@ struct sctp_status_expr { /* Parse tree for a sctp_paddrinfo struct in a [gs]etsockopt syscall. */ struct sctp_paddrinfo_expr { + struct expression *spinfo_assoc_id; struct expression *spinfo_address; struct expression *spinfo_state; struct expression *spinfo_cwnd; @@ -244,6 +279,7 @@ struct sctp_paddrinfo_expr { /* Parse tree for a sctp_paddrparams struct in a [gs]etsockopt syscall. */ struct sctp_paddrparams_expr { + struct expression *spp_assoc_id; struct expression *spp_address; struct expression *spp_hbinterval; struct expression *spp_pathmaxrxt; @@ -255,6 +291,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; @@ -264,6 +301,7 @@ struct sctp_assocparams_expr { /* Parse tree for sctp_event struct in [gs]etsockopt syscall. */ struct sctp_event_expr { + struct expression *se_assoc_id; struct expression *se_type; struct expression *se_on; }; @@ -291,6 +329,12 @@ struct sctp_sndinfo_expr { struct expression *snd_assoc_id; }; +/* Parse tree for sctp_setadaptation struct in [gs]etsockopt syscall. */ +struct sctp_setprim_expr { + struct expression *ssp_assoc_id; + struct expression *ssp_addr; +}; + /* Parse tree for sctp_setadaptation struct in [gs]etsockopt syscall. */ struct sctp_setadaptation_expr { struct expression *ssb_adaptation_ind; @@ -315,6 +359,13 @@ struct sctp_prinfo_expr { struct expression *pr_value; }; +/* Parse tree for sctp_default_prinfo in [gs]etsockopt syscall. */ +struct sctp_default_prinfo_expr { + struct expression *pr_policy; + struct expression *pr_value; + struct expression *pr_assoc_id; +}; + /* Parse tree for sctp_authinfo in sctp_sendv syscall. */ struct sctp_authinfo_expr { struct expression *auth_keynumber; @@ -405,6 +456,7 @@ struct sctp_shutdown_event_expr { struct expression *sse_type; struct expression *sse_flags; struct expression *sse_length; + struct expression *sse_assoc_id; }; /* Parse tree for sctp_adaptation_event for notifications. */ @@ -481,6 +533,38 @@ struct sctp_extrcvinfo_expr { struct expression *sinfo_assoc_id; }; +/* Parse tree for sctp_extrcvinfo struct for [gs]etsockopt. */ +struct sctp_assoc_ids_expr { + struct expression *gaids_number_of_ids; + struct expression *gaids_assoc_id; +}; + +/* Parse tree for sctp_authchunks struct for [gs]etsockopt. */ +struct sctp_authchunks_expr { + struct expression *gauth_assoc_id; + struct expression *gauth_number_of_chunks; + struct expression *gauth_chunks; +}; + +/* Parse tree for sctp_setpeerprim struct for [gs]etsockopt. */ +struct sctp_setpeerprim_expr { + struct expression *sspp_assoc_id; + struct expression *sspp_addr; +}; + +/* Parse tree for sctp_authchunk struct for setsockopt. */ +struct sctp_authchunk_expr { + struct expression *sauth_chunk; +}; + +/* Parse tree for sctp_authkey struct for setsockopt. */ +struct sctp_authkey_expr { + struct expression *sca_assoc_id; + struct expression *sca_keynumber; + struct expression *sca_keylength; + struct expression *sca_key; +}; + /* 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 a3adfe351b873ca8a1ef0b973b198922e7852b75..3d245a68dfe9f0aff27794814ad55e638c4692f0 100644 --- a/gtests/net/packetdrill/symbols_freebsd.c +++ b/gtests/net/packetdrill/symbols_freebsd.c @@ -84,17 +84,40 @@ struct int_symbol platform_symbols_table[] = { { SCTP_INITMSG, "SCTP_INITMSG" }, { SCTP_INIT, "SCTP_INIT" }, { SCTP_NODELAY, "SCTP_NODELAY" }, + { SCTP_AUTOCLOSE, "SCTP_AUTOCLOSE" }, + { SCTP_PRIMARY_ADDR, "SCTP_PRIMARY_ADDR" }, { SCTP_ADAPTATION_LAYER, "SCTP_ADAPTATION_LAYER" }, + { SCTP_DISABLE_FRAGMENTS, "SCTP_DISABLE_FRAGMENTS" }, + { SCTP_DEFAULT_SEND_PARAM, "SCTP_DEFAULT_SEND_PARAM" }, + { SCTP_I_WANT_MAPPED_V4_ADDR, "SCTP_I_WANT_MAPPED_V4_ADDR" }, { SCTP_MAXSEG, "SCTP_MAXSEG" }, + { SCTP_HMAC_IDENT, "SCTP_HMAC_IDENT" }, + { SCTP_AUTH_ACTIVE_KEY, "SCTP_AUTH_ACTIVE_KEY" }, { SCTP_DELAYED_SACK, "SCTP_DELAYED_SACK" }, + { SCTP_PARTIAL_DELIVERY_POINT, "SCTP_PARTIAL_DELIVERY_POINT" }, + { SCTP_AUTO_ASCONF, "SCTP_AUTO_ASCONF" }, { SCTP_MAX_BURST, "SCTP_MAX_BURST" }, + { SCTP_CONTEXT, "SCTP_CONTEXT" }, { SCTP_PEER_ADDR_PARAMS, "SCTP_PEER_ADDR_PARAMS" }, { SCTP_EVENT, "SCTP_EVENT" }, + { SCTP_EXPLICIT_EOR, "SCTP_EXPLICIT_EOR" }, + { SCTP_REUSE_PORT, "SCTP_REUSE_PORT" }, { SCTP_EVENTS, "SCTP_EVENTS" }, { SCTP_DEFAULT_SNDINFO, "SCTP_DEFAULT_SNDINFO" }, + { SCTP_DEFAULT_PRINFO, "SCTP_DEFAULT_PRINFO" }, { SCTP_STATUS, "SCTP_STATUS" }, { SCTP_GET_PEER_ADDR_INFO, "SCTP_GET_PEER_ADDR_INFO" }, + { SCTP_PEER_AUTH_CHUNKS, "SCTP_PEER_AUTH_CHUNKS" }, + { SCTP_LOCAL_AUTH_CHUNKS, "SCTP_LOCAL_AUTH_CHUNKS" }, + { SCTP_GET_ASSOC_NUMBER, "SCTP_GET_ASSOC_NUMBER" }, + { SCTP_GET_ASSOC_ID_LIST, "SCTP_GET_ASSOC_ID_LIST" }, + { SCTP_SET_PEER_PRIMARY_ADDR, "SCTP_SET_PEER_PRIMARY_ADDR" }, + { SCTP_AUTH_CHUNK, "SCTP_AUTH_CHUNK" }, + { SCTP_AUTH_KEY, "SCTP_AUTH_KEY" }, + { SCTP_AUTH_DEACTIVATE_KEY, "SCTP_AUTH_DEACTIVATE_KEY" }, + { SCTP_AUTH_DELETE_KEY, "SCTP_AUTH_DELETE_KEY" }, { SCTP_FRAGMENT_INTERLEAVE, "SCTP_FRAGMENT_INTERLEAVE" }, + { SCTP_EXPLICIT_EOR, "SCTP_EXPLICIT_EOR" }, #if defined(SCTP_INTERLEAVING_SUPPORTED) { SCTP_INTERLEAVING_SUPPORTED, "SCTP_INTERLEAVING_SUPPORTED" }, #endif @@ -239,6 +262,8 @@ struct int_symbol platform_symbols_table[] = { { SCTP_DSTADDRV6, "SCTP_DSTADDRV6" }, { SCTP_EXTRCV, "SCTP_EXTRCV" }, { SCTP_USE_EXT_RCVINFO, "SCTP_USE_EXT_RCVINFO" }, + { SCTP_AUTH_HMAC_ID_SHA1, "SCTP_AUTH_HMAC_ID_SHA1" }, + { SCTP_AUTH_HMAC_ID_SHA256, "SCTP_AUTH_HMAC_ID_SHA256" }, /* /usr/include/netinet/tcp.h */ { TCP_NODELAY, "TCP_NODELAY" }, { TCP_MAXSEG, "TCP_MAXSEG" }, diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg.pkt new file mode 100644 index 0000000000000000000000000000000000000000..bf44947527a16a98c19550410182fff1011606e2 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg.pkt @@ -0,0 +1,168 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//recvmsg(sd, msghdr, flags) ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, + {spp_assoc_id=0, + spp_address=..., + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 +//base test ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(0)=[], + msg_flags=MSG_EOR}, 0) = 1000 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0 ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=2, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(40)=[{cmsg_len=40, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_RCVINFO, + cmsg_data={rcv_sid=0, + rcv_ssn=0, + rcv_flags=SCTP_UNORDERED, + rcv_ppid=htonl(0), + rcv_tsn=2, + rcv_cumtsn=2, + rcv_context=0, + rcv_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=3, sid=0, ssn=1, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=4, sid=0, ssn=2, ppid=1234] +* > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(28)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_NXTINFO, + cmsg_data={nxt_sid=0, + nxt_flags=SCTP_COMPLETE, + nxt_ppid=htonl(1234), + nxt_length=1000, + nxt_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=5, sid=0, ssn=0, ppid=9876] +* > sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(68)=[{cmsg_len=40, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_RCVINFO, + cmsg_data={rcv_sid=0, + rcv_ssn=2, + rcv_flags=0, + rcv_ppid=htonl(1234), + rcv_tsn=4, + rcv_cumtsn=5, + rcv_context=0, + rcv_assoc_id=...}}, + {cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_NXTINFO, + cmsg_data= {nxt_sid=0, + nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE, + nxt_ppid=htonl(9876), + nxt_length=1000, + nxt_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, + sctp_association_event=0, + sctp_address_event=0, + sctp_send_failure_event=0, + sctp_peer_error_event=0, + sctp_shutdown_event=0, + sctp_partial_delivery_event=0, + sctp_adaptation_layer_event=0, + sctp_authentication_event=0, + sctp_sender_dry_event=0}, 11) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [0], 4) = 0 ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(140)=[{cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDRCV, + cmsg_data={sinfo_stream=0, + sinfo_ssn=0, + sinfo_flags=SCTP_UNORDERED, + sinfo_ppid=htonl(9876), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=5, + sinfo_cumtsn=5, + sinfo_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], 4) = 0 ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=6, sid=0, ssn=3, ppid=9877] +* > sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(140)=[{cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_EXTRCV, + cmsg_data={sinfo_stream=0, + sinfo_ssn=3, + sinfo_flags=0, + sinfo_ppid=htonl(9877), + sinfo_context=0, + sinfo_pr_value=0, + sinfo_tsn=6, + sinfo_cumtsn=6, + serinfo_next_flags=0, + serinfo_next_stream=0, + serinfo_next_aid=0, + serinfo_next_length=0, + serinfo_next_ppid=htonl(0), + sinfo_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=7, sid=0, ssn=4, ppid=9878] +* > sctp: SACK[flgs=0, cum_tsn=7, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=8, sid=1, ssn=0, ppid=9879] +* > sctp: SACK[flgs=0, cum_tsn=8, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(140)=[{cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_EXTRCV, + cmsg_data={sinfo_stream=0, + sinfo_ssn=4, + sinfo_flags=0, + sinfo_ppid=htonl(9878), + sinfo_context=0, + sinfo_pr_value=0, + sinfo_tsn=7, + sinfo_cumtsn=8, + serinfo_next_flags=SCTP_NEXT_MSG_AVAIL|SCTP_NEXT_MSG_ISCOMPLETE|SCTP_NEXT_MSG_IS_UNORDERED, + serinfo_next_stream=1, + serinfo_next_aid=..., + serinfo_next_length=1000, + serinfo_next_ppid=htonl(9879), + sinfo_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_extrcv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_extrcv.pkt new file mode 100644 index 0000000000000000000000000000000000000000..3609bc3178d1483ed66ca38296cf41326b284f91 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_extrcv.pkt @@ -0,0 +1,108 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, + {spp_assoc_id=0, + spp_address=..., + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, + sctp_association_event=0, + sctp_address_event=0, + sctp_send_failure_event=0, + sctp_peer_error_event=0, + sctp_shutdown_event=0, + sctp_partial_delivery_event=0, + sctp_adaptation_layer_event=0, + sctp_authentication_event=0, + sctp_sender_dry_event=0}, 11) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], 4) = 0 + ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=9877] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(140)=[{cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_EXTRCV, + cmsg_data={sinfo_stream=0, + sinfo_ssn=0, + sinfo_flags=0, + sinfo_ppid=htonl(9877), + sinfo_context=0, + sinfo_pr_value=0, + sinfo_tsn=1, + sinfo_cumtsn=1, + serinfo_next_flags=0, + serinfo_next_stream=0, + serinfo_next_aid=0, + serinfo_next_length=0, + serinfo_next_ppid=htonl(0), + sinfo_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 + ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=2, sid=0, ssn=1, ppid=9878] +* > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=3, sid=1, ssn=0, ppid=9879] +* > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(140)=[{cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_EXTRCV, + cmsg_data={sinfo_stream=0, + sinfo_ssn=1, + sinfo_flags=0, + sinfo_ppid=htonl(9878), + sinfo_context=0, + sinfo_pr_value=0, + sinfo_tsn=2, + sinfo_cumtsn=3, + serinfo_next_flags=SCTP_NEXT_MSG_AVAIL|SCTP_NEXT_MSG_ISCOMPLETE|SCTP_NEXT_MSG_IS_UNORDERED, + serinfo_next_stream=1, + serinfo_next_aid=..., + serinfo_next_length=1000, + serinfo_next_ppid=htonl(9879), + sinfo_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 + ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=4, sid=2, ssn=0, ppid=9880] +* > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(140)=[{cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_EXTRCV, + cmsg_data={sinfo_stream=1, + sinfo_ssn=0, + sinfo_flags=SCTP_UNORDERED, + sinfo_ppid=htonl(9879), + sinfo_context=0, + sinfo_pr_value=0, + sinfo_tsn=3, + sinfo_cumtsn=4, + serinfo_next_flags=SCTP_NEXT_MSG_AVAIL|SCTP_NEXT_MSG_ISCOMPLETE|SCTP_NEXT_MSG_IS_UNORDERED, + serinfo_next_stream=2, + serinfo_next_aid=..., + serinfo_next_length=1000, + serinfo_next_ppid=htonl(9880)}}], + msg_flags=MSG_EOR}, 0) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_nxtinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_nxtinfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..aaea9f59ae4bc3ba1f7a105d6cc79ba0f69ed211 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_nxtinfo.pkt @@ -0,0 +1,93 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//recvmsg(sd, msghdr, flags) ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, + {spp_assoc_id=0, + spp_address=..., + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=2, sid=0, ssn=1, ppid=1234] +* > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(28)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_NXTINFO, + cmsg_data={nxt_sid=0, + nxt_flags=SCTP_COMPLETE, + nxt_ppid=htonl(1234), + nxt_length=1000, + nxt_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=3, sid=0, ssn=0, ppid=9876] +* > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(68)=[{cmsg_len=40, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_RCVINFO, + cmsg_data={rcv_sid=0, + rcv_ssn=1, + rcv_flags=0, + rcv_ppid=htonl(1234), + rcv_tsn=2, + rcv_cumtsn=3, + rcv_context=0, + rcv_assoc_id=3}}, + {cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_NXTINFO, + cmsg_data= {nxt_sid=0, + nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE, + nxt_ppid=htonl(9876), + nxt_length=1000, + nxt_assoc_id=3}}], + msg_flags=MSG_EOR}, 0) = 1000 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=4, sid=0, ssn=0, ppid=9876] +* > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(68)=[{cmsg_len=40, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_RCVINFO, + cmsg_data={rcv_sid=0, + rcv_ssn=0, + rcv_flags=SCTP_UNORDERED, + rcv_ppid=htonl(9876), + rcv_tsn=3, + rcv_cumtsn=4, + rcv_context=0}}, + {cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_NXTINFO, + cmsg_data= {nxt_sid=0, + nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE, + nxt_ppid=htonl(9876), + nxt_length=1000}}], + msg_flags=MSG_EOR}, 0) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_rcvinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_rcvinfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..9d19a020045722901690e98a75f633cbd3979295 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_rcvinfo.pkt @@ -0,0 +1,149 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//recvmsg(sd, msghdr, flags) ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, + {spp_assoc_id=0, + spp_address=..., + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 +//base test ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(0)=[], + msg_flags=MSG_EOR}, 0) = 1000 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0 ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=2, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(40)=[{cmsg_len=40, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_RCVINFO, + cmsg_data={rcv_sid=0, + rcv_ssn=0, + rcv_flags=SCTP_UNORDERED, + rcv_ppid=htonl(0), + rcv_tsn=2, + rcv_cumtsn=2, + rcv_context=0, + rcv_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=3, sid=0, ssn=1, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=4, sid=0, ssn=2, ppid=1234] +* > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(28)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_NXTINFO, + cmsg_data={nxt_sid=0, + nxt_flags=SCTP_COMPLETE, + nxt_ppid=htonl(1234), + nxt_length=1000, + nxt_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=5, sid=0, ssn=0, ppid=9876] +* > sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(68)=[{cmsg_len=40, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_RCVINFO, + cmsg_data={rcv_sid=0, + rcv_ssn=2, + rcv_flags=0, + rcv_ppid=htonl(1234), + rcv_tsn=4, + rcv_cumtsn=5, + rcv_context=0, + rcv_assoc_id=...}}, + {cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_NXTINFO, + cmsg_data= {nxt_sid=0, + nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE, + nxt_ppid=htonl(9876), + nxt_length=1000, + nxt_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, + sctp_association_event=0, + sctp_address_event=0, + sctp_send_failure_event=0, + sctp_peer_error_event=0, + sctp_shutdown_event=0, + sctp_partial_delivery_event=0, + sctp_adaptation_layer_event=0, + sctp_authentication_event=0, + sctp_sender_dry_event=0}, 11) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [0], 4) = 0 ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(140)=[{cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDRCV, + cmsg_data={sinfo_stream=0, + sinfo_ssn=0, + sinfo_flags=SCTP_UNORDERED, + sinfo_ppid=htonl(9876), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=5, + sinfo_cumtsn=5, + sinfo_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0, + sctp_association_event=0, + sctp_address_event=0, + sctp_send_failure_event=0, + sctp_peer_error_event=0, + sctp_shutdown_event=0, + sctp_partial_delivery_event=0, + sctp_adaptation_layer_event=0, + sctp_authentication_event=0, + sctp_sender_dry_event=0}, 11) = 0 ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=6, sid=0, ssn=0, ppid=9876] +* > sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(40)=[{cmsg_len=40, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_RCVINFO, + cmsg_data={rcv_sid=0, + rcv_ssn=0, + rcv_flags=SCTP_UNORDERED, + rcv_ppid=htonl(9876), + rcv_tsn=6, + rcv_cumtsn=6, + rcv_context=0}}], + msg_flags=MSG_EOR}, 0) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_sndrcv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_sndrcv.pkt new file mode 100644 index 0000000000000000000000000000000000000000..3e1c7fc76ade256d3abffece9dd5def28b48a93f --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg_sctp_sndrcv.pkt @@ -0,0 +1,89 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//recvmsg(sd, msghdr, flags) + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, + sctp_association_event=0, + sctp_address_event=0, + sctp_send_failure_event=0, + sctp_peer_error_event=0, + sctp_shutdown_event=0, + sctp_partial_delivery_event=0, + sctp_adaptation_layer_event=0, + sctp_authentication_event=0, + sctp_sender_dry_event=0}, 11) = 0 + + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, + {spp_assoc_id=0, + spp_address=..., + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=9877] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(140)=[{cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDRCV, + cmsg_data={sinfo_stream=0, + sinfo_ssn=0, + sinfo_flags=0, + sinfo_ppid=htonl(9877), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=1, + sinfo_cumtsn=1, + sinfo_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 + ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=2, sid=0, ssn=1, ppid=9878] +* > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(140)=[{cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDRCV, + cmsg_data={sinfo_stream=0, + sinfo_ssn=1, + sinfo_flags=SCTP_UNORDERED, + sinfo_ppid=htonl(9878), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=2, + sinfo_cumtsn=2, + sinfo_assoc_id=...}}], + msg_flags=MSG_EOR}, 0) = 1000 + ++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=3, sid=0, ssn=2, ppid=9879] +* > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(140)=[{cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDRCV, + cmsg_data={sinfo_stream=0, + sinfo_ssn=2, + sinfo_flags=SCTP_UNORDERED, + sinfo_ppid=htonl(9879), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=3, + sinfo_cumtsn=3}}], + msg_flags=MSG_EOR}, 0) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg.pkt new file mode 100644 index 0000000000000000000000000000000000000000..7dec990876a50acf1949cf4c9a10ea43c7510f4b --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg.pkt @@ -0,0 +1,154 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//sendmsg(sd, msghdr, flags) + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(0)=[], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + +//base test ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(28)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(3), + snd_context=2, + snd_assoc_id=0}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=0, ppid=3] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + +// test with 2 cmsg ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(44)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(4), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_DSTADDRV4, + cmsg_data={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=2, ssn=1, ppid=4] ++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]] + +// test with 2 cmsg ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(64)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(5), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_DSTADDRV4, + cmsg_data={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}, + {cmsg_len=18, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_PRINFO, + cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=2, ssn=2, ppid=5] ++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]] + +// test with 4 cmsg ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(80)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(6), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_DSTADDRV4, + cmsg_data={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}, + {cmsg_len=18, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_PRINFO, + cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}, + {cmsg_len=14, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_AUTHINFO, + cmsg_data={auth_keynumber=123}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=5, sid=2, ssn=3, ppid=6] ++0.0 < sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=1500, gaps=[], dups=[]] + +//test for sndrcvinfo ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(168)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(6), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDRCV, + cmsg_data={sinfo_stream=3, + sinfo_ssn=3, + sinfo_flags=0, + sinfo_ppid=htonl(7), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=6, + sinfo_cumtsn=6, + sinfo_assoc_id=3}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=6, sid=3, ssn=0, ppid=7] ++0.0 < sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_authinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_authinfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..73287130a3a050b27916cf1e786abff955ab266d --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_authinfo.pkt @@ -0,0 +1,58 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//sendmsg(sd, msghdr, flags) + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(44)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(6), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_AUTHINFO, + cmsg_data={auth_keynumber=123}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=6] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(16)=[{cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_AUTHINFO, + cmsg_data={auth_keynumber=123}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv4.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv4.pkt new file mode 100644 index 0000000000000000000000000000000000000000..c298b1777c8c2c2a304873edaf5fc9431cb56b22 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv4.pkt @@ -0,0 +1,62 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//sendmsg(sd, msghdr, flags) + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(16)=[{cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_DSTADDRV4, + cmsg_data={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(44)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(5), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_DSTADDRV4, + cmsg_data={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=0, ppid=5] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv6.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv6.pkt new file mode 100644 index 0000000000000000000000000000000000000000..60530f1f9ca496e6f85282a9c7123cd06257ea06 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv6.pkt @@ -0,0 +1,62 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//sendmsg(sd, msghdr, flags) + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, + spp_address={sa_family=AF_INET6, + sin_port=htons(8080), + sin_addr=inet_addr("2001:DB8::1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(16)=[{cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_DSTADDRV6, + cmsg_data={sa_family=AF_INET6, + sin_port=htons(8080), + sin_addr=inet_addr("2001:DB8::1")}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(44)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(5), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_DSTADDRV6, + cmsg_data={sa_family=AF_INET6, + sin_port=htons(8080), + sin_addr=inet_addr("2001:DB8::1")}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=0, ppid=5] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt new file mode 100644 index 0000000000000000000000000000000000000000..d92e3f7ac26bde06922d8f6e75af91759c7e045a --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt @@ -0,0 +1,36 @@ +--tolerance_usecs=100000 + +0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(64)=[{cmsg_len=20, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_INIT, + cmsg_data={sinit_num_ostreams=1, + sinit_max_instreams=1, + sinit_max_attempts=1, + sinit_max_init_timeo=100}}, + {cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(1234), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_DSTADDRV4, + cmsg_data={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}], msg_flags=0}, 0) = 1000 + +* > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] +* > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]; DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=1234] ++0.1 < sctp: COOKIE_ACK[flgs=0]; SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_prinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_prinfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..c4b32245c416cf9deea5da37838636cb601d4dc3 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_prinfo.pkt @@ -0,0 +1,58 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//sendmsg(sd, msghdr, flags) + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(48)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(6), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=20, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_PRINFO, + cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=6] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(20)=[{cmsg_len=20, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_PRINFO, + cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..b773b1b2b93f64f5e5013adabf46c4614560a4e1 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt @@ -0,0 +1,87 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//sendmsg(sd, msghdr, flags) + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(28)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=1, + snd_flags=0, + snd_ppid=htonl(3), + snd_context=2, + snd_assoc_id=0}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=1, ssn=0, ppid=3] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(28)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=1, + snd_flags=0, + snd_ppid=htonl(3), + snd_context=2, + snd_assoc_id=...}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=1, ssn=1, ppid=3] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(28)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=3, + snd_flags=0, + snd_ppid=htonl(32), + snd_context=2, + snd_assoc_id=...}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=3, ssn=0, ppid=32] ++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(28)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=4, + snd_flags=0, + snd_ppid=htonl(33), + snd_context=2}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=4, ssn=0, ppid=33] ++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]] + + + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt new file mode 100644 index 0000000000000000000000000000000000000000..4485ccf4c78d65f6ef91b9977becefec768bef37 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt @@ -0,0 +1,124 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +//sendmsg(sd, msghdr, flags) + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(140)=[{cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDRCV, + cmsg_data={sinfo_stream=3, + sinfo_ssn=0, + sinfo_flags=SCTP_SENDALL, + sinfo_ppid=htonl(7), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=1, + sinfo_cumtsn=1, + sinfo_assoc_id=3}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=7] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + +//test for sndrcvinfo ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(168)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(6), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDRCV, + cmsg_data={sinfo_stream=3, + sinfo_ssn=3, + sinfo_flags=0, + sinfo_ppid=htonl(7), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=3, + sinfo_cumtsn=3, + sinfo_assoc_id=3}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=3, ssn=1, ppid=7] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(168)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(6), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDRCV, + cmsg_data={sinfo_stream=3, + sinfo_ssn=3, + sinfo_flags=0, + sinfo_ppid=htonl(7), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=..., + sinfo_cumtsn=..., + sinfo_assoc_id=3}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=3, ssn=2, ppid=7] ++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(168)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(6), + snd_context=2}}, + {cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDRCV, + cmsg_data={sinfo_stream=3, + sinfo_ssn=3, + sinfo_flags=0, + sinfo_ppid=htonl(7), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=..., + sinfo_cumtsn=...}}], + msg_flags=0}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=3, ssn=3, ppid=7] ++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_adaptation_layer.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_adaptation_layer.pkt new file mode 100644 index 0000000000000000000000000000000000000000..145d3e6c49ac508a4bd85dae9853934b1b2460a1 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_adaptation_layer.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_ADAPTATION_LAYER, {ssb_adaptation_ind=...}, [4]) = 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 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_associnfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_associnfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..114342a01093f90f6f5068057fe3022b2b1984e8 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_associnfo.pkt @@ -0,0 +1,55 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=..., + 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=..., + 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=..., + sasoc_asocmaxrxt=..., + sasoc_number_peer_destinations=..., + sasoc_peer_rwnd=1500, + sasoc_local_rwnd=..., + sasoc_cookie_life=40000}, [20]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=..., + sasoc_asocmaxrxt=5, + sasoc_number_peer_destinations=1, + sasoc_peer_rwnd=1500, + sasoc_local_rwnd=..., + sasoc_cookie_life=40000}, [20]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=..., + sasoc_asocmaxrxt=..., + sasoc_number_peer_destinations=..., + sasoc_peer_rwnd=..., + sasoc_local_rwnd=..., + sasoc_cookie_life=...}, [20]) = 0 +//now test structure without associd ++0 setsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5, + sasoc_number_peer_destinations=2, + 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 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_active_key.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_active_key.pkt new file mode 100644 index 0000000000000000000000000000000000000000..a5944c6d3bc57dffe393d09b4bf23ffb98b90d39 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_active_key.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, {scact_assoc_id=0, scact_keynumber=0}, [8]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, {scact_assoc_id=0, scact_keynumber=0}, 8) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, {scact_assoc_id=0, scact_keynumber=0}, [8]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt new file mode 100644 index 0000000000000000000000000000000000000000..0a023a16c2b6e424da2015fb75eb1dedcf882afc --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=0}, 1) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=1}, 1) = -1 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=4}, 1) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_deactivate_key.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_deactivate_key.pkt new file mode 100644 index 0000000000000000000000000000000000000000..06103c6ba81797f4aeee310542a2dd9b50bc4392 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_deactivate_key.pkt @@ -0,0 +1,16 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, {scact_assoc_id=..., scact_keynumber=0}, 6) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, {scact_keynumber=0}, 6) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_delete_key.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_delete_key.pkt new file mode 100644 index 0000000000000000000000000000000000000000..86d0fa1f4d1a62ae993270d175c603c88ab91280 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_delete_key.pkt @@ -0,0 +1,16 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, {scact_assoc_id=..., scact_keynumber=0}, 8) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, {scact_keynumber=0}, 8) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_key.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_key.pkt new file mode 100644 index 0000000000000000000000000000000000000000..58b63eccc76dec085f0d9740fcb2d925a622b4dd --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_key.pkt @@ -0,0 +1,16 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_KEY, {sca_assoc_id=..., sca_keynumber=123, sca_keylength=2, sca_key=[0x00, 0x00]}, 10) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_KEY, {sca_keynumber=123, sca_keylength=2, sca_key=[0x00, 0x00]}, 10) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auto_asconf.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auto_asconf.pkt new file mode 100644 index 0000000000000000000000000000000000000000..d6b3c8481dcd4638c9594c628c928d509e5ffe7a --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auto_asconf.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTO_ASCONF, [1], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTO_ASCONF, [0], 4) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTO_ASCONF, [0], [4]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_autoclose.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_autoclose.pkt new file mode 100644 index 0000000000000000000000000000000000000000..b7e923431729907fc26ee89e5fd21f3640385148 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_autoclose.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTOCLOSE, [0], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTOCLOSE, [1], 4) = -1 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTOCLOSE, [0], [4]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_context.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_context.pkt new file mode 100644 index 0000000000000000000000000000000000000000..c9843cc46e1744e3f7638fd0d8d49a7ed09025f6 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_context.pkt @@ -0,0 +1,19 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_id=0, assoc_value=1200}, 8) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_id=0, assoc_value=1200}, [8]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_value=1200}, 8) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_value=1200}, [8]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_prinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_prinfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..86b3b89b0add8207034a0c488c786fc20465094e --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_prinfo.pkt @@ -0,0 +1,28 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL, + pr_value=5, + pr_assoc_id=3}, 12) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL, + pr_value=5, + pr_assoc_id=3}, [12]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL, + pr_value=5, + pr_assoc_id=...}, [12]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL, + pr_value=5}, 12) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL, + pr_value=5}, [12]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_send_param.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_send_param.pkt new file mode 100644 index 0000000000000000000000000000000000000000..275882b7d3a221384087e409a04b70fc8187199f --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_send_param.pkt @@ -0,0 +1,61 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0, + sinfo_ssn=0, + sinfo_flags=0, + sinfo_ppid=htonl(0), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=0, + sinfo_cumtsn=0, + sinfo_assoc_id=0}, [128]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0, + sinfo_ssn=1, + sinfo_flags=0, + sinfo_ppid=htonl(123), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=2, + sinfo_cumtsn=1, + sinfo_assoc_id=3}, 128) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0, + sinfo_ssn=1, + sinfo_flags=0, + sinfo_ppid=htonl(123), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=2, + sinfo_cumtsn=1, + sinfo_assoc_id=3}, [128]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0, + sinfo_ssn=1, + sinfo_flags=0, + sinfo_ppid=htonl(123), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=2, + sinfo_cumtsn=1}, 128) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0, + sinfo_ssn=1, + sinfo_flags=0, + sinfo_ppid=htonl(123), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=2, + sinfo_cumtsn=1}, [128]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_sndinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_sndinfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..aa7732ca66ab0b8385575c6df0150a718d94c6d1 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_default_sndinfo.pkt @@ -0,0 +1,54 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, + snd_flags=0, + snd_ppid=htonl(1), + snd_context=1, + snd_assoc_id=0}, 16) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, + snd_flags=0, + snd_ppid=htonl(1), + snd_context=1, + snd_assoc_id=0}, [16]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, + snd_flags=SCTP_UNORDERED, + snd_ppid=htonl(2), + snd_context=2, + snd_assoc_id=0}, 16) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, + snd_flags=SCTP_UNORDERED, + snd_ppid=htonl(2), + snd_context=2, + snd_assoc_id=...}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, + snd_flags=SCTP_UNORDERED, + snd_ppid=htonl(2), + snd_context=..., + snd_assoc_id=...}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, + snd_flags=SCTP_UNORDERED, + snd_ppid=..., + snd_context=2, + snd_assoc_id=...}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, + snd_flags=..., + snd_ppid=htonl(2), + snd_context=2, + snd_assoc_id=...}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=..., + snd_flags=SCTP_UNORDERED, + snd_ppid=htonl(2), + snd_context=2, + snd_assoc_id=...}, [16]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_delayed_sack.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_delayed_sack.pkt new file mode 100644 index 0000000000000000000000000000000000000000..8e344e1dcd762e0fa08bd81ed9f5e32c468a9aed --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_delayed_sack.pkt @@ -0,0 +1,24 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=250, sack_freq=1}, 12) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=250, sack_freq=1}, [12]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=250, sack_freq=1}, 12) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=250, sack_freq=1}, [12]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=..., sack_freq=1}, [12]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=250, sack_freq=...}, [12]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=200, sack_freq=1}, 12) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=200, sack_freq=1}, [12]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_disable_fragments.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_disable_fragments.pkt new file mode 100644 index 0000000000000000000000000000000000000000..5498560b078b643fe0d8f1d2320d8c7aef4d266e --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_disable_fragments.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS, [0], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS, [1], 4) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS, [1], [4]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..d817e4150f47ab2084c1e652eb89515c85f55eba --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_event.pkt @@ -0,0 +1,20 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, 8) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_events.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_events.pkt new file mode 100644 index 0000000000000000000000000000000000000000..732cbb8827a4f2bf18ee8efbaa574ab58244b315 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_events.pkt @@ -0,0 +1,35 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, + sctp_association_event=1, + sctp_address_event=0, + sctp_send_failure_event=1, + sctp_peer_error_event=0, + sctp_shutdown_event=1, + sctp_partial_delivery_event=0, + sctp_adaptation_layer_event=0, + sctp_authentication_event=0, + sctp_sender_dry_event=0}, 11) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, + sctp_association_event=1, + sctp_address_event=0, + sctp_send_failure_event=1, + sctp_peer_error_event=0, + sctp_shutdown_event=1, + sctp_partial_delivery_event=0, + sctp_adaptation_layer_event=0, + sctp_authentication_event=0, + sctp_sender_dry_event=0}, [11]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_explicit_eor.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_explicit_eor.pkt new file mode 100644 index 0000000000000000000000000000000000000000..e2cfe119980df381910c5701e16c76ac92470d39 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_explicit_eor.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_EXPLICIT_EOR, [0], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_EXPLICIT_EOR, [1], 4) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_EXPLICIT_EOR, [1], [4]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_fragment_interleave.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_fragment_interleave.pkt new file mode 100644 index 0000000000000000000000000000000000000000..f8a8f2dad5db82d86cc5be3c68e7cc2a16541804 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_fragment_interleave.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE, [1], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE, [2], 4) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE, [2], [4]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_id_list.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_id_list.pkt new file mode 100644 index 0000000000000000000000000000000000000000..e09f741ffa43b803f4dfb217bd2ce7f9f5d040f6 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_id_list.pkt @@ -0,0 +1,15 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_ASSOC_ID_LIST, {gaids_number_of_ids=1, gaids_assoc_id=[3]}, [8]) = -1 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_number.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_number.pkt new file mode 100644 index 0000000000000000000000000000000000000000..f7a67b81dc764ccbe38610d1ef0b84625ce80bc9 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_assoc_number.pkt @@ -0,0 +1,15 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_ASSOC_NUMBER, [1], [4]) = -1 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_peer_addr_info.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_peer_addr_info.pkt new file mode 100644 index 0000000000000000000000000000000000000000..4f765e3e2de5da4cb2b8c7e83e904e8bb836cd29 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_get_peer_addr_info.pkt @@ -0,0 +1,101 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=..., + spinfo_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spinfo_state=SCTP_ACTIVE, + spinfo_cwnd=4464, + spinfo_srtt=111, + spinfo_rto=1000, + spinfo_mtu=1468}, 152) = -1 (ENOPROTOOPT) + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=3, + spinfo_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spinfo_state=SCTP_ACTIVE, + spinfo_cwnd=4464, + spinfo_srtt=..., + spinfo_rto=1000, + spinfo_mtu=1468}, [152]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=..., + spinfo_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spinfo_state=SCTP_ACTIVE, + spinfo_cwnd=4464, + spinfo_srtt=..., + spinfo_rto=1000, + spinfo_mtu=1468}, [152]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=..., + spinfo_address=..., + spinfo_state=SCTP_ACTIVE, + spinfo_cwnd=..., + spinfo_srtt=..., + spinfo_rto=1000, + spinfo_mtu=1468}, [152]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=..., + spinfo_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spinfo_state=..., + spinfo_cwnd=..., + spinfo_srtt=..., + spinfo_rto=1000, + spinfo_mtu=1468}, [152]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=..., + spinfo_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spinfo_state=SCTP_ACTIVE, + spinfo_cwnd=..., + spinfo_srtt=..., + spinfo_rto=..., + spinfo_mtu=1468}, [152]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=..., + spinfo_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spinfo_state=SCTP_ACTIVE, + spinfo_cwnd=4464, + spinfo_srtt=..., + spinfo_rto=1000, + spinfo_mtu=...}, [152]) = 0 + + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spinfo_state=SCTP_ACTIVE, + spinfo_cwnd=4464, + spinfo_srtt=111, + spinfo_rto=1000, + spinfo_mtu=1468}, 152) = -1 (ENOPROTOOPT) + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spinfo_state=SCTP_ACTIVE, + spinfo_cwnd=4464, + spinfo_srtt=..., + spinfo_rto=1000, + spinfo_mtu=1468}, [152]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_hmac_ident.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_hmac_ident.pkt new file mode 100644 index 0000000000000000000000000000000000000000..2388a9c2ccc873ae78914deac891e092a7fbd1bf --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_hmac_ident.pkt @@ -0,0 +1,16 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_HMAC_IDENT, {shmac_number_of_idents=2, shmac_idents=[SCTP_AUTH_HMAC_ID_SHA1, SCTP_AUTH_HMAC_ID_SHA256]}, [8]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_HMAC_IDENT, {shmac_number_of_idents=2, shmac_idents=[SCTP_AUTH_HMAC_ID_SHA1, SCTP_AUTH_HMAC_ID_SHA256]}, 8) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt new file mode 100644 index 0000000000000000000000000000000000000000..1b0fbf0fbe6b0f38cb633bf67e652ab638084fc2 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, [0], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, [1], 4) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, [1], [4]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_initmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_initmsg.pkt new file mode 100644 index 0000000000000000000000000000000000000000..adaa43af3223218add8d476ef981e83407edcdec --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_initmsg.pkt @@ -0,0 +1,42 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2, + 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=2, + sinit_max_attempts=2, + sinit_max_init_timeo=30}, [8]) = 0 ++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 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2, + sinit_max_instreams=2, + sinit_max_attempts=2, + sinit_max_init_timeo=...}, [8]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=..., + sinit_max_instreams=..., + sinit_max_attempts=..., + sinit_max_init_timeo=...}, [8]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_local_auth_chunks.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_local_auth_chunks.pkt new file mode 100644 index 0000000000000000000000000000000000000000..fab0f1c5d9b81d73fb138a48124d8b031d95d233 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_local_auth_chunks.pkt @@ -0,0 +1,20 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, {gauth_assoc_id=3, + gauth_number_of_chunks=2, + gauth_chunks=[0x80,0xC1]}, [10]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, {gauth_number_of_chunks=2, + gauth_chunks=[0x80,0xC1]}, [10]) = 0 + + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_max_burst.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_max_burst.pkt new file mode 100644 index 0000000000000000000000000000000000000000..9f3dd90242304adfd252d70b8895af41bb689850 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_max_burst.pkt @@ -0,0 +1,20 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=4}, [8]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=5}, 8) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=5}, [8]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=4}, 8) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=4}, [8]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_maxseg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_maxseg.pkt new file mode 100644 index 0000000000000000000000000000000000000000..5a941be44d88d394bc0ea71646ae091fc009e81d --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_maxseg.pkt @@ -0,0 +1,20 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1452}, [8]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1200}, 8) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1200}, [8]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1452}, 8) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1452}, [8]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_nodelay.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_nodelay.pkt new file mode 100644 index 0000000000000000000000000000000000000000..0745ab4b59b6c24ba55ae4853e023ce977292589 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_nodelay.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, SOL_SOCKET, SCTP_NODELAY, [0], [4]) = 0 ++0 setsockopt(3, SOL_SOCKET, SCTP_NODELAY, [1], 4) = 0 ++0 getsockopt(3, SOL_SOCKET, SCTP_NODELAY, [4], [4]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_partial_delivery_point.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_partial_delivery_point.pkt new file mode 100644 index 0000000000000000000000000000000000000000..cb80af28e4080b064a1b4f0c81b78ffc801c80ff --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_partial_delivery_point.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, [932067], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, [1000], 4) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, [1000], [4]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_addr_params.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_addr_params.pkt new file mode 100644 index 0000000000000000000000000000000000000000..3aca77e9e0d16834c76436977ee10de99cc13bb4 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_addr_params.pkt @@ -0,0 +1,130 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=3, + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=300, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_DSCP|SPP_HB_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=300, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, [152]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=300, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, [152]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=300, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, [152]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=300, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, [152]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=..., + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, [152]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=300, + spp_pathmaxrxt=..., + spp_pathmtu=1468, + spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, [152]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=300, + spp_pathmaxrxt=8, + spp_pathmtu=..., + spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, [152]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=300, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=..., + spp_ipv6_flowlabel=0, + spp_dscp=0}, [152]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=300, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE, + spp_ipv6_flowlabel=..., + spp_dscp=0}, [152]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=300, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=...}, [152]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=300, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_DSCP|SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=300, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_DSCP|SPP_HB_DISABLE|SPP_PMTUD_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, [152]) = 0 + + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_auth_chunks.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_auth_chunks.pkt new file mode 100644 index 0000000000000000000000000000000000000000..e97bfe5954fd2e17b74e0a5676bf2f9ef11108ab --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_peer_auth_chunks.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//only dummy values, unimplemented in packetdrill ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, {gauth_assoc_id=..., gauth_number_of_chunks=0, gauth_chunks=[]}, [8]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, {gauth_number_of_chunks=0, gauth_chunks=[]}, [8]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_primary_addr.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_primary_addr.pkt new file mode 100644 index 0000000000000000000000000000000000000000..db160a48f491c9541e8f87a8b8af24035b05e340 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_primary_addr.pkt @@ -0,0 +1,31 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=..., + ssp_addr={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}, 136) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=..., + ssp_addr={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}, [136]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=..., + ssp_addr=...}, [136]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_addr={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}, 136) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_addr={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}, [136]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvnxtinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvnxtinfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..59eea97afadd197ac065fcdd4b5ef08b6cd048c7 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvnxtinfo.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], [4]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvrcvinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvrcvinfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..037533c8e9725833a469487ca2629bb64fda98fe --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_recvrcvinfo.pkt @@ -0,0 +1,17 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], [4]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_reuse_port.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_reuse_port.pkt new file mode 100644 index 0000000000000000000000000000000000000000..7f0849265f6b3272df860899682335de2c2b0fef --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_reuse_port.pkt @@ -0,0 +1,12 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_REUSE_PORT, [0], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_REUSE_PORT, [1], 4) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_REUSE_PORT, [1], [4]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..554879b17acbc5504ea78c29dbef9c23f7ec236f --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt @@ -0,0 +1,41 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., + srto_initial=100, + srto_max=200, + srto_min=50}, 16) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., + srto_initial=100, + srto_max=200, + srto_min=50}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., + srto_initial=..., + srto_max=200, + srto_min=50}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, + srto_initial=100, + srto_max=..., + srto_min=50}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, + srto_initial=100, + srto_max=200, + srto_min=...}, [16]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=150, + srto_max=200, + srto_min=50}, 16) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=150, + srto_max=200, + srto_min=50}, [16]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_set_peer_primary_addr.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_set_peer_primary_addr.pkt new file mode 100644 index 0000000000000000000000000000000000000000..4a3e7b8886287e753d001cf9bbd251806417c0c4 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_set_peer_primary_addr.pkt @@ -0,0 +1,21 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, {sspp_addr={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}, 136) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, {sspp_assoc_id=..., + sspp_addr={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}, 136) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_status.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_status.pkt new file mode 100644 index 0000000000000000000000000000000000000000..db00d22768e871d406143479d1e37d8411a26c45 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_status.pkt @@ -0,0 +1,166 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., + sstat_state=..., + sstat_rwnd=..., + sstat_unackdata=..., sstat_penddata=..., + sstat_instrms=..., + sstat_outstrms=..., + sstat_fragmentation_point=..., + sstat_primary=...}, 176) = -1 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, + sstat_state=SCTP_ESTABLISHED, + sstat_rwnd=1500, + sstat_unackdata=0, + sstat_penddata=0, + sstat_instrms=1, + sstat_outstrms=1, + sstat_fragmentation_point=1452, + sstat_primary={spinfo_assoc_id=3, + spinfo_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spinfo_state=SCTP_ACTIVE, + spinfo_cwnd=4464, + spinfo_srtt=..., + spinfo_rto=1000, + spinfo_mtu=1468}}, [176]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, + sstat_state=SCTP_ESTABLISHED, + sstat_rwnd=1500, + sstat_unackdata=0, + sstat_penddata=0, + sstat_instrms=1, + sstat_outstrms=1, + sstat_fragmentation_point=1452, + sstat_primary=...}, [176]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., + sstat_state=SCTP_ESTABLISHED, + sstat_rwnd=1500, + sstat_unackdata=0, + sstat_penddata=0, + sstat_instrms=1, + sstat_outstrms=1, + sstat_fragmentation_point=1452, + sstat_primary=...}, [176]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., + sstat_state=..., + sstat_rwnd=1500, + sstat_unackdata=0, + sstat_penddata=0, + sstat_instrms=1, + sstat_outstrms=1, + sstat_fragmentation_point=1452, + sstat_primary=...}, [176]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., + sstat_state=SCTP_ESTABLISHED, + sstat_rwnd=..., + sstat_unackdata=0, + sstat_penddata=0, + sstat_instrms=1, + sstat_outstrms=1, + sstat_fragmentation_point=1452, + sstat_primary=...}, [176]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., + sstat_state=SCTP_ESTABLISHED, + sstat_rwnd=1500, + sstat_unackdata=..., + sstat_penddata=0, + sstat_instrms=1, + sstat_outstrms=1, + sstat_fragmentation_point=1452, + sstat_primary=...}, [176]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., + sstat_state=SCTP_ESTABLISHED, + sstat_rwnd=1500, + sstat_unackdata=0, + sstat_penddata=..., + sstat_instrms=1, + sstat_outstrms=1, + sstat_fragmentation_point=1452, + sstat_primary=...}, [176]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., + sstat_state=SCTP_ESTABLISHED, + sstat_rwnd=1500, + sstat_unackdata=0, + sstat_penddata=0, + sstat_instrms=..., + sstat_outstrms=1, + sstat_fragmentation_point=1452, + sstat_primary=...}, [176]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., + sstat_state=SCTP_ESTABLISHED, + sstat_rwnd=1500, + sstat_unackdata=0, + sstat_penddata=0, + sstat_instrms=1, + sstat_outstrms=..., + sstat_fragmentation_point=1452, + sstat_primary=...}, [176]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., + sstat_state=SCTP_ESTABLISHED, + sstat_rwnd=1500, + sstat_unackdata=0, + sstat_penddata=0, + sstat_instrms=1, + sstat_outstrms=1, + sstat_fragmentation_point=..., + sstat_primary=...}, [176]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., + sstat_state=8, + sstat_rwnd=1500, + sstat_unackdata=0, + sstat_penddata=0, + sstat_instrms=1, + sstat_outstrms=1, + sstat_fragmentation_point=..., + sstat_primary=...}, [176]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=..., + sstat_rwnd=..., + sstat_unackdata=..., sstat_penddata=..., + sstat_instrms=..., + sstat_outstrms=..., + sstat_fragmentation_point=..., + sstat_primary=...}, 176) = -1 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=SCTP_ESTABLISHED, + sstat_rwnd=1500, + sstat_unackdata=0, + sstat_penddata=0, + sstat_instrms=1, + sstat_outstrms=1, + sstat_fragmentation_point=1452, + sstat_primary={spinfo_assoc_id=3, + spinfo_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spinfo_state=SCTP_ACTIVE, + spinfo_cwnd=4464, + spinfo_srtt=..., + spinfo_rto=1000, + spinfo_mtu=1468}}, [176]) = 0 + + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_use_ext_rcvinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_use_ext_rcvinfo.pkt new file mode 100644 index 0000000000000000000000000000000000000000..64defd820a9033a8d91bda101de1bdb420ae4615 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_use_ext_rcvinfo.pkt @@ -0,0 +1,18 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [0], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], 4) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], [4]) = 0 + + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/so_linger.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/so_linger.pkt new file mode 100644 index 0000000000000000000000000000000000000000..4c95a0325a94a2e9f8dfd37c953ef8567754c1ba --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/so_linger.pkt @@ -0,0 +1,19 @@ +0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0 setsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1, linger=30}, 8) = 0 ++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=128, linger=30}, [8]) = 0 ++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=128, linger=...}, [8]) = 0 ++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=..., linger=30}, [8]) = 0 ++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=..., linger=...}, [8]) = 0 + ++0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_adaptation_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_adaptation_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..c270602302208c57a3e48ac0b9960d5b3a986cf1 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_adaptation_event.pkt @@ -0,0 +1,30 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.0 bind(3, ..., ...) = 0 ++0.0 listen(3, 1) = 0 + +// Enable Event notification ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0 + +// Send Adaptation Indication with Init chunk ++0.0 < sctp: INIT[flgs=0, tag=1, a_rwnd=1500, os=1, is=1, tsn=0, + ECN_CAPABLE[], + ADAPTATION_INDICATION[adaptation_code_point=3], + COOKIE_PRESERVATIVE[incr=12345], + SUPPORTED_ADDRESS_TYPES[types=[IPv4]]] + +* > sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=..., os=..., is=..., tsn=10, ...] ++0.0 < sctp: COOKIE_ECHO[flgs=0, len=..., val=...] +* > sctp: COOKIE_ACK[flgs=0] + ++0.0 accept(3, ..., ...) = 4 + +//TODO: Packetdrill does not support Path reconfiguration, after that update this test ++0.0 sctp_recvv(4, [{iov_base={sai_type=SCTP_ADAPTATION_INDICATION, + sai_flags=0, + sai_length=16, + sai_adaptation_ind=3, + sai_assoc_id=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO],[MSG_NOTIFICATION|MSG_EOR]) = 16 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_assoc_change_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_assoc_change_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..39332546f893ffc26adf36b167759486832c0651 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_assoc_change_event.pkt @@ -0,0 +1,34 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ASSOC_CHANGE, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ASSOC_CHANGE, se_on=1}, [8]) = 0 ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE, + sac_flags=0, + sac_length=21, + sac_state=SCTP_COMM_UP, + sac_error=0, + sac_outbound_streams=1, + sac_inbound_streams=1, + sac_assoc_id=..., + sac_info=[SCTP_ASSOC_SUPPORTS_MULTIBUF]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21 + ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 ++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0] +* > sctp: SHUTDOWN_ACK[flgs=0] ++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0] ++0.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE, + sac_flags=0, + sac_length=20, + sac_state=SCTP_SHUTDOWN_COMP, + sac_error=0, + sac_outbound_streams=1, + sac_inbound_streams=1, + sac_info=[]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20 + diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..d94a2f811b100ff2fb6365b76838256b0c464473 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event.pkt @@ -0,0 +1,24 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, [8]) = 0 ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 sctp_recvv(3, [{iov_base={auth_type=SCTP_AUTHENTICATION_EVENT, + auth_flags=0, + auth_length=20, + auth_keynumber=0, + auth_indication=SCTP_AUTH_NO_AUTH, + auth_assoc_id=3}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20 + ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 ++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0] +* > sctp: SHUTDOWN_ACK[flgs=0] ++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0] + diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..b43bf482f1002b4a2d4f18292021b411be65e33b --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_authentication_event_2.pkt @@ -0,0 +1,23 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, [8]) = 0 ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 sctp_recvv(3, [{iov_base={auth_type=SCTP_AUTHENTICATION_EVENT, + auth_flags=0, + auth_length=20, + auth_keynumber=0, + auth_indication=SCTP_AUTH_NO_AUTH}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20 + ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 ++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0] +* > sctp: SHUTDOWN_ACK[flgs=0] ++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0] + diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_notifications_stopped_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_notifications_stopped_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..65a7771b77639237c0e5b8b27846dccc007f1bd3 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_notifications_stopped_event.pkt @@ -0,0 +1,17 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_NOTIFICATIONS_STOPPED_EVENT, se_on=1}, 8) = 0 + ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] +// No implementation provides this messages, so it can't be tested +// as discribed in rfc, create an notification storm so that the implementation disable notifications ++0.0 sctp_recvv(3, [{iov_base={sn_type=SCTP_NOTIFICATIONS_STOPPED_EVENT, sn_flags=0, sn_length=8}, iov_len=1000}], 1, +..., 20, NULL, [0], [SCTP_RECVV_NOINFO],[MSG_NOTIFICATION|MSG_EOR]) = 21 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..68ffb5bba20a025be8a21d819098957a32e38dda --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event.pkt @@ -0,0 +1,26 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] +//Enable Partial delivery event ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, [8]) = 0 + ++0.0 < sctp: DATA[flgs=B, len=300, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=0, len=300, tsn=2, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: ABORT[flgs=0] ++1.5 sctp_recvv(3, [{iov_base=..., iov_len=1000}, + {iov_base={pdapi_type=SCTP_PARTIAL_DELIVERY_EVENT, + pdapi_flags=0, + pdapi_length=24, + pdapi_indication=SCTP_PARTIAL_DELIVERY_ABORTED, + pdapi_stream=0, + pdapi_seq=0, + pdapi_assoc_id=3 }, iov_len=1000}], 2, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..53dfa5436c70311f318a7f98a058a77fc15dd2c2 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_partial_delivery_event_2.pkt @@ -0,0 +1,25 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] +//Enable Partial delivery event ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, [8]) = 0 + ++0.0 < sctp: DATA[flgs=B, len=300, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=0, len=300, tsn=2, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: ABORT[flgs=0] ++1.5 sctp_recvv(3, [{iov_base=..., iov_len=1000}, + {iov_base={pdapi_type=SCTP_PARTIAL_DELIVERY_EVENT, + pdapi_flags=0, + pdapi_length=24, + pdapi_indication=SCTP_PARTIAL_DELIVERY_ABORTED, + pdapi_stream=0, + pdapi_seq=0}, iov_len=1000}], 2, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change.pkt new file mode 100644 index 0000000000000000000000000000000000000000..1737976033c57d139d21064ab8c4a451ee58f8e3 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change.pkt @@ -0,0 +1,47 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, [8]) = 0 + ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=1, + spp_pathmaxrxt=3, + spp_pathmtu=1468, + spp_flags=SPP_HB_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + +* > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] +* > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] +* > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] +* > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] +* > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] + ++0.5 sctp_recvv(3, [{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE, + spc_flags=0, + spc_length=152, + spc_aaddr=..., + spc_state=SCTP_ADDR_UNREACHABLE, + spc_error=0, + spc_assoc_id=...}, + iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 152 + ++0.0 < sctp: HEARTBEAT_ACK[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] + ++0.5 sctp_recvv(3, [{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE, + spc_flags=0, + spc_length=152, + spc_aaddr=..., + spc_state=SCTP_ADDR_AVAILABLE, + spc_error=0, + spc_assoc_id=...}, + iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 152 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..c69c7697942b4924f1b675bb3b71148fbca7dec0 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_peer_addr_change_2.pkt @@ -0,0 +1,46 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, [8]) = 0 + ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=1, + spp_pathmaxrxt=3, + spp_pathmtu=1468, + spp_flags=SPP_HB_ENABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + +* > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] +* > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] +* > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] +* > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] +* > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] + ++0.5 sctp_recvv(3, [{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE, + spc_flags=0, + spc_length=152, + spc_aaddr=..., + spc_state=SCTP_ADDR_UNREACHABLE, + spc_error=0, + spc_assoc_id=...}, + iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 152 + ++0.0 < sctp: HEARTBEAT_ACK[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]] + ++0.5 sctp_recvv(3, [{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE, + spc_flags=0, + spc_length=152, + spc_aaddr=..., + spc_state=SCTP_ADDR_AVAILABLE, + spc_error=0}, + iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 152 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error.pkt new file mode 100644 index 0000000000000000000000000000000000000000..0d7557b6976a59996fa71021fab815780c98d62c --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error.pkt @@ -0,0 +1,23 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, [8]) = 0 ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 < sctp: ERROR[flgs=0, INVALID_STREAM_IDENTIFIER[sid=1]] + ++0.0 sctp_recvv(3, [{iov_base={sre_type=SCTP_REMOTE_ERROR, + sre_flags=0, + sre_length=32, + sre_error=1, + sre_assoc_id=..., + sre_data=[0x09, 0x00, 0x00 , 0x0C, 0x00, 0x01, 0x00 , 0x08, 0x00, 0x01, 0x00 , 0x00]}, + iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 32 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..eeda20bc4ea171dd61893aadc447325282d043a3 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_remote_error_2.pkt @@ -0,0 +1,22 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, [8]) = 0 ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 < sctp: ERROR[flgs=0, INVALID_STREAM_IDENTIFIER[sid=1]] + ++0.0 sctp_recvv(3, [{iov_base={sre_type=SCTP_REMOTE_ERROR, + sre_flags=0, + sre_length=32, + sre_error=1, + sre_data=[0x09, 0x00, 0x00 , 0x0C, 0x00, 0x01, 0x00 , 0x08, 0x00, 0x01, 0x00 , 0x00]}, + iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 32 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed.pkt new file mode 100644 index 0000000000000000000000000000000000000000..3a7570d6e6a3549f21074173ce26b5b775c9474c --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed.pkt @@ -0,0 +1,53 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=0, + spp_pathmaxrxt=100, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + +//test for SEND_FAILED_EVENT ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, [8]) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, + srto_initial=100, + srto_max=150, + srto_min=50}, 16) = 0 + ++0.0 write(3, ..., 1000) = 1000 ++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++1.0 sctp_recvv(3, [{iov_base={ssf_type=SCTP_SEND_FAILED, + ssf_flags=SCTP_DATA_SENT, + ssf_length=1144, + ssf_error=0, + ssf_info={sinfo_stream=0, + sinfo_ssn=0, + sinfo_flags=3, + sinfo_ppid=htonl(0), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=0, + sinfo_cumtsn=0, + sinfo_assoc_id=3}, + ssf_assoc_id=3, + ssf_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..2244a1678b11af7a859dd9bd99b01ad3db4495b5 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_2.pkt @@ -0,0 +1,51 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=0, + spp_pathmaxrxt=100, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + +//test for SEND_FAILED_EVENT ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, [8]) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, + srto_initial=100, + srto_max=150, + srto_min=50}, 16) = 0 + ++0.0 write(3, ..., 1000) = 1000 ++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++1.0 sctp_recvv(3, [{iov_base={ssf_type=SCTP_SEND_FAILED, + ssf_flags=SCTP_DATA_SENT, + ssf_length=1144, + ssf_error=0, + ssf_info={sinfo_stream=0, + sinfo_ssn=0, + sinfo_flags=3, + sinfo_ppid=htonl(0), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=0, + sinfo_cumtsn=0}, + ssf_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..3febfbd9c61efa0aa4c736063585dca7504f570e --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event.pkt @@ -0,0 +1,50 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=0, + spp_pathmaxrxt=100, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + +//test for SEND_FAILED_EVENT ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, + se_type=SCTP_SEND_FAILED_EVENT, + se_on=1}, 8) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, + srto_initial=100, + srto_max=150, + srto_min=50}, 16) = 0 + ++0.0 write(3, ..., 1000) = 1000 ++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT, + ssfe_flags=SCTP_DATA_SENT, + ssfe_length=1032, + ssfe_error=0, + ssfe_info={snd_sid=0, + snd_flags=3, + snd_ppid=htonl(0), + snd_context=0, + snd_assoc_id=3}, + ssfe_assoc_id=3, + ssfe_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..39d8113ee59bbacccee271cfd29d2d2f7b95ab70 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_send_failed_event_2.pkt @@ -0,0 +1,48 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address=..., + spp_hbinterval=0, + spp_pathmaxrxt=100, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + +//test for SEND_FAILED_EVENT ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, + se_type=SCTP_SEND_FAILED_EVENT, + se_on=1}, 8) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, + srto_initial=100, + srto_max=150, + srto_min=50}, 16) = 0 + ++0.0 write(3, ..., 1000) = 1000 ++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT, + ssfe_flags=SCTP_DATA_SENT, + ssfe_length=1032, + ssfe_error=0, + ssfe_info={snd_sid=0, + snd_flags=3, + snd_ppid=htonl(0), + snd_context=0}, + ssfe_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..f060cbee7b38827f4911d3e33fc8726c2c70a954 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event.pkt @@ -0,0 +1,34 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, + sctp_association_event=1, + sctp_address_event=0, + sctp_send_failure_event=1, + sctp_peer_error_event=0, + sctp_shutdown_event=1, + sctp_partial_delivery_event=0, + sctp_adaptation_layer_event=0, + sctp_authentication_event=0, + sctp_sender_dry_event=0}, 11) = 0 + ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 + +//test for SENDER_DRY_EVENT ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0 ++0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT, + sender_dry_flags=0, + sender_dry_length=12, + sender_dry_assoc_id=3}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0 + diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..b298a7000d43f44b0303f01c860dd5628d8d19a9 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_sender_dry_event_2.pkt @@ -0,0 +1,34 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, + sctp_association_event=1, + sctp_address_event=0, + sctp_send_failure_event=1, + sctp_peer_error_event=0, + sctp_shutdown_event=1, + sctp_partial_delivery_event=0, + sctp_adaptation_layer_event=0, + sctp_authentication_event=0, + sctp_sender_dry_event=0}, 11) = 0 + ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 + +//test for SENDER_DRY_EVENT ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0 ++0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT, + sender_dry_flags=0, + sender_dry_length=12}, + iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0 + diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event.pkt new file mode 100644 index 0000000000000000000000000000000000000000..9671000ddce4f8021868cd7a2e38d9caa8a01be6 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event.pkt @@ -0,0 +1,28 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 + +// Tear down the association ++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0] +* > sctp: SHUTDOWN_ACK[flgs=0] ++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, + sse_flags=0, + sse_length=12, + sse_assoc_id=3}, iov_len=1000}], + msg_control(0)=[], + msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12 +//+0.0 sctp_recvv(3, [{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=1, sse_length=12}, iov_len=1000}], 1, +//..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..19762c465c942a4023b169f15321cb5102eed122 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/notifications/sctp_shutdown_event_2.pkt @@ -0,0 +1,26 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 + +// Tear down the association ++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0] +* > sctp: SHUTDOWN_ACK[flgs=0] ++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0] ++0.0 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, + sse_flags=0, + sse_length=12}, + iov_len=1000}], + msg_control(0)=[], + msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests new file mode 100755 index 0000000000000000000000000000000000000000..c2290936d66546d63ee039575390f9dc3a02a548 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests @@ -0,0 +1,191 @@ +#!/usr/bin/env tcsh + +# +# Copyright (c) 2015 Michael Tuexen +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +set packetdrill = ./../../../../packetdrill +set delay = 1 +set testcases = (setsockopt/sctp_rtoinfo_1 \ + setsockopt/sctp_rtoinfo_2 \ + setsockopt/sctp_rtoinfo_3 \ + getsockopt/sctp_rtoinfo \ + getsockopt/sctp_associnfo \ + getsockopt/sctp_initmsg \ + getsockopt/so_linger \ + getsockopt/sctp_nodelay \ + getsockopt/sctp_autoclose \ + getsockopt/sctp_primary_addr \ + getsockopt/sctp_adaptation_layer \ + getsockopt/sctp_disable_fragments \ + getsockopt/sctp_peer_addr_params \ + getsockopt/sctp_default_send_param \ + getsockopt/sctp_events \ + getsockopt/sctp_i_want_mapped_v4_addr \ + getsockopt/sctp_maxseg \ + getsockopt/sctp_hmac_ident \ + getsockopt/sctp_auth_active_key \ + getsockopt/sctp_delayed_sack \ + getsockopt/sctp_fragment_interleave \ + getsockopt/sctp_partial_delivery_point \ + getsockopt/sctp_use_ext_rcvinfo \ + getsockopt/sctp_auto_asconf \ + getsockopt/sctp_max_burst \ + getsockopt/sctp_context \ + getsockopt/sctp_explicit_eor \ + getsockopt/sctp_reuse_port \ + getsockopt/sctp_event \ + getsockopt/sctp_recvrcvinfo \ + getsockopt/sctp_recvnxtinfo \ + getsockopt/sctp_default_sndinfo \ + getsockopt/sctp_default_prinfo \ + getsockopt/sctp_status \ + getsockopt/sctp_get_peer_addr_info \ + getsockopt/sctp_peer_auth_chunks \ + getsockopt/sctp_local_auth_chunks \ + getsockopt/sctp_get_assoc_number \ + getsockopt/sctp_get_assoc_id_list \ + getsockopt/sctp_set_peer_primary_addr \ + getsockopt/sctp_auth_chunk \ + getsockopt/sctp_auth_key \ + getsockopt/sctp_auth_deactivate_key \ + getsockopt/sctp_auth_delete_key \ + notifications/sctp_adaptation_event \ + notifications/sctp_notifications_stopped_event \ + notifications/sctp_remote_error \ + notifications/sctp_remote_error_2 \ + notifications/sctp_sender_dry_event \ + notifications/sctp_sender_dry_event_2 \ + notifications/sctp_assoc_change_event \ + notifications/sctp_partial_delivery_event \ + notifications/sctp_partial_delivery_event_2 \ + notifications/sctp_send_failed \ + notifications/sctp_send_failed_2 \ + notifications/sctp_shutdown_event \ + notifications/sctp_shutdown_event_2 \ + notifications/sctp_authentication_event \ + notifications/sctp_authentication_event_2 \ + notifications/sctp_peer_addr_change \ + notifications/sctp_peer_addr_change_2 \ + notifications/sctp_send_failed_event \ + notifications/sctp_send_failed_event_2 \ + cmsgs/sendmsg_sctp_init \ + cmsgs/sendmsg_sctp_sndrcv \ + cmsgs/sendmsg_sctp_sndinfo \ + cmsgs/sendmsg_sctp_authinfo \ + cmsgs/sendmsg_sctp_prinfo \ + cmsgs/sendmsg_sctp_dstaddrv4 \ + cmsgs/sendmsg_sctp_dstaddrv6 \ + cmsgs/recvmsg_sctp_extrcv \ + cmsgs/recvmsg_sctp_nxtinfo \ + cmsgs/recvmsg_sctp_rcvinfo \ + cmsgs/recvmsg_sctp_sndrcv \ + cmsgs/recvmsg \ + cmsgs/sendmsg \ + sctp_send/sctp_send_1 \ + sctp_send/sctp_send_2 \ + sctp_sendx/sctp_sendx_1 \ + sctp_sendx/sctp_sendx_2 \ + sctp_sendv/sctp_sendv \ + sctp_sendv/sctp_sendv_1 \ + sctp_sendv/sctp_sendv_2 \ + sctp_sendv/sctp_sendv_3 \ + sctp_sendv/sctp_sendv_4 \ + sctp_sendv/sctp_sendv_5 \ + sctp_sendv/sctp_sendv_6 \ + sctp_sendv/sctp_sendv_7 \ + sctp_sendv/sctp_sendv_8 \ + sctp_bindx/sctp_bindx \ + sctp_peeloff/sctp_peeloff \ + sctp_getpaddrs/sctp_getpaddrs \ + sctp_getladdrs/sctp_getladdrs \ + sctp_sendmsg/sctp_sendmsg_1 \ + sctp_sendmsg/sctp_sendmsg_2 \ + sctp_sendmsg/sctp_sendmsg_3 \ + sctp_recvmsg/sctp_recvmsg_1 \ + sctp_recvmsg/sctp_recvmsg_2 \ + sctp_recvmsg/sctp_recvmsg_3 \ + sctp_connectx/sctp_connectx \ + sctp_recvv/sctp_recvv_1 \ + sctp_recvv/sctp_recvv_2 \ + sctp_recvv/sctp_recvv_3 \ + sctp_recvv/sctp_recvv_4 \ + sctp_recvv/sctp_recvv_5 \ + sctp_recvv/sctp_recvv_6 \ + sctp_recvv/sctp_recvv_7 ) + +set rootdir = `/usr/bin/dirname $0` +set os = `uname -s | tr '[A-Z]' '[a-z]'` +set passed = 0 +set failed = 0 +set run = 0 +set skipped = 0 +set first = 1 + +printf "Name Verdict\n" +printf "===================================================\n" +foreach testcase ($testcases) + printf "%-40.40s " `/usr/bin/basename $testcase` + if ($first == 0) then + if ($delay != 0) then + printf "\033[33m%10s\033[0m" "WAITING" + sleep $delay + printf "\b\b\b\b\b\b\b\b\b\b" + endif + else + set first = 0 + endif + printf "\033[33m%10s\033[0m" "RUNNING" + if (-f ${rootdir}/${testcase}-$os.pkt) then + $packetdrill ${rootdir}/${testcase}-$os.pkt >& /dev/null + set result = $status + set found = 1 + else if (-f ${rootdir}/${testcase}.pkt) then + $packetdrill ${rootdir}/${testcase}.pkt >& /dev/null + set result = $status + set found = 1 + else + set found = 0 + endif + printf "\b\b\b\b\b\b\b\b\b\b" + if ($found == 1) then + if ($result == 0) then + @ passed++ + printf "\033[32m%10s\033[0m\n" "PASSED" + else + @ failed++ + printf "\033[31m%10s\033[0m\n" "FAILED" + endif + @ run++ + else + printf "\033[34m%10s\033[0m\n" "SKIPPED" + @ skipped++ + endif +end +printf "===================================================\n" +printf "Summary: Number of tests run: %3u\n" $run +printf " Number of tests passed: %3u\n" $passed +printf " Number of tests failed: %3u\n" $failed +printf " Number of tests skipped: %3u\n" $skipped diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_bindx/sctp_bindx.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_bindx/sctp_bindx.pkt new file mode 100644 index 0000000000000000000000000000000000000000..664ca300e40758a088790ed15a7f6759908a762e --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_bindx/sctp_bindx.pkt @@ -0,0 +1,6 @@ + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 + ++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_connectx/sctp_connectx.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_connectx/sctp_connectx.pkt new file mode 100644 index 0000000000000000000000000000000000000000..8e33925643afae0accb16042ac8dbc7cc6ab48eb --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_connectx/sctp_connectx.pkt @@ -0,0 +1,17 @@ + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 + ++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0 + +// Check the handshake with an empty(!) cookie ++0.1 sctp_connectx(3, [...], 1, [3]) = 0 ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0] +* > sctp: SHUTDOWN_ACK[flgs=0] ++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getladdrs/sctp_getladdrs.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getladdrs/sctp_getladdrs.pkt new file mode 100644 index 0000000000000000000000000000000000000000..96dba972178a72aaa935c382fa41ffb925bd08df --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getladdrs/sctp_getladdrs.pkt @@ -0,0 +1,19 @@ + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 + ++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0 + +// Check the handshake with an empty(!) cookie ++0.1 sctp_connectx(3, [...], 1, [3]) = 0 ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 sctp_getladdrs(3, 3, [...]) = 1 ++0.0 sctp_freeladdrs([...]) = 0 + ++0.0 sctp_getladdrs(3, 3, [{sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.168.0.1")}]) = 1 ++0.0 sctp_freeladdrs([...]) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getpaddrs/sctp_getpaddrs.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getpaddrs/sctp_getpaddrs.pkt new file mode 100644 index 0000000000000000000000000000000000000000..eeec01d894c7558d5e3dec9fc859c56d37887b5a --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_getpaddrs/sctp_getpaddrs.pkt @@ -0,0 +1,19 @@ + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 + ++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0 + +// Check the handshake with an empty(!) cookie ++0.1 sctp_connectx(3, [...], 1, [3]) = 0 ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 sctp_getpaddrs(3, 3, [...]) = 1 ++0.0 sctp_freepaddrs([...]) = 0 + ++0.0 sctp_getpaddrs(3, 3, [{sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}]) = 1 ++0.0 sctp_freepaddrs([...]) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_peeloff/sctp_peeloff.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_peeloff/sctp_peeloff.pkt new file mode 100644 index 0000000000000000000000000000000000000000..de7c9edfe1119689b45e514f6427d0e58c4944d3 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_peeloff/sctp_peeloff.pkt @@ -0,0 +1,15 @@ + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 + ++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0 + +// Check the handshake with an empty(!) cookie ++0.1 sctp_connectx(3, [...], 1, [3]) = 0 ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 sctp_peeloff(3, 3) = 4 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_1.pkt new file mode 100644 index 0000000000000000000000000000000000000000..569fae58952a350ebbbf755449b608e449e90305 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_1.pkt @@ -0,0 +1,20 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvmsg(3, ..., 1000, ..., ..., ..., MSG_EOR) = 1000 + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..be3e3314acdb8ce52ec672ac92986b51858c1e29 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_2.pkt @@ -0,0 +1,28 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=1234] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvmsg(3, ..., 1000, ..., ..., {sinfo_stream=0, + sinfo_ssn=..., + sinfo_flags=0, + sinfo_ppid=htonl(1234), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=1, + sinfo_cumtsn=1, + sinfo_assoc_id=...}, 8) = 1000 + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_3.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_3.pkt new file mode 100644 index 0000000000000000000000000000000000000000..36b5c445b31e92b5e51dd2a140fec42a4b27a804 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_3.pkt @@ -0,0 +1,49 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvmsg(3, ..., 1000, + {sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + 16, + {sinfo_stream=0, + sinfo_ssn=0, + sinfo_flags=0, + sinfo_ppid=htonl(0), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=1, + sinfo_cumtsn=1, + sinfo_assoc_id=...}, MSG_EOR) = 1000 + ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvmsg(3, ..., 1000, + {sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + 16, + {sinfo_stream=0, + sinfo_ssn=1, + sinfo_flags=0, + sinfo_ppid=htonl(0), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=2, + sinfo_cumtsn=2}, MSG_EOR) = 1000 + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=2] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_1.pkt new file mode 100644 index 0000000000000000000000000000000000000000..85825263004432971c20b95b5f656d77177cf4af --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_1.pkt @@ -0,0 +1,21 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//base test ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_EOR]) = 1000 + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..0eea4a1950d98143386dfd4657f32f13eb333675 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_2.pkt @@ -0,0 +1,23 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, {sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + 16, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_EOR]) = 1000 + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_3.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_3.pkt new file mode 100644 index 0000000000000000000000000000000000000000..71ecfe4c913f80270b682279aa0e30b000de70cd --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_3.pkt @@ -0,0 +1,20 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, NULL, 0, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_EOR]) = 1000 + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_4.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_4.pkt new file mode 100644 index 0000000000000000000000000000000000000000..3742f14891cb6089af9c54c1e323aee4419368e8 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_4.pkt @@ -0,0 +1,31 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//base SCTP_RECVV_RCVINFO ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0 ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=123] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {rcv_sid=0, + rcv_ssn=0, + rcv_flags=0, + rcv_ppid=htonl(123), + rcv_tsn=1, + rcv_cumtsn=1, + rcv_context=0, + rcv_assoc_id=...}, + [28], [SCTP_RECVV_RCVINFO], [MSG_EOR]) = 1000 + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_5.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_5.pkt new file mode 100644 index 0000000000000000000000000000000000000000..af38f796f0bb7a086457b45cd4303c8cebd252d7 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_5.pkt @@ -0,0 +1,31 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//base SCTP_RECVV_NXTINFO ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=10] +* > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {nxt_sid=0, + nxt_flags=32, + nxt_ppid=htonl(10), + nxt_length=1000, + nxt_assoc_id=3}, + [16], [SCTP_RECVV_NXTINFO], [MSG_EOR]) = 1000 ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL, [0], [0], [MSG_EOR]) = 1000 + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=2] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_6.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_6.pkt new file mode 100644 index 0000000000000000000000000000000000000000..d68c13f82fe03fed73763855810895eb360b0870 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_6.pkt @@ -0,0 +1,55 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//base SCTP_RECVV_RN ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=10] +* > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo={rcv_sid=0, + rcv_ssn=0, + rcv_flags=0, + rcv_ppid=htonl(0), + rcv_tsn=1, + rcv_cumtsn=2, + rcv_context=0, + rcv_assoc_id=3}, + recvv_nxtinfo={nxt_sid=0, + nxt_flags=32, + nxt_ppid=htonl(10), + nxt_length=1000, + nxt_assoc_id=3}}, + [44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000 + ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=2, ppid=11] +* > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo={rcv_sid=0, + rcv_ssn=1, + rcv_flags=0, + rcv_ppid=htonl(10), + rcv_tsn=2, + rcv_cumtsn=3, + rcv_context=0}, + recvv_nxtinfo={nxt_sid=0, + nxt_flags=32, + nxt_ppid=htonl(11), + nxt_length=1000}}, + [44],[SCTP_RECVV_RN], [MSG_EOR]) = 1000 + ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL ,[0],[SCTP_RECVV_NOINFO], [MSG_EOR]) = 1000 + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=3] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_7.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_7.pkt new file mode 100644 index 0000000000000000000000000000000000000000..0d2620581f980450a7e79605480ea1f3ca7699fb --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_recvv/sctp_recvv_7.pkt @@ -0,0 +1,46 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 + ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=10] +* > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=10] +* > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo={rcv_sid=0, + rcv_ssn=0, + rcv_flags=0, + rcv_ppid=htonl(10), + rcv_tsn=1, + rcv_cumtsn=2, + rcv_context=0}, + recvv_nxtinfo=...}, + [44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000 + + ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=2, ppid=10] +* > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo=..., + recvv_nxtinfo={nxt_sid=0, + nxt_flags=32, + nxt_ppid=htonl(10), + nxt_length=1000, + nxt_assoc_id=3}}, + [44], [SCTP_RECVV_RN], [8]) = 1000 + ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL,[0], [SCTP_RECVV_NOINFO], [8]) = 1000 + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=3] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_1.pkt new file mode 100644 index 0000000000000000000000000000000000000000..ceff10fc530e27fdcb245ec691d348a3cf0c0e2d --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_1.pkt @@ -0,0 +1,42 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++1.0 sctp_send(3, ..., 1000, {sinfo_stream=3, + sinfo_ssn=3, + sinfo_flags=0, + sinfo_ppid=htonl(7), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=1, + sinfo_cumtsn=6, + sinfo_assoc_id=3}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=7] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..940f5485eeeb3f949cc05899ad3764e49147388a --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_send/sctp_send_2.pkt @@ -0,0 +1,55 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] + ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++1.0 sctp_send(3, ..., 1000, {sinfo_stream=3, + sinfo_ssn=3, + sinfo_flags=0, + sinfo_ppid=htonl(7), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=1, + sinfo_cumtsn=6, + sinfo_assoc_id=3}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=7] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++1.0 sctp_send(3, ..., 1000, {sinfo_stream=3, + sinfo_ssn=3, + sinfo_flags=0, + sinfo_ppid=htonl(7), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=1, + sinfo_cumtsn=6, + sinfo_assoc_id=3}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=3, ssn=1, ppid=7] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_1.pkt new file mode 100644 index 0000000000000000000000000000000000000000..2144bf4d295c4e7600160d8c39d3b015f4a78615 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_1.pkt @@ -0,0 +1,20 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 sctp_sendmsg(3, ..., 1000, ..., ..., htonl(1234), SCTP_UNORDERED, 1, 0, 0) = 1000 ++0.0 > sctp: DATA[flgs=UBE, len=1016, tsn=1, sid=1, ssn=0, ppid=1234] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..4e916dca4981c3ea01a7ff47854dd63f0397d60c --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_2.pkt @@ -0,0 +1,23 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 sctp_sendmsg(3, ..., 1000, {sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + 16, htonl(0x1234), 0, 0, 0, 0) = 1000 ++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0x1234] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_3.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_3.pkt new file mode 100644 index 0000000000000000000000000000000000000000..b02ac279aaae3b92db943cb7e2fc8e6827440f12 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_3.pkt @@ -0,0 +1,20 @@ ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 sctp_sendmsg(3, ..., 1000, NULL, 0, 0, 0, 0, 0, 0) = 1000 ++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv.pkt new file mode 100644 index 0000000000000000000000000000000000000000..8c00dcc9bd103b222e83025b4753366aa4b6ec16 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv.pkt @@ -0,0 +1,103 @@ +--tolerance_usecs=100000 + ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//sctp_sendv(int sd, const struct iovec *iov, int iovcnt, struct sockaddr *addrs, int addrcnt, void *info, socklen_t infolen, unsigned int infotype, int flags); + +//test with sctp_sendv_authinfo ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=500}, {iov_base=..., iov_len=500}], 2, NULL, 0, {auth_keynumber=123}, 2, SCTP_SENDV_AUTHINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + +//base test ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + +//base test ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=2, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]] + +//base test ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=0, ssn=3, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]] + +//TEST NULL as sockaddr ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=500}], 1, NULL, 0, NULL, 0, SCTP_SENDV_NOINFO, 0) = 500 +* > sctp: DATA[flgs=BE, len=516, tsn=5, sid=0, ssn=4, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=1500, gaps=[], dups=[]] + +//TEST with two structs iov ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=500},{iov_base=..., iov_len=500}], 2, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=6, sid=0, ssn=5, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=1500, gaps=[], dups=[]] + +//test with sctp_sendv_prinfo ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=500}, {iov_base=..., iov_len=500}], 2, ..., 1, {pr_policy=0, pr_value=0}, 8, SCTP_SENDV_PRINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=7, sid=0, ssn=6, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=7, a_rwnd=1500, gaps=[], dups=[]] + +//test with all sctp_sendv_spainfo ++0.1 sctp_sendv(3, [{..., 500}, {..., 500}], 2, ..., 1, {sendv_flags=SCTP_SEND_SNDINFO_VALID, + sendv_sndinfo={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(0), + snd_context=0, + snd_assoc_id=0}, + sendv_prinfo={pr_policy=SCTP_PR_SCTP_TTL, + pr_value=10}, + sendv_authinfo={auth_keynumber=123}}, 32, SCTP_SENDV_SPA, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=8, sid=2, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=8, a_rwnd=1500, gaps=[], dups=[]] + +//test with sctp_sendv_sndinfo ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, {snd_sid=1, + snd_flags=0, + snd_ppid=htonl(1234), + snd_context=0, + snd_assoc_id=0}, 16, SCTP_SENDV_SNDINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=9, sid=1, ssn=0, ppid=1234] ++0.0 < sctp: SACK[flgs=0, cum_tsn=9, a_rwnd=1500, gaps=[], dups=[]] + +//test with struct sockaddr ++0.1 sctp_sendv(3, [{..., 1000}], 1, [{sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}], 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=10, sid=0, ssn=7, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=10, a_rwnd=1500, gaps=[], dups=[]] + ++0.1 sctp_sendv(3, [{..., 500}, {..., 500}], 2, ..., 1, {sendv_flags=SCTP_SEND_SNDINFO_VALID, + sendv_sndinfo={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(0), + snd_context=0}, + sendv_prinfo={pr_policy=SCTP_PR_SCTP_TTL, + pr_value=10}, + sendv_authinfo={auth_keynumber=123}}, 32, SCTP_SENDV_SPA, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=11, sid=2, ssn=1, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=11, a_rwnd=1500, gaps=[], dups=[]] + +//test with sctp_sendv_sndinfo ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, {snd_sid=1, + snd_flags=0, + snd_ppid=htonl(1234), + snd_context=0}, 16, SCTP_SENDV_SNDINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=12, sid=1, ssn=1, ppid=1234] ++0.0 < sctp: SACK[flgs=0, cum_tsn=12, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_1.pkt new file mode 100644 index 0000000000000000000000000000000000000000..e649f4daa15d8d3f73a6f1d502eb2e583496c931 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_1.pkt @@ -0,0 +1,33 @@ + ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=2, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]] + ++0.1 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=0, ssn=3, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..025b9296eb2f774f7eb51a35eb21ca4611e33581 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_2.pkt @@ -0,0 +1,24 @@ + ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//sctp_sendv(int sd, const struct iovec *iov, int iovcnt, struct sockaddr *addrs, int addrcnt, void *info, socklen_t infolen, unsigned int infotype, int flags); + +//test with sctp_sendv_authinfo ++0.0 sctp_sendv(3, [{iov_base=..., iov_len=500}, {iov_base=..., iov_len=500}], 2, NULL, 0, {auth_keynumber=123}, 2, SCTP_SENDV_AUTHINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_3.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_3.pkt new file mode 100644 index 0000000000000000000000000000000000000000..6362b962777ae39996aa86762cd31ffbd18cd755 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_3.pkt @@ -0,0 +1,22 @@ + ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//TEST NULL as sockaddr ++0.0 sctp_sendv(3, [{iov_base=..., iov_len=500}], 1, NULL, 0, NULL, 0, SCTP_SENDV_NOINFO, 0) = 500 +* > sctp: DATA[flgs=BE, len=516, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_4.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_4.pkt new file mode 100644 index 0000000000000000000000000000000000000000..6e651a98bcbd19de06cbf7a7ff87c4a171ce0f67 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_4.pkt @@ -0,0 +1,22 @@ + ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//TEST with two structs iov ++0.0 sctp_sendv(3, [{iov_base=..., iov_len=500},{iov_base=..., iov_len=500}], 2, ..., 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_5.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_5.pkt new file mode 100644 index 0000000000000000000000000000000000000000..d65e9123eb0da4c8df515de81a775b3982c84c8d --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_5.pkt @@ -0,0 +1,22 @@ + ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//test with sctp_sendv_prinfo ++0.0 sctp_sendv(3, [{iov_base=..., iov_len=500}, {iov_base=..., iov_len=500}], 2, ..., 1, {pr_policy=0, pr_value=0}, 8, SCTP_SENDV_PRINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_6.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_6.pkt new file mode 100644 index 0000000000000000000000000000000000000000..68fc8e3660e8a94c6c42f5807f533dd6bb7f8743 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_6.pkt @@ -0,0 +1,42 @@ + ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//test with all sctp_sendv_spainfo ++0.0 sctp_sendv(3, [{..., 500}, {..., 500}], 2, ..., 1, {sendv_flags=SCTP_SEND_SNDINFO_VALID, + sendv_sndinfo={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(0), + snd_context=0, + snd_assoc_id=0}, + sendv_prinfo={pr_policy=SCTP_PR_SCTP_TTL, + pr_value=10}, + sendv_authinfo={auth_keynumber=123}}, 32, SCTP_SENDV_SPA, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + +//test with all sctp_sendv_spainfo ++0.0 sctp_sendv(3, [{..., 500}, {..., 500}], 2, ..., 1, {sendv_flags=SCTP_SEND_SNDINFO_VALID, + sendv_sndinfo={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(0), + snd_context=0}, + sendv_prinfo={pr_policy=SCTP_PR_SCTP_TTL, + pr_value=10}, + sendv_authinfo={auth_keynumber=123}}, 32, SCTP_SENDV_SPA, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=1, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_7.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_7.pkt new file mode 100644 index 0000000000000000000000000000000000000000..2d56698428634d3326df5d5b3c4c59016927033f --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_7.pkt @@ -0,0 +1,32 @@ + ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, {snd_sid=1, + snd_flags=0, + snd_ppid=htonl(1234), + snd_context=0, + snd_assoc_id=0}, 16, SCTP_SENDV_SNDINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=1, ssn=0, ppid=1234] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 sctp_sendv(3, [{iov_base=..., iov_len=1000}], 1, ..., 1, {snd_sid=1, + snd_flags=0, + snd_ppid=htonl(1234), + snd_context=0}, 16, SCTP_SENDV_SNDINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=1, ssn=1, ppid=1234] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_8.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_8.pkt new file mode 100644 index 0000000000000000000000000000000000000000..c9ebd3b7b108cd0d447a8f1115f055db79734acd --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendv/sctp_sendv_8.pkt @@ -0,0 +1,21 @@ + ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + ++0.0 sctp_sendv(3, [{..., 1000}], 1, [{sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}], 1, NULL, 0, SCTP_SENDV_NOINFO, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_1.pkt new file mode 100644 index 0000000000000000000000000000000000000000..e89e65533032c7ea83c058b0abf8ac325644fa59 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_1.pkt @@ -0,0 +1,43 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//Disable Heartbeats ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0.0 sctp_sendx(3, ..., 1000, ..., 1, {sinfo_stream=3, + sinfo_ssn=3, + sinfo_flags=0, + sinfo_ppid=htonl(1234), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=2, + sinfo_cumtsn=2, + sinfo_assoc_id=3}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=1234] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..b2e4362a7d5d464a38286a06fc928df122f32f4c --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/sctp_sendx/sctp_sendx_2.pkt @@ -0,0 +1,45 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 +// Check the handshake with an empty(!) cookie ++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) ++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] ++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + +//Disable Heartbeats ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=..., + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 + ++0.0 sctp_sendx(3, ..., 1000, {sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, 1, + {sinfo_stream=3, + sinfo_ssn=3, + sinfo_flags=0, + sinfo_ppid=htonl(7), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=1, + sinfo_cumtsn=6, + sinfo_assoc_id=3}, 0) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=7] ++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] + ++0.0 close(3) = 0 ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0] ++0.1 < sctp: SHUTDOWN_ACK[flgs=0] ++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_1.pkt new file mode 100644 index 0000000000000000000000000000000000000000..1a6fe6762e9cf441ad426da25915b5a532e0e457 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_1.pkt @@ -0,0 +1,9 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 + +// Check sctp_rtoinfo before connection startup ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=..., srto_max=..., srto_min=...}, [16]) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_2.pkt new file mode 100644 index 0000000000000000000000000000000000000000..80305cd4fb022a8b65f08aa9f847ddd08b11b96e --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_2.pkt @@ -0,0 +1,10 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 + +// Check sctp_rtoinfo before connection startup ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, 16) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, [16]) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_3.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_3.pkt new file mode 100644 index 0000000000000000000000000000000000000000..164ace174e5380211078cf1eb8b541825b2c1be4 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/setsockopt/sctp_rtoinfo_3.pkt @@ -0,0 +1,11 @@ +--tolerance_usecs=100000 + + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 ++0.0 bind(3, ..., ...) = 0 + +// Check sctp_rtoinfo for one-to-one style check if srto_assoc_id is ignored ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=200, srto_max=400, srto_min=100}, 16) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=3, srto_initial=100, srto_max=200, srto_min=50}, 16) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, [16]) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_adaptation_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_adaptation_event.pkt index 282b383885d289485e3e1b9d225fd6387131e6bf..6a3a663b916a0543f451d1dd829aa62698a5b6de 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_adaptation_event.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_adaptation_event.pkt @@ -6,8 +6,8 @@ +0.0 listen(3, 1) = 0 // Enable Event notification -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0 // Send Adaptation Indication with Init chunk +0.0 < sctp: INIT[flgs=0, tag=1, a_rwnd=1500, os=1, is=1, tsn=0, diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt index 78467aad5dacfba214c238767bc8a1f831f938fb..f110cab2989614c5b5b299738950d857e10833d6 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt @@ -3,8 +3,8 @@ +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 // Check the handshake with an empty(!) cookie +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ASSOC_CHANGE, se_on=1}, 8) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ASSOC_CHANGE, se_on=1}, [8]) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ASSOC_CHANGE, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ASSOC_CHANGE, se_on=1}, [8]) = 0 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_authentication_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_authentication_event.pkt index cf7a4ce7ec91e5ddd463685b57cb12342a8c4595..4b216e9877183a0104c96f4216955d6829fce983 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_authentication_event.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_authentication_event.pkt @@ -3,8 +3,8 @@ +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 // Check the handshake with an empty(!) cookie +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, 8) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, [8]) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, [8]) = 0 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications.pkt deleted file mode 100644 index 6df07beeb907fdf8d0cd3fa52e0797af1252b672..0000000000000000000000000000000000000000 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications.pkt +++ /dev/null @@ -1,60 +0,0 @@ -+0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 -+0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) -+0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 -// Check the handshake with an empty(!) cookie -+0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) -+0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] -+0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] -+0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] -+0.1 < sctp: COOKIE_ACK[flgs=0] -+0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 -//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, 8) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0 - -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=1, sctp_address_event=0, sctp_send_failure_event=1, -sctp_peer_error_event=0, sctp_shutdown_event=1, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0, -sctp_sender_dry_event=0}, 11) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 - -//Deactivate all EVENTS -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0, sctp_association_event=0, sctp_address_event=0, sctp_send_failure_event=0, -sctp_peer_error_event=0, sctp_shutdown_event=0, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0, -sctp_sender_dry_event=0}, 11) = 0 - -//test for SENDER_DRY_EVENT -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0 -+0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT, sender_dry_flags=0, sender_dry_length=12, sender_dry_assoc_id=3}, iov_len=1000}], -1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12 -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0 - -//test for SEND_FAILED_EVENT -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SEND_FAILED_EVENT, se_on=1}, 8) = 0 -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=150, srto_min=50}, 16) = 0 -+0.0 write(3, ..., 1000) = 1000 -+0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] -* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] -* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] -* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] -* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] -* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] -* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] -* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] -+1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT, ssfe_flags=SCTP_DATA_SENT, ssfe_length=1032, ssfe_error=0, -ssfe_info={snd_sid=0, snd_flags=3, snd_ppid=htonl(0), snd_context=0, snd_assoc_id=...}, ssfe_assoc_id=3, ssfe_data=...}, iov_len=1000}], -1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000 -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SEND_FAILED_EVENT, se_on=0}, 8) = 0 - -//+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0 -//+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 -// Tear down the association -//+0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0] -//* > sctp: SHUTDOWN_ACK[flgs=0] -//+0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0] -//+0.0 recvmsg(3, {msg_name(...)=..., -// msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=0, sse_length=12}, iov_len=1000}], -// msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12 -//+0.0 sctp_recvv(3, [{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=1, sse_length=12}, iov_len=1000}], 1, -//..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications_stopped_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications_stopped_event.pkt index 6adecb8f05d09a6964e5db5d966391bbfe01e71b..65a7771b77639237c0e5b8b27846dccc007f1bd3 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications_stopped_event.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications_stopped_event.pkt @@ -3,9 +3,9 @@ +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 // Check the handshake with an empty(!) cookie +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0 -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_NOTIFICATIONS_STOPPED_EVENT, se_on=1}, 8) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_NOTIFICATIONS_STOPPED_EVENT, se_on=1}, 8) = 0 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_partial_delivery_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_partial_delivery_event.pkt index b1c619e8dfcb773fed123181ce3e1774165ebdba..68ffb5bba20a025be8a21d819098957a32e38dda 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_partial_delivery_event.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_partial_delivery_event.pkt @@ -3,18 +3,24 @@ +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 // Check the handshake with an empty(!) cookie +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, 8) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, [8]) = 0 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] +0.1 < sctp: COOKIE_ACK[flgs=0] +//Enable Partial delivery event ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, [8]) = 0 +0.0 < sctp: DATA[flgs=B, len=300, tsn=1, sid=0, ssn=0, ppid=0] +0.0 > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] +0.0 < sctp: DATA[flgs=0, len=300, tsn=2, sid=0, ssn=0, ppid=0] * > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] +0.0 < sctp: ABORT[flgs=0] -+1.5 sctp_recvv(3, [{iov_base=..., iov_len=1000}, {iov_base={pdapi_type=SCTP_PARTIAL_DELIVERY_EVENT, pdapi_flags=0,pdapi_length=24, -pdapi_indication=SCTP_PARTIAL_DELIVERY_ABORTED, pdapi_stream=0, pdapi_seq=0, pdapi_assoc_id=3 }, iov_len=1000}], 2, ..., 20, NULL, [0], -[SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21 ++1.5 sctp_recvv(3, [{iov_base=..., iov_len=1000}, + {iov_base={pdapi_type=SCTP_PARTIAL_DELIVERY_EVENT, + pdapi_flags=0, + pdapi_length=24, + pdapi_indication=SCTP_PARTIAL_DELIVERY_ABORTED, + pdapi_stream=0, + pdapi_seq=0, + pdapi_assoc_id=3 }, iov_len=1000}], 2, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_peer_addr_change.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_peer_addr_change.pkt index ffd6eabc1bdaa607a7fae91a60e6e7b6c93ab3e9..1e9238b66c0356f596b239491ccaa5e2610a4a8c 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_peer_addr_change.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_peer_addr_change.pkt @@ -3,8 +3,8 @@ +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 // Check the handshake with an empty(!) cookie +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, 8) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, [8]) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PEER_ADDR_CHANGE, se_on=1}, [8]) = 0 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_remote_error.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_remote_error.pkt index 4d245235197b7f22585e70aa63536206b03cb82d..7479fdc1554e6a87cb508fad6418678d8b26e856 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_remote_error.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_remote_error.pkt @@ -3,8 +3,8 @@ +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 // Check the handshake with an empty(!) cookie +0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_REMOTE_ERROR, se_on=1}, 8) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_REMOTE_ERROR, se_on=1}, [8]) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_REMOTE_ERROR, se_on=1}, [8]) = 0 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...] +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed.pkt index 6a55b3dc6db8f738d6f1dc25008c0547089ca008..db09d5fd93e19fe1df8c6dbe55b9bb1b896d91a1 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed.pkt @@ -13,8 +13,14 @@ spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0 //test for SEND_FAILED_EVENT -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SEND_FAILED, se_on=1}, 8) = 0 -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=150, srto_min=50}, 16) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, [8]) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, + srto_initial=100, + srto_max=150, + srto_min=50}, 16) = 0 + +0.0 write(3, ..., 1000) = 1000 +0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] * > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] @@ -24,7 +30,18 @@ spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0 * > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] * > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] * > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] -+1.0 sctp_recvv(3, [{iov_base={ssf_type=SCTP_SEND_FAILED, ssf_flags=SCTP_DATA_SENT, ssf_length=1144, ssf_error=0, -ssf_info={sinfo_stream=0, sinfo_ssn=0, sinfo_flags=3, sinfo_ppid=htonl(0), sinfo_context=0, sinfo_timetolive=0, sinfo_tsn=0, sinfo_cumtsn=0}, -ssf_assoc_id=3, ssf_data=...}, iov_len=1000}], -1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000 ++1.0 sctp_recvv(3, [{iov_base={ssf_type=SCTP_SEND_FAILED, + ssf_flags=SCTP_DATA_SENT, + ssf_length=1144, + ssf_error=0, + ssf_info={sinfo_stream=0, + sinfo_ssn=0, + sinfo_flags=3, + sinfo_ppid=htonl(0), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=0, + sinfo_cumtsn=0, + sinfo_assoc_id=3}, + ssf_assoc_id=3, + ssf_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt index 69780e2574b8fe6729948c558e8225cd930d268e..51cd97210d8ade8af2dd814c259eb5041a766240 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt @@ -7,14 +7,26 @@ +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]] +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] +0.1 < sctp: COOKIE_ACK[flgs=0] + +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address=..., spp_hbinterval=0, spp_pathmaxrxt=100, spp_pathmtu=1468, spp_flags=SPP_HB_DISABLE, -spp_ipv6_flowlabel=0, -spp_dscp=0}, 152) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address=..., + spp_hbinterval=0, + spp_pathmaxrxt=100, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 //test for SEND_FAILED_EVENT -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SEND_FAILED_EVENT, se_on=1}, 8) = 0 -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=150, srto_min=50}, 16) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, + se_type=SCTP_SEND_FAILED_EVENT, + se_on=1}, 8) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, + srto_initial=100, + srto_max=150, + srto_min=50}, 16) = 0 + +0.0 write(3, ..., 1000) = 1000 +0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] * > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] @@ -24,6 +36,14 @@ spp_dscp=0}, 152) = 0 * > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] * > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] * > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] -+1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT, ssfe_flags=SCTP_DATA_SENT, ssfe_length=1032, ssfe_error=0, -ssfe_info={snd_sid=0, snd_flags=3, snd_ppid=htonl(0), snd_context=0}, ssfe_assoc_id=3, ssfe_data=...}, iov_len=1000}], -1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000 ++1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT, + ssfe_flags=SCTP_DATA_SENT, + ssfe_length=1032, + ssfe_error=0, + ssfe_info={snd_sid=0, + snd_flags=3, + snd_ppid=htonl(0), + snd_context=0, + snd_assoc_id=3}, + ssfe_assoc_id=3, + ssfe_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt index bbca55239d311473133ee2758b7f5125c5553db6..f060cbee7b38827f4911d3e33fc8726c2c70a954 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt @@ -8,20 +8,27 @@ +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] +0.1 < sctp: COOKIE_ACK[flgs=0] +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + //test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, 8) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, + sctp_association_event=1, + sctp_address_event=0, + sctp_send_failure_event=1, + sctp_peer_error_event=0, + sctp_shutdown_event=1, + sctp_partial_delivery_event=0, + sctp_adaptation_layer_event=0, + sctp_authentication_event=0, + sctp_sender_dry_event=0}, 11) = 0 -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=1, sctp_address_event=0, sctp_send_failure_event=1, -sctp_peer_error_event=0, sctp_shutdown_event=1, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0, -sctp_sender_dry_event=0}, 11) = 0 -+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 //test for SENDER_DRY_EVENT -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0 -+0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT, sender_dry_flags=0, sender_dry_length=12, sender_dry_assoc_id=3}, iov_len=1000}], -1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12 -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0 ++0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT, + sender_dry_flags=0, + sender_dry_length=12, + sender_dry_assoc_id=3}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt index 5488096702167b2676227eb07311a68f16270323..9671000ddce4f8021868cd7a2e38d9caa8a01be6 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt @@ -8,15 +8,21 @@ +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] +0.1 < sctp: COOKIE_ACK[flgs=0] +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 + //test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0 // Tear down the association +0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0] * > sctp: SHUTDOWN_ACK[flgs=0] +0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0] +0.0 recvmsg(3, {msg_name(...)=..., - msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=0, sse_length=12}, iov_len=1000}], + msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, + sse_flags=0, + sse_length=12, + sse_assoc_id=3}, iov_len=1000}], + msg_control(0)=[], msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12 //+0.0 sctp_recvv(3, [{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=1, sse_length=12}, iov_len=1000}], 1, //..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt index e81c3d2844ad6afc21e959902ab3320a094da092..bf44947527a16a98c19550410182fff1011606e2 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt @@ -13,7 +13,8 @@ +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 //recvmsg(sd, msghdr, flags) +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, - {spp_address=..., + {spp_assoc_id=0, + spp_address=..., spp_hbinterval=0, spp_pathmaxrxt=8, spp_pathmtu=1468, 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 a33a6d1950fec9df17d13a79b78dd047d694a1fb..d0e775b51c49dcefbad4f5f3b68663db5d14ba7c 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 @@ -8,72 +8,78 @@ +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] +0.1 < sctp: COOKIE_ACK[flgs=0] -+0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 ++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=..., sstat_rwnd=..., sstat_unackdata=..., sstat_penddata=..., -sstat_instrms=..., sstat_outstrms=..., sstat_fragmentation_point=..., sstat_primary=...}, 176) = -1 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=0, ssp_addr={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}}, 136) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=0, ssp_addr={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}}, [136]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, -sstat_unackdata=0, sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL, pr_value=5, pr_assoc_id=3}, 12) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL, pr_value=5, pr_assoc_id=3}, [12]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., sstat_state=..., sstat_rwnd=..., sstat_unackdata=..., sstat_penddata=..., +sstat_instrms=..., sstat_outstrms=..., sstat_fragmentation_point=..., sstat_primary=...}, 176) = -1 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=..., sstat_rwnd=1500, sstat_unackdata=0, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=..., sstat_state=..., sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=..., sstat_unackdata=0, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, +sstat_unackdata=0, sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=..., sstat_unackdata=0, sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=..., ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=1500, sstat_unackdata=..., sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=..., sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0, sstat_instrms=..., sstat_outstrms=1, sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0, sstat_instrms=1, sstat_outstrms=..., sstat_fragmentation_point=1452, sstat_primary=...}, [176]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., sstat_primary=...}, [176]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0, -sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., sstat_primary={spinfo_address={sa_family=AF_INET,sin_port=htons(8080), ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=3, sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0, +sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., sstat_primary={spinfo_assoc_id=3, spinfo_address={sa_family=AF_INET,sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468} }, [176]) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 setsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=..., spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=111, spinfo_rto=1000, spinfo_mtu=1468}, 152) = -1 (ENOPROTOOPT) -+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=3, spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spinfo_state=..., spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468}, [152]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=3, spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spinfo_state=SCTP_ACTIVE, spinfo_cwnd=..., spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468}, [152]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=3, spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=..., spinfo_mtu=1468}, [152]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=3, spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=...}, [152]) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=3, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spp_hbinterval=300, spp_pathmaxrxt=8, spp_pathmtu=1468, spp_flags=SPP_DSCP|SPP_HB_ENABLE, spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spp_hbinterval=300, spp_pathmaxrxt=8, spp_pathmtu=1468, spp_flags=SPP_DSCP|SPP_HB_ENABLE|SPP_PMTUD_ENABLE, spp_ipv6_flowlabel=0, spp_dscp=0}, [152]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spp_hbinterval=..., spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=..., spp_ipv6_flowlabel=0, spp_dscp=0}, [152]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=..., spp_flags=521, spp_ipv6_flowlabel=0, spp_dscp=0}, [152]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv6_flowlabel=..., spp_dscp=0}, [152]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv6_flowlabel=0, spp_dscp=...}, [152]) = 0 @@ -83,12 +89,14 @@ spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv +0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=..., linger=30}, [8]) = 0 +0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=..., linger=...}, [8]) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=50}, 16) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=50}, [16]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=..., srto_max=200, srto_min=50}, [16]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=..., srto_min=50}, [16]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=...}, [16]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1452}, [8]) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, 16) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=100, srto_max=200, srto_min=50}, 16) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=..., srto_max=200, srto_min=50}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=..., srto_min=50}, [16]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=...}, [16]) = 0 + ++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1452}, [8]) = 0 +0 setsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2, 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=2, sinit_max_attempts=2, sinit_max_init_timeo=30}, [8]) = 0 @@ -96,24 +104,24 @@ 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_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 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=..., sack_freq=1}, [12]) = 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=250, sack_freq=...}, [12]) = 0 - -+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_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_assoc_id=0, sack_delay=250, sack_freq=1}, 12) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=..., sack_freq=1}, [12]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=..., sack_freq=1}, [12]) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=250, sack_freq=...}, [12]) = 0 + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, 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=htonl(1), snd_context=1, snd_assoc_id=0}, 16) = 0 +0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=0, snd_ppid=htonl(1), snd_context=1, snd_assoc_id=0}, [16]) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_init_rtx.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_init_rtx.pkt index ed3759cd09697ed5d1a6f876dabe4a7680eb9046..75debec3c601438cb50dd309b2d1b0b1e528b03a 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_init_rtx.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_init_rtx.pkt @@ -9,7 +9,7 @@ +0.0 bind(3, ..., ...) = 0 +0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=50}, 16) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=100, srto_max=200, srto_min=50}, 16) = 0 +0.0 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) // Check the number and the timing of the restransmissions +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=0, ...] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt index 17f94900394fa8e5d1e1fc44c00d53120dcdc19f..e19e4f64bb4b4ceb1867ac2b8913264e5dbe129a 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt @@ -56,20 +56,41 @@ rcv_assoc_id=...}, * > sctp: SACK[flgs=0, cum_tsn=7, a_rwnd=..., gaps=[], dups=[]] +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=8, sid=0, ssn=7, ppid=10] * > sctp: SACK[flgs=0, cum_tsn=8, a_rwnd=..., gaps=[], dups=[]] -+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, { -recvv_rcvinfo={rcv_sid=0, rcv_ssn=6, rcv_flags=0, rcv_ppid=htonl(0), rcv_tsn=7, rcv_cumtsn=8, rcv_context=0, rcv_assoc_id=3}, -recvv_nxtinfo={nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000, nxt_assoc_id=4}}, [44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000 ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo={rcv_sid=0, + rcv_ssn=6, + rcv_flags=0, + rcv_ppid=htonl(0), + rcv_tsn=7, + rcv_cumtsn=8, + rcv_context=0, + rcv_assoc_id=3}, + recvv_nxtinfo={nxt_sid=0, + nxt_flags=32, + nxt_ppid=htonl(10), + nxt_length=1000, + nxt_assoc_id=3}}, [44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000 +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=9, sid=0, ssn=8, ppid=11] * > sctp: SACK[flgs=0, cum_tsn=9, a_rwnd=..., gaps=[], dups=[]] -+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, { -recvv_rcvinfo={rcv_sid=0, rcv_ssn=7, rcv_flags=0, rcv_ppid=htonl(10), rcv_tsn=8, rcv_cumtsn=9, rcv_context=0, rcv_assoc_id=...}, recvv_nxtinfo=...}, -[44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000 ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo={rcv_sid=0, + rcv_ssn=7, + rcv_flags=0, + rcv_ppid=htonl(10), + rcv_tsn=8, + rcv_cumtsn=9, + rcv_context=0, + rcv_assoc_id=3}, + recvv_nxtinfo=...}, [44], [SCTP_RECVV_RN], [MSG_EOR]) = 1000 + +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=10, sid=0, ssn=9, ppid=10] * > sctp: SACK[flgs=0, cum_tsn=10, a_rwnd=..., gaps=[], dups=[]] -+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, { -recvv_rcvinfo=..., recvv_nxtinfo={nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000, nxt_assoc_id=3}}, [44], [SCTP_RECVV_RN], [8]) = 1000 ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {recvv_rcvinfo=..., + recvv_nxtinfo={nxt_sid=0, + nxt_flags=32, + nxt_ppid=htonl(10), + nxt_length=1000, + nxt_assoc_id=3}}, [44], [SCTP_RECVV_RN], [8]) = 1000 +0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_EOR]) = 1000 +0.0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_send.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_send.pkt index dd3e13911825b78a56cb92b365c497f847661f3b..7557027687e2b91999fe733de8cd29b01bbd8255 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_send.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_send.pkt @@ -13,8 +13,16 @@ +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 //sendmsg(sd, msghdr, flags) -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, -spp_hbinterval=0, spp_pathmaxrxt=8, spp_pathmtu=1468, spp_flags=SPP_HB_DISABLE, spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=3, + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152)= 0 +1.0 sctp_send(3, ..., 1000, {sinfo_stream=3, sinfo_ssn=3, diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_sendx.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_sendx.pkt index 20b4eb9a6734766192c57c6cb71147925d9dbd43..ed2b27ba3325391f1e143c442830d3606f68a443 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_sendx.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_sendx.pkt @@ -13,8 +13,16 @@ +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 //sendmsg(sd, msghdr, flags) -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, -spp_hbinterval=0, spp_pathmaxrxt=8, spp_pathmtu=1468, spp_flags=SPP_HB_DISABLE, spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=3, + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 +1.0 sctp_sendx(3, ..., 1000, ..., 1, {sinfo_stream=3, sinfo_ssn=3, diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt index af811a60bd4158cad8ed03642210684a2fde792f..d7fdcc7d2da222517d3d9ac8f60c50fe4ccef853 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt @@ -1,14 +1,14 @@ 0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=50}, 16) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=50, srto_max=200, srto_min=50}, 16) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=200, srto_max=200, srto_min=50}, 16) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=50, srto_max=50, srto_min=50}, 16) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=200, srto_min=50}, 17) = 0 -//+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=..., srto_max=200, srto_min=50}, 15) = -1 EINVAL (Invalid argument) -+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=25, srto_max=200, srto_min=50}, 16) = -1 EINVAL (Invalid argument) -+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=225, srto_max=200, srto_min=50}, 16) = -1 EINVAL (Invalid argument) -+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=50, srto_max=50, srto_min=200}, 16) = -1 EINVAL (Invalid argument) ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, 16) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=50, srto_max=200, srto_min=50}, 16) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=200, srto_max=200, srto_min=50}, 16) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=50, srto_max=50, srto_min=50}, 16) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=100, srto_max=200, srto_min=50}, 17) = 0 +//+0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=..., srto_max=200, srto_min=50}, 15) = -1 EINVAL (Invalid argument) ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=25, srto_max=200, srto_min=50}, 16) = -1 EINVAL (Invalid argument) ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=225, srto_max=200, srto_min=50}, 16) = -1 EINVAL (Invalid argument) ++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=..., srto_initial=50, srto_max=50, srto_min=200}, 16) = -1 EINVAL (Invalid argument) +0 setsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=1024, sinit_max_instreams=1024, sinit_max_attempts=5, sinit_max_init_timeo=100}, 8) = 0 +0 setsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=1024, sinit_max_instreams=1024, sinit_max_attempts=5, sinit_max_init_timeo=100}, 9) = 0 @@ -19,30 +19,30 @@ +0 setsockopt(3, IPPROTO_SCTP, SCTP_NODELAY, [1], 5) = 0 +0 setsockopt(3, IPPROTO_SCTP, SCTP_NODELAY, [1], 3) = -1 (Invalid argument) -+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1}, 8) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=0}, 8) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1024}, 8) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1}, 9) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1}, 7) = -1 (Invalid argument) - -+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=1000, sack_freq=0}, 12) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=500, sack_freq=0}, 12) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=200, sack_freq=0}, 12) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=100, sack_freq=0}, 12) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=10, sack_freq=0}, 12) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=0, sack_freq=1}, 12) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=0, sack_freq=2}, 12) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=0, sack_freq=4}, 12) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=200, sack_freq=2}, 13) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=200, sack_freq=2}, 11) = -1 (Invalid argument) - -+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=1}, 8) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=0}, 8) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=1024}, 8) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=1}, 9) = 0 -+0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=1}, 7) = -1 (Invalid argument) - -+0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1}, 8) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=0}, 8) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1024}, 8) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1}, 9) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1}, 7) = -1 (Invalid argument) + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=1000, sack_freq=0}, 12) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=500, sack_freq=0}, 12) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=200, sack_freq=0}, 12) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=100, sack_freq=0}, 12) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=10, sack_freq=0}, 12) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=0, sack_freq=1}, 12) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=0, sack_freq=2}, 12) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=0, sack_freq=4}, 12) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=200, sack_freq=2}, 13) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0, sack_delay=200, sack_freq=2}, 11) = -1 (Invalid argument) + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=1}, 8) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=0}, 8) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=1024}, 8) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=1}, 9) = 0 ++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=1}, 7) = -1 (Invalid argument) + ++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, spp_hbinterval=30000, spp_pathmaxrxt=100, spp_pathmtu=1468, spp_flags=0, spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0 +0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=0, sctp_address_event=0, sctp_send_failure_event=0, diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sendmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sendmsg.pkt index 67d100db2f55d740ee8cc9868d7849dbc481ba8a..67f5857ff451ffa04e7d8fb676ce6411b124d6a0 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sendmsg.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sendmsg.pkt @@ -13,69 +13,138 @@ +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 //sendmsg(sd, msghdr, flags) -+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, -spp_hbinterval=0, spp_pathmaxrxt=8, spp_pathmtu=1468, spp_flags=SPP_HB_DISABLE, spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0, + spp_address={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}, + spp_hbinterval=0, + spp_pathmaxrxt=8, + spp_pathmtu=1468, + spp_flags=SPP_HB_DISABLE, + spp_ipv6_flowlabel=0, + spp_dscp=0}, 152) = 0 -+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(0)=[], msg_flags=0}, 0) = 1000 ++1.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(0)=[], + msg_flags=0}, 0) = 1000 * > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] +0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] //base test -+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(28)= - [{cmsg_len=28, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDINFO, cmsg_data= - {snd_sid=2, snd_flags=0, snd_ppid=htonl(3), snd_context=2, snd_assoc_id=0} - }], - msg_flags=0}, 0) = 1000 ++1.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(28)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(3), + snd_context=2, + snd_assoc_id=0}}], + msg_flags=0}, 0) = 1000 * > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=0, ppid=3] +0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] // test with 2 cmsg -+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(44)= - [{cmsg_len=28, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDINFO, cmsg_data= - {snd_sid=2, snd_flags=0, snd_ppid=htonl(4), snd_context=2, snd_assoc_id=0} - },{cmsg_len=16, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_DSTADDRV4, cmsg_data= - {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")} - }], - msg_flags=0}, 0) = 1000 ++1.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(44)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(4), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_DSTADDRV4, + cmsg_data={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}], + msg_flags=0}, 0) = 1000 * > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=2, ssn=1, ppid=4] +0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]] // test with 2 cmsg -+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(64)= - [{cmsg_len=28, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDINFO, cmsg_data= - {snd_sid=2, snd_flags=0, snd_ppid=htonl(5), snd_context=2, snd_assoc_id=0} - },{cmsg_len=16, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_DSTADDRV4, cmsg_data= - {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")} - },{cmsg_len=18, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_PRINFO, cmsg_data= - {pr_policy=SCTP_PR_SCTP_TTL, pr_value=30} - }], - msg_flags=0}, 0) = 1000 ++1.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(64)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(5), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_DSTADDRV4, + cmsg_data={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}, + {cmsg_len=18, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_PRINFO, + cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}], + msg_flags=0}, 0) = 1000 * > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=2, ssn=2, ppid=5] +0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]] -// test with 2 cmsg -+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(80)= - [{cmsg_len=28, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDINFO, cmsg_data= - {snd_sid=2, snd_flags=0, snd_ppid=htonl(6), snd_context=2, snd_assoc_id=0} - },{cmsg_len=16, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_DSTADDRV4, cmsg_data= - {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")} - },{cmsg_len=18, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_PRINFO, cmsg_data= - {pr_policy=SCTP_PR_SCTP_TTL, pr_value=30} - },{cmsg_len=14, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_AUTHINFO, cmsg_data= - {auth_keynumber=123} - }], - msg_flags=0}, 0) = 1000 +// test with 4 cmsg ++1.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(80)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(6), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=16, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_DSTADDRV4, + cmsg_data={sa_family=AF_INET, + sin_port=htons(8080), + sin_addr=inet_addr("192.0.2.1")}}, + {cmsg_len=18, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_PRINFO, + cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}, + {cmsg_len=14, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_AUTHINFO, + cmsg_data={auth_keynumber=123}}], + msg_flags=0}, 0) = 1000 * > sctp: DATA[flgs=BE, len=1016, tsn=5, sid=2, ssn=3, ppid=6] +0.0 < sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=1500, gaps=[], dups=[]] //test for sndrcvinfo -+1.0 sendmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}], msg_control(168)= - [{cmsg_len=28, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDINFO, cmsg_data= - {snd_sid=2, snd_flags=0, snd_ppid=htonl(6), snd_context=2, snd_assoc_id=0} - },{cmsg_len=140, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_SNDRCV, cmsg_data= - {sinfo_stream=3, sinfo_ssn=3, sinfo_flags=0, sinfo_ppid=htonl(7), sinfo_context=0, sinfo_timetolive=0, sinfo_tsn=6, sinfo_cumtsn=6, sinfo_assoc_id=3} - }], - msg_flags=0}, 0) = 1000 ++1.0 sendmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base=..., iov_len=1000}], + msg_control(168)=[{cmsg_len=28, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDINFO, + cmsg_data={snd_sid=2, + snd_flags=0, + snd_ppid=htonl(6), + snd_context=2, + snd_assoc_id=0}}, + {cmsg_len=140, + cmsg_level=IPPROTO_SCTP, + cmsg_type=SCTP_SNDRCV, + cmsg_data={sinfo_stream=3, + sinfo_ssn=3, + sinfo_flags=0, + sinfo_ppid=htonl(7), + sinfo_context=0, + sinfo_timetolive=0, + sinfo_tsn=6, + sinfo_cumtsn=6, + sinfo_assoc_id=3}}], + msg_flags=0}, 0) = 1000 * > sctp: DATA[flgs=BE, len=1016, tsn=6, sid=3, ssn=0, ppid=7] +0.0 < sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=1500, gaps=[], dups=[]]