Changeset 49ce177 for tools


Ignore:
Timestamp:
11/03/05 02:49:40 (16 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:
2a34193
Parents:
5a67294
Message:

Added:

  • error reports
  • flow reports
  • per port reports
  • direction report
  • moved everything to use the container library
Location:
tools/tracereport
Files:
3 added
7 edited

Legend:

Unmodified
Added
Removed
  • tools/tracereport/Makefile.am

    raef91e2 r49ce177  
    22
    33include ../Makefile.tools
    4 tracereport_SOURCES = tracereport.c tracereport.h tree.c tree.h report.h ttl_report.c tos_report.c port_report.c error_report.c flow_report.c
     4tracereport_SOURCES = tracereport.c tracereport.h report.h \
     5                        contain.c contain.h \
     6                        ttl_report.c tos_report.c port_report.c error_report.c \
     7                        flow_report.c dir_report.c protocol_report.c
  • tools/tracereport/error_report.c

    rd3ff1fb r49ce177  
    77static uint64_t rx_errors = 0;
    88static uint64_t ip_errors = 0;
     9static uint64_t tcp_errors = 0;
    910
    1011void error_per_packet(struct libtrace_packet_t *packet)
    1112{
    1213        struct libtrace_ip *ip = trace_get_ip(packet);
     14        struct libtrace_tcp *tcp = trace_get_tcp(packet);
    1315        void *link = trace_get_link(packet);
    1416        if (!link) {
     
    1921                        ++ip_errors;
    2022        }
    21 
     23        if (tcp) {
     24                if (ntohs(tcp->check)!=0)
     25                        ++tcp_errors;
     26        }
    2227}
    2328
     
    2732        printf("RX Errors: %" PRIu64 "\n",rx_errors);
    2833        printf("IP Checksum errors: %" PRIu64 "\n",ip_errors);
     34        //printf("TCP Checksum errors: %" PRIu64 "\n",tcp_errors);
    2935}
  • tools/tracereport/flow_report.c

    rd3ff1fb r49ce177  
    55#include "libtrace.h"
    66#include "tracereport.h"
    7 #include "tree.h"
     7#include "contain.h"
    88
    9 static tree_t *flows=NULL;
    109static uint64_t flow_count=0;
    1110
     
    1817};
    1918
    20 static int fivetuplecmp(const void *a, const void *b)
     19static int fivetuplecmp(struct fivetuple_t a, struct fivetuple_t b)
    2120{
    22         const struct fivetuple_t *as=a;
    23         const struct fivetuple_t *bs=b;
    24         if (as->ipa != bs->ipa) return as->ipa-bs->ipa;
    25         if (as->ipb != bs->ipb) return as->ipb-bs->ipb;
    26         if (as->porta != bs->porta) return as->porta-bs->porta;
    27         if (as->portb != bs->portb) return as->portb-bs->portb;
    28         return as->porta - as->portb;
     21        if (a.porta != b.porta) return a.porta-b.porta;
     22        if (a.portb != b.portb) return a.portb-b.portb;
     23        if (a.ipa != b.ipa) return a.ipa-b.ipa;
     24        if (a.ipb != b.ipb) return a.ipb-b.ipb;
     25        return a.prot - b.prot;
    2926}
     27
     28SET_CREATE(flowset,struct fivetuple_t,fivetuplecmp)
    3029
    3130void flow_per_packet(struct libtrace_packet_t *packet)
    3231{
    3332        struct libtrace_ip *ip = trace_get_ip(packet);
    34         struct fivetuple_t *ftp;
     33        struct fivetuple_t ft;
    3534        if (!ip)
    3635                return;
    37         ftp=malloc(sizeof(struct fivetuple_t));
    38         ftp->ipa=ip->ip_src.s_addr;
    39         ftp->ipb=ip->ip_dst.s_addr;
    40         ftp->porta=trace_get_source_port(packet);
    41         ftp->portb=trace_get_destination_port(packet);
     36        ft.ipa=ip->ip_src.s_addr;
     37        ft.ipb=ip->ip_dst.s_addr;
     38        ft.porta=trace_get_source_port(packet);
     39        ft.portb=trace_get_destination_port(packet);
    4240
    43         stat_t *stat=tree_find(&flows,ftp,fivetuplecmp);
    44         if (!stat) {
    45                 stat=calloc(1,sizeof(stat_t));
    46                 ++flow_count;
    47         }
    48 
    49         ++stat->count;
    50         stat->bytes+=trace_get_wire_length(packet);
    51 
    52         if (tree_replace(&flows,ftp,fivetuplecmp,stat)) {
    53                 free(ftp);
     41        if (!SET_CONTAINS(flowset,ft)) {
     42                SET_INSERT(flowset,ft);
     43                flow_count++;
    5444        }
    5545}
  • tools/tracereport/port_report.c

    rd3ff1fb r49ce177  
    66#include "libtrace.h"
    77#include "tracereport.h"
    8 #include "tree.h"
     8#include "contain.h"
    99
    10 #define MEMDUP(x) memcpy(malloc(sizeof(x)),&x,sizeof(x))
     10CMP(cmp_int,int,a-b)
     11MAP(int,MAP(int,stat_t)) protocol_tree = MAP_INIT(cmp_int);
    1112
    12 static tree_t *protocol_tree = NULL;
    13 
    14 int protocolcmp(const void *a,const void *b) {
    15         return *(uint8_t*)a-*(uint8_t*)b;
    16 }
    17 int portcmp(const void *a, const void *b) {
    18         return *(uint16_t*)a-*(uint16_t*)b;
    19 }
    2013
    2114void port_per_packet(struct libtrace_packet_t *packet)
     
    3124                : trace_get_destination_port(packet);
    3225
    33         uint8_t *protocol = MEMDUP(ip->ip_p);
    34         uint16_t *portmem = MEMDUP(port);
    3526
     27        if (!MAP_FIND(protocol_tree,ip->ip_p)) {
     28                MAP_INSERT(protocol_tree,ip->ip_p,MAP_INIT(cmp_int));
     29        }
    3630
    37         tree_t *ports=tree_find(&protocol_tree,protocol,protocolcmp);
     31        if (!MAP_FIND(MAP_FIND(protocol_tree,ip->ip_p)->value,port)) {
     32                MAP_INSERT(MAP_FIND(protocol_tree,ip->ip_p)->value,port,{0});
     33        }
    3834
    39         stat_t *stat =tree_find(&ports,portmem,portcmp);
    40         if (!stat) {
    41                 stat=calloc(1,sizeof(stat_t));
    42         }
    43         ++stat->count;
    44         stat->bytes+=trace_get_wire_length(packet);
    45         if (tree_replace(&ports,portmem,portcmp,stat)) {
    46                 free(portmem);
    47         }
    48         if (tree_replace(&protocol_tree,protocol,protocolcmp,ports)) {
    49                 free(protocol);
    50         }
     35        ++MAP_FIND(MAP_FIND(protocol_tree,ip->ip_p)->value,port)->value.count;
     36        MAP_FIND(MAP_FIND(protocol_tree,ip->ip_p)->value,port)->value.bytes+=trace_get_wire_length(packet);
    5137}
    5238
    53 static void port_visitor(const void *key, void *value, void *data)
     39static MAP_VISITOR(port_visitor,int,stat_t)
    5440{
    55         struct servent *ent = getservbyport(htons(*(uint16_t*)key),(char *)data);
     41        struct servent *ent = getservbyport(htons(node->key),(char *)userdata);
    5642        if(ent)
    5743                printf("%20s:\t%12" PRIu64 "\t%12" PRIu64 "\n",
    5844                                ent->s_name,
    59                                 ((stat_t *)value)->bytes,
    60                                 ((stat_t *)value)->count
     45                                node->value.bytes,
     46                                node->value.count
    6147                      );
    6248        else
    6349                printf("%20i:\t%12" PRIu64 "\t%12" PRIu64 "\n",
    64                                 *(uint16_t*)key,
    65                                 ((stat_t *)value)->bytes,
    66                                 ((stat_t *)value)->count
     50                                node->key,
     51                                node->value.bytes,
     52                                node->value.count
    6753                      );
    6854}
    6955
    70 static void protocol_visitor(const void *key, void *value, void *data)
     56static MAP_VISITOR(protocol_visitor,int,MAP(int,stat_t))
    7157{
    72         struct protoent *ent = getprotobynumber(*(uint8_t*)key);
    73         printf("Protocol: %i %s%s%s\n",*(uint8_t*)key,
     58        struct protoent *ent = getprotobynumber(node->key);
     59        printf("Protocol: %i %s%s%s\n",node->key,
    7460                        ent?"(":"",ent?ent->p_name:"",ent?")":"");
    75         tree_inorder((tree_t**)&value,
    76                         port_visitor,
    77                         (void*)(ent?ent->p_name:""));
     61        MAP_VISIT(node->value,NULL,port_visitor,NULL,(void*)(ent?ent->p_name:""));
    7862}
    7963
    8064void port_report(void)
    8165{
    82         int i;
    8366        printf("# Port breakdown:\n");
    8467        printf("%-20s \t%12s\t%12s\n","Port","Bytes","Packets");
    8568        setservent(1);
    8669        setprotoent(1);
    87         tree_inorder(&protocol_tree,protocol_visitor,NULL);
     70        MAP_VISIT(protocol_tree,NULL,protocol_visitor,NULL,NULL);
    8871        endprotoent();
    8972        endservent();
  • tools/tracereport/report.h

    rd3ff1fb r49ce177  
    77void protocol_per_packet(struct libtrace_packet_t *packet);
    88void ttl_per_packet(struct libtrace_packet_t *packet);
     9void dir_per_packet(struct libtrace_packet_t *packet);
    910
    1011void error_report(void);
     
    1213void tos_report(void);
    1314void port_report(void);
    14 void ttl_report(void);
     15void dir_report(void);
    1516
    1617#endif
  • tools/tracereport/tracereport.c

    rd3ff1fb r49ce177  
    7878                ttl_per_packet(&packet);
    7979                flow_per_packet(&packet);
     80                dir_per_packet(&packet);
    8081
    8182        }
     
    104105        port_report();
    105106        ttl_report();
     107        dir_report();
    106108
    107109
  • tools/tracereport/tree.c

    rd3ff1fb r49ce177  
    99        struct tree_t *left;
    1010        struct tree_t *right;
     11        struct tree_t *up;
    1112};
    1213
     
    121122}
    122123
    123 #ifdef TEST
    124124#include <string.h>
    125125#include <stdio.h>
     
    139139        dump_tree(tree->right,level+1);
    140140}
     141#ifdef TEST
    141142
    142143int main(int argc, char *argv[])
Note: See TracChangeset for help on using the changeset viewer.