+ } else if (IN6_IS_ADDR_V4MAPPED(&mreq->ipv6mr_multiaddr)) {
+ struct ip_mreq v4req;
+
+ v4req.imr_multiaddr.s_addr = mreq->ipv6mr_multiaddr.s6_addr32[3];
+ v4req.imr_interface.s_addr = INADDR_ANY;
+
+ /* Find an IPv4 address on the specified interface. */
+ if (mreq->ipv6mr_interface != 0) {
+ struct in_ifaddr *ifa;
+
+ ifp = ifindex2ifnet[mreq->ipv6mr_interface];
+
+ TAILQ_FOREACH(ifa, &in_ifaddrhead, ia_link) {
+ if (ifa->ia_ifp == ifp) {
+ v4req.imr_interface = IA_SIN(ifa)->sin_addr;
+ break;
+ }
+ }
+
+ if (v4req.imr_multiaddr.s_addr == 0) {
+ /* Interface has no IPv4 address. */
+ error = EINVAL;
+ break;
+ }
+ }
+
+ error = ip_addmembership(imo, &v4req);
+ break;