Index: uspace/srv/net/ethip/ethip_nic.c
===================================================================
--- uspace/srv/net/ethip/ethip_nic.c	(revision b323a3a09e3968d8e7fc0de737feca58ddaaaeca)
+++ uspace/srv/net/ethip/ethip_nic.c	(revision 820104d36ba9cd28a40e7a63571bf4eedbb7f2a1)
@@ -45,5 +45,6 @@
 #include <device/nic.h>
 #include <stdlib.h>
-
+#include <net/socket_codes.h>
+#include <mem.h>
 #include "ethip.h"
 #include "ethip_nic.h"
@@ -108,5 +109,4 @@
 {
 	ethip_nic_t *nic = calloc(1, sizeof(ethip_nic_t));
-
 	if (nic == NULL) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed allocating NIC structure. "
@@ -114,8 +114,8 @@
 		return NULL;
 	}
-
+	
 	link_initialize(&nic->link);
 	list_initialize(&nic->addr_list);
-
+	
 	return nic;
 }
@@ -140,4 +140,5 @@
 	if (nic->svc_name != NULL)
 		free(nic->svc_name);
+	
 	free(nic);
 }
@@ -335,4 +336,80 @@
 }
 
+/** Setup accepted multicast addresses
+ *
+ * Currently the set of accepted multicast addresses is
+ * determined only based on IPv6 addresses.
+ *
+ */
+static int ethip_nic_setup_multicast(ethip_nic_t *nic)
+{
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_setup_multicast()");
+	
+	/* Count the number of multicast addresses */
+	
+	size_t count = 0;
+	
+	list_foreach(nic->addr_list, link) {
+		ethip_link_addr_t *laddr = list_get_instance(link,
+		    ethip_link_addr_t, link);
+		
+		uint16_t af = inet_addr_get(&laddr->addr, NULL, NULL);
+		if (af == AF_INET6)
+			count++;
+	}
+	
+	if (count == 0)
+		return nic_multicast_set_mode(nic->sess, NIC_MULTICAST_BLOCKED,
+		    NULL, 0);
+	
+	nic_address_t *mac_list = calloc(count, sizeof(nic_address_t));
+	if (mac_list == NULL)
+		return ENOMEM;
+	
+	/* Create the multicast MAC list */
+	
+	size_t i = 0;
+	
+	list_foreach(nic->addr_list, link) {
+		assert(i < count);
+		
+		ethip_link_addr_t *laddr = list_get_instance(link,
+		    ethip_link_addr_t, link);
+		
+		addr128_t v6;
+		uint16_t af = inet_addr_get(&laddr->addr, NULL, &v6);
+		if (af != AF_INET6)
+			continue;
+		
+		addr48_t mac;
+		addr48_solicited_node(v6, mac);
+		
+		/* Avoid duplicate addresses in the list */
+		
+		bool found = false;
+		
+		for (size_t j = 0; j < i; j++) {
+			if (addr48_compare(mac_list[j].address, mac)) {
+				found = true;
+				break;
+			}
+		}
+		
+		if (!found) {
+			addr48(mac, mac_list[i].address);
+			i++;
+		} else
+			count--;
+	}
+	
+	/* Setup the multicast MAC list */
+	
+	int rc = nic_multicast_set_mode(nic->sess, NIC_MULTICAST_LIST,
+	    mac_list, count);
+	
+	free(mac_list);
+	return rc;
+}
+
 int ethip_nic_addr_add(ethip_nic_t *nic, inet_addr_t *addr)
 {
@@ -344,5 +421,6 @@
 	
 	list_append(&laddr->link, &nic->addr_list);
-	return EOK;
+	
+	return ethip_nic_setup_multicast(nic);
 }
 
@@ -357,5 +435,6 @@
 	list_remove(&laddr->link);
 	ethip_link_addr_delete(laddr);
-	return EOK;
+	
+	return ethip_nic_setup_multicast(nic);
 }
 
Index: uspace/srv/net/inetsrv/ndp.c
===================================================================
--- uspace/srv/net/inetsrv/ndp.c	(revision b323a3a09e3968d8e7fc0de737feca58ddaaaeca)
+++ uspace/srv/net/inetsrv/ndp.c	(revision 820104d36ba9cd28a40e7a63571bf4eedbb7f2a1)
@@ -49,21 +49,6 @@
 #define NDP_REQUEST_TIMEOUT  (3 * 1000 * 1000)
 
-static addr48_t solicited_node_mac =
-    {0x33, 0x33, 0xff, 0, 0, 0};
-
 static addr128_t solicited_node_ip =
     {0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0xff, 0, 0, 0};
-
-/** Compute solicited node MAC multicast address from target IPv6 address
- *
- * @param ip_addr  Target IPv6 address
- * @param mac_addr Solicited MAC address to be assigned
- *
- */
-static void ndp_solicited_node_mac(addr128_t ip_addr, addr48_t mac_addr)
-{
-	memcpy(mac_addr, solicited_node_mac, 3);
-	memcpy(mac_addr + 3, ip_addr + 13, 3);
-}
 
 /** Compute solicited node IPv6 multicast address from target IPv6 address
@@ -186,5 +171,5 @@
 	addr128(src_addr, packet.sender_proto_addr);
 	addr128(ip_addr, packet.solicited_ip);
-	ndp_solicited_node_mac(ip_addr, packet.target_hw_addr);
+	addr48_solicited_node(ip_addr, packet.target_hw_addr);
 	ndp_solicited_node_ip(ip_addr, packet.target_proto_addr);
 	
