OffloadUtils: move existing ethernet device check to isEthernet() helper

Preparation for tethering bpf offload

Test: manual clatd test
1. Connect to IPv6-Only WiFi hotspot
2. Browse 172.217.0.46 (google.com) successfully
3. Disconnect from WiFi
Repeat the above steps three times.

Change-Id: Ib2fdc644c6048acaacf51c46c6960e8cd6cbc445
diff --git a/server/OffloadUtils.cpp b/server/OffloadUtils.cpp
index b374722..53665f6 100644
--- a/server/OffloadUtils.cpp
+++ b/server/OffloadUtils.cpp
@@ -18,6 +18,7 @@
 
 #include <arpa/inet.h>
 #include <linux/if.h>
+#include <linux/if_arp.h>
 #include <linux/netlink.h>
 #include <linux/pkt_cls.h>
 #include <linux/pkt_sched.h>
@@ -60,6 +61,25 @@
     return ifr.ifr_hwaddr.sa_family;
 }
 
+base::Result<bool> isEthernet(const std::string& interface) {
+    int rv = hardwareAddressType(interface);
+    if (rv < 0) {
+        errno = -rv;
+        return ErrnoErrorf("Get hardware address type of interface {} failed", interface);
+    }
+
+    switch (rv) {
+        case ARPHRD_ETHER:
+            return true;
+        case ARPHRD_RAWIP:  // in Linux 4.14+ rmnet support was upstreamed and this is 519
+        case 530:           // this is ARPHRD_RAWIP on some Android 4.9 kernels with rmnet
+            return false;
+        default:
+            errno = EAFNOSUPPORT;  // Address family not supported
+            return ErrnoErrorf("Unknown hardware address type {} on interface {}", rv, interface);
+    }
+}
+
 // TODO: use //system/netd/server/NetlinkCommands.cpp:openNetlinkSocket(protocol)
 // and //system/netd/server/SockDiag.cpp:checkError(fd)
 static int sendAndProcessNetlinkResponse(const void* req, int len) {