Changeset f19c3e9 for lib


Ignore:
Timestamp:
12/18/12 15:03:38 (9 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:
a8c3d1d
Parents:
7d6d80e
Message:

Various fixes for ring: bugs

  • Fixed bug where max_order was not being initialised
  • Fixed double-free bug which would crop up if the ring_start_input or ring_start_output functions returned an error
  • Better error reporting when ring_start_input or ring_start_output fails
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/format_linux.c

    r5b825b3 rf19c3e9  
    366366        FORMAT(libtrace->format_data)->rx_ring = NULL;
    367367        FORMAT(libtrace->format_data)->rxring_offset = 0;
     368        FORMAT(libtrace->format_data)->max_order = MAX_ORDER;
    368369}
    369370static int linuxring_init_input(libtrace_t *libtrace)
     
    388389        DATAOUT(libtrace)->txring_offset = 0;
    389390        DATAOUT(libtrace)->queue = 0;
     391        DATAOUT(libtrace)->max_order = MAX_ORDER;
    390392}
    391393static int linuxnative_init_output(libtrace_out_t *libtrace)
     
    524526        return 0;
    525527}
    526 static inline int socket_to_packetmmap(char * uridata, int ring_type,
     528static inline int socket_to_packetmmap( char * uridata, int ring_type,
    527529                                        int fd,
    528530                                        struct tpacket_req * req,
    529531                                        char ** ring_location,
    530                                         uint32_t *max_order){
    531         socklen_t len;
     532                                        uint32_t *max_order,
     533                                        char *error){
    532534        int val;
    533535
    534536        /* Switch to TPACKET header version 2, we only try support v2 because v1 had problems */
    535         val = TPACKET_V2;
    536         len = sizeof(val);
    537         if(getsockopt(fd,
    538                         SOL_PACKET,
    539                         PACKET_HDRLEN,
    540                         &val,
    541                         &len) == -1){
    542                 return -1;
    543         }
    544537
    545538        val = TPACKET_V2;
     
    549542                        &val,
    550543                        sizeof(val)) == -1){
     544                strncpy(error, "TPACKET2 not supported", 2048);
    551545                return -1;
    552546        }
     
    557551        while(1) {     
    558552                if (*max_order <= 0) {
     553                        strncpy(error,"Cannot allocate enough memory for ring buffer", 2048);
    559554                        return -1;
    560555                }
     
    568563                                (*max_order)--;
    569564                        } else {
     565                                strncpy(error, "Error setting the ring buffer size", 2048);
    570566                                return -1;
    571567                        }
     
    581577                                        fd, 0);
    582578        if(*ring_location == MAP_FAILED){
     579                strncpy(error, "Failed to map memory for ring buffer", 2048);
    583580                return -1;
    584581        }
     
    586583}
    587584static int linuxring_start_input(libtrace_t *libtrace){
    588        
     585
     586        char error[2048];       
    589587
    590588        /* We set the socket up the same and then convert it to PACKET_MMAP */
     
    597595                        &FORMAT(libtrace->format_data)->req,
    598596                        &FORMAT(libtrace->format_data)->rx_ring,
    599                         &FORMAT(libtrace->format_data)->max_order) != 0){
    600                 trace_set_err(libtrace, TRACE_ERR_INIT_FAILED,
    601                         "TPACKET2 not supported or ring buffer is too large");
     597                        &FORMAT(libtrace->format_data)->max_order,
     598                        error) != 0){
     599                trace_set_err(libtrace, TRACE_ERR_INIT_FAILED, error);
    602600                close(DATAOUT(libtrace)->fd);
    603601                free(libtrace->format_data);
     602                libtrace->format_data = NULL;
    604603                return -1;
    605604        }
     
    621620static int linuxring_start_output(libtrace_out_t *libtrace)
    622621{
     622        char error[2048];       
    623623        /* We set the socket up the same and then convert it to PACKET_MMAP */
    624624        if(linuxnative_start_output(libtrace) != 0)
     
    630630                        &DATAOUT(libtrace)->req,
    631631                        &DATAOUT(libtrace)->tx_ring,
    632                         &DATAOUT(libtrace)->max_order) != 0){
    633                 trace_set_err_out(libtrace, TRACE_ERR_INIT_FAILED,
    634                         "TPACKET2 not supported or ring buffer is too large");
     632                        &DATAOUT(libtrace)->max_order,
     633                        error) != 0){
     634                trace_set_err_out(libtrace, TRACE_ERR_INIT_FAILED, error);
    635635                close(DATAOUT(libtrace)->fd);
    636636                free(libtrace->format_data);
     637                libtrace->format_data = NULL;
    637638                return -1;
    638639        }
Note: See TracChangeset for help on using the changeset viewer.