DD1984 / sockperf

Automatically exported from code.google.com/p/sockperf
Other
1 stars 0 forks source link

add support for low latency sockets #45

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
Here is a sample patch
You can use it under any SW license you want to.

Add lls socket option support.
use --lls (value in usecs) to override global setting.
Right now we always get and print the value of the option before we set,
to show that the option works properly.
This should be removed in an official release.

---

 src/Defs.h       |    3 +++
 src/SockPerf.cpp |   58 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/src/Defs.h b/src/Defs.h
index e38e3a4..041fa0d 100644
--- a/src/Defs.h
+++ b/src/Defs.h
@@ -161,6 +161,7 @@ enum {
     OPT_OUTPUT_PRECISION,           //35
     OPT_CLIENTPORT,                 //36
     OPT_CLIENTIP,                   //37
+    OPT_LLS,            //38
 };

 #define MODULE_NAME            "sockperf"
@@ -527,6 +528,8 @@ struct user_params_t {
 //    bool stream_mode; - use b_stream instead
     int mthread_server;
     struct timeval* select_timeout;
+    unsigned int lls_usecs;
+    bool lls_is_set;
     int sock_buff_size;
     int threads_num;
     char threads_affinity[MAX_ARGV_SIZE];
diff --git a/src/SockPerf.cpp b/src/SockPerf.cpp
index 41daf95..28569c9 100644
--- a/src/SockPerf.cpp
+++ b/src/SockPerf.cpp
@@ -207,6 +207,10 @@ static const AOPT_DESC  common_opt_desc[] =
         "Limit the lifetime of the message (default 2)."
     },
     {
+        OPT_LLS, AOPT_ARG, aopt_set_literal( 0 ), aopt_set_string( "lls" ),
+        "Turn on LLS via socket option (value = us to poll)."
+    },
+    {
         OPT_BUFFER_SIZE, AOPT_ARG, aopt_set_literal( 0 ), aopt_set_string( "buffer-size" ),
         "Set total socket receive/send buffer <size> in bytes (system defined by default)."
     },
@@ -292,7 +296,7 @@ static int proc_mode_help( int id, int argc, const char 
**argv )
     int   i = 0;

     printf(MODULE_NAME " is a tool for testing network latency and throughput.\n");
-    printf("version %s\n", STR(VERSION));
+    printf("version %s-lls\n", STR(VERSION));
     printf("\n");
     printf("Usage: " MODULE_NAME " <subcommand> [options] [args]\n");
     printf("Type: \'" MODULE_NAME " <subcommand> --help\' for help on a specific subcommand.\n");
@@ -1382,8 +1386,8 @@ static int proc_mode_server( int id, int argc, const char 
**argv )
         {
             'B', AOPT_NOARG,    aopt_set_literal( 'B' ), aopt_set_string( "Bridge" ),
             "Run in Bridge mode."
-        },
-*/
+        },
+*/
         {
              OPT_THREADS_NUM, AOPT_ARG, aopt_set_literal( 0 ), aopt_set_string( "threads-num" ),
              "Run <N> threads on server side (requires '-f' option)."
@@ -1789,6 +1793,26 @@ static int parse_common_opt( const AOPT_OBJECT 
*common_obj )
             s_user_params.is_nonblocked_send = true;
         }

+        if ( !rc && aopt_check(common_obj, OPT_LLS) ) {
+            const char* optarg = aopt_value(common_obj, OPT_LLS);
+            if (optarg) {
+                errno = 0;
+                int value = strtoul(optarg, NULL, 0);
+                if (errno != 0 || value < 0) {
+                    log_msg("'-%d' Invalid LLS value: %s", OPT_LLS, optarg);
+                    rc = SOCKPERF_ERR_BAD_ARGUMENT;
+                }
+                else {
+                    s_user_params.lls_usecs = value;
+                    s_user_params.lls_is_set = true;
+                }
+            }
+            else {
+                log_msg("'-%d' Invalid value", OPT_LLS);
+                rc = SOCKPERF_ERR_BAD_ARGUMENT;
+            }
+        }
+
         if ( !rc && aopt_check(common_obj, OPT_RECV_LOOPING) ) {

             const char* optarg = aopt_value(common_obj, OPT_RECV_LOOPING);
@@ -2296,6 +2320,29 @@ int sock_set_reuseaddr(int fd)
     return rc;
 }

+#ifndef SO_LL
+#define SO_LL 46
+#endif
+int sock_set_lls(int fd)
+{
+    int rc = SOCKPERF_ERR_NONE;
+    unsigned int lls;
+    int size = sizeof(lls);
+
+    if(getsockopt(fd, SOL_SOCKET, SO_LL, &lls, (socklen_t *)&size) < 0){
+        log_err("getsockopt(SO_LL) failed");
+        return SOCKPERF_ERR_SOCKET;
+    } else
+        log_msg("socket option SO_LL default was %u, changing to %u", lls, 
s_user_params.lls_usecs);
+
+    if (setsockopt(fd, SOL_SOCKET, SO_LL, &(s_user_params.lls_usecs), 
sizeof(s_user_params.lls_usecs)) < 0) {
+        log_err("setsockopt(SO_LL) failed");
+        rc = SOCKPERF_ERR_SOCKET;
+    }
+    return rc;
+}
+
+
 int sock_set_snd_rcv_bufs(int fd)
 {
     /*
@@ -2460,6 +2507,11 @@ int prepare_socket(int fd, struct fds_data *p_data)
     }

     if (!rc &&
+            (s_user_params.lls_is_set == true))
+    {
+        rc = sock_set_lls(fd);
+    }
+    if (!rc &&
             (s_user_params.sock_buff_size > 0))
     {
         rc = sock_set_snd_rcv_bufs(fd);

Original issue reported on code.google.com by eliez...@gmail.com on 18 Jun 2013 at 6:16

GoogleCodeExporter commented 9 years ago

Original comment by rosenbau...@gmail.com on 18 Jun 2013 at 8:33

GoogleCodeExporter commented 9 years ago

Original comment by rosenbau...@gmail.com on 18 Jun 2013 at 10:53

GoogleCodeExporter commented 9 years ago
Hi Eliezer,
Please take a look at the attached modified patch and see if you approve the 
changes and does it pass your tests.
Thanks,
Alex

Original comment by rosenbau...@gmail.com on 18 Jun 2013 at 11:43

Attachments:

GoogleCodeExporter commented 9 years ago
looks OK to me.

Original comment by eliez...@gmail.com on 18 Jun 2013 at 11:49

GoogleCodeExporter commented 9 years ago

Original comment by rosenbau...@gmail.com on 19 Jun 2013 at 5:48