| 504 | } |
| 505 | |
| 506 | static int |
| 507 | infiniband_resolvemulti(struct ifnet *ifp, struct sockaddr **llsa, |
| 508 | struct sockaddr *sa) |
| 509 | { |
| 510 | struct sockaddr_dl *sdl; |
| 511 | #ifdef INET |
| 512 | struct sockaddr_in *sin; |
| 513 | #endif |
| 514 | #ifdef INET6 |
| 515 | struct sockaddr_in6 *sin6; |
| 516 | #endif |
| 517 | uint8_t *e_addr; |
| 518 | |
| 519 | switch (sa->sa_family) { |
| 520 | case AF_LINK: |
| 521 | /* |
| 522 | * No mapping needed. Just check that it's a valid MC address. |
| 523 | */ |
| 524 | sdl = (struct sockaddr_dl *)sa; |
| 525 | e_addr = LLADDR(sdl); |
| 526 | if (!INFINIBAND_IS_MULTICAST(e_addr)) |
| 527 | return (EADDRNOTAVAIL); |
| 528 | *llsa = NULL; |
| 529 | return 0; |
| 530 | |
| 531 | #ifdef INET |
| 532 | case AF_INET: |
| 533 | sin = (struct sockaddr_in *)sa; |
| 534 | if (!IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) |
| 535 | return (EADDRNOTAVAIL); |
| 536 | sdl = link_init_sdl(ifp, *llsa, IFT_INFINIBAND); |
| 537 | sdl->sdl_alen = INFINIBAND_ADDR_LEN; |
| 538 | e_addr = LLADDR(sdl); |
| 539 | infiniband_ipv4_multicast_map( |
| 540 | sin->sin_addr.s_addr, ifp->if_broadcastaddr, e_addr); |
| 541 | *llsa = (struct sockaddr *)sdl; |
| 542 | return (0); |
| 543 | #endif |
| 544 | #ifdef INET6 |
| 545 | case AF_INET6: |
| 546 | sin6 = (struct sockaddr_in6 *)sa; |
| 547 | /* |
| 548 | * An IP6 address of 0 means listen to all of the |
| 549 | * multicast address used for IP6. This has no meaning |
| 550 | * in infiniband. |
| 551 | */ |
| 552 | if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) |
| 553 | return (EADDRNOTAVAIL); |
| 554 | if (!IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) |
| 555 | return (EADDRNOTAVAIL); |
| 556 | sdl = link_init_sdl(ifp, *llsa, IFT_INFINIBAND); |
| 557 | sdl->sdl_alen = INFINIBAND_ADDR_LEN; |
| 558 | e_addr = LLADDR(sdl); |
| 559 | infiniband_ipv6_multicast_map( |
| 560 | &sin6->sin6_addr, ifp->if_broadcastaddr, e_addr); |
| 561 | *llsa = (struct sockaddr *)sdl; |
| 562 | return (0); |
| 563 | #endif |
nothing calls this directly
no test coverage detected