diff --git a/lib/netfilter_api.c b/lib/netfilter_api.c index 915d2f610..8ac4e4e56 100644 --- a/lib/netfilter_api.c +++ b/lib/netfilter_api.c @@ -222,7 +222,10 @@ const char *nfapi_recv_iter(nfapi_socket *s, const nfapi_callbacks *c, void *use } ss; socklen_t ssl = sizeof(ss); errno = 0; - ssize_t r = recvfrom(s->fd, buf, sizeof(buf), 0, (struct sockaddr *) &ss.sst, &ssl); + ssize_t r = recvfrom(s->fd, buf, sizeof(buf), MSG_DONTWAIT, (struct sockaddr *) &ss.sst, &ssl); + + if (r < 0 && errno == EAGAIN) + return NULL; if (r < 0 || r > sizeof(buf) || ssl < sizeof(ss.ssn) @@ -282,11 +285,8 @@ const char *nfapi_recv_iter(nfapi_socket *s, const nfapi_callbacks *c, void *use }; } else { - if (type == NLMSG_DONE) { - if (hdr->nlmsg_seq != s->last_seq) - continue; - return NULL; - } + if (type == NLMSG_DONE) + continue; if (type == NLMSG_ERROR) { struct nlmsgerr *err; @@ -296,11 +296,8 @@ const char *nfapi_recv_iter(nfapi_socket *s, const nfapi_callbacks *c, void *use err = (struct nlmsgerr *) (buf + next); - if (err->error == 0) { - if (hdr->nlmsg_seq != s->last_seq) - continue; - return NULL; - } + if (err->error == 0) + continue; errno = -err->error; s->err_seq = hdr->nlmsg_seq;