- Timestamp:
- 03/25/09 11:57:54 (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:
- bdea38b
- Parents:
- 35c5a72
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
tools/tracetop/tracetop.cc
r752353b r7babe98 20 20 #endif 21 21 22 typedef enum { BITS_PER_SEC, BYTES } display_t;22 typedef enum { BITS_PER_SEC, BYTES, PERCENT } display_t; 23 23 display_t display_as = BYTES; 24 int interval=1; 24 float interval=2; 25 26 bool use_sip = true; 27 bool use_dip = true; 28 bool use_sport = true; 29 bool use_dport = true; 30 bool use_protocol = true; 31 32 uint64_t total_bytes=0; 33 uint64_t total_packets=0; 25 34 26 35 int cmp_sockaddr_in6(const struct sockaddr_in6 *a, const struct sockaddr_in6 *b) … … 101 110 int c; 102 111 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; 110 123 111 124 return protocol < b.protocol; … … 122 135 flows_t flows; 123 136 137 const 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 124 155 static void per_packet(libtrace_packet_t *packet) 125 156 { … … 127 158 flows_t::iterator it; 128 159 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) 130 161 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) 132 163 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); 137 168 138 169 it = flows.find(flowkey); … … 146 177 ++it->second.packets; 147 178 it->second.bytes+=trace_get_capture_length(packet); 179 180 ++total_packets; 181 total_bytes+=trace_get_capture_length(packet); 148 182 149 183 } … … 181 215 } 182 216 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(); 183 220 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 189 255 attrset(A_NORMAL); 190 256 char sipstr[1024]; 191 257 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", 194 262 trace_sockaddr2string((struct sockaddr*)&pq.top().sip, 195 263 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", 198 274 trace_sockaddr2string((struct sockaddr*)&pq.top().dip, 199 275 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 } 203 291 switch (display_as) { 204 292 case BYTES: … … 208 296 break; 209 297 case BITS_PER_SEC: 210 printw("% 8.03f\t%"PRIu64"\n",298 printw("%14.03f\t%"PRIu64"\n", 211 299 8.0*pq.top().bytes/interval, 212 300 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); 213 305 } 214 306 pq.pop(); 215 307 } 216 308 flows.clear(); 309 total_packets = 0; 310 total_bytes = 0; 217 311 218 312 clrtobot(); … … 233 327 int promisc=-1; 234 328 double last_report=0; 329 330 setprotoent(1); 235 331 236 332 while(1) { … … 242 338 { "help", 0, 0, 'h' }, 243 339 { "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' }, 245 343 { NULL, 0, 0, 0 } 246 344 }; 247 345 248 int c= getopt_long(argc, argv, "f:s:p:hH ",346 int c= getopt_long(argc, argv, "f:s:p:hHi:", 249 347 long_options, &option_index); 250 348 … … 265 363 trace_help(); 266 364 return 1; 267 case ' b':365 case 'B': 268 366 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 } 269 377 break; 270 378 default: … … 337 445 338 446 endwin(); 447 endprotoent(); 339 448 340 449 return 0;
Note: See TracChangeset
for help on using the changeset viewer.