Changeset 6561682 for lib/format_rt.c


Ignore:
Timestamp:
02/16/06 10:43:03 (15 years ago)
Author:
Shane Alcock <salcock@…>
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:
70b38dc
Parents:
e9f9ab3
Message:

Added rudimentary acking of received data

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/format_rt.c

    re9f9ab3 r6561682  
    290290}
    291291
    292 static int rt_read_packet(struct libtrace_t *libtrace, struct libtrace_packet_t *packet) {
     292static int rt_send_ack(struct libtrace_t *libtrace,
     293                struct libtrace_packet_t *packet)  {
     294       
     295        static char *ack_buffer = 0;
     296        char *buf_ptr;
     297        int numbytes = 0;
     298        int to_write = 0;
     299        rt_header_t *hdr;
     300        rt_ack_t *ack_hdr;
     301       
     302        if (!ack_buffer) {
     303                ack_buffer = malloc(sizeof(rt_header_t) + sizeof(rt_ack_t));
     304        }
     305       
     306        hdr = (rt_header_t) ack_buffer;
     307        ack_hdr = (rt_ack_t) (ack_buffer + sizeof(rt_header_t));
     308       
     309        hdr->type = RT_ACK;
     310        hdr->length = sizeof(rt_header_t) + sizeof(rt_ack_t);
     311
     312        ack_hdr->ts = trace_get_erf_timestamp(packet);
     313       
     314        to_write = hdr->length;
     315        buf_ptr = ack_buffer;
     316       
     317        while (to_write > 0) {
     318                numbytes = send(RT_INFO.input_fd, buf_ptr, to_write);
     319                if (numbytes == -1) {
     320                        if (errno == EINTR || errno == EAGAIN) {
     321                                continue;
     322                        }
     323                        else {
     324                                printf("Error sending ack\n");
     325                                return -1;
     326                        }
     327                }
     328                to_write = to_write - numbytes;
     329                buf_ptr = buf_ptr + to_write;
     330               
     331        }
     332
     333        return 1;
     334}
     335       
     336static int rt_read_packet(struct libtrace_t *libtrace,
     337                struct libtrace_packet_t *packet) {
    293338       
    294339        int numbytes = 0;
     
    344389                                }
    345390                                if (tracefifo_out_read(libtrace->fifo, buffer,
    346                                                         packet->size -
    347                                                         sizeof(uint16_t)) == 0)
     391                                                        packet->size - sizeof(uint16_t))== 0)
    348392                                {
    349393                                        tracefifo_out_reset(libtrace->fifo);
     
    357401                                // set packet->payload
    358402                                rt_set_payload(packet, format);
     403                               
    359404                                // send ack
     405                                if (rt_send_ack(libtrace, packet) == -1) {
     406                                        return -1;
     407                                }
     408                               
    360409                                break;
    361410                        case RT_STATUS:
     
    395444
    396445                        default:
    397                                 printf("Bad rt type: %d\n", packet->type);
     446                                printf("Bad rt client type: %d\n", packet->type);
    398447                                return -1;
    399448                               
Note: See TracChangeset for help on using the changeset viewer.