Re: [PATCH] sockperf: add SO_LL socketop support

From: Amir Vadai
Date: Wed Jun 12 2013 - 04:39:04 EST


On 11/06/2013 17:26, Eliezer Tamir wrote:
> Add lls socket option support to sockperf.
> Right now we always get the option before set to show the option is
> working properly. We should probably remove that in an official release.
> use --lls (value in usecs) to override global setting.
> ---
>
> src/Defs.h | 3 +++
> src/SockPerf.cpp | 54
> +++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 56 insertions(+), 1 deletions(-)
>
> diff --git a/src/Defs.h b/src/Defs.h
> index e38e3a4..87b45a0 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 long 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..d76320f 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");
> @@ -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 long 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 %lu, changing to %lu",
> 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);
>
>
>
>
>

Eliezer Hi,

Added sockperf maintainers to CC list.

To upload changes to sockperf code, please open a ticket on the sockperf
google code and then submit the patch
(https://code.google.com/p/sockperf/issues/).

You will need to wrap it in " #ifndef w-i-n-d-o-w-s" but sockperf
maintainers can help you do that on the sockperf pages.

You should look at the recently added TOS which is very similar
(https://code.google.com/p/sockperf/issues/detail?id=44).

Amir
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/