Index: sys/net/if_infiniband.c =================================================================== --- sys/net/if_infiniband.c +++ sys/net/if_infiniband.c @@ -187,6 +187,8 @@ case AF_INET: if (lle != NULL && (lle->la_flags & LLE_VALID)) { memcpy(edst, lle->ll_addr, sizeof(edst)); + } else if (m->m_flags & M_BCAST) { + memcpy(edst, ifp->if_broadcastaddr, INFINIBAND_ADDR_LEN); } else if (m->m_flags & M_MCAST) { infiniband_ipv4_multicast_map( ((const struct sockaddr_in *)dst)->sin_addr.s_addr, @@ -243,21 +245,15 @@ } #endif #ifdef INET6 - case AF_INET6: { - const struct ip6_hdr *ip6; - - ip6 = mtod(m, const struct ip6_hdr *); - if (m->m_len < sizeof(*ip6)) { - error = EINVAL; - goto bad; - } else if (lle != NULL && (lle->la_flags & LLE_VALID)) { + case AF_INET6: + if (lle != NULL && (lle->la_flags & LLE_VALID)) { memcpy(edst, lle->ll_addr, sizeof(edst)); + } else if (m->m_flags & M_BCAST) { + memcpy(edst, ifp->if_broadcastaddr, INFINIBAND_ADDR_LEN); } else if (m->m_flags & M_MCAST) { infiniband_ipv6_multicast_map( &((const struct sockaddr_in6 *)dst)->sin6_addr, ifp->if_broadcastaddr, edst); - } else if (ip6->ip6_nxt == IPPROTO_ICMPV6) { - memcpy(edst, ifp->if_broadcastaddr, INFINIBAND_ADDR_LEN); } else { error = nd6_resolve(ifp, is_gw, m, dst, edst, NULL, NULL); if (error) { @@ -269,7 +265,6 @@ } type = htons(ETHERTYPE_IPV6); break; - } #endif default: error = EAFNOSUPPORT;