Index: uspace/lib/inet/src/addr.c
===================================================================
--- uspace/lib/inet/src/addr.c	(revision b4edc96c3455b41ece7d35a9752221342dec22f8)
+++ uspace/lib/inet/src/addr.c	(revision a7f7b9c3744bb1a355f84327e6b489c2a79f47c5)
@@ -55,7 +55,6 @@
 const addr32_t addr32_broadcast_all_hosts = 0xffffffff;
 
-static const eth_addr_t inet_eth_addr_solicited_node = {
-	0x33, 0x33, 0xff, 0, 0, 0
-};
+static eth_addr_t inet_eth_addr_solicited_node =
+    ETH_ADDR_INITIALIZER(0x33, 0x33, 0xff, 0, 0, 0);
 
 static const inet_addr_t inet_addr_any_addr = {
@@ -91,6 +90,10 @@
 void eth_addr_solicited_node(const addr128_t ip, eth_addr_t *mac)
 {
-	memcpy(&mac->b[0], &inet_eth_addr_solicited_node.b[0], 3);
-	memcpy(&mac->b[3], ip + 13, 3);
+	uint8_t b[6];
+	mac->a = inet_eth_addr_solicited_node.a;
+
+	eth_addr_encode(&inet_eth_addr_solicited_node, b);
+	memcpy(&b[3], ip + 13, 3);
+	eth_addr_decode(b, mac);
 }
 
Index: uspace/lib/inet/src/eth_addr.c
===================================================================
--- uspace/lib/inet/src/eth_addr.c	(revision b4edc96c3455b41ece7d35a9752221342dec22f8)
+++ uspace/lib/inet/src/eth_addr.c	(revision a7f7b9c3744bb1a355f84327e6b489c2a79f47c5)
@@ -37,14 +37,19 @@
 #include <inet/eth_addr.h>
 #include <mem.h>
+#include <stdio.h>
 
-const eth_addr_t eth_addr_broadcast = {
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-};
+const eth_addr_t eth_addr_broadcast =
+    ETH_ADDR_INITIALIZER(0xff, 0xff, 0xff, 0xff, 0xff, 0xff);
 
 void eth_addr_encode(eth_addr_t *addr, void *buf)
 {
 	uint8_t *bp = (uint8_t *)buf;
+	uint64_t a;
+	int i;
 
-	memcpy(bp, &addr->b[0], ETH_ADDR_SIZE);
+	a = addr->a;
+
+	for (i = 0; i < ETH_ADDR_SIZE; i++)
+		bp[i] = (a >> (40 - 8 * i)) & 0xff;
 }
 
@@ -52,6 +57,12 @@
 {
 	const uint8_t *bp = (uint8_t *)buf;
+	uint64_t a;
+	int i;
 
-	memcpy(&addr->b[0], bp, ETH_ADDR_SIZE);
+	a = 0;
+	for (i = 0; i < ETH_ADDR_SIZE; i++)
+		a |= (uint64_t)bp[i] << (40 - 8 * i);
+
+	addr->a = a;
 }
 
@@ -62,5 +73,22 @@
 int eth_addr_compare(const eth_addr_t *a, const eth_addr_t *b)
 {
-	return memcmp(a->b, b->b, ETH_ADDR_SIZE) == 0;
+	if (a->a < b->a)
+		return -1;
+	else if (a->a == b->a)
+		return 0;
+	else
+		return 1;
+}
+
+void eth_addr_format(eth_addr_t *addr, eth_addr_str_t *saddr)
+{
+	int i;
+
+	snprintf(saddr->str, 3, "%02x",
+	    (unsigned)((addr->a >> 40) & 0xff));
+	for (i = 1; i < ETH_ADDR_SIZE; i++) {
+		snprintf(saddr->str + 2 + 3 * (i - 1), 4, ":%02x",
+		    (unsigned)((addr->a >> (40 - i * 8)) & 0xff));
+	}
 }
 
