- Timestamp:
- 03/19/06 15:27:22 (16 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:
- 25efeac
- Parents:
- eea0f87
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lib/format_rt.c
r32f365f r2ffda28 96 96 int input_fd; 97 97 int reliable; 98 98 char *pkt_buffer; 99 char *buf_current; 100 int buf_left; 101 102 99 103 struct libtrace_t *dummy_erf; 100 104 struct libtrace_t *dummy_pcap; … … 158 162 case RT_HELLO: 159 163 /* do something with options */ 160 printf("Hello\n");161 164 if (recv(RT_INFO->input_fd, &hello_opts, 162 165 sizeof(rt_hello_t), 0) … … 189 192 RT_INFO->dummy_pcap = NULL; 190 193 RT_INFO->dummy_wag = NULL; 194 RT_INFO->pkt_buffer = NULL; 195 RT_INFO->buf_current = NULL; 196 RT_INFO->buf_left = 0; 191 197 192 198 if (strlen(uridata) == 0) { … … 219 225 start_msg.length = sizeof(rt_start_t); 220 226 221 printf("Sending start - len: %d\n", start_msg.length);222 227 223 228 /* Need to send start message to server */ … … 257 262 } 258 263 259 static int rt_read(struct libtrace_t *libtrace, void *buffer, size_t len) { 264 #define RT_BUF_SIZE 4000 265 266 static int rt_read(struct libtrace_t *libtrace, void **buffer, size_t len) { 260 267 int numbytes; 261 268 262 while(1) { 269 assert(len <= RT_BUF_SIZE); 270 271 if (!RT_INFO->pkt_buffer) { 272 RT_INFO->pkt_buffer = malloc(RT_BUF_SIZE); 273 RT_INFO->buf_current = RT_INFO->pkt_buffer; 274 RT_INFO->buf_left = 0; 275 } 276 277 278 if (len > RT_INFO->buf_left) { 279 memcpy(RT_INFO->pkt_buffer, RT_INFO->buf_current, 280 RT_INFO->buf_left); 281 RT_INFO->buf_current = RT_INFO->pkt_buffer; 282 263 283 #ifndef MSG_NOSIGNAL 264 284 # define MSG_NOSIGNAL 0 265 285 #endif 266 if ((numbytes = recv(RT_INFO->input_fd, 267 buffer, 268 len, 286 while (len > RT_INFO->buf_left) { 287 if ((numbytes = recv(RT_INFO->input_fd, 288 RT_INFO->pkt_buffer + 289 RT_INFO->buf_left, 290 RT_BUF_SIZE-RT_INFO->buf_left, 269 291 MSG_NOSIGNAL)) == -1) { 270 if (errno == EINTR) { 271 /* ignore EINTR in case 272 * a caller is using signals 273 */ 274 continue; 275 } 276 perror("recv"); 277 return -1; 278 } 279 break; 292 if (errno == EINTR) { 293 /* ignore EINTR in case 294 * a caller is using signals 295 */ 296 continue; 297 } 298 perror("recv"); 299 return -1; 300 } 301 RT_INFO->buf_left+=numbytes; 302 } 280 303 281 304 } 282 return numbytes; 305 *buffer = RT_INFO->buf_current; 306 RT_INFO->buf_current += len; 307 RT_INFO->buf_left -= len; 308 assert(RT_INFO->buf_left >= 0); 309 return len; 283 310 } 284 311 … … 385 412 386 413 static int rt_read_packet(libtrace_t *libtrace, libtrace_packet_t *packet) { 387 388 rt_header_t pkt_hdr;414 rt_header_t rt_hdr; 415 rt_header_t *pkt_hdr = &rt_hdr; 389 416 int pkt_size = 0; 390 417 391 void *buffer = 0; 392 418 393 419 if (packet->buf_control == TRACE_CTRL_EXTERNAL || !packet->buffer) { 394 420 packet->buf_control = TRACE_CTRL_PACKET; … … 396 422 } 397 423 398 buffer = packet->buffer;399 424 packet->header = packet->buffer; 400 425 401 426 /* FIXME: Better error handling required */ 402 if (rt_read(libtrace, &pkt_hdr, sizeof(rt_header_t)) !=427 if (rt_read(libtrace, (void **)&pkt_hdr, sizeof(rt_header_t)) != 403 428 sizeof(rt_header_t)) { 404 429 printf("Error receiving rt header\n"); … … 406 431 } 407 432 408 packet->type = pkt_hdr .type;409 pkt_size = pkt_hdr .length;410 packet->size = pkt_hdr .length;433 packet->type = pkt_hdr->type; 434 pkt_size = pkt_hdr->length; 435 packet->size = pkt_hdr->length; 411 436 412 437 if (packet->type >= RT_DATA_SIMPLE) { 413 if (rt_read(libtrace, buffer, pkt_size) != pkt_size) {438 if (rt_read(libtrace, &packet->buffer, pkt_size) != pkt_size) { 414 439 printf("Error receiving packet\n"); 415 440 return -1; … … 423 448 if (reliability > 0) { 424 449 425 if (rt_send_ack(libtrace, pkt_hdr .sequence)450 if (rt_send_ack(libtrace, pkt_hdr->sequence) 426 451 == -1) 427 452 { … … 433 458 case RT_STATUS: 434 459 case RT_DUCK: 435 if (rt_read(libtrace, buffer, pkt_size) != 460 if (rt_read(libtrace, &packet->buffer, 461 pkt_size) != 436 462 pkt_size) { 437 463 printf("Error receiving status packet\n"); … … 439 465 } 440 466 packet->header = 0; 441 packet->payload = buffer;467 packet->payload = packet->buffer; 442 468 break; 443 469 case RT_END_DATA: … … 453 479 default: 454 480 printf("Bad rt type for client receipt: %d\n", 455 pkt_hdr .type);481 pkt_hdr->type); 456 482 } 457 483 }
Note: See TracChangeset
for help on using the changeset viewer.