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 <pe...@mellanox.com>
---
 mausezahn.8         |  6 ++++++
 staging/layer3.c    |  9 +++++++++
 staging/mausezahn.c | 18 +++++++++++++++++-
 staging/mz.h        |  1 +
 4 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/mausezahn.8 b/mausezahn.8
index 8379111..71d3aa0 100644
--- a/mausezahn.8
+++ b/mausezahn.8
@@ -79,6 +79,12 @@ Specify IPv6 mode (IPv4 is the default).
 .SS -l <IP>
 Specify the IP address mausezahn should bind to when in interactive mode, 
default: 0.0.0.0.
 .PP
+.SS -R <PRIO>
+Set priority of sent packets. This configures SO_PRIORITY at the socket through
+which the packets are sent. Usual priority numbers are 0..15, but the value can
+also be a class ID for purposes of Qdisc classification. In that case, a class
+ID such is 1234:5678 would be specified as 0x12345678.
+.PP
 .SS -v
 Verbose mode. Capital \-V is even more verbose.
 .PP
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
-- 
2.20.1

-- 
You received this message because you are subscribed to the Google Groups 
"netsniff-ng" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to netsniff-ng+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/netsniff-ng/6f60695450b6c36131323347de67b7aef094cabe.1569947985.git.petrm%40mellanox.com.

Reply via email to