| 219 | } |
| 220 | |
| 221 | static int |
| 222 | infiniband_resolve_addr(struct ifnet *ifp, struct mbuf *m, |
| 223 | const struct sockaddr *dst, struct route *ro, uint8_t *phdr, |
| 224 | uint32_t *pflags, struct llentry **plle) |
| 225 | { |
| 226 | struct infiniband_header *ih; |
| 227 | uint32_t lleflags = 0; |
| 228 | int error = 0; |
| 229 | |
| 230 | if (plle) |
| 231 | *plle = NULL; |
| 232 | ih = (struct infiniband_header *)phdr; |
| 233 | |
| 234 | switch (dst->sa_family) { |
| 235 | #ifdef INET |
| 236 | case AF_INET: |
| 237 | if ((m->m_flags & (M_BCAST | M_MCAST)) == 0) { |
| 238 | error = arpresolve(ifp, 0, m, dst, phdr, &lleflags, plle); |
| 239 | } else { |
| 240 | if (m->m_flags & M_BCAST) { |
| 241 | memcpy(ih->ib_hwaddr, ifp->if_broadcastaddr, |
| 242 | INFINIBAND_ADDR_LEN); |
| 243 | } else { |
| 244 | infiniband_ipv4_multicast_map( |
| 245 | ((const struct sockaddr_in *)dst)->sin_addr.s_addr, |
| 246 | ifp->if_broadcastaddr, ih->ib_hwaddr); |
| 247 | } |
| 248 | ih->ib_protocol = htons(ETHERTYPE_IP); |
| 249 | ih->ib_reserved = 0; |
| 250 | } |
| 251 | break; |
| 252 | #endif |
| 253 | #ifdef INET6 |
| 254 | case AF_INET6: |
| 255 | if ((m->m_flags & M_MCAST) == 0) { |
| 256 | error = nd6_resolve(ifp, 0, m, dst, phdr, &lleflags, plle); |
| 257 | } else { |
| 258 | infiniband_ipv6_multicast_map( |
| 259 | &((const struct sockaddr_in6 *)dst)->sin6_addr, |
| 260 | ifp->if_broadcastaddr, ih->ib_hwaddr); |
| 261 | ih->ib_protocol = htons(ETHERTYPE_IPV6); |
| 262 | ih->ib_reserved = 0; |
| 263 | } |
| 264 | break; |
| 265 | #endif |
| 266 | default: |
| 267 | if_printf(ifp, "can't handle af%d\n", dst->sa_family); |
| 268 | if (m != NULL) |
| 269 | m_freem(m); |
| 270 | return (EAFNOSUPPORT); |
| 271 | } |
| 272 | |
| 273 | if (error == EHOSTDOWN) { |
| 274 | if (ro != NULL && (ro->ro_flags & RT_HAS_GW) != 0) |
| 275 | error = EHOSTUNREACH; |
| 276 | } |
| 277 | |
| 278 | if (error != 0) |
no test coverage detected