Changeset 7babe98 for tools


Ignore:
Timestamp:
03/25/09 11:57:54 (13 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:
bdea38b
Parents:
35c5a72
Message:

Add more display modes
Allow for arbitary flow keys (although there is not yet any configuration for this)
Clean up the display logic

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/tracetop/tracetop.cc

    r752353b r7babe98  
    2020#endif
    2121
    22 typedef enum { BITS_PER_SEC, BYTES } display_t;
     22typedef enum { BITS_PER_SEC, BYTES, PERCENT } display_t;
    2323display_t display_as = BYTES;
    24 int interval=1;
     24float interval=2;
     25
     26bool use_sip = true;
     27bool use_dip = true;
     28bool use_sport = true;
     29bool use_dport = true;
     30bool use_protocol = true;
     31
     32uint64_t total_bytes=0;
     33uint64_t total_packets=0;
    2534
    2635int cmp_sockaddr_in6(const struct sockaddr_in6 *a, const struct sockaddr_in6 *b)
     
    101110                int c;
    102111
    103                 c = cmp_sockaddr((struct sockaddr*)&sip,(struct sockaddr*)&b.sip);
    104                 if (c != 0) return c<0;
    105                 c = cmp_sockaddr((struct sockaddr*)&dip,(struct sockaddr*)&b.dip);
    106                 if (c != 0) return c<0;
    107 
    108                 if (sport != b.sport) return sport < b.sport;
    109                 if (dport != b.dport) return dport < b.dport;
     112                if (use_sip) {
     113                        c = cmp_sockaddr((struct sockaddr*)&sip,(struct sockaddr*)&b.sip);
     114                        if (c != 0) return c<0;
     115                }
     116                if (use_dip) {
     117                        c = cmp_sockaddr((struct sockaddr*)&dip,(struct sockaddr*)&b.dip);
     118                        if (c != 0) return c<0;
     119                }
     120
     121                if (use_sport && sport != b.sport) return sport < b.sport;
     122                if (use_dport && dport != b.dport) return dport < b.dport;
    110123
    111124                return protocol < b.protocol;
     
    122135flows_t flows;
    123136
     137const char *nice_bandwidth(double bytespersec)
     138{
     139        static char ret[1024];
     140        double bitspersec = bytespersec*8;
     141
     142        if (bitspersec>1e12)
     143                snprintf(ret,sizeof(ret),"%.03fTb/s", bitspersec/1e12);
     144        else if (bitspersec>1e9)
     145                snprintf(ret,sizeof(ret),"%.03fGb/s", bitspersec/1e9);
     146        else if (bitspersec>1e6)
     147                snprintf(ret,sizeof(ret),"%.03fMb/s", bitspersec/1e6);
     148        else if (bitspersec>1e3)
     149                snprintf(ret,sizeof(ret),"%.03fkb/s", bitspersec/1e3);
     150        else
     151                snprintf(ret,sizeof(ret),"%.03fb/s", bitspersec);
     152        return ret;
     153}
     154
    124155static void per_packet(libtrace_packet_t *packet)
    125156{
     
    127158        flows_t::iterator it;
    128159
    129         if (trace_get_source_address(packet,(struct sockaddr*)&flowkey.sip)==NULL)
     160        if (use_sip && trace_get_source_address(packet,(struct sockaddr*)&flowkey.sip)==NULL)
    130161                flowkey.sip.ss_family = AF_UNSPEC;
    131         if (trace_get_destination_address(packet,(struct sockaddr*)&flowkey.dip)==NULL)
     162        if (use_dip && trace_get_destination_address(packet,(struct sockaddr*)&flowkey.dip)==NULL)
    132163                flowkey.dip.ss_family = AF_UNSPEC;
    133         if (trace_get_transport(packet,&flowkey.protocol, NULL) == NULL)
    134                 flowkey.protocol = NULL;
    135         flowkey.sport = trace_get_source_port(packet);
    136         flowkey.dport = trace_get_destination_port(packet);
     164        if (use_protocol && trace_get_transport(packet,&flowkey.protocol, NULL) == NULL)
     165                flowkey.protocol = 0;
     166        if (use_sport) flowkey.sport = trace_get_source_port(packet);
     167        if (use_dport) flowkey.dport = trace_get_destination_port(packet);
    137168
    138169        it = flows.find(flowkey);
     
    146177        ++it->second.packets;
    147178        it->second.bytes+=trace_get_capture_length(packet);
     179
     180        ++total_packets;
     181        total_bytes+=trace_get_capture_length(packet);
    148182
    149183}
     
    181215        }
    182216        getmaxyx(stdscr,row,col);
     217        move(0,0);
     218        printw("Total Bytes: %10" PRIu64 " (%s)\tTotal Packets: %10" PRIu64, total_bytes, nice_bandwidth(total_bytes), total_packets);
     219        clrtoeol();
    183220        attrset(A_REVERSE);
    184         mvprintw(0,0,"%20s/%s\t%20s/%s\tproto\t%s\tpackets\n",
    185                 "source ip","sport",
    186                 "dest ip","dport",
    187                 (display_as == BYTES ? "bytes" : "bits/sec")
    188                 );
     221        move(1,0);
     222        if (use_sip) {
     223                printw("%20s", "source ip");
     224                if (use_sport)
     225                        printw("/");
     226                else
     227                        printw("\t");
     228        }
     229        if (use_sport)
     230                printw("%d\t", "sport");
     231        if (use_dip) {
     232                printw("%20s", "dest ip");
     233                if (use_dport)
     234                        printw("/");
     235                else
     236                        printw("\t");
     237        }
     238        if (use_dport)
     239                printw("%d\t", "dport");
     240        if (use_protocol)
     241                printw("proto\t");
     242        switch(display_as) {
     243                case BYTES:
     244                        printw("Bytes\t");
     245                        break;
     246                case BITS_PER_SEC:
     247                        printw("%14s\t","Bits/sec");
     248                        break;
     249                case PERCENT:
     250                        printw("%% bytes\t");
     251                        break;
     252        }
     253        printw("Packets");
     254
    189255        attrset(A_NORMAL);
    190256        char sipstr[1024];
    191257        char dipstr[1024];
    192         for(int i=0; i<row-2 && !pq.empty(); ++i) {
    193                 mvprintw(i+1,0,"%20s/%-5d\t%20s/%-5d\t%d\t",
     258        for(int i=1; i<row-3 && !pq.empty(); ++i) {
     259                move(i+1,0);
     260                if (use_sip) {
     261                        printw("%20s",
    194262                                trace_sockaddr2string((struct sockaddr*)&pq.top().sip,
    195263                                        sizeof(struct sockaddr_storage),
    196                                         sipstr,sizeof(sipstr)),
    197                                 pq.top().sport,
     264                                        sipstr,sizeof(sipstr)));
     265                        if (use_sport)
     266                                printw("/");
     267                        else
     268                                printw("\t");
     269                }
     270                if (use_sport)
     271                        printw("%-5d\t", pq.top().sport);
     272                if (use_dip) {
     273                        printw("%20s",
    198274                                trace_sockaddr2string((struct sockaddr*)&pq.top().dip,
    199275                                        sizeof(struct sockaddr_storage),
    200                                         dipstr,sizeof(dipstr)),
    201                                 pq.top().dport,
    202                                 pq.top().protocol);
     276                                        dipstr,sizeof(dipstr)));
     277                        if (use_dport)
     278                                printw("/");
     279                        else
     280                                printw("\t");
     281                }
     282                if (use_dport)
     283                        printw("%-5d\t", pq.top().dport);
     284                if (use_protocol) {
     285                        struct protoent *proto = getprotobynumber(pq.top().protocol);
     286                        if (proto)
     287                                printw("%-5s\t", proto->p_name);
     288                        else
     289                                printw("%5d\t",pq.top().protocol);
     290                }
    203291                switch (display_as) {
    204292                        case BYTES:
     
    208296                                break;
    209297                        case BITS_PER_SEC:
    210                                 printw("%8.03f\t%"PRIu64"\n",
     298                                printw("%14.03f\t%"PRIu64"\n",
    211299                                                8.0*pq.top().bytes/interval,
    212300                                                pq.top().packets);
     301                        case PERCENT:
     302                                printw("%6.2f%%\t%6.2f%%\n",
     303                                                100.0*pq.top().bytes/total_bytes,
     304                                                100.0*pq.top().packets/total_packets);
    213305                }
    214306                pq.pop();
    215307        }
    216308        flows.clear();
     309        total_packets = 0;
     310        total_bytes = 0;
    217311
    218312        clrtobot();
     
    233327        int promisc=-1;
    234328        double last_report=0;
     329
     330        setprotoent(1);
    235331
    236332        while(1) {
     
    242338                        { "help",               0, 0, 'h' },
    243339                        { "libtrace-help",      0, 0, 'H' },
    244                         { "bits-per-sec",       0, 0, 'b' },
     340                        { "bits-per-sec",       0, 0, 'B' },
     341                        { "percent",            0, 0, 'P' },
     342                        { "interval",           1, 0, 'i' },
    245343                        { NULL,                 0, 0, 0 }
    246344                };
    247345
    248                 int c= getopt_long(argc, argv, "f:s:p:hH",
     346                int c= getopt_long(argc, argv, "f:s:p:hHi:",
    249347                                long_options, &option_index);
    250348
     
    265363                                trace_help();
    266364                                return 1;
    267                         case 'b':
     365                        case 'B':
    268366                                display_as = BITS_PER_SEC;
     367                                break;
     368                        case 'P':
     369                                display_as = PERCENT;
     370                                break;
     371                        case 'i':
     372                                interval = atof(optarg);
     373                                if (interval<=0) {
     374                                        fprintf(stderr,"Interval must be >0\n");
     375                                        return 1;
     376                                }
    269377                                break;
    270378                        default:
     
    337445
    338446        endwin();
     447        endprotoent();
    339448
    340449        return 0;
Note: See TracChangeset for help on using the changeset viewer.