From 81c4b3117f866d3e1c9b1d1f81d9adccf138748e Mon Sep 17 00:00:00 2001 From: Hoelscher <jens.hoelscher@fh-muenster.de> Date: Fri, 1 Jul 2016 17:57:20 +0200 Subject: [PATCH] add testcases for sctp stream reconfiguration events --- .../tests/bsd/sctp/sctp_active.pkt | 13 ++++- .../sctp_change_streams_event.pkt | 56 +++++++++++++++++++ .../sctp_reconfig/sctp_reset_assoc_event.pkt | 47 ++++++++++++++++ .../sctp_reconfig/sctp_reset_stream_event.pkt | 49 ++++++++++++++++ .../tests/bsd/sctp/sctp_simple_active.pkt | 2 +- 5 files changed, 163 insertions(+), 4 deletions(-) create mode 100644 gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_change_streams_event.pkt create mode 100644 gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_assoc_event.pkt create mode 100644 gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_stream_event.pkt diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_active.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_active.pkt index c2c8ab13..2104291a 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_active.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_active.pkt @@ -1,13 +1,15 @@ + --tolerance_usecs=75000 + 0.0 `sysctl -w net.inet.sctp.ecn_enable=1` +0.0 `sysctl -w net.inet.sctp.pr_enable=0` +0.0 `sysctl -w net.inet.sctp.asconf_enable=0` -+0.0 `sysctl -w net.inet.sctp.auth_enable=0` ++0.0 `sysctl -w net.inet.sctp.auth_disable=1` +0.0 `sysctl -w net.inet.sctp.reconfig_enable=0` -+0.0 `sysctl -w net.inet.sctp.nrsack_enable=0` -+0.0 `sysctl -w net.inet.sctp.pktdrop_enable=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=0, @@ -19,7 +21,9 @@ PARAMETER[type=0xbf11, len=5, val=[0x01]]] +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 + // Send some data +0.5 < sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=9, val=...]]; PAD[flgs=0, len=1300, val=...] @@ -27,14 +31,17 @@ +1.0 write(3, ..., 1000) = 1000 +0.0 > sctp: DATA[flgs=BE, len=1016, tsn=0, sid=0, ssn=0, ppid=0] +0.1 < sctp: SACK[flgs=0, cum_tsn=0, a_rwnd=1500, gaps=[], dups=[]] + // Receive some data +1.0 < sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=0, ppid=0] +0.0 read(3, ..., 2000) = 1000 +0.0 > sctp: SACK[flgs=..., cum_tsn=3, a_rwnd=..., gaps=..., dups=...] + // Receive more data, observe a non-delayed SACK +1.0 < sctp: DATA[flgs=IBE, len=1016, tsn=4, sid=0, ssn=1, ppid=0] +0.0 read(3, ..., 2000) = 1000 +0.0 > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=..., dups=...] + // Tear down the association +0.0 close(3) = 0 +0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=4] diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_change_streams_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_change_streams_event.pkt new file mode 100644 index 00000000..c0da10b4 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_change_streams_event.pkt @@ -0,0 +1,56 @@ +--tolerance_usecs=100000 + ++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=0, assoc_value=SCTP_ENABLE_CHANGE_ASSOC_REQ}, 8) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_STREAM_CHANGE_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_STREAM_CHANGE_EVENT, se_on=1}, [8]) = 0 + ++0.0 bind(3, ..., ...) = 0 ++0.0 listen(3, 1) = 0 ++0.0 < sctp: INIT[flgs=0, tag=1, a_rwnd=1500, os=1, is=1, tsn=1, + ECN_CAPABLE[], + SUPPORTED_EXTENSIONS[types=[0x82]], + COOKIE_PRESERVATIVE[incr=12345], + SUPPORTED_ADDRESS_TYPES[types=[IPv4]]] ++0.0 > sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=..., os=..., is=..., tsn=10, ...] ++0.1 < sctp: COOKIE_ECHO[flgs=0, len=..., val=...] ++0.0 > sctp: COOKIE_ACK[flgs=0] + ++0.0 accept(3, ..., ...) = 4 + ++1.0 write(4, ..., 1000) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=10, sid=0, ssn=0, ppid=0] ++0.1 < sctp: SACK[flgs=0, cum_tsn=10, a_rwnd=1500, gaps=[], dups=[]] + ++1.0 write(4, ..., 1000) = 1000 +* > sctp: DATA[flgs=BE, len=1016, tsn=11, sid=0, ssn=1, ppid=0] ++0.0 < sctp: SACK[flgs=0, cum_tsn=11, a_rwnd=1500, gaps=[], dups=[]] + ++0.1 < 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 read(4, ..., 1000) = 1000 + ++0.1 < 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 read(4, ..., 1000) = 1000 + ++0.0 setsockopt(4, IPPROTO_SCTP, SCTP_ADD_STREAMS, {sas_instrms=0, + sas_outstrms=10}, 8) = 0 ++0.0 > sctp: RECONFIG[flgs=0, ADD_OUTGOING_STREAMS[req_sn=10, number_of_new_streams=10]] ++0.0 < sctp: RECONFIG[flgs=0, RECONFIG_RESPONSE[resp_sn=10, result=1]] + ++0.2 recvmsg(4, {msg_name(...)=..., + msg_iov(1)=[{iov_base={strchange_type=SCTP_STREAM_CHANGE_EVENT, + strchange_flags=0, + strchange_length=16, + strchange_assoc_id=3, + strchange_instrms=1, + strchange_outstrms=11}, + iov_len=1000}], + msg_control(0)=[], + msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 16 + + ++0 close(3) = 0 ++0 close(4) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_assoc_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_assoc_event.pkt new file mode 100644 index 00000000..b194e685 --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_assoc_event.pkt @@ -0,0 +1,47 @@ +--tolerance_usecs=100000 + +// Create a non-blocking 1-to-1 style socket + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x02 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR | O_NONBLOCK) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=3, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ|SCTP_ENABLE_RESET_ASSOC_REQ|SCTP_ENABLE_CHANGE_ASSOC_REQ}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=3, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ|SCTP_ENABLE_RESET_ASSOC_REQ|SCTP_ENABLE_CHANGE_ASSOC_REQ}, [8]) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ASSOC_RESET_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ASSOC_RESET_EVENT, se_on=1}, [8]) = 0 + +// Trigger the active associtation setup ++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.0 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...], SUPPORTED_EXTENSIONS[types=[0x82]]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.0 < sctp: COOKIE_ACK[flgs=0] + +// Check if the setup was sucessful ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +// Generate some traffic so the tsn and ssn increase ++0.0 write(3, ..., 1000) = 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 write(3, ..., 1000) = 1000 ++0.0 > 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=[]] + +// Reset Stream 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RESET_ASSOC, [3], 4) = 0 ++0.0 > sctp: RECONFIG[flgs=0, SSN_TSN_RESET[req_sn=1]] ++0.0 < sctp: RECONFIG[flgs=0, RECONFIG_RESPONSE[resp_sn=1, result=1, sender_next_tsn=1, receiver_next_tsn=1]] + ++0.2 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base={assocreset_type=SCTP_ASSOC_RESET_EVENT, + assocreset_flags=0, + assocreset_length=20, + assocreset_assoc_id=3, + assocreset_local_tsn=1, + assocreset_remote_tsn=2}, + iov_len=1000}], + msg_control(0)=[], + msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 20 + ++1.0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_stream_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_stream_event.pkt new file mode 100644 index 00000000..ac7dd22c --- /dev/null +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/sctp_reset_stream_event.pkt @@ -0,0 +1,49 @@ +--tolerance_usecs=100000 + +// Create a non-blocking 1-to-1 style socket + 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 ++0.0 fcntl(3, F_GETFL) = 0x02 (flags O_RDWR) ++0.0 fcntl(3, F_SETFL, O_RDWR | O_NONBLOCK) = 0 + ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=3, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET, {assoc_id=3, assoc_value=SCTP_ENABLE_RESET_STREAM_REQ}, [8]) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_STREAM_RESET_EVENT, se_on=1}, 8) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_STREAM_RESET_EVENT, se_on=1}, [8]) = 0 + +// Trigger the active associtation setup ++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.0 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...], SUPPORTED_EXTENSIONS[types=[0x82]]] ++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] ++0.0 < sctp: COOKIE_ACK[flgs=0] + +// Check if the setup was sucessful ++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +// Generate some traffic so the tsn and ssn increase ++0.0 write(3, ..., 1000) = 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 write(3, ..., 1000) = 1000 ++0.0 > 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=[]] + +// Reset Stream 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RESET_STREAMS, {srs_assoc_id=3, + srs_flags=SCTP_STREAM_RESET_OUTGOING, + srs_number_streams=0, + srs_stream_list=[]}, 8) = 0 ++0.0 > sctp: RECONFIG[flgs=0, OUTGOING_SSN_RESET[req_sn=1, resp_sn=0, last_tsn=2, sids=[]]] ++0.0 < sctp: RECONFIG[flgs=0, RECONFIG_RESPONSE[resp_sn=1, result=1]] + ++0.2 recvmsg(3, {msg_name(...)=..., + msg_iov(1)=[{iov_base={strreset_type=SCTP_STREAM_RESET_EVENT, + strreset_flags=SCTP_STREAM_RESET_OUTGOING, + strreset_length=12, + strreset_assoc_id=3, + strreset_stream_list=[]}, + iov_len=1000}], + msg_control(0)=[], + msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12 + ++1.0 close(3) = 0 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_simple_active.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_simple_active.pkt index 09e36466..662fbde6 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_simple_active.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_simple_active.pkt @@ -1,4 +1,4 @@ -+0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3 + 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 -- GitLab