Changes in uspace/lib/net/tl/socket_core.c [c6533a7:6b82009] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/net/tl/socket_core.c
rc6533a7 r6b82009 36 36 37 37 #include <socket_core.h> 38 #include <packet_client.h> 39 #include <packet_remote.h> 38 40 #include <net/socket_codes.h> 39 41 #include <net/in.h> 40 42 #include <net/inet.h> 43 #include <net/packet.h> 41 44 #include <net/modules.h> 42 45 #include <stdint.h> … … 89 92 } 90 93 94 /* Release all received packets */ 95 int packet_id; 96 while ((packet_id = dyn_fifo_pop(&socket->received)) >= 0) 97 pq_release_remote(sess, packet_id); 98 99 dyn_fifo_destroy(&socket->received); 91 100 dyn_fifo_destroy(&socket->accepted); 92 101 … … 439 448 socket->key_length = 0; 440 449 socket->specific_data = specific_data; 441 442 rc = dyn_fifo_initialize(&socket->accepted, SOCKET_INITIAL_ACCEPTED_SIZE); 450 rc = dyn_fifo_initialize(&socket->received, SOCKET_INITIAL_RECEIVED_SIZE); 443 451 if (rc != EOK) { 444 452 free(socket); 445 453 return rc; 446 454 } 455 456 rc = dyn_fifo_initialize(&socket->accepted, SOCKET_INITIAL_ACCEPTED_SIZE); 457 if (rc != EOK) { 458 dyn_fifo_destroy(&socket->received); 459 free(socket); 460 return rc; 461 } 447 462 socket->socket_id = *socket_id; 448 463 rc = socket_cores_add(local_sockets, socket->socket_id, socket); 449 464 if (rc < 0) { 465 dyn_fifo_destroy(&socket->received); 450 466 dyn_fifo_destroy(&socket->accepted); 451 467 free(socket); … … 490 506 socket_destroy_core(sess, socket, local_sockets, global_sockets, 491 507 socket_release); 508 509 return EOK; 510 } 511 512 /** Replies the packet or the packet queue data to the application via the 513 * socket. 514 * 515 * Uses the current message processing fibril. 516 * 517 * @param[in] packet The packet to be transfered. 518 * @param[out] length The total data length. 519 * @return EOK on success. 520 * @return EBADMEM if the length parameter is NULL. 521 * @return ENOMEM if there is not enough memory left. 522 * @return Other error codes as defined for the data_reply() 523 * function. 524 */ 525 int socket_reply_packets(packet_t *packet, size_t *length) 526 { 527 packet_t *next_packet; 528 size_t fragments; 529 size_t *lengths; 530 size_t index; 531 int rc; 532 533 if (!length) 534 return EBADMEM; 535 536 next_packet = pq_next(packet); 537 if (!next_packet) { 538 /* Write all if only one fragment */ 539 rc = data_reply(packet_get_data(packet), 540 packet_get_data_length(packet)); 541 if (rc != EOK) 542 return rc; 543 /* Store the total length */ 544 *length = packet_get_data_length(packet); 545 } else { 546 /* Count the packet fragments */ 547 fragments = 1; 548 next_packet = pq_next(packet); 549 while ((next_packet = pq_next(next_packet))) 550 ++fragments; 551 552 /* Compute and store the fragment lengths */ 553 lengths = (size_t *) malloc(sizeof(size_t) * fragments + 554 sizeof(size_t)); 555 if (!lengths) 556 return ENOMEM; 557 558 lengths[0] = packet_get_data_length(packet); 559 lengths[fragments] = lengths[0]; 560 next_packet = pq_next(packet); 561 562 for (index = 1; index < fragments; ++index) { 563 lengths[index] = packet_get_data_length(next_packet); 564 lengths[fragments] += lengths[index]; 565 next_packet = pq_next(packet); 566 } 567 568 /* Write the fragment lengths */ 569 rc = data_reply(lengths, sizeof(int) * (fragments + 1)); 570 if (rc != EOK) { 571 free(lengths); 572 return rc; 573 } 574 next_packet = packet; 575 576 /* Write the fragments */ 577 for (index = 0; index < fragments; ++index) { 578 rc = data_reply(packet_get_data(next_packet), 579 lengths[index]); 580 if (rc != EOK) { 581 free(lengths); 582 return rc; 583 } 584 next_packet = pq_next(next_packet); 585 } 586 587 /* Store the total length */ 588 *length = lengths[fragments]; 589 free(lengths); 590 } 492 591 493 592 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.