Changeset 9e429e8 for lib/format_linux.c


Ignore:
Timestamp:
09/19/14 15:40:01 (7 years ago)
Author:
Richard Sanger <rsangerarj@…>
Branches:
4.0.1-hotfixes, cachetimestamps, develop, dpdk-ndag, etsilive, 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:
11cf9b1
Parents:
d994324 (diff), ea602cd (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge remote-tracking branch 'upsteam/master' into develop

Conflicts:

README
lib/format_dpdk.c
lib/format_linux.c
lib/trace.c

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/format_linux.c

    r2498008 r9e429e8  
    546546         */
    547547        if (filter != NULL) {
    548                 assert(filter->flag == 1);
     548                /* Check if the filter was successfully compiled. If not,
     549                 * it is probably a bad filter and we should return an error
     550                 * before the caller tries to read any packets */
     551                if (filter->flag == 0) {
     552                        return -1;
     553                }
     554               
    549555                if (setsockopt(FORMAT(libtrace->format_data)->fd,
    550556                                        SOL_SOCKET,
     
    902908
    903909                if (pcap_compile(pcap, &f->filter, f->filterstring, 0, 0) == -1) {
    904                         perror("PCAP failed to compile the filterstring");
    905                         return -1;
     910                        /* Filter didn't compile, set flag to 0 so we can
     911                         * detect this when trace_start() is called and
     912                         * produce a useful error
     913                         */
     914                        f->flag = 0;
     915                        trace_set_err(libtrace, TRACE_ERR_INIT_FAILED,
     916                                        "Failed to compile BPF filter (%s): %s",
     917                                        f->filterstring, pcap_geterr(pcap));
     918                } else {
     919                        /* Set the "flag" to indicate that the filterstring
     920                         * has been compiled
     921                         */
     922                        f->flag = 1;
    906923                }
    907924
    908925                pcap_close(pcap);
    909926               
    910                 /* Set the "flag" to indicate that the filterstring has been
    911                  * compiled
    912                  */
    913                 f->flag = 1;
    914927        }
    915928       
     
    10721085
    10731086        uint32_t flags = 0;
     1087        fd_set readfds;
     1088        struct timeval tout;
     1089        int ret;
    10741090       
    10751091        if (!packet->buffer || packet->buf_control == TRACE_CTRL_EXTERNAL) {
     
    11181134                        FD_SET(get_thread_table(libtrace)->messages.pipefd[0], &rfds);
    11191135                        int largestfd = fd > get_thread_table(libtrace)->messages.pipefd[0] ? fd : get_thread_table(libtrace)->messages.pipefd[0];
    1120                        
    11211136                        do {
    11221137                                ret = select(largestfd+1, &rfds, NULL, NULL, NULL);
     
    11361151                }
    11371152        } else {
    1138                 hdr->wirelen = recvmsg(fd, &msghdr, MSG_TRUNC);
    1139         }
     1153        /* Use select to allow us to time out occasionally to check if someone
     1154         * has hit Ctrl-C or otherwise wants us to stop reading and return
     1155         * so they can exit their program.
     1156         */
     1157
     1158        while (1) {
     1159                tout.tv_sec = 0;
     1160                tout.tv_usec = 500000;
     1161                FD_ZERO(&readfds);
     1162                FD_SET(FORMAT(libtrace->format_data)->fd, &readfds);
     1163
     1164                ret = select(FORMAT(libtrace->format_data)->fd + 1, &readfds,
     1165                                NULL, NULL, &tout);
     1166                if (ret < 0 && errno != EINTR) {
     1167                        trace_set_err(libtrace, errno, "select");
     1168                        return -1;
     1169                } else if (ret < 0) {
     1170                        continue;
     1171                }
     1172               
     1173                if (FD_ISSET(FORMAT(libtrace->format_data)->fd, &readfds)) {
     1174                        /* There's something available for us to read */
     1175                        break;
     1176                }
     1177
     1178               
     1179                /* If we get here, we timed out -- check if we should halt */
     1180                if (libtrace_halt)
     1181                        return 0;
     1182        }
     1183        hdr->wirelen = recvmsg(FORMAT(libtrace->format_data)->fd, &msghdr, MSG_TRUNC);
     1184        }
     1185
     1186                       
     1187                       
    11401188       
    11411189        if (hdr->wirelen==~0U) {
     
    12881336        assert((((unsigned long) header) & (pagesize - 1)) == 0);
    12891337
    1290         /* TP_STATUS_USER means that we can use the frame.
    1291          * When a slot does not have this flag set, the frame is not
    1292          * ready for consumption.
    1293          */
    1294         while (!(header->tp_status & TP_STATUS_USER)) {
     1338        while (1) {
    12951339                if (message) {
    12961340                        struct pollfd pollset[2];
     
    13181362
    13191363                        /* Wait for more data or a message*/
    1320                         ret = poll(&pollset, 1, -1);
     1364                ret = poll(&pollset, 1, 500);
    13211365                        if (ret < 0) {
    13221366                                if (errno != EINTR)
    13231367                                        trace_set_err(libtrace,errno,"poll()");
    13241368                                return -1;
    1325                         }
     1369                } else if (ret == 0) {
     1370                        /* Poll timed out - check if we should exit */
     1371                        if (libtrace_halt)
     1372                                return 0;
     1373                        continue;
     1374                }
     1375
     1376                /* TP_STATUS_USER means that we can use the frame.
     1377                 * When a slot does not have this flag set, the frame is not
     1378                 * ready for consumption.
     1379                 */
     1380                if (header->tp_status & TP_STATUS_USER)
     1381                        break;
    13261382                }
    13271383        }
     
    13801436        if(header->tp_status & TP_STATUS_USER){
    13811437                /* We have a frame waiting */
    1382                 event.size = linuxring_read_packet(libtrace, packet);
     1438                event.size = trace_read_packet(libtrace, packet);
    13831439                event.type = TRACE_EVENT_PACKET;
    13841440        } else {
Note: See TracChangeset for help on using the changeset viewer.