Changeset f9b6f64 for tools


Ignore:
Timestamp:
02/21/07 16:49:12 (14 years ago)
Author:
Shane Alcock <salcock@…>
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:
2d99bd2
Parents:
09be643
Message:

Added getopt so that the user can specify which reports they want
Removed a bunch of unnecessary includes

Location:
tools/tracereport
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • tools/tracereport/tracereport.c

    r09be643 rf9b6f64  
    4040#include <sys/time.h>
    4141#include <sys/types.h>
    42 #include <time.h>
    43 
    44 #include <netinet/in.h>
    45 #include <netinet/in_systm.h>
    46 #include <netinet/tcp.h>
    47 #include <netinet/ip.h>
    48 #include <netinet/ip_icmp.h>
    49 #include <arpa/inet.h>
    50 #include <sys/socket.h>
     42
    5143#include <getopt.h>
    5244#include <inttypes.h>
     
    5850
    5951struct libtrace_t *trace;
     52uint32_t reports_required = 0;
    6053
    6154/* Process a trace, counting packets that match filter(s) */
     
    6457        struct libtrace_packet_t *packet = trace_create_packet();
    6558
    66         fprintf(stderr,"%s:\n",uri);
    6759        trace = trace_create(uri);
    6860       
     
    8375        for (;;) {
    8476                int psize;
     77               
     78                /* Not convinced we need this count business */
     79                /*
    8580                if (count--<1)
    8681                        break;
     82                */
    8783                if ((psize = trace_read_packet(trace, packet)) <1) {
    8884                        break;
    8985                }
    90                 error_per_packet(packet);
    91                 port_per_packet(packet);
    92                 protocol_per_packet(packet);
    93                 tos_per_packet(packet);
    94                 ttl_per_packet(packet);
    95                 flow_per_packet(packet);
    96                 tcpopt_per_packet(packet);
    97                 nlp_per_packet(packet);
    98                 dir_per_packet(packet);
    99                 //ecn_per_packet(packet);
    100                 //tcpseg_per_packet(packet);
     86                if (reports_required & REPORT_TYPE_ERROR)
     87                        error_per_packet(packet);
     88                if (reports_required & REPORT_TYPE_PORT)
     89                        port_per_packet(packet);
     90                if (reports_required & REPORT_TYPE_PROTO)
     91                        protocol_per_packet(packet);
     92                if (reports_required & REPORT_TYPE_TOS)
     93                        tos_per_packet(packet);
     94                if (reports_required & REPORT_TYPE_TTL)
     95                        ttl_per_packet(packet);
     96                if (reports_required & REPORT_TYPE_FLOW)
     97                        flow_per_packet(packet);
     98                if (reports_required & REPORT_TYPE_TCPOPT)
     99                        tcpopt_per_packet(packet);
     100                if (reports_required & REPORT_TYPE_NLP)
     101                        nlp_per_packet(packet);
     102                if (reports_required & REPORT_TYPE_DIR)
     103                        dir_per_packet(packet);
     104                /*
     105                if (reports_required & REPORT_TYPE_ECN)
     106                        ecn_per_packet(packet);
     107                if (reports_required & REPORT_TYPE_TCPSEQ)
     108                        tcpseg_per_packet(packet);
     109                */
    101110        }
    102111        trace_destroy(trace);
     
    107116        fprintf(stderr,"Usage:\n"
    108117        "%s flags traceuri [traceuri...]\n"
    109         "-f --filter=bpf        Apply BPF filter. Can be specified multiple times\n"
    110         "-H --libtrace-help     Print libtrace runtime documentation\n"
     118        "-f --filter=bpf        \tApply BPF filter. Can be specified multiple times\n"
     119        "-e --error             Report packet errors (e.g. checksum failures, rxerrors)\n"
     120        "-F --flow              Report flows\n"
     121        "-P --protocol          Report transport protocols\n"
     122        "-p --port              Report port numbers\n"
     123        "-T --tos               Report IP TOS\n"
     124        "-O --tcpoptions        \tReport TCP Options\n"
     125        "-n --nlp               Report network layer protocols\n"
     126        "-d --direction         Report direction\n"
     127        "-C --ecn               Report TCP ECN information\n"
     128        "-s --tcpsegment        \tReport TCP segment size\n"
     129        "-H --help              Print libtrace runtime documentation\n"
    111130        ,argv0);
    112131        exit(1);
     
    116135
    117136        int i;
    118 
    119         /*char *filterstring="host 130.197.127.210"; */
     137        int opt;
     138        char *filterstring=NULL;
    120139
    121140        libtrace_filter_t *filter = NULL;/*trace_bpf_setfilter(filterstring); */
    122141
    123         for(i=1;i<argc;++i) {
     142        while (1) {
     143                int option_index;
     144                struct option long_options[] = {
     145                        { "filter",             1, 0, 'f' },
     146                        { "help",               0, 0, 'H' },
     147                        { "error",              0, 0, 'e' },
     148                        { "flow",               0, 0, 'F' },
     149                        { "protocol",           0, 0, 'P' },
     150                        { "port",               0, 0, 'p' },
     151                        { "tos",                0, 0, 'T' },
     152                        { "ttl",                0, 0, 't' },
     153                        { "tcpoptions",         0, 0, 'O' },
     154                        { "nlp",                0, 0, 'n' },
     155                        { "direction",          0, 0, 'd' },
     156                        { "ecn",                0, 0, 'C' },
     157                        { "tcpsegment",         0, 0, 's' },
     158                        { NULL,                 0, 0, 0 }
     159                };
     160                opt = getopt_long(argc, argv, "f:HeFPpTtOndCs", long_options,
     161                                &option_index);
     162                if (opt == -1)
     163                        break;
     164               
     165                switch (opt) {
     166                        case 'C':
     167                                reports_required |= REPORT_TYPE_ECN;
     168                                break;
     169                        case 'd':
     170                                reports_required |= REPORT_TYPE_DIR;
     171                                break;
     172                        case 'e':
     173                                reports_required |= REPORT_TYPE_ERROR;
     174                                break;
     175                        case 'F':
     176                                reports_required |= REPORT_TYPE_FLOW;
     177                                break;
     178                        case 'f':
     179                                filterstring = optarg;
     180                                break;
     181                        case 'H':
     182                                usage(argv[0]);
     183                                break;
     184                        case 'n':
     185                                reports_required |= REPORT_TYPE_NLP;
     186                                break;
     187                        case 'O':
     188                                reports_required |= REPORT_TYPE_TCPOPT;
     189                                break;
     190                        case 'P':
     191                                reports_required |= REPORT_TYPE_PROTO;
     192                                break;
     193                        case 'p':
     194                                reports_required |= REPORT_TYPE_PORT;
     195                                break;
     196                        case 's':
     197                                reports_required |= REPORT_TYPE_TCPSEG;
     198                                break;
     199                        case 'T':
     200                                reports_required |= REPORT_TYPE_TOS;
     201                                break;
     202                        case 't':
     203                                reports_required |= REPORT_TYPE_TTL;
     204                                break;
     205                        default:
     206                                usage(argv[0]);
     207                }
     208        }
     209
     210        if (filterstring) {
     211                filter = trace_create_filter(filterstring);
     212        }
     213               
     214       
     215        for(i=optind;i<argc;++i) {
     216                /* This is handy for knowing how far through the traceset
     217                 * we are - printing to stderr because we use stdout for
     218                 * genuine output at the moment */
     219                fprintf(stderr, "Reading from trace: %s\n", argv[i]);
    124220                run_trace(argv[i],filter,(1<<30));
    125221        }
    126222
    127         error_report();
    128         flow_report();
    129         tos_report();
    130         protocol_report();
    131         port_report();
    132         ttl_report();
    133         tcpopt_report();
    134         nlp_report();
    135         dir_report();
    136         //ecn_report();
    137         //tcpseg_report();
     223        if (reports_required & REPORT_TYPE_ERROR)
     224                error_report();
     225        if (reports_required & REPORT_TYPE_FLOW)
     226                flow_report();
     227        if (reports_required & REPORT_TYPE_TOS)
     228                tos_report();
     229        if (reports_required & REPORT_TYPE_PROTO)
     230                protocol_report();
     231        if (reports_required & REPORT_TYPE_PORT)
     232                port_report();
     233        if (reports_required & REPORT_TYPE_TTL)
     234                ttl_report();   
     235        if (reports_required & REPORT_TYPE_TCPOPT)
     236                tcpopt_report();
     237        if (reports_required & REPORT_TYPE_NLP)
     238                nlp_report();
     239        if (reports_required & REPORT_TYPE_DIR)
     240                dir_report();
     241        /*
     242        if (reports_required & REPORT_TYPE_ECN)
     243                ecn_report();
     244        if (reports_required & REPORT_TYPE_TCPSEG)
     245                tcpseg_report();
     246        */
    138247        return 0;
    139248}
  • tools/tracereport/tracereport.h

    rd3ff1fb rf9b6f64  
    77} stat_t;
    88
     9typedef enum {
     10        REPORT_TYPE_ERROR = 1,
     11        REPORT_TYPE_FLOW = 1 << 1,
     12        REPORT_TYPE_TOS = 1 << 2,
     13        REPORT_TYPE_PROTO = 1 << 3,
     14        REPORT_TYPE_PORT = 1 << 4,
     15        REPORT_TYPE_TTL = 1 << 5,
     16        REPORT_TYPE_TCPOPT = 1 << 6,
     17        REPORT_TYPE_NLP = 1 << 7,
     18        REPORT_TYPE_DIR = 1 << 8,
     19        REPORT_TYPE_ECN = 1 << 9,
     20        REPORT_TYPE_TCPSEG = 1 << 10
     21} report_type_t;
     22
    923#endif
Note: See TracChangeset for help on using the changeset viewer.