summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/netlink-socket.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/netlink-socket.c b/lib/netlink-socket.c
index b1e6804fb..09d3a6187 100644
--- a/lib/netlink-socket.c
+++ b/lib/netlink-socket.c
@@ -724,9 +724,15 @@ nl_dump_refill(struct nl_dump *dump, struct ofpbuf *buffer)
int error;
while (!ofpbuf_size(buffer)) {
- error = nl_sock_recv__(dump->sock, buffer, true);
+ error = nl_sock_recv__(dump->sock, buffer, false);
if (error) {
- /* The kernel shouldn't return EAGAIN while there's data left. */
+ /* The kernel never blocks providing the results of a dump, so
+ * error == EAGAIN means that we've read the whole thing, and
+ * therefore transform it into EOF. (The kernel always provides
+ * NLMSG_DONE as a sentinel. Some other thread must have received
+ * that already but not yet signaled it in 'status'.)
+ *
+ * Any other error is just an error. */
return error == EAGAIN ? EOF : error;
}