Index: uspace/lib/c/generic/iplink.c
===================================================================
--- uspace/lib/c/generic/iplink.c	(revision f5f79cdca759b2a16b9d14f6446269fc248a6f1e)
+++ uspace/lib/c/generic/iplink.c	(revision a17356fd13769fdbaa2f4df26127bb541d940247)
@@ -86,7 +86,30 @@
 	
 	ipc_call_t answer;
-	aid_t req = async_send_0(exch, IPLINK_SEND, &answer);
-	
-	int rc = async_data_write_start(exch, &sdu->src, sizeof(inet_addr_t));
+	aid_t req = async_send_2(exch, IPLINK_SEND, (sysarg_t) sdu->src,
+	    (sysarg_t) sdu->dest, &answer);
+	
+	int rc = async_data_write_start(exch, sdu->data, sdu->size);
+	
+	async_exchange_end(exch);
+	
+	if (rc != EOK) {
+		async_forget(req);
+		return rc;
+	}
+	
+	sysarg_t retval;
+	async_wait_for(req, &retval);
+	
+	return (int) retval;
+}
+
+int iplink_send6(iplink_t *iplink, iplink_sdu6_t *sdu)
+{
+	async_exch_t *exch = async_exchange_begin(iplink->sess);
+	
+	ipc_call_t answer;
+	aid_t req = async_send_0(exch, IPLINK_SEND6, &answer);
+	
+	int rc = async_data_write_start(exch, &sdu->dest, sizeof(addr48_t));
 	if (rc != EOK) {
 		async_exchange_end(exch);
@@ -95,11 +118,4 @@
 	}
 	
-	rc = async_data_write_start(exch, &sdu->dest, sizeof(inet_addr_t));
-	if (rc != EOK) {
-		async_exchange_end(exch);
-		async_forget(req);
-		return rc;
-	}
-	
 	rc = async_data_write_start(exch, sdu->data, sdu->size);
 	
@@ -119,15 +135,38 @@
 int iplink_get_mtu(iplink_t *iplink, size_t *rmtu)
 {
+	async_exch_t *exch = async_exchange_begin(iplink->sess);
+	
 	sysarg_t mtu;
-	async_exch_t *exch = async_exchange_begin(iplink->sess);
-
 	int rc = async_req_0_1(exch, IPLINK_GET_MTU, &mtu);
-	async_exchange_end(exch);
-
+	
+	async_exchange_end(exch);
+	
 	if (rc != EOK)
 		return rc;
-
+	
 	*rmtu = mtu;
 	return EOK;
+}
+
+int iplink_get_mac48(iplink_t *iplink, addr48_t *mac)
+{
+	async_exch_t *exch = async_exchange_begin(iplink->sess);
+	
+	ipc_call_t answer;
+	aid_t req = async_send_0(exch, IPLINK_GET_MAC48, &answer);
+	
+	int rc = async_data_read_start(exch, mac, sizeof(addr48_t));
+	
+	loc_exchange_end(exch);
+	
+	if (rc != EOK) {
+		async_forget(req);
+		return rc;
+	}
+	
+	sysarg_t retval;
+	async_wait_for(req, &retval);
+	
+	return (int) retval;
 }
 
Index: uspace/lib/c/generic/iplink_srv.c
===================================================================
--- uspace/lib/c/generic/iplink_srv.c	(revision f5f79cdca759b2a16b9d14f6446269fc248a6f1e)
+++ uspace/lib/c/generic/iplink_srv.c	(revision a17356fd13769fdbaa2f4df26127bb541d940247)
@@ -50,4 +50,35 @@
 }
 
+static void iplink_get_mac48_srv(iplink_srv_t *srv, ipc_callid_t iid,
+    ipc_call_t *icall)
+{
+	addr48_t mac;
+	int rc = srv->ops->get_mac48(srv, &mac);
+	if (rc != EOK) {
+		async_answer_0(iid, rc);
+		return;
+	}
+	
+	ipc_callid_t callid;
+	size_t size;
+	if (!async_data_read_receive(&callid, &size)) {
+		async_answer_0(callid, EREFUSED);
+		async_answer_0(iid, EREFUSED);
+		return;
+	}
+	
+	if (size != sizeof(addr48_t)) {
+		async_answer_0(callid, EINVAL);
+		async_answer_0(iid, EINVAL);
+		return;
+	}
+	
+	rc = async_data_read_finalize(callid, &mac, size);
+	if (rc != EOK)
+		async_answer_0(callid, rc);
+	
+	async_answer_0(iid, (sysarg_t) rc);
+}
+
 static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t iid,
     ipc_call_t *icall)
@@ -111,4 +142,24 @@
 	iplink_sdu_t sdu;
 	
+	sdu.src = IPC_GET_ARG1(*icall);
+	sdu.dest = IPC_GET_ARG2(*icall);
+	
+	int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0,
+	    &sdu.size);
+	if (rc != EOK) {
+		async_answer_0(iid, rc);
+		return;
+	}
+	
+	rc = srv->ops->send(srv, &sdu);
+	free(sdu.data);
+	async_answer_0(iid, rc);
+}
+
+static void iplink_send6_srv(iplink_srv_t *srv, ipc_callid_t iid,
+    ipc_call_t *icall)
+{
+	iplink_sdu6_t sdu;
+	
 	ipc_callid_t callid;
 	size_t size;
@@ -119,5 +170,5 @@
 	}
 	
-	if (size != sizeof(inet_addr_t)) {
+	if (size != sizeof(addr48_t)) {
 		async_answer_0(callid, EINVAL);
 		async_answer_0(iid, EINVAL);
@@ -125,5 +176,5 @@
 	}
 	
-	int rc = async_data_write_finalize(callid, &sdu.src, size);
+	int rc = async_data_write_finalize(callid, &sdu.dest, size);
 	if (rc != EOK) {
 		async_answer_0(callid, (sysarg_t) rc);
@@ -131,28 +182,12 @@
 	}
 	
-	if (!async_data_write_receive(&callid, &size)) {
-		async_answer_0(callid, EREFUSED);
-		async_answer_0(iid, EREFUSED);
-		return;
-	}
-	
-	if (size != sizeof(inet_addr_t)) {
-		async_answer_0(callid, EINVAL);
-		async_answer_0(iid, EINVAL);
-		return;
-	}
-	
-	rc = async_data_write_finalize(callid, &sdu.dest, size);
-	if (rc != EOK) {
-		async_answer_0(callid, (sysarg_t) rc);
-		async_answer_0(iid, (sysarg_t) rc);
-	}
-	
 	rc = async_data_write_accept(&sdu.data, false, 0, 0, 0,
 	    &sdu.size);
-	if (rc != EOK)
-		return;
-	
-	rc = srv->ops->send(srv, &sdu);
+	if (rc != EOK) {
+		async_answer_0(iid, rc);
+		return;
+	}
+	
+	rc = srv->ops->send6(srv, &sdu);
 	free(sdu.data);
 	async_answer_0(iid, rc);
@@ -170,5 +205,5 @@
 int iplink_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
 {
-	iplink_srv_t *srv = (iplink_srv_t *)arg;
+	iplink_srv_t *srv = (iplink_srv_t *) arg;
 	int rc;
 	
@@ -214,6 +249,12 @@
 			iplink_get_mtu_srv(srv, callid, &call);
 			break;
+		case IPLINK_GET_MAC48:
+			iplink_get_mac48_srv(srv, callid, &call);
+			break;
 		case IPLINK_SEND:
 			iplink_send_srv(srv, callid, &call);
+			break;
+		case IPLINK_SEND6:
+			iplink_send6_srv(srv, callid, &call);
 			break;
 		case IPLINK_ADDR_ADD:
Index: uspace/lib/c/include/inet/iplink.h
===================================================================
--- uspace/lib/c/include/inet/iplink.h	(revision f5f79cdca759b2a16b9d14f6446269fc248a6f1e)
+++ uspace/lib/c/include/inet/iplink.h	(revision a17356fd13769fdbaa2f4df26127bb541d940247)
@@ -47,10 +47,10 @@
 } iplink_t;
 
-/** Internet link Service Data Unit */
+/** IPv4 link Service Data Unit */
 typedef struct {
 	/** Local source address */
-	inet_addr_t src;
+	addr32_t src;
 	/** Local destination address */
-	inet_addr_t dest;
+	addr32_t dest;
 	/** Serialized IP packet */
 	void *data;
@@ -58,4 +58,14 @@
 	size_t size;
 } iplink_sdu_t;
+
+/** IPv6 link Service Data Unit */
+typedef struct {
+	/** Local MAC destination address */
+	addr48_t dest;
+	/** Serialized IP packet */
+	void *data;
+	/** Size of @c data in bytes */
+	size_t size;
+} iplink_sdu6_t;
 
 /** Internet link receive Service Data Unit */
@@ -74,7 +84,9 @@
 extern void iplink_close(iplink_t *);
 extern int iplink_send(iplink_t *, iplink_sdu_t *);
+extern int iplink_send6(iplink_t *, iplink_sdu6_t *);
 extern int iplink_addr_add(iplink_t *, inet_addr_t *);
 extern int iplink_addr_remove(iplink_t *, inet_addr_t *);
 extern int iplink_get_mtu(iplink_t *, size_t *);
+extern int iplink_get_mac48(iplink_t *, addr48_t *);
 
 #endif
Index: uspace/lib/c/include/inet/iplink_srv.h
===================================================================
--- uspace/lib/c/include/inet/iplink_srv.h	(revision f5f79cdca759b2a16b9d14f6446269fc248a6f1e)
+++ uspace/lib/c/include/inet/iplink_srv.h	(revision a17356fd13769fdbaa2f4df26127bb541d940247)
@@ -57,5 +57,7 @@
 	int (*close)(iplink_srv_t *);
 	int (*send)(iplink_srv_t *, iplink_sdu_t *);
+	int (*send6)(iplink_srv_t *, iplink_sdu6_t *);
 	int (*get_mtu)(iplink_srv_t *, size_t *);
+	int (*get_mac48)(iplink_srv_t *, addr48_t *);
 	int (*addr_add)(iplink_srv_t *, inet_addr_t *);
 	int (*addr_remove)(iplink_srv_t *, inet_addr_t *);
Index: uspace/lib/c/include/ipc/iplink.h
===================================================================
--- uspace/lib/c/include/ipc/iplink.h	(revision f5f79cdca759b2a16b9d14f6446269fc248a6f1e)
+++ uspace/lib/c/include/ipc/iplink.h	(revision a17356fd13769fdbaa2f4df26127bb541d940247)
@@ -40,5 +40,7 @@
 typedef enum {
 	IPLINK_GET_MTU = IPC_FIRST_USER_METHOD,
+	IPLINK_GET_MAC48,
 	IPLINK_SEND,
+	IPLINK_SEND6,
 	IPLINK_ADDR_ADD,
 	IPLINK_ADDR_REMOVE
