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