net/addr/ether: Add basic MAC comparison and hashing

Change-Id: I8e6ddb709726326357cad4c583fec38c18d1ea83
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/include/meson.build b/include/meson.build
index 6d02351..50ecdef 100644
--- a/include/meson.build
+++ b/include/meson.build
@@ -9,6 +9,7 @@
   'stdplus/hash.hpp',
   'stdplus/hash/array.hpp',
   'stdplus/hash/tuple.hpp',
+  'stdplus/net/addr/ether.hpp',
   'stdplus/net/addr/ip.hpp',
   'stdplus/numeric/endian.hpp',
   'stdplus/pinned.hpp',
diff --git a/include/stdplus/net/addr/ether.hpp b/include/stdplus/net/addr/ether.hpp
new file mode 100644
index 0000000..91cf031
--- /dev/null
+++ b/include/stdplus/net/addr/ether.hpp
@@ -0,0 +1,30 @@
+#pragma once
+#include <net/ethernet.h>
+
+#include <stdplus/hash.hpp>
+
+#include <algorithm>
+#include <variant>
+
+namespace stdplus
+{
+
+struct EtherAddr : ether_addr
+{
+    constexpr bool operator==(ether_addr rhs) const noexcept
+    {
+        return std::equal(ether_addr_octet, ether_addr_octet + 6,
+                          rhs.ether_addr_octet);
+    }
+};
+
+} // namespace stdplus
+
+template <>
+struct std::hash<stdplus::EtherAddr>
+{
+    constexpr std::size_t operator()(ether_addr addr) const noexcept
+    {
+        return stdplus::hashMulti(addr.ether_addr_octet);
+    }
+};