Changeset 4fd12ac for lib/trace.c
- Timestamp:
- 10/25/04 20:42:36 (18 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:
- 24412fc
- Parents:
- dea6547
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lib/trace.c
rdea6547 r4fd12ac 60 60 #include <sys/socket.h> 61 61 #include <sys/un.h> 62 #include <sys/mman.h> 62 63 #include <unistd.h> 63 64 #include <net/ethernet.h> … … 72 73 73 74 #ifdef HAVE_STDDEF_H 74 # include <stddef.h>75 # include <stddef.h> 75 76 #else 76 77 # error "Can't find stddef.h - do you define ptrdiff_t elsewhere?" … … 90 91 #include <zlib.h> 91 92 #include <pcap.h> 92 93 #include "dagformat.h" 93 #include <zlib.h> 94 94 95 95 96 #include "wag.h" 96 97 98 #ifdef HAVE_DAG_API 99 # include "dagnew.h" 100 # include "dagapi.h" 101 # define DAGDEVICE 1 102 #else 103 # include "dagformat.h" 104 #endif 97 105 98 106 … … 123 131 } input; 124 132 struct fifo_t *fifo; 133 void *buf; 125 134 struct { 126 135 void *buffer; … … 134 143 static int init_trace(struct libtrace_t **libtrace, char *uri) { 135 144 char *scan = calloc(sizeof(char),URI_PROTO_LINE); 136 char *uridata = 0; 145 char *uridata = 0; 146 struct stat buf; 137 147 138 148 // parse the URI to determine what sort of event we are dealing with … … 190 200 case ERF: 191 201 case WAG: 192 case DAG:193 202 /* 194 203 * Can have uridata of the following format … … 202 211 (*libtrace)->sourcetype = STDIN; 203 212 } else { 204 struct stat buf;205 213 if (stat(uridata,&buf) == -1) { 206 214 perror("stat"); … … 217 225 } 218 226 break; 227 case DAG: 228 /* 229 * Can have uridata of the following format: 230 * /dev/device 231 */ 232 if (stat(uridata,&buf) == -1) { 233 perror("stat"); 234 return 0; 235 } 236 if (S_ISCHR(buf.st_mode)) { 237 (*libtrace)->sourcetype = DEVICE; 238 } else { 239 fprintf(stderr,"%s isn't a valid char device, exiting\n",uridata); 240 exit(1); 241 } 242 (*libtrace)->conn_info.path = strdup(uridata); 243 244 break; 219 245 220 246 case RTCLIENT: … … 249 275 250 276 (*libtrace)->fifo = create_fifo(1048576); 251 (*libtrace)->packet.buffer = 0;252 (*libtrace)->packet.size = 0;277 //(*libtrace)->packet.buffer = 0; 278 //(*libtrace)->packet.size = 0; 253 279 254 280 return 1; … … 370 396 O_RDONLY); 371 397 break; 398 #ifdef DAGDEVICE 399 case DAG: 400 if((libtrace->input.fd = dag_open(libtrace->conn_info.path)) < 0) { 401 fprintf(stderr,"Cannot open DAG %s: %m", libtrace->conn_info.path,errno); 402 exit(0); 403 } 404 if((libtrace->buf = dag_mmap(libtrace->input.fd)) == MAP_FAILED) { 405 fprintf(stderr,"Cannot mmap DAG %s: %m", libtrace->conn_info.path,errno); 406 exit(0); 407 } 408 if(dag_start(libtrace->input.fd) < 0) { 409 fprintf(stderr,"Cannot start DAG %s: %m", libtrace->conn_info.path,errno); 410 } 411 break; 412 #endif 413 372 414 } 373 415 break; … … 399 441 static int trace_read(struct libtrace_t *libtrace, void *buffer, size_t len) { 400 442 int numbytes; 401 assert(libtrace); 443 static unsigned bottom = 0, top, diff, curr, scan; 444 static short lctr = 0; 445 struct dag_record_t *recptr = 0; 446 int rlen; 447 assert(libtrace); 402 448 assert(len >= 0); 403 449 … … 424 470 break; 425 471 case DEVICE: 426 if ((numbytes=read(libtrace->input.fd, 472 switch(libtrace->format) { 473 case DAG: 474 top = dag_offset(libtrace->input.fd, 475 &bottom, 476 0); 477 diff = top - bottom; 478 errno = 0; 479 curr = 0; 480 481 recptr = (dag_record_t *) (libtrace->buf + (bottom + curr)); 482 483 buffer=libtrace->buf + (bottom + curr); 484 485 numbytes=diff; 486 487 488 break; 489 default: 490 if ((numbytes=read(libtrace->input.fd, 427 491 buffer, 428 492 len)) == -1) { 429 perror("read"); 430 return -1; 493 perror("read"); 494 return -1; 495 } 431 496 } 432 497 break; … … 452 517 * 453 518 */ 519 #define RP_BUFSIZE 65536 454 520 int trace_read_packet(struct libtrace_t *libtrace, struct libtrace_packet_t *packet) { 455 521 int numbytes; 456 522 int size; 457 char buf[ 4096];523 char buf[RP_BUFSIZE]; 458 524 struct pcap_pkthdr pcaphdr; 459 525 const u_char *pcappkt; … … 488 554 489 555 /* If we're reading from an ERF input, it's an offline trace. We can make some assumptions */ 490 491 556 if (libtrace->format == ERF) { 492 557 void *buffer2 = buffer; … … 518 583 do { 519 584 if (fifo_out_available(libtrace->fifo) == 0 || read_required) { 520 if ((numbytes = trace_read(libtrace,buf, 4096))<=0){585 if ((numbytes = trace_read(libtrace,buf,RP_BUFSIZE))<=0){ 521 586 return numbytes; 522 587 } … … 1046 1111 * @author Perry Lorier 1047 1112 */ 1048 struct libtrace_eventobj_t libtrace_event(struct libtrace_t *trace,1113 struct libtrace_eventobj_t trace_event(struct libtrace_t *trace, 1049 1114 struct libtrace_packet_t *packet) { 1050 1115 struct libtrace_eventobj_t event; 1116 1117 if (!trace) { 1118 fprintf(stderr,"You called trace_event() with a NULL trace object!\n"); 1119 } 1120 assert(trace); 1121 assert(packet); 1122 1123 /* Store the trace we are reading from into the packet opaque 1124 * structure */ 1125 packet->trace = trace; 1126 1051 1127 /* Is there a packet ready? */ 1052 1128 switch (trace->sourcetype) { … … 1059 1135 } 1060 1136 if (data>0) { 1137 trace_read_packet(trace,packet); 1061 1138 event.type = TRACE_EVENT_PACKET; 1139 return event; 1062 1140 } 1063 1141 event.type = TRACE_EVENT_IOWAIT; 1142 return event; 1064 1143 } 1065 1144 case SOCKET: … … 1068 1147 { 1069 1148 int data; 1070 if(ioctl(trace->input.fd,FIONREAD,&data)==-1){ 1149 event.fd = trace->input.fd; 1150 if(ioctl(event.fd,FIONREAD,&data)==-1){ 1071 1151 perror("ioctl(FIONREAD)"); 1072 1152 } 1073 1153 if (data>0) { 1154 trace_read_packet(trace,packet); 1074 1155 event.type = TRACE_EVENT_PACKET; 1075 }1076 event.fd = trace->input.fd;1156 return event; 1157 } 1077 1158 event.type = TRACE_EVENT_IOWAIT; 1159 return event; 1078 1160 } 1079 1161 case STDIN: … … 1090 1172 if (trace->last_ts!=0) { 1091 1173 event.seconds = ts - trace->last_ts; 1092 if (event.seconds>time(NULL)-trace->start_ts) 1174 if (event.seconds>time(NULL)-trace->start_ts) { 1093 1175 event.type = TRACE_EVENT_SLEEP; 1176 return event; 1177 } 1178 1094 1179 } 1095 1180 else { … … 1104 1189 trace->packet.buffer = 0; 1105 1190 event.type = TRACE_EVENT_PACKET; 1191 return event; 1106 1192 } 1107 1193 default: 1108 1194 assert(0); 1109 1195 } 1110 return event;1196 assert(0); 1111 1197 } 1112 1198
Note: See TracChangeset
for help on using the changeset viewer.