Implement socket receive iterator

Bug: 162032964
Test: watch logcat for ifautocf and l2repeater
Test: adb shell canhalctrl up test virtual vcan2
Change-Id: Icbae3951113391846cfcf9a6747ed565bdaa7dd7
diff --git a/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp b/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
index b3cfbe2..4c5b309 100644
--- a/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
+++ b/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
@@ -165,28 +165,24 @@
 
     LOG(DEBUG) << "Waiting for " << (allOf ? "" : "any of ") << toString(ifnames) << " to "
                << toString(cnd);
-    while (true) {
-        const auto msgBuf = sock.receive();
-        CHECK(msgBuf.has_value()) << "Can't read Netlink socket";
+    for (const auto rawMsg : sock) {
+        const auto msg = nl::Message<ifinfomsg>::parse(rawMsg, {RTM_NEWLINK, RTM_DELLINK});
+        if (!msg.has_value()) continue;
 
-        for (const auto rawMsg : *msgBuf) {
-            const auto msg = nl::Message<ifinfomsg>::parse(rawMsg, {RTM_NEWLINK, RTM_DELLINK});
-            if (!msg.has_value()) continue;
+        const auto ifname = msg->attributes.get<std::string>(IFLA_IFNAME);
+        if (ifnames.count(ifname) == 0) continue;
 
-            const auto ifname = msg->attributes.get<std::string>(IFLA_IFNAME);
-            if (ifnames.count(ifname) == 0) continue;
+        const bool present = (msg->header.nlmsg_type != RTM_DELLINK);
+        const bool up = present && (msg->data.ifi_flags & IFF_UP) != 0;
+        states[ifname] = {present, up};
 
-            const bool present = (msg->header.nlmsg_type != RTM_DELLINK);
-            const bool up = present && (msg->data.ifi_flags & IFF_UP) != 0;
-            states[ifname] = {present, up};
-
-            if (isFullySatisfied()) {
-                LOG(DEBUG) << "Finished waiting for " << (allOf ? "" : "some of ")
-                           << toString(ifnames) << " to " << toString(cnd);
-                return;
-            }
+        if (isFullySatisfied()) {
+            LOG(DEBUG) << "Finished waiting for " << (allOf ? "" : "some of ") << toString(ifnames)
+                       << " to " << toString(cnd);
+            return;
         }
     }
+    LOG(FATAL) << "Can't read Netlink socket";
 }
 
 }  // namespace android::netdevice