return 0;
}
+/** \brief wait for all afpacket threads to fully init
+ *
+ * Discard packets before all threads are ready, as the cluster
+ * setup is not complete yet.
+ *
+ * if AFPPeersListStarted() returns true init is complete
+ *
+ * \retval r 1 = happy, otherwise unhappy
+ */
static int AFPSynchronizeStart(AFPThreadVars *ptv)
{
int r;
struct timeval synctv;
+ struct pollfd fds;
+
+ fds.fd = ptv->socket;
+ fds.events = POLLIN;
/* Set timeval to end of the world */
synctv.tv_sec = 0xffffffff;
synctv.tv_usec = 0xffffffff;
while (1) {
- if (AFPPeersListStarted() && synctv.tv_sec == (time_t) 0xffffffff) {
- gettimeofday(&synctv, NULL);
- }
- if (ptv->flags & AFP_RING_MODE) {
- r = AFPReadAndDiscardFromRing(ptv, &synctv);
+ r = poll(&fds, 1, POLL_TIMEOUT);
+ if (r > 0 &&
+ (fds.revents & (POLLHUP|POLLRDHUP|POLLERR|POLLNVAL))) {
+ SCLogWarning(SC_ERR_AFP_READ, "poll failed %02x",
+ fds.revents & (POLLHUP|POLLRDHUP|POLLERR|POLLNVAL));
+ return 0;
+ } else if (r > 0) {
+ if (AFPPeersListStarted() && synctv.tv_sec == (time_t) 0xffffffff) {
+ gettimeofday(&synctv, NULL);
+ }
+ if (ptv->flags & AFP_RING_MODE) {
+ r = AFPReadAndDiscardFromRing(ptv, &synctv);
+ } else {
+ r = AFPReadAndDiscard(ptv, &synctv);
+ }
+ SCLogDebug("Discarding on %s", ptv->tv->name);
+ switch (r) {
+ case 1:
+ SCLogInfo("Starting to read on %s", ptv->tv->name);
+ return 1;
+ case -1:
+ return r;
+ }
+ /* no packets */
+ } else if (r == 0 && AFPPeersListStarted()) {
+ SCLogInfo("Starting to read on %s", ptv->tv->name);
+ return 1;
} else {
- r = AFPReadAndDiscard(ptv, &synctv);
- }
- SCLogDebug("Discarding on %s", ptv->tv->name);
- switch (r) {
- case 1:
- SCLogInfo("Starting to read on %s", ptv->tv->name);
- return 1;
- case -1:
- return r;
+ SCLogWarning(SC_ERR_AFP_READ, "poll failed with retval %d", r);
+ return 0;
}
}
return 1;