diff options
author | fenner <fenner@FreeBSD.org> | 2001-05-02 16:12:58 +0000 |
---|---|---|
committer | fenner <fenner@FreeBSD.org> | 2001-05-02 16:12:58 +0000 |
commit | 1501296e82bd1611cafb4dd5272e10cb2eb31fe0 (patch) | |
tree | f1df62c3d0a377be78fdf295b327c3a54bac0df6 /sys/net/if_ethersubr.c | |
parent | dae4d9ed16230f273bcaebb7564fb64feb02f9a9 (diff) | |
download | FreeBSD-src-1501296e82bd1611cafb4dd5272e10cb2eb31fe0.zip FreeBSD-src-1501296e82bd1611cafb4dd5272e10cb2eb31fe0.tar.gz |
Get IP multicast working on VLAN devices:
- Allocate zeroed memory in ether_resolvemulti() to prevent equal() from
comparing garbage and determining that two otherwise-equal sockaddr_dls
are different.
- Fill in all required fields of the sockaddr_dl
- Actually copy the multicast address into the sockaddr_dl when calling
if_addmulti()
- Don't claim that we don't have a way to resolve layer 3 addresses into
layer 2 addresses; use the ethernet way.
Diffstat (limited to 'sys/net/if_ethersubr.c')
-rw-r--r-- | sys/net/if_ethersubr.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index 97beae9..f475f91 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -837,14 +837,12 @@ ether_resolvemulti(ifp, llsa, sa) if (!IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) return EADDRNOTAVAIL; MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_WAITOK); + M_WAITOK|M_ZERO); sdl->sdl_len = sizeof *sdl; sdl->sdl_family = AF_LINK; sdl->sdl_index = ifp->if_index; sdl->sdl_type = IFT_ETHER; - sdl->sdl_nlen = 0; sdl->sdl_alen = ETHER_ADDR_LEN; - sdl->sdl_slen = 0; e_addr = LLADDR(sdl); ETHER_MAP_IP_MULTICAST(&sin->sin_addr, e_addr); *llsa = (struct sockaddr *)sdl; @@ -866,14 +864,12 @@ ether_resolvemulti(ifp, llsa, sa) if (!IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) return EADDRNOTAVAIL; MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_WAITOK); + M_WAITOK|M_ZERO); sdl->sdl_len = sizeof *sdl; sdl->sdl_family = AF_LINK; sdl->sdl_index = ifp->if_index; sdl->sdl_type = IFT_ETHER; - sdl->sdl_nlen = 0; sdl->sdl_alen = ETHER_ADDR_LEN; - sdl->sdl_slen = 0; e_addr = LLADDR(sdl); ETHER_MAP_IPV6_MULTICAST(&sin6->sin6_addr, e_addr); *llsa = (struct sockaddr *)sdl; |