base: fix some bugs in EthAddr

per the IEEE 802 spec:
1) fixed broadcast() to ensure that all bytes are equal to 0xff.
2) fixed unicast() to ensure that bit 0 of the first byte is equal to 0
3) fixed multicast() to ensure that bit 0 of the first byte is equal to 1, and
   that it is not a broadcast.

also the constructors in EthAddr are fixed so that all bytes of data are
initialized.
diff --git a/src/base/inet.hh b/src/base/inet.hh
index afa6c40..5130a07 100644
--- a/src/base/inet.hh
+++ b/src/base/inet.hh
@@ -93,9 +93,18 @@
     uint8_t *bytes() { return &data[0]; }
 
     const uint8_t *addr() const { return &data[0]; }
-    bool unicast() const { return data[0] == 0x00; }
-    bool multicast() const { return data[0] == 0x01; }
-    bool broadcast() const { return data[0] == 0xff; }
+    bool unicast() const { return !(data[0] & 0x01); }
+    bool multicast() const { return !unicast() && !broadcast(); }
+    bool broadcast() const
+    {
+        bool isBroadcast = true;
+        for (int i = 0; i < ETH_ADDR_LEN; ++i) {
+            isBroadcast = isBroadcast && data[i] == 0xff;
+        }
+
+        return isBroadcast;
+    }
+
     std::string string() const;
 
     operator uint64_t() const