MCPcopy Create free account
hub / github.com/F-Stack/f-stack / infiniband_resolvemulti

Function infiniband_resolvemulti

freebsd/net/if_infiniband.c:506–567  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

504}
505
506static int
507infiniband_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

Callers

nothing calls this directly

Calls 3

link_init_sdlFunction · 0.85

Tested by

no test coverage detected