blob: db6df5984975040ec198a4b7cd75522a872bb2e8 [file] [log] [blame]
From c13f135fe4d745aa7b9935643f3c9af404cc3c62 Mon Sep 17 00:00:00 2001
From: Daniel Mentz <danielmentz@google.com>
Date: Tue, 18 Sep 2012 09:40:48 -0700
Subject: [PATCH] Option --priority allows user to set SO_PRIORITY
Add command line option --priority that allows the user to specify the
protocol-defined priority i.e. the skb_priority which is the priority in
the socket buffer (sk_buff). Packets with a higher priority may be
processed first depending on the selected device queueing discipline.
Furthermore, this value eventually maps to the Priority Code Point (PCP)
in the 802.1q VLAN tag. The exact mapping can be found in the output of
the following command under "egress-qos-map".
ip -d link show dev eth1.0
Also, look at socket(7) and search for SO_PRIORITY.
---
doc/index.html | 8 ++++++++
include/Settings.hpp | 1 +
man/iperf.1 | 3 +++
src/Locale.c | 1 +
src/PerfSocket.cpp | 17 +++++++++++++++++
src/Settings.cpp | 8 ++++++++
6 files changed, 38 insertions(+)
diff --git a/doc/index.html b/doc/index.html
index 47d213f..fcffe9d 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -219,6 +219,14 @@ we will try to fix them quickly. <BR>
<TD><TT>$IPERF_NODELAY</TT></TD>
<TD>Set the TCP no delay option, disabling Nagle's algorithm. Normally
this is only disabled for interactive applications like telnet.</TD></TR>
+ <TR vAlign=top>
+ <TD><A name=priority></A><TT>-O, --priority</TT></TD>
+ <TD><TT>$IPERF_PRIORITY</TT></TD>
+ <TD>Set protocol-defined priority i.e. skb_priority which is the priority in
+ the socket buffer (sk_buff). Packets with a higher priority may be
+ processed first depending on the selected device queueing discipline.
+ Furthermore, this value eventually maps to the Priority Code Point (PCP)
+ in the 802.1q VLAN tag.</TD></TR>
<TR>
<TD><TT>-V </TT>(from v1.6 or higher)</TD>
<TD>.</TD>
diff --git a/include/Settings.hpp b/include/Settings.hpp
index 31de506..1713777 100644
--- a/include/Settings.hpp
+++ b/include/Settings.hpp
@@ -120,6 +120,7 @@ typedef struct thread_Settings {
// int's
int mThreads; // -P
int mTOS; // -S
+ int mPriority; // -O
int mSock;
int Extractor_size;
int mBufLen; // -l
diff --git a/man/iperf.1 b/man/iperf.1
index b6e4ce5..aaa5beb 100644
--- a/man/iperf.1
+++ b/man/iperf.1
@@ -67,6 +67,9 @@ set TCP maximum segment size (MTU - 40 bytes)
.BR -N ", " --nodelay " "
set TCP no delay, disabling Nagle's Algorithm
.TP
+.BR -O ", " --priority " "
+set protocol-defined priority i.e. skb_priority
+.TP
.BR -v ", " --version " "
print version information and quit
.TP
diff --git a/src/Locale.c b/src/Locale.c
index b5d42b1..7f94ec6 100644
--- a/src/Locale.c
+++ b/src/Locale.c
@@ -88,6 +88,7 @@ Client/Server:\n\
-C, --compatibility for use with older versions does not sent extra msgs\n\
-M, --mss # set TCP maximum segment size (MTU - 40 bytes)\n\
-N, --nodelay set TCP no delay, disabling Nagle's Algorithm\n\
+ -O, --priority set protocol-defined priority i.e. skb_priority\n\
-V, --IPv6Version Set the domain to IPv6\n\
\n\
Server specific:\n\
diff --git a/src/PerfSocket.cpp b/src/PerfSocket.cpp
index 3ecdbe0..c599c88 100644
--- a/src/PerfSocket.cpp
+++ b/src/PerfSocket.cpp
@@ -138,6 +138,23 @@ void SetSocketOptions( thread_Settings *inSettings ) {
}
#endif
+#ifdef SO_PRIORITY
+ /* From socket(7): "Set the protocol-defined priority for all
+ * packets to be sent on this socket. Linux uses this value to order
+ * the networking queues: packets with a higher priority may be
+ * processed first depending on the selected device queueing
+ * discipline. For ip(7), this also sets the IP type-of-service (TOS)
+ * field for outgoing packets. Setting a priority outside the range 0
+ * to 6 requires the CAP_NET_ADMIN capability." */
+ if ( inSettings->mPriority > 0 ) {
+ int priority = inSettings->mPriority;
+ Socklen_t len = sizeof(priority);
+ int rc = setsockopt( inSettings->mSock, SOL_SOCKET, SO_PRIORITY,
+ (char*) &priority, len );
+ WARN_errno( rc == SOCKET_ERROR, "setsockopt SO_PRIORITY" );
+ }
+#endif
+
if ( !isUDP( inSettings ) ) {
// set the TCP maximum segment size
setsock_tcp_mss( inSettings->mSock, inSettings->mMSS );
diff --git a/src/Settings.cpp b/src/Settings.cpp
index 6a5f092..c018418 100644
--- a/src/Settings.cpp
+++ b/src/Settings.cpp
@@ -113,6 +113,7 @@ const struct option long_options[] =
{"mss", required_argument, NULL, 'M'},
{"nodelay", no_argument, NULL, 'N'},
{"listenport", required_argument, NULL, 'L'},
+{"priority", required_argument, NULL, 'O'},
{"parallel", required_argument, NULL, 'P'},
{"remove", no_argument, NULL, 'R'},
{"tos", required_argument, NULL, 'S'},
@@ -157,6 +158,7 @@ const struct option env_options[] =
{"IPERF_MSS", required_argument, NULL, 'M'},
{"IPERF_NODELAY", no_argument, NULL, 'N'},
{"IPERF_LISTENPORT", required_argument, NULL, 'L'},
+{"IPERF_PRIORITY", required_argument, NULL, 'O'},
{"IPERF_PARALLEL", required_argument, NULL, 'P'},
{"IPERF_TOS", required_argument, NULL, 'S'},
{"IPERF_TTL", required_argument, NULL, 'T'},
@@ -629,6 +631,12 @@ void Settings_Interpret( char option, const char *optarg, thread_Settings *mExtS
mExtSettings->mTOS = strtol( optarg, NULL, 0 );
break;
+ case 'O': // protocol-defined priority
+ // the zero base here allows the user to specify
+ // "0x#" hex, "0#" octal, and "#" decimal numbers
+ mExtSettings->mPriority = strtol( optarg, NULL, 0 );
+ break;
+
case 'T': // time-to-live for multicast
mExtSettings->mTTL = atoi( optarg );
break;
--
1.7.11.1