Treat multicast test failures with ENODEV as non-fatal.
diff --git a/asio/include/asio/error.hpp b/asio/include/asio/error.hpp
index 6f5dff2..e03d534 100644
--- a/asio/include/asio/error.hpp
+++ b/asio/include/asio/error.hpp
@@ -146,6 +146,11 @@
   /// Protocol not available.
   no_protocol_option = ASIO_SOCKET_ERROR(ENOPROTOOPT),
 
+  /// No such device.
+  no_such_device = ASIO_WIN_OR_POSIX(
+      ASIO_NATIVE_ERROR(ERROR_BAD_UNIT),
+      ASIO_NATIVE_ERROR(ENODEV)),
+
   /// Transport endpoint is not connected.
   not_connected = ASIO_SOCKET_ERROR(ENOTCONN),
 
diff --git a/asio/include/asio/impl/error_code.ipp b/asio/include/asio/impl/error_code.ipp
index a9d7d8a..7472264 100644
--- a/asio/include/asio/impl/error_code.ipp
+++ b/asio/include/asio/impl/error_code.ipp
@@ -168,6 +168,8 @@
       return std::errc::operation_not_permitted;
     case no_protocol_option:
       return std::errc::no_protocol_option;
+    case no_such_device:
+      return std::errc::no_such_device;
     case not_connected:
       return std::errc::not_connected;
     case not_socket:
diff --git a/asio/src/tests/unit/ip/multicast.cpp b/asio/src/tests/unit/ip/multicast.cpp
index 019b957..53b8e52 100644
--- a/asio/src/tests/unit/ip/multicast.cpp
+++ b/asio/src/tests/unit/ip/multicast.cpp
@@ -165,30 +165,34 @@
   {
     ip::multicast::join_group join_group(multicast_address_v4);
     sock_v4.set_option(join_group, ec);
-    ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+    ASIO_CHECK_MESSAGE(!ec || ec == error::no_such_device,
+                       ec.value() << ", " << ec.message());
+
+    if (!ec)
+    {
+      // leave_group class.
+
+      ip::multicast::leave_group leave_group(multicast_address_v4);
+      sock_v4.set_option(leave_group, ec);
+      ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+    }
   }
 
   if (have_v6)
   {
     ip::multicast::join_group join_group(multicast_address_v6);
     sock_v6.set_option(join_group, ec);
-    ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
-  }
+    ASIO_CHECK_MESSAGE(!ec || ec == error::no_such_device,
+                       ec.value() << ", " << ec.message());
 
-  // leave_group class.
+    if (!ec)
+    {
+      // leave_group class.
 
-  if (have_v4)
-  {
-    ip::multicast::leave_group leave_group(multicast_address_v4);
-    sock_v4.set_option(leave_group, ec);
-    ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
-  }
-
-  if (have_v6)
-  {
-    ip::multicast::leave_group leave_group(multicast_address_v6);
-    sock_v6.set_option(leave_group, ec);
-    ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+      ip::multicast::leave_group leave_group(multicast_address_v6);
+      sock_v6.set_option(leave_group, ec);
+      ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+    }
   }
 
   // outbound_interface class.