Changeset c549d3f


Ignore:
Timestamp:
11/09/09 17:21:56 (11 years ago)
Author:
Perry Lorier <perry@…>
Branches:
4.0.1-hotfixes, cachetimestamps, develop, dpdk-ndag, etsilive, getfragoff, help, libtrace4, master, ndag_format, pfring, rc-4.0.1, rc-4.0.2, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance, ringtimestampfixes
Children:
4f8703ae
Parents:
34cab5b
Message:

Move tracetop to using trace_event() api, and dealing with key presses

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/tracetop/tracetop.cc

    re7307f9 rc549d3f  
    1616#include "config.h"
    1717#ifdef HAVE_NETPACKET_PACKET_H
    18 #include <sys/socket.h>
    1918#include <netpacket/packet.h>
    2019#include <net/ethernet.h>
     
    2423display_t display_as = BYTES;
    2524float interval=2;
     25double last_report=0;
    2626
    2727bool use_sip = true;
     
    3030bool use_dport = true;
    3131bool use_protocol = true;
     32bool quit = false;
    3233
    3334uint64_t total_bytes=0;
     
    315316}
    316317
     318static void run_trace(libtrace_t *trace)
     319{
     320        libtrace_packet_t *packet = trace_create_packet();
     321        libtrace_eventobj_t obj;
     322        fd_set rfds;
     323        struct timeval sleep_tv;
     324        struct timeval *tv = NULL;
     325
     326        do {
     327                int maxfd=0;
     328                FD_ZERO(&rfds);
     329                FD_SET(0, &rfds); /* stdin */
     330                tv=NULL;
     331                maxfd=0;
     332
     333                obj = trace_event(trace, packet);
     334                switch(obj.type) {
     335                        case TRACE_EVENT_IOWAIT:
     336                                FD_SET(obj.fd, &rfds);
     337                                maxfd = obj.fd;
     338                                break;
     339
     340                        case TRACE_EVENT_SLEEP:
     341                                sleep_tv.tv_sec = (int)obj.seconds;
     342                                sleep_tv.tv_usec = (int)((obj.seconds - sleep_tv.tv_sec)*1000000.0);
     343
     344                                tv = &sleep_tv;
     345                                break;;
     346
     347                        case TRACE_EVENT_TERMINATE:
     348                                trace_destroy_packet(packet);
     349                                return;
     350
     351                        case TRACE_EVENT_PACKET:
     352                                if (obj.size == -1)
     353                                        break;
     354                                if (trace_get_seconds(packet) - last_report >= interval) {
     355                                        do_report();
     356                                               
     357                                        last_report=trace_get_seconds(packet);
     358                                }
     359                                if (trace_read_packet(trace,packet) <= 0) {
     360                                        obj.size = -1;
     361                                        break;
     362                                }
     363                                per_packet(packet);
     364                                continue;
     365                }
     366
     367                if (tv && tv->tv_sec > interval) {
     368                        tv->tv_sec = (int)interval;
     369                        tv->tv_usec = 0;
     370                }
     371
     372                select(maxfd+1, &rfds, 0, 0, tv);
     373                if (FD_ISSET(0, &rfds)) {
     374                        switch (getch()) {
     375                                case '%':
     376                                        display_as = PERCENT;
     377                                        break;
     378                                case 'b':
     379                                        display_as = BITS_PER_SEC;
     380                                        break;
     381                                case 'B':
     382                                        display_as = BYTES;
     383                                        break;
     384                                case '\x1b': /* Escape */
     385                                case 'q':
     386                                        quit = true;
     387                                        trace_destroy_packet(packet);
     388                                        return;
     389                                case '1': use_sip       = !use_sip; break;
     390                                case '2': use_sport     = !use_sport; break;
     391                                case '3': use_dip       = !use_dip; break;
     392                                case '4': use_dport     = !use_dport; break;
     393                                case '5': use_protocol  = !use_protocol; break;
     394                        }
     395                }
     396        } while (obj.type != TRACE_EVENT_TERMINATE || obj.size == -1);
     397
     398        trace_destroy_packet(packet);
     399}
     400
    317401static void usage(char *argv0)
    318402{
    319         fprintf(stderr,"usage: %s [ --filter | -f bpfexp ]  [ --snaplen | -s snap ]\n\t\t[ --promisc | -p flag] [ --help | -h ] [ --libtrace-help | -H ] libtraceuri...\n",argv0);
     403        fprintf(stderr,"usage: %s [options] libtraceuri...\n",argv0);
     404        fprintf(stderr," --filter bpfexpr\n");
     405        fprintf(stderr," -f bpfexpr\n");
     406        fprintf(stderr,"\t\tApply a bpf filter expression\n");
     407        fprintf(stderr," --snaplen snaplen\n");
     408        fprintf(stderr," -s snaplen\n");
     409        fprintf(stderr,"\t\tCapture only snaplen bytes\n");
     410        fprintf(stderr," --promisc 0|1\n");
     411        fprintf(stderr," -p 0|1\n");
     412        fprintf(stderr,"\t\tEnable/Disable promiscuous mode\n");
     413        fprintf(stderr," --bits-per-sec\n");
     414        fprintf(stderr," -B\n");
     415        fprintf(stderr,"\t\tDisplay usage in bits per second, not bytes per second\n");
     416        fprintf(stderr," --percent\n");
     417        fprintf(stderr," -P\n");
     418        fprintf(stderr,"\t\tDisplay usage in percentage of total usage\n");
     419        fprintf(stderr," --interval int\n");
     420        fprintf(stderr," -i int\n");
     421        fprintf(stderr,"\t\tUpdate the display every int seconds\n");
    320422}
    321423
     
    327429        int snaplen=-1;
    328430        int promisc=-1;
    329         double last_report=0;
    330431
    331432        setprotoent(1);
     
    394495        initscr(); cbreak(); noecho();
    395496
    396         while (optind<argc) {
     497        while (!quit && optind<argc) {
    397498                trace = trace_create(argv[optind]);
    398499                ++optind;
     
    425526                }
    426527
    427                 packet = trace_create_packet();
    428 
    429                 while (trace_read_packet(trace,packet)>0) {
    430                         if (trace_get_seconds(packet) - last_report >= interval) {
    431                                 do_report();
    432                                        
    433                                 last_report=trace_get_seconds(packet);
    434                         }
    435                         per_packet(packet);
    436                 }
    437 
    438                 trace_destroy_packet(packet);
     528                run_trace(trace);
    439529
    440530                if (trace_is_err(trace)) {
Note: See TracChangeset for help on using the changeset viewer.