diff options
author | Petr Machata <petrm@mellanox.com> | 2019-10-01 16:40:11 +0000 |
---|---|---|
committer | Tobias Klauser <tklauser@distanz.ch> | 2019-10-04 10:23:46 +0200 |
commit | 5f67447541f2382dfbae354d38a21b0e1482028d (patch) | |
tree | ab5599c5380b78d098ba22183c8e3bd2c048120a /staging | |
parent | 0bdd9e1b61534f099ba2a13f8143632a47bf8c27 (diff) |
mausezahn: Support -R to set packet priority
Add a command line option -R to specify SO_PRIORITY socket option. This
then sets priority of the generated SKBs, which is handy for testing Qdiscs
and other priority-dependent functionality.
Signed-off-by: Petr Machata <petrm@mellanox.com>
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Diffstat (limited to 'staging')
-rw-r--r-- | staging/layer3.c | 9 | ||||
-rw-r--r-- | staging/mausezahn.c | 18 | ||||
-rw-r--r-- | staging/mz.h | 1 |
3 files changed, 27 insertions, 1 deletions
diff --git a/staging/layer3.c b/staging/layer3.c index 0b17db1..7dabc26 100644 --- a/staging/layer3.c +++ b/staging/layer3.c @@ -133,6 +133,15 @@ libnet_t* get_link_context(void) fprintf(stderr, "%s", errbuf); exit(EXIT_FAILURE); } + + if (tx.prio != 0 && + setsockopt (libnet_getfd (l), SOL_SOCKET, SO_PRIORITY, &tx.prio, + sizeof tx.prio) < 0) + { + perror("setsockopt SO_PRIORITY"); + exit(EXIT_FAILURE); + } + return l; } diff --git a/staging/mausezahn.c b/staging/mausezahn.c index de3a2e2..c38ea46 100644 --- a/staging/mausezahn.c +++ b/staging/mausezahn.c @@ -34,7 +34,7 @@ int verbose_level = 0; -static const char *short_options = "46hqvVSxra:A:b:B:c:d:E:f:F:l:p:P:t:T:M:Q:X:"; +static const char *short_options = "46hqvVSxra:A:b:B:c:d:E:f:F:l:p:P:R:t:T:M:Q:X:"; static void signal_handler(int number) { @@ -113,6 +113,7 @@ static void help(void) " -l <ip> Listen address to bind to when in interactive mode, default: 0.0.0.0\n" " -4 IPv4 mode (default)\n" " -6 IPv6 mode\n" + " -R <PRIO> Set socket priority\n" " -c <count> Send packet count times, default:1, infinite:0\n" " -d <delay> Apply delay between transmissions. The delay value can be\n" " specified in usec (default, no additional unit needed), or in\n" @@ -224,6 +225,7 @@ int reset(void) tx.packet_mode = 1; // assume we don't care about L2 tx.count = 1; tx.delay = DEFAULT_DELAY; + tx.prio = 0; tx.arg_string[0] = '\0'; // Reset Ethernet parameters of TX: @@ -398,6 +400,7 @@ int getopts (int argc, char *argv[]) char hexpld[MAX_PAYLOAD_SIZE*2]; int hexpld_specified=0; long delay; + long prio; char unit; opterr = 1; // let getopt print error message if necessary @@ -413,6 +416,19 @@ int getopts (int argc, char *argv[]) tx.eth_type = 0x86dd; ipv6_mode=1; break; + case 'R': + errno = 0; + prio = strtol(optarg, NULL, 0); + if (errno) { + perror("Couldn't parse priority"); + return -1; + } + if (prio < 0 || prio > 0xffffffff) { + perror("Invalid priority value"); + return -1; + } + tx.prio = (int)prio; + break; case 'h': help(); break; diff --git a/staging/mz.h b/staging/mz.h index 6d98ad0..5afe57d 100644 --- a/staging/mz.h +++ b/staging/mz.h @@ -340,6 +340,7 @@ struct tx_struct int packet_mode; // 0 means use LIBNET_LINK_ADV, 1 means LIBNET_RAW4 unsigned int count; // 0 means infinite, 1 is default unsigned int delay; // Delay in microseconds, 0 means no delay (default) + unsigned int prio; // Socket priority, 0 is default char arg_string[MAX_PAYLOAD_SIZE]; // Argument-string when -t is used // Ethernet and 802.3 parameters |