From e58d15828610fcf0af663b53f9741eba8e72130c Mon Sep 17 00:00:00 2001 From: Matteo Cypriani Date: Fri, 20 Sep 2013 12:34:11 -0400 Subject: [PATCH] [Client] Change -F option's behaviour In flood mode, the delay is now counted from the beginning of the transmission of a request, instead of after the end of the transmission. The old behaviour is still supported by adding a '+' before the delay duration on the command line. --- TODO.t2t | 8 ----- doc/owlps-client.t2t | 13 ++++++-- owlps-client/owlps-client.c | 62 +++++++++++++++++++++++++++++++------ 3 files changed, 62 insertions(+), 21 deletions(-) diff --git a/TODO.t2t b/TODO.t2t index f7bf062..2de0bb8 100644 --- a/TODO.t2t +++ b/TODO.t2t @@ -139,14 +139,6 @@ Work to do in OwlPS = Client = -- "Metronome" option to send a request precisely every X milliseconds. - - Get the current time right before and right after transmitting a - request, and sleep for (X - elapsed(before, after)). - - Should we replace the default behaviour? Or -F 1000 would be the new - behaviour, whereas -F +1000 would be the old behaviour? - - Log sent requests? - Qt version of the client diff --git a/doc/owlps-client.t2t b/doc/owlps-client.t2t index 7bbeacc..2e23b32 100644 --- a/doc/owlps-client.t2t +++ b/doc/owlps-client.t2t @@ -23,7 +23,7 @@ June 2013 **owlps-client** [ **-v** | **-q** ] **-i** //dest_ip// [ **-p** //dest_port// ] [ **-I** //iface// ] [ **-t** //delay// ] [ **-n** //nb_packets// ] [ **-s** //packet_size// ] - [ **-F** [ //delay// ] [ **-N** //nb_requests// ] [ **-D** ] ] [ **-l** [ //port// ] ] + [ **-F** [ //[+]delay// ] [ **-N** //nb_requests// ] [ **-D** ] ] [ **-l** [ //port// ] ] **owlps-client** [ **-v** | **-q** ] **-i** dest_ip [ **-p** //dest_port// ] [ **-I** //iface// ] [ **-t** //delay// ] [ **-n** //nb_packets// ] [ **-s** //packet_size// ] @@ -75,9 +75,16 @@ owlps-aggregatord.t2t) to create a manual calibration database. Name of the network interface used to transmit the request (e.g. “eth2”). If this option is absent, the interface is selected automatically. You must be root to use this option. -: **-F** [ //delay// ] +: **-F** [ //[+]delay// ] “Flood mode”: loop indefinitely, sending a new request every //delay// - milliseconds (default: 1000 ms). + milliseconds (default: 1000 ms). If //delay// is smaller than the + transmission time of a request (cf. **-n** and **-t** options), it is + ignored and the next request is transmitted right away. If //delay// + is prefixed with a //+// sign, it is cumulative to the transmission + time, i.e. it is the delay between the end of a request's transmission + and the start of the next request's transmission; by default, + //delay// is the time between the start of the transmissions of both + requests. : **-N** //nb_requests// With -F, stop after //nb_requests// requests transmitted instead of looping indefinitely. diff --git a/owlps-client/owlps-client.c b/owlps-client/owlps-client.c index 395629b..49cb90b 100644 --- a/owlps-client/owlps-client.c +++ b/owlps-client/owlps-client.c @@ -84,6 +84,7 @@ struct { uint_fast16_t nb_pkt ; // Number of packets to send uint_fast16_t pkt_size ; // Size of the packet to send int_fast32_t flood_delay ; // Time between two request transmissions + bool add_flood_delay ; // Add the delay to the transmission time? uint_fast16_t nb_requests ; // Number of requests to send uint_fast16_t listening_port ; // Calibration data: @@ -101,6 +102,7 @@ struct { 0, // nb_pkt 0, // pkt_size -1, // flood_delay + false, // add_flood_delay 0, // nb_requests 0, // listening_port 0, 0, 0, 0 // Calibration data @@ -125,6 +127,7 @@ int main(int argc, char *argv[]) int ret = 0 ; // Number of requests we still have to transmit: uint_fast16_t nb_requests_left = 1 ; + owl_timestamp start_time ; // Time of the transmission's start owl_run = true ; @@ -149,12 +152,42 @@ int main(int argc, char *argv[]) create_socket() ; + /* Transmit the first request */ + if (! options.add_flood_delay) + owl_timestamp_now(&start_time) ; send_request() ; if (options.nb_requests) nb_requests_left = options.nb_requests - 1 ; + + /* Transmit the next requests, if any */ while (owl_run && options.flood_delay >= 0 && nb_requests_left > 0) { - owl_msleep(options.flood_delay) ; + uint_fast32_t trx_time, sleep_time ; + owl_timestamp now ; + + if (options.add_flood_delay) + owl_msleep(options.flood_delay) ; + else + { + owl_timestamp_now(&now) ; + trx_time = owl_time_elapsed_ms(&start_time, &now) ; + printf("Transmission time was %"PRIuFAST32" ms", trx_time) ; + + // Sleep only if the sleep delay is greater than the + // transmission time + if (trx_time < (uint_fast32_t) options.flood_delay) + { + sleep_time = options.flood_delay - trx_time ; + printf(", sleeping for %"PRIuFAST32" ms...\n", sleep_time) ; + owl_msleep(sleep_time) ; + } + else + printf(" > %"PRIdFAST32" ms, no sleeping required.\n", + options.flood_delay) ; + + owl_timestamp_now(&start_time) ; + } + if (owl_run) // owl_run can have been set to false during the sleep { send_request() ; @@ -204,8 +237,12 @@ void parse_main_options(int argc, char **argv) * (like -F ), so we have to test separately. */ if (optarg) // We got an option like -F, it's OK - options.flood_delay = strtoul(optarg, NULL, 0) ; - else // We got -F alone or -F + { + options.flood_delay = strtoul(optarg, NULL, 0) ; + if (optarg[0] == '+') + options.add_flood_delay = true ; + } + else // We got -F alone or -F { /* If we are at the end of the string, or the next optind * is an option, we have the option without argument */ @@ -215,8 +252,9 @@ void parse_main_options(int argc, char **argv) else { // Take the optind value: - options.flood_delay = - strtoul(argv[optind], NULL, 0) ; + options.flood_delay = strtoul(argv[optind], NULL, 0) ; + if (argv[optind][0] == '+') + options.add_flood_delay = true ; ++optind ; } } @@ -438,6 +476,7 @@ void print_configuration() "\tNumber of packets: %"PRIuFAST16"\n" "\tPacket size: %"PRIuFAST16"\n" "\tFlood delay (ms): %"PRIdFAST32"\n" + "\tCumulative flood delay: %s\n" "\tNumber of requests: %"PRIuFAST16"\n" "\tListening port: %"PRIuFAST16"\n" "\tDirection: %"PRIu8"\n" @@ -454,6 +493,7 @@ void print_configuration() options.nb_pkt, options.pkt_size, options.flood_delay, + OWL_BOOL_TO_STRING(options.add_flood_delay), options.nb_requests, options.listening_port, options.direction, @@ -497,7 +537,7 @@ void make_packet() if (is_calibration_request) // Calibration packet { if (options.verbose) - printf("Preparing calibration request packet...\n") ; + printf("\nPreparing calibration request packet...\n") ; packet_size = sizeof(uint8_t) * 2 + sizeof(owl_timestamp) + sizeof(float) * 3 + @@ -517,7 +557,7 @@ void make_packet() else // Standard packet { if (options.verbose) - printf("Preparing request packet...\n") ; + printf("\nPreparing request packet...\n") ; packet_size = sizeof(uint8_t) + sizeof(owl_timestamp) + sizeof(uint16_t) * 2 ; @@ -676,7 +716,7 @@ void print_usage() "\n\t" " [-n nb_packets]" " [-s packet_size]" - " [-F [delay] [-N nb_requests] [-D]]" + " [-F [[+]delay] [-N nb_requests] [-D]]" "\n\t" " [-l [port]]\n" "Calibration request:\n" @@ -689,7 +729,7 @@ void print_usage() "\n\t" " [-n nb_packets]" " [-s packet_size]" - " [-F [delay] [-N nb_requests] [-D]]" + " [-F [[+]delay] [-N nb_requests] [-D]]" "\n\t" " direction x y z\n" @@ -721,7 +761,9 @@ void print_usage() " to\n\t\t\tuse this option.\n" "\t-F [delay]\t\"Flood mode\": loop indefinitely, sending a" " new request\n\t\t\tevery milliseconds (default:" - " %d ms).\n" + " %d ms). If\n\t\t\t starts with a +, it is the time" + " between two\n\t\t\trequests instead of the time between the" + " start of the\n\t\t\ttransmission of two requests.\n" "\t-N nb_requests\tWith -F, stop after requests" " transmitted\n\t\t\tinstead of looping indefinitely.\n" "\t-D\t\tDaemon mode. Useful only in flood mode.\n"