Changeset d4242e4


Ignore:
Timestamp:
03/23/09 15:23:53 (12 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:
59751a5
Parents:
a6da077
Message:

Support IPv4/IPv6 addresses.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/tracetop/tracetop.cc

    ra6da077 rd4242e4  
    1111#include <inttypes.h>
    1212#include <ncurses.h>
     13#include <sys/socket.h>
     14#include <netdb.h>
     15
     16int cmp_sockaddr_in6(const struct sockaddr_in6 *a, const struct sockaddr_in6 *b)
     17{
     18        if (a->sin6_port != b->sin6_port)
     19                return a->sin6_port - b->sin6_port;
     20        return memcmp(a->sin6_addr.s6_addr,b->sin6_addr.s6_addr,sizeof(a->sin6_addr.s6_addr));
     21}
     22
     23int cmp_sockaddr_in(const struct sockaddr_in *a, const struct sockaddr_in *b)
     24{
     25        if (a->sin_port != b->sin_port)
     26                return a->sin_port - b->sin_port;
     27        return a->sin_addr.s_addr - b->sin_addr.s_addr;
     28}
     29
     30int cmp_sockaddr(const struct sockaddr *a, const struct sockaddr *b)
     31{
     32        if (a->sa_family != b->sa_family) {
     33                return a->sa_family - b->sa_family;
     34        }
     35        switch (a->sa_family) {
     36                case AF_INET:
     37                        return cmp_sockaddr_in((struct sockaddr_in *)a,(struct sockaddr_in*)b);
     38                case AF_INET6:
     39                        return cmp_sockaddr_in6((struct sockaddr_in6 *)a,(struct sockaddr_in6*)b);
     40                case AF_UNSPEC:
     41                        return 0; /* Can't compare UNSPEC's! */
     42                default:
     43                        fprintf(stderr,"Don't know how to compare family %d\n",a->sa_family);
     44                        abort();
     45        }
     46}
     47
     48char *trace_sockaddr2string(const struct sockaddr *a, socklen_t salen, char *buffer, size_t bufflen)
     49{
     50        static char intbuffer[NI_MAXHOST];
     51        char *mybuf = buffer ? buffer : intbuffer;
     52        size_t mybufflen = buffer ? bufflen : sizeof(intbuffer);
     53        int err;
     54        if ((err=getnameinfo(a, salen, mybuf, mybufflen, NULL, 0, NI_NUMERICHOST))!=0) {
     55                strncpy(mybuf,gai_strerror(err),mybufflen);
     56        }
     57        return mybuf;
     58}
    1359
    1460struct flowkey_t {
    15         uint32_t sip;
    16         uint32_t dip;
     61        struct sockaddr_storage sip;
     62        struct sockaddr_storage dip;
    1763        uint16_t sport;
    1864        uint16_t dport;
     
    2066
    2167        bool operator <(const flowkey_t &b) const {
    22                 if (sip != b.sip) return sip < b.sip;
    23                 if (dip != b.dip) return dip < b.dip;
     68                int c;
     69
     70                c = cmp_sockaddr((struct sockaddr*)&sip,(struct sockaddr*)&b.sip);
     71                if (c != 0) return c<0;
     72                c = cmp_sockaddr((struct sockaddr*)&dip,(struct sockaddr*)&b.dip);
     73                if (c != 0) return c<0;
     74
    2475                if (sport != b.sport) return sport < b.sport;
    2576                if (dport != b.dport) return dport < b.dport;
     77
    2678                return protocol < b.protocol;
    2779        }
     
    4193        flowkey_t flowkey;
    4294        flows_t::iterator it;
    43         libtrace_ip_t *ip = trace_get_ip(packet);
    44         if (!ip) {
    45                 flowkey.sip = 0;
    46                 flowkey.dip = 0;
    47                 flowkey.sport = 0;
    48                 flowkey.dport = 0;
    49                 flowkey.protocol = 0;
    50         }
    51         else {
    52                 flowkey.sip = ntohs(ip->ip_src.s_addr);
    53                 flowkey.dip = ntohs(ip->ip_dst.s_addr);
    54                 flowkey.protocol = ip->ip_p;
    55                 flowkey.sport = trace_get_source_port(packet);
    56                 flowkey.dport = trace_get_destination_port(packet);
    57         }
     95
     96        if (trace_get_source_address(packet,(struct sockaddr*)&flowkey.sip)==0)
     97                flowkey.sip.ss_family = AF_UNSPEC;
     98        if (trace_get_destination_address(packet,(struct sockaddr*)&flowkey.dip)==0)
     99                flowkey.dip.ss_family = AF_UNSPEC;
     100        trace_get_transport(packet,&flowkey.protocol, NULL);
     101        flowkey.sport = trace_get_source_port(packet);
     102        flowkey.dport = trace_get_destination_port(packet);
     103
    58104        it = flows.find(flowkey);
    59105        if (it == flows.end()) {
     
    71117        uint64_t bytes;
    72118        uint64_t packets;
    73         uint32_t sip;
    74         uint32_t dip;
     119        struct sockaddr_storage sip;
     120        struct sockaddr_storage dip;
    75121        uint16_t sport;
    76122        uint16_t dport;
     
    101147        getmaxyx(stdscr,row,col);
    102148        attrset(A_REVERSE);
    103         mvprintw(0,0,"%08s:%s\t%8s:%s\tproto\tbytes\tpackets\n",
     149        mvprintw(0,0,"%15s:%s\t%15s:%s\tproto\tbytes\tpackets\n",
    104150                "sip","sport",
    105151                "dip","dport"
    106152                );
    107153        attrset(A_NORMAL);
     154        char sipstr[1024];
     155        char dipstr[1024];
    108156        for(int i=0; i<row-2 && !pq.empty(); ++i) {
    109                 mvprintw(i+1,0,"%08x:%d\t%08x:%d\t%d\t%"PRIu64"\t%"PRIu64"\n",
    110                                 pq.top().sip, pq.top().sport,
    111                                 pq.top().dip, pq.top().dport,
     157                mvprintw(i+1,0,"%s/%d\t%s/%d\t%d\t%"PRIu64"\t%"PRIu64"\n",
     158                                trace_sockaddr2string((struct sockaddr*)&pq.top().sip,
     159                                        sizeof(struct sockaddr_storage),
     160                                        sipstr,sizeof(sipstr)),
     161                                pq.top().sport,
     162                                trace_sockaddr2string((struct sockaddr*)&pq.top().dip,
     163                                        sizeof(struct sockaddr_storage),
     164                                        dipstr,sizeof(dipstr)),
     165                                pq.top().dport,
    112166                                pq.top().protocol,
    113167                                pq.top().bytes,
Note: See TracChangeset for help on using the changeset viewer.