Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F175816728
D33854.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D33854.id.diff
View Options
Index: tests/sys/common/Makefile
===================================================================
--- tests/sys/common/Makefile
+++ tests/sys/common/Makefile
@@ -6,9 +6,11 @@
${PACKAGE}FILES+= divert.py
${PACKAGE}FILES+= sender.py
${PACKAGE}FILES+= net_receiver.py
+${PACKAGE}FILES+= tcp_dscp.sh
${PACKAGE}FILESMODE_divert.py=0555
${PACKAGE}FILESMODE_sender.py=0555
${PACKAGE}FILESMODE_net_receiver.py=0555
+${PACKAGE}FILESMODE_tcp_dscp.sh=0555
.include <bsd.test.mk>
Index: tests/sys/common/tcp_dscp.sh
===================================================================
--- /dev/null
+++ tests/sys/common/tcp_dscp.sh
@@ -0,0 +1,125 @@
+#!/bin/sh
+
+# Test if packets has corresponding DSCP value when a TCP socket is requesting
+# specific IP_TOS|IPV6_TCLASS
+# Uses netcat(1) as TCP client and server to send 1MB of random data over loopback,
+# then uses tcpdump(1) to read the DSCP values from those packets.
+set -eu
+
+# We are testing only some DSCP values, not all of them
+dscp_cs1=0x20
+dscp_cs7=0xe0
+dscp_af11=0x28
+dscp_af43=0x98
+dscp_ef=0xb8
+
+die() {
+ # Exit on error
+ echo -n "EXIT: " >&2
+ echo "$@" >&2
+ exit 1
+}
+
+usage () {
+ # Display usage
+ echo "$0 inet | inet6"
+ exit 0
+}
+
+check_dump () {
+ # Check tcpdump trace for expected DSCP value in packet
+ direction=$1
+ if [ $direction = "client->server" ]; then
+ src=""
+ dst="${host}.${port}"
+ else
+ src="${host}.${port}"
+ dst=
+ fi
+ # tcpdump is displaying IPv4 packets verbose output using 2 lines but only 1 line if IPv6 :-(
+ if [ "${proto}" = "ip" ]; then
+ if grep -B 1 "${src}[[:space:]]>[[:space:]]${dst}" /tmp/${proto}.txt | grep -q '(tos 0x0,' /tmp/${proto}.txt; then
+ result="Fail (Empty tos detected)"
+ elif grep -B 1 "${src}[[:space:]]>[[:space:]]${dst}" /tmp/${proto}.txt | grep -q "(${tcpdump_name} ${dscp_hex}"; then
+ result="Success"
+ else
+ result="Fail (Wrong value)"
+ fi
+ elif [ "$proto" = "ip6" ]; then
+ if grep -q "(flowlabel[[:space:]].*${src}[[:space:]]>[[:space:]]${dst}" /tmp/$proto.txt; then
+ result="Fail (Empty tos detected)"
+ elif grep -q "(${tcpdump_name} ${dscp_hex}.*${src}[[:space:]]>[[:space:]]${dst}" /tmp/$proto.txt; then
+ result="Success"
+ else
+ result="Fail (Wrong value)"
+ fi
+ fi
+
+ printf "%s\t%s\t%s\t%s\n" ${af} ${dscp_name} ${direction} ${result}
+
+ case "$result" in
+ *Fail*) error=1;;
+ *Success*) error=0;;
+ *) error=;;
+ esac
+ return $error
+}
+
+test () {
+ # Starting tcpdump, then nc to send/receive TCP traffic
+ # $1 dscp name
+ # $2 tos mapping
+ local dscp_name=$1
+ local dscp_hex=$2
+ local result=0
+ # Force a timeout after 5 seconds in case less than 20 packets are captured
+ /usr/bin/timeout 5 /usr/sbin/tcpdump -vpni lo0 -c 20 -K "tcp port ${port}" > /tmp/${proto}.txt 2> /tmp/${proto}.txt &
+JOB_TCPDUMP=$!
+ # Start a TCP server setting the DSCP (flow server -> client) sending 1MB of data to the first client connected
+ dd if=/dev/urandom bs=1M count=1 status=none | /usr/bin/timeout 4 /usr/bin/nc -n -T ${dscp_name} -l $host $port > /dev/null &
+ # Gives time to start the server before running the client
+ sleep 1
+ # Start a TCP client setting the DSCP too too (flow client -> server, mainly ACK here)
+ /usr/bin/timeout 4 /usr/bin/nc -n -w 2 -T ${dscp_name} $host $port > /dev/null &
+ # Wait for the timeout/tcpdump job to complete (capture 20 packets or timeout)
+ wait ${JOB_TCPDUMP} || die "ERROR running tcpdump (common error: need /dev/bpf permission), error code from wait is $? (if 124 it is a timeout)"
+ # Add a forced sleep, to avoid mixing results in the next test (tcpdump could use previously buffered packets)
+ sleep 1
+
+ check_dump "client->server"
+ check_dump "server->client"
+ #rm /tmp/$proto.txt
+}
+
+if [ $# -lt 1 ]; then
+ echo "Not enought argument"
+ usage
+fi
+
+af=$1
+
+# Using different port for inet and inet6 to avoid mixed results
+# with parallel tests
+
+case "$af" in
+ "inet")
+ host="127.0.0.1"
+ proto="ip"
+ port=4404
+ tcpdump_name="tos"
+ ;;
+ "inet6")
+ host="::1"
+ proto="ip6"
+ port=6606
+ tcpdump_name="class"
+ ;;
+ *)
+ usage
+ ;;
+esac
+
+printf "AF\tDSCP\tDirection\tResult\n"
+for value in cs1 af11 cs7 af43 ef; do
+ eval "test ${value} \$dscp_$value"
+done
Index: tests/sys/netinet/Makefile
===================================================================
--- tests/sys/netinet/Makefile
+++ tests/sys/netinet/Makefile
@@ -12,7 +12,7 @@
socket_afinet \
tcp_connect_port_test
-ATF_TESTS_SH= carp fibs fibs_test redirect divert forward output lpm arp
+ATF_TESTS_SH= carp fibs fibs_test redirect divert forward output lpm arp tcp_dscp
TEST_METADATA.output+= required_programs="python"
PROGS= udp_dontroute tcp_user_cookie
Index: tests/sys/netinet/tcp_dscp.sh
===================================================================
--- /dev/null
+++ tests/sys/netinet/tcp_dscp.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env atf-sh
+
+atf_test_case "tcp_dscp_inet"
+tcp_dscp_inet_head() {
+
+ atf_set descr 'Test if TCP socket option correctly generate marked inet DSCP packets'
+ atf_set require.user root
+ atf_set require.progs "tcpdump nc"
+}
+
+tcp_dscp_inet_body() {
+
+ script_name="../common/tcp_dscp.sh"
+
+ atf_check -s exit:0 -o ignore $(atf_get_srcdir)/${script_name} inet
+}
+
+atf_init_test_cases()
+{
+
+ atf_add_test_case "tcp_dscp_inet"
+}
+
+# end
+
Index: tests/sys/netinet6/Makefile
===================================================================
--- tests/sys/netinet6/Makefile
+++ tests/sys/netinet6/Makefile
@@ -15,7 +15,8 @@
output6 \
lpm6 \
fibs6 \
- ndp
+ ndp \
+ tcp_dscp
TEST_METADATA.output6+= required_programs="python"
${PACKAGE}FILES+= exthdr.py
Index: tests/sys/netinet6/tcp_dscp.sh
===================================================================
--- /dev/null
+++ tests/sys/netinet6/tcp_dscp.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env atf-sh
+
+atf_test_case "tcp_dscp_inet6"
+tcp_dscp_inet6_head() {
+
+ atf_set descr 'Test if TCP socket option correctly generate marked inet6 DSCP packets'
+ atf_set require.user root
+ atf_set require.progs "tcpdump nc"
+}
+
+tcp_dscp_inet6_body() {
+
+ script_name="../common/tcp_dscp.sh"
+
+ atf_check -s exit:0 -o ignore $(atf_get_srcdir)/${script_name} inet6
+}
+
+atf_init_test_cases()
+{
+
+ atf_add_test_case "tcp_dscp_inet6"
+}
+
+# end
+
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Oct 14, 2:56 PM (3 h, 47 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40805409
Default Alt Text
D33854.id.diff (6 KB)
Attached To
Mode
D33854: Add a regression test for TCP socket setting DSCP.
Attached
Detach File
Event Timeline
Log In to Comment