Add U/T/I/D/S runtime commands (same like for command line)
to filter flows by UDP/TCP/ICMP/DCCP/SCTP proto.

Signed-off-by: Vadim Kochan <[email protected]>
---
 flowtop.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 63 insertions(+), 5 deletions(-)

diff --git a/flowtop.c b/flowtop.c
index 1fdbea3..11d73b3 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)
@@ -1187,8 +1195,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)
@@ -1218,6 +1232,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;
@@ -1239,11 +1274,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;
@@ -1275,6 +1312,14 @@ static void presenter(void)
                        wclear(screen);
                        clear();
                        break;
+               case 'T':
+               case 'U':
+               case 'D':
+               case 'I':
+               case 'S':
+                       show_option_toggle(ch);
+                       do_reload_flows = true;
+                       break;
                default:
                        fflush(stdin);
                        redraw_flows = false;
@@ -1607,12 +1652,23 @@ static void *collector(void *null __maybe_unused)
 
        rcu_register_thread();
 
+       collector_create_filter(ct_event);
        collector_dump_flows();
 
        while (!sigint) {
                int status;
 
-               usleep(USEC_PER_SEC * interval);
+               if (!do_reload_flows)
+                       usleep(USEC_PER_SEC * interval);
+
+               if (do_reload_flows) {
+                       flow_list_destroy(&flow_list);
+
+                       collector_create_filter(ct_event);
+                       collector_dump_flows();
+
+                       do_reload_flows = false;
+               }
 
                collector_refresh_flows(ct_update);
 
@@ -1633,6 +1689,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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to