Changeset d4242e4 for tools/tracetop
- Timestamp:
- 03/23/09 15:23:53 (13 years ago)
- 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
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
tools/tracetop/tracetop.cc
ra6da077 rd4242e4 11 11 #include <inttypes.h> 12 12 #include <ncurses.h> 13 #include <sys/socket.h> 14 #include <netdb.h> 15 16 int 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 23 int 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 30 int 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 48 char *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 } 13 59 14 60 struct flowkey_t { 15 uint32_tsip;16 uint32_tdip;61 struct sockaddr_storage sip; 62 struct sockaddr_storage dip; 17 63 uint16_t sport; 18 64 uint16_t dport; … … 20 66 21 67 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 24 75 if (sport != b.sport) return sport < b.sport; 25 76 if (dport != b.dport) return dport < b.dport; 77 26 78 return protocol < b.protocol; 27 79 } … … 41 93 flowkey_t flowkey; 42 94 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 58 104 it = flows.find(flowkey); 59 105 if (it == flows.end()) { … … 71 117 uint64_t bytes; 72 118 uint64_t packets; 73 uint32_tsip;74 uint32_tdip;119 struct sockaddr_storage sip; 120 struct sockaddr_storage dip; 75 121 uint16_t sport; 76 122 uint16_t dport; … … 101 147 getmaxyx(stdscr,row,col); 102 148 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", 104 150 "sip","sport", 105 151 "dip","dport" 106 152 ); 107 153 attrset(A_NORMAL); 154 char sipstr[1024]; 155 char dipstr[1024]; 108 156 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, 112 166 pq.top().protocol, 113 167 pq.top().bytes,
Note: See TracChangeset
for help on using the changeset viewer.