From d932b2950666601bc7b86f657d4d74a5fc536b57 Mon Sep 17 00:00:00 2001
From: hoelscher <jens.hoelscher@fh-muenster.de>
Date: Fri, 27 Nov 2015 02:04:26 +0100
Subject: [PATCH] add first testcases for testing  packetdrill for sctp_ap_api

---
 .../8.1.1_sctp_rtoinfo_1.pkt                  |  9 ++
 .../8.1.1_sctp_rtoinfo_2.pkt                  | 10 +++
 .../8.1.1_sctp_rtoinfo_3.pkt                  | 11 +++
 .../api_tests/9.10_sctp_send/sctp_send_1.pkt  | 34 +++++++
 .../api_tests/9.10_sctp_send/sctp_send_2.pkt  | 47 ++++++++++
 .../9.11_sctp_sendx/sctp_sendx_1.pkt          | 65 ++++++++++++++
 .../tests/bsd/sctp/api_tests/run-all-tests    | 89 +++++++++++++++++++
 7 files changed, 265 insertions(+)
 create mode 100644 gtests/net/packetdrill/tests/bsd/sctp/api_tests/8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_1.pkt
 create mode 100644 gtests/net/packetdrill/tests/bsd/sctp/api_tests/8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_2.pkt
 create mode 100644 gtests/net/packetdrill/tests/bsd/sctp/api_tests/8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_3.pkt
 create mode 100644 gtests/net/packetdrill/tests/bsd/sctp/api_tests/9.10_sctp_send/sctp_send_1.pkt
 create mode 100644 gtests/net/packetdrill/tests/bsd/sctp/api_tests/9.10_sctp_send/sctp_send_2.pkt
 create mode 100644 gtests/net/packetdrill/tests/bsd/sctp/api_tests/9.11_sctp_sendx/sctp_sendx_1.pkt
 create mode 100755 gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests

diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_1.pkt
new file mode 100644
index 00000000..1a6fe676
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/8.1_rw_socketoptions/8.1.1_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/8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_2.pkt
new file mode 100644
index 00000000..80305cd4
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/8.1_rw_socketoptions/8.1.1_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/8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_3.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_3.pkt
new file mode 100644
index 00000000..164ace17
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/8.1_rw_socketoptions/8.1.1_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/api_tests/9.10_sctp_send/sctp_send_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/9.10_sctp_send/sctp_send_1.pkt
new file mode 100644
index 00000000..11faa137
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/9.10_sctp_send/sctp_send_1.pkt
@@ -0,0 +1,34 @@
+--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_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/9.10_sctp_send/sctp_send_2.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/9.10_sctp_send/sctp_send_2.pkt
new file mode 100644
index 00000000..879896fe
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/9.10_sctp_send/sctp_send_2.pkt
@@ -0,0 +1,47 @@
+--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_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/9.11_sctp_sendx/sctp_sendx_1.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/9.11_sctp_sendx/sctp_sendx_1.pkt
new file mode 100644
index 00000000..20b4eb9a
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/9.11_sctp_sendx/sctp_sendx_1.pkt
@@ -0,0 +1,65 @@
+--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_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,
+                                       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=[]]
+
+
++1.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=2, sid=3, ssn=1, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++1.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=3, sid=3, ssn=2, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=3, 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/run-all-tests b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests
new file mode 100755
index 00000000..a5669632
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/run-all-tests
@@ -0,0 +1,89 @@
+#!/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 = (8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_1 \
+		 8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_2 \
+		 8.1_rw_socketoptions/8.1.1_sctp_rtoinfo_3 \
+		 9.10_sctp_send/sctp_send_1                \
+		 9.11_sctp_sendx/sctp_sendx_1 )
+
+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
-- 
GitLab