summaryrefslogtreecommitdiffstats
path: root/sys/net/if_ethersubr.c
diff options
context:
space:
mode:
authorfenner <fenner@FreeBSD.org>2001-05-02 16:12:58 +0000
committerfenner <fenner@FreeBSD.org>2001-05-02 16:12:58 +0000
commit1501296e82bd1611cafb4dd5272e10cb2eb31fe0 (patch)
treef1df62c3d0a377be78fdf295b327c3a54bac0df6 /sys/net/if_ethersubr.c
parentdae4d9ed16230f273bcaebb7564fb64feb02f9a9 (diff)
downloadFreeBSD-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.c8
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;
OpenPOWER on IntegriCloud