On 2015-11-12 at 07:54:19 +0100, Vadim Kochan <vadi...@gmail.com> wrote:
> Now it is possible toggle display TCP/UDP/DCCP/ICMP/SCTP protos
> by the same char keys as short command line options - T/U/D/I/S.
> 
> Signed-off-by: Vadim Kochan <vadi...@gmail.com>
> ---
>  flowtop.c | 69 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 65 insertions(+), 4 deletions(-)
> 
> diff --git a/flowtop.c b/flowtop.c
> index 4c6f383..b6d3a08 100644
> --- a/flowtop.c
> +++ b/flowtop.c
> @@ -104,6 +104,14 @@ enum flow_direction {
>  #define INCLUDE_ICMP (1 << 5)
>  #define INCLUDE_SCTP (1 << 6)
>  
> +#define TOGGLE_FLAG(what, flag) \
> +do {                                 \
> +     if (what & flag)        \
> +             what &= ~flag;  \
> +     else                    \
> +             what |= flag;   \
> +} while (0)
> +
>  struct sysctl_params_ctx {
>       int nfct_acct;
>       int nfct_tstamp;
> @@ -114,6 +122,7 @@ enum rate_units {
>       RATE_BYTES
>  };
>  
> +static volatile bool do_reload_flows;
>  static volatile bool is_flow_collecting;
>  static volatile sig_atomic_t sigint = 0;
>  static int what = INCLUDE_IPV4 | INCLUDE_IPV6 | INCLUDE_TCP;
> @@ -462,7 +471,6 @@ static void flow_list_destroy(struct flow_list *fl)
>       }
>  
>       synchronize_rcu();
> -     spinlock_destroy(&fl->lock);
>  }
>  
>  static int walk_process(unsigned int pid, struct flow_entry *n)
> @@ -1186,8 +1194,14 @@ static void draw_help(WINDOW *screen)
>       mvaddnstr(row + 9, col + 2, "Display Settings", -1);
>       attroff(A_BOLD | A_UNDERLINE);
>  
> -     mvaddnstr(row + 11, col + 3, "b             Toggle rate units 
> (bits/bytes)", -1);
> -     mvaddnstr(row + 12, col + 3, "a             Toggle display of active 
> flows (rate > 0) only", -1);
> +     mvaddnstr(row + 11, col + 3, "b     Toggle rate units (bits/bytes)", 
> -1);
> +     mvaddnstr(row + 12, col + 3, "a     Toggle display of active flows 
> (rate > 0) only", -1);
> +
> +     mvaddnstr(row + 14, col + 3, "T     Toggle display TCP flows", -1);
> +     mvaddnstr(row + 15, col + 3, "U     Toggle display UDP flows", -1);
> +     mvaddnstr(row + 16, col + 3, "D     Toggle display DCCP flows", -1);
> +     mvaddnstr(row + 17, col + 3, "I     Toggle display ICMP flows", -1);
> +     mvaddnstr(row + 18, col + 3, "S     Toggle display SCTP flows", -1);
>  }
>  
>  static void draw_header(WINDOW *screen)
> @@ -1217,6 +1231,27 @@ static void draw_footer(WINDOW *screen)
>       attroff(A_STANDOUT);
>  }
>  
> +static void show_option_toggle(int opt)
> +{
> +     switch (opt) {
> +     case 'T':
> +             TOGGLE_FLAG(what, INCLUDE_TCP);
> +             break;
> +     case 'U':
> +             TOGGLE_FLAG(what, INCLUDE_UDP);
> +             break;
> +     case 'D':
> +             TOGGLE_FLAG(what, INCLUDE_DCCP);
> +             break;
> +     case 'I':
> +             TOGGLE_FLAG(what, INCLUDE_ICMP);
> +             break;
> +     case 'S':
> +             TOGGLE_FLAG(what, INCLUDE_SCTP);
> +             break;
> +     }
> +}
> +
>  static void presenter(void)
>  {
>       int time_sleep_us = 200000;
> @@ -1238,11 +1273,13 @@ static void presenter(void)
>       rcu_register_thread();
>       while (!sigint) {
>               bool redraw_flows = true;
> +             int ch;
>  
>               curs_set(0);
>               getmaxyx(screen, rows, cols);
>  
> -             switch (getch()) {
> +             ch = getch();
> +             switch (ch) {
>               case 'q':
>                       sigint = 1;
>                       break;
> @@ -1274,6 +1311,18 @@ static void presenter(void)
>                       wclear(screen);
>                       clear();
>                       break;
> +             case 'T':
> +             case 'U':
> +             case 'D':
> +             case 'I':
> +             case 'S':
> +                     if (is_flow_collecting)
> +                             break;

In this case we will silently discard the user input, which is not very
nice. Do you see any reasonable way to avoid that?

> +
> +                     show_option_toggle(ch);
> +
> +                     do_reload_flows = true;
> +                     break;
>               default:
>                       fflush(stdin);
>                       redraw_flows = false;
> @@ -1606,11 +1655,21 @@ static void *collector(void *null __maybe_unused)
>  
>       rcu_register_thread();
>  
> +reload:
> +     if (do_reload_flows)
> +             collector_create_filter(ct_event);
> +
> +     do_reload_flows = false;
>       collector_dump_flows();
>  
>       while (!sigint) {
>               int status;
>  
> +             if (do_reload_flows) {
> +                     flow_list_destroy(&flow_list);
> +                     goto reload;

Ugh, I don't like jumping out of the loop here, even if it saves some
code duplication. But in that case I'd rather opt for duplicating the 4
LoC above.

Otherwise looks good to me.

> +             }
> +
>               usleep(USEC_PER_SEC * interval);
>  
>               collector_refresh_flows(ct_update);
> @@ -1632,6 +1691,8 @@ static void *collector(void *null __maybe_unused)
>       rcu_unregister_thread();
>  
>       flow_list_destroy(&flow_list);
> +     spinlock_destroy(&flow_list.lock);
> +
>       nfct_close(ct_event);
>       nfct_close(ct_update);
>  
> -- 
> 2.6.2
> 

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to