Index: uspace/lib/c/include/inet/addr.h
===================================================================
--- uspace/lib/c/include/inet/addr.h	(revision e52b4b59c1061c3dd893ff39ca793858bbafd080)
+++ uspace/lib/c/include/inet/addr.h	(revision 02a09ed9ab72cd7eb2ca3f11873db078ab906acc)
@@ -38,11 +38,17 @@
 #include <stdint.h>
 #include <net/in.h>
+#include <net/in6.h>
 
-#define INET_ADDR_SIZE  16
+typedef uint32_t addr32_t;
+typedef uint8_t addr48_t[6];
+typedef uint8_t addr128_t[16];
 
 /** Node address */
 typedef struct {
 	uint16_t family;
-	uint8_t addr[INET_ADDR_SIZE];
+	union {
+		addr32_t addr;
+		addr128_t addr6;
+	};
 } inet_addr_t;
 
@@ -53,5 +59,8 @@
 	
 	/** Address */
-	uint8_t addr[INET_ADDR_SIZE];
+	union {
+		addr32_t addr;
+		addr128_t addr6;
+	};
 	
 	/** Number of valid bits */
@@ -59,20 +68,11 @@
 } inet_naddr_t;
 
-extern int inet_addr_family(const char *, uint16_t *);
+extern const addr48_t addr48_broadcast;
 
-extern int inet_addr_parse(const char *, inet_addr_t *);
-extern int inet_naddr_parse(const char *, inet_naddr_t *);
+extern void addr48(const addr48_t, addr48_t);
+extern void addr128(const addr128_t, addr128_t);
 
-extern int inet_addr_format(inet_addr_t *, char **);
-extern int inet_naddr_format(inet_naddr_t *, char **);
-
-extern int inet_addr_pack(inet_addr_t *, uint32_t *);
-extern int inet_naddr_pack(inet_naddr_t *, uint32_t *, uint8_t *);
-
-extern void inet_addr_unpack(uint32_t, inet_addr_t *);
-extern void inet_naddr_unpack(uint32_t, uint8_t, inet_naddr_t *);
-
-extern int inet_addr_sockaddr_in(inet_addr_t *, sockaddr_in_t *);
-extern void inet_naddr_addr(inet_naddr_t *, inet_addr_t *);
+extern void host2addr128_t_be(const addr128_t, addr128_t);
+extern void addr128_t_be2host(const addr128_t, addr128_t);
 
 extern void inet_addr(inet_addr_t *, uint8_t, uint8_t, uint8_t, uint8_t);
@@ -80,9 +80,40 @@
     uint8_t);
 
+extern void inet_addr6(inet_addr_t *, uint16_t, uint16_t, uint16_t, uint16_t,
+    uint16_t, uint16_t, uint16_t, uint16_t);
+extern void inet_naddr6(inet_naddr_t *, uint16_t, uint16_t, uint16_t, uint16_t,
+    uint16_t, uint16_t, uint16_t, uint16_t, uint8_t);
+
+extern int inet_addr_family(const char *, uint16_t *);
+extern void inet_naddr_addr(const inet_naddr_t *, inet_addr_t *);
+
 extern void inet_addr_any(inet_addr_t *);
 extern void inet_naddr_any(inet_naddr_t *);
 
-extern int inet_addr_compare(inet_addr_t *, inet_addr_t *);
-extern int inet_addr_is_any(inet_addr_t *);
+extern int inet_addr_compare(const inet_addr_t *, const inet_addr_t *);
+extern int inet_addr_is_any(const inet_addr_t *);
+
+extern int inet_naddr_compare_mask(const inet_naddr_t *, const inet_addr_t *);
+
+extern int inet_addr_parse(const char *, inet_addr_t *);
+extern int inet_naddr_parse(const char *, inet_naddr_t *);
+
+extern int inet_addr_format(const inet_addr_t *, char **);
+extern int inet_naddr_format(const inet_naddr_t *, char **);
+
+extern uint16_t inet_addr_get(const inet_addr_t *, addr32_t *, addr128_t *);
+extern uint16_t inet_naddr_get(const inet_naddr_t *, addr32_t *, addr128_t *,
+    uint8_t *);
+
+extern void inet_addr_set(addr32_t, inet_addr_t *);
+extern void inet_naddr_set(addr32_t, uint8_t, inet_naddr_t *);
+extern void inet_sockaddr_in_addr(const sockaddr_in_t *, inet_addr_t *);
+
+extern void inet_addr_set6(addr128_t, inet_addr_t *);
+extern void inet_naddr_set6(addr128_t, uint8_t, inet_naddr_t *);
+extern void inet_sockaddr_in6_addr(const sockaddr_in6_t *, inet_addr_t *);
+
+extern uint16_t inet_addr_sockaddr_in(const inet_addr_t *, sockaddr_in_t *,
+    sockaddr_in6_t *);
 
 #endif
Index: uspace/lib/c/include/inet/iplink.h
===================================================================
--- uspace/lib/c/include/inet/iplink.h	(revision e52b4b59c1061c3dd893ff39ca793858bbafd080)
+++ uspace/lib/c/include/inet/iplink.h	(revision 02a09ed9ab72cd7eb2ca3f11873db078ab906acc)
@@ -47,10 +47,10 @@
 } iplink_t;
 
-/** IPv4 link Service Data Unit */
+/** Internet link Service Data Unit */
 typedef struct {
 	/** Local source address */
-	uint32_t lsrc;
+	inet_addr_t src;
 	/** Local destination address */
-	uint32_t ldest;
+	inet_addr_t dest;
 	/** Serialized IP packet */
 	void *data;
@@ -59,16 +59,14 @@
 } iplink_sdu_t;
 
-/** IPv6 link Service Data Unit */
+/** Internet link receive Service Data Unit */
 typedef struct {
-	/** Target MAC address */
-	uint64_t hwaddr;
-	/** Serialized IP packet */
+	/** Serialized datagram */
 	void *data;
 	/** Size of @c data in bytes */
 	size_t size;
-} iplink_sdu6_t;
+} iplink_recv_sdu_t;
 
 typedef struct iplink_ev_ops {
-	int (*recv)(iplink_t *, iplink_sdu_t *);
+	int (*recv)(iplink_t *, iplink_recv_sdu_t *, uint16_t);
 } iplink_ev_ops_t;
 
Index: uspace/lib/c/include/inet/iplink_srv.h
===================================================================
--- uspace/lib/c/include/inet/iplink_srv.h	(revision e52b4b59c1061c3dd893ff39ca793858bbafd080)
+++ uspace/lib/c/include/inet/iplink_srv.h	(revision 02a09ed9ab72cd7eb2ca3f11873db078ab906acc)
@@ -40,4 +40,6 @@
 #include <stdbool.h>
 #include <sys/types.h>
+#include <inet/addr.h>
+#include <inet/iplink.h>
 
 struct iplink_ops;
@@ -51,23 +53,11 @@
 } iplink_srv_t;
 
-/** IP link Service Data Unit */
-typedef struct {
-	/** Local source address */
-	uint32_t lsrc;
-	/** Local destination address */
-	uint32_t ldest;
-	/** Serialized IP packet */
-	void *data;
-	/** Size of @c data in bytes */
-	size_t size;
-} iplink_srv_sdu_t;
-
 typedef struct iplink_ops {
 	int (*open)(iplink_srv_t *);
 	int (*close)(iplink_srv_t *);
-	int (*send)(iplink_srv_t *, iplink_srv_sdu_t *);
+	int (*send)(iplink_srv_t *, iplink_sdu_t *);
 	int (*get_mtu)(iplink_srv_t *, size_t *);
-	int (*addr_add)(iplink_srv_t *, uint32_t);
-	int (*addr_remove)(iplink_srv_t *, uint32_t);
+	int (*addr_add)(iplink_srv_t *, inet_addr_t *);
+	int (*addr_remove)(iplink_srv_t *, inet_addr_t *);
 } iplink_ops_t;
 
@@ -75,5 +65,5 @@
 
 extern int iplink_conn(ipc_callid_t, ipc_call_t *, void *);
-extern int iplink_ev_recv(iplink_srv_t *, iplink_srv_sdu_t *);
+extern int iplink_ev_recv(iplink_srv_t *, iplink_recv_sdu_t *, uint16_t);
 
 #endif
