summaryrefslogtreecommitdiff
path: root/sys/net/if_vlan.c
diff options
context:
space:
mode:
authorChris Cappuccio <chris@cvs.openbsd.org>2003-02-01 00:14:41 +0000
committerChris Cappuccio <chris@cvs.openbsd.org>2003-02-01 00:14:41 +0000
commitb83b035ad76c468abf50c50aa3fc6d59bc72d01c (patch)
tree4a4336ebf19cabb54b4162f52cea1499363e6cb8 /sys/net/if_vlan.c
parent609ea2af724e48e613d45d154b62231036f7a139 (diff)
from Chris Pascoe <c.pascoe@itee.uq.edu.au>:
Fix multicast bug; internal multicast members' list was not initialized correctly. Also, begin to make vlan less ether specific - TR and FDDI could also be supported.
Diffstat (limited to 'sys/net/if_vlan.c')
-rw-r--r--sys/net/if_vlan.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/sys/net/if_vlan.c b/sys/net/if_vlan.c
index 2d14112c4ff..a68149b8bae 100644
--- a/sys/net/if_vlan.c
+++ b/sys/net/if_vlan.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_vlan.c,v 1.33 2003/01/07 09:00:34 kjc Exp $ */
+/* $OpenBSD: if_vlan.c,v 1.34 2003/02/01 00:14:40 chris Exp $ */
/*
* Copyright 1998 Massachusetts Institute of Technology
*
@@ -110,6 +110,7 @@ vlanattach(int count)
bzero(ifv_softc, nifvlan * sizeof(struct ifvlan));
for (i = 0; i < nifvlan; i++) {
+ LIST_INIT(&ifv_softc[i].vlan_mc_listhead);
ifp = &ifv_softc[i].ifv_if;
ifp->if_softc = &ifv_softc[i];
sprintf(ifp->if_xname, "vlan%d", i);
@@ -140,7 +141,6 @@ vlan_start(struct ifnet *ifp)
ifv = ifp->if_softc;
p = ifv->ifv_p;
- LIST_INIT(&ifv->vlan_mc_listhead);
ifp->if_flags |= IFF_OACTIVE;
for (;;) {
@@ -619,6 +619,7 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
int
vlan_ether_addmulti(struct ifvlan *ifv, struct ifreq *ifr)
{
+ struct ifnet *ifp = ifv->ifv_p; /* Parent. */
struct vlan_mc_entry *mc;
u_int8_t addrlo[ETHER_ADDR_LEN], addrhi[ETHER_ADDR_LEN];
int error;
@@ -651,10 +652,10 @@ vlan_ether_addmulti(struct ifvlan *ifv, struct ifreq *ifr)
memcpy(&mc->mc_addr, &ifr->ifr_addr, ifr->ifr_addr.sa_len);
LIST_INSERT_HEAD(&ifv->vlan_mc_listhead, mc, mc_entries);
- error = ether_ioctl(ifv->ifv_p, &ifv->ifv_ac, SIOCADDMULTI,
- (caddr_t)ifr);
+ error = (*ifp->if_ioctl)(ifp, SIOCADDMULTI, (caddr_t)ifr);
if (error != 0)
goto ioctl_failed;
+
return (error);
ioctl_failed:
@@ -662,12 +663,14 @@ vlan_ether_addmulti(struct ifvlan *ifv, struct ifreq *ifr)
FREE(mc, M_DEVBUF);
alloc_failed:
(void)ether_delmulti(ifr, (struct arpcom *)&ifv->ifv_ac);
+
return (error);
}
int
vlan_ether_delmulti(struct ifvlan *ifv, struct ifreq *ifr)
{
+ struct ifnet *ifp = ifv->ifv_p; /* Parent. */
struct ether_multi *enm;
struct vlan_mc_entry *mc;
u_int8_t addrlo[ETHER_ADDR_LEN], addrhi[ETHER_ADDR_LEN];
@@ -686,8 +689,7 @@ vlan_ether_delmulti(struct ifvlan *ifv, struct ifreq *ifr)
return (error);
/* We no longer use this multicast address. Tell parent so. */
- error = ether_ioctl(ifv->ifv_p, &ifv->ifv_ac, SIOCDELMULTI,
- (caddr_t)ifr);
+ error = (*ifp->if_ioctl)(ifp, SIOCDELMULTI, (caddr_t)ifr);
if (error == 0) {
/* And forget about this address. */
for (mc = LIST_FIRST(&ifv->vlan_mc_listhead); mc != NULL;
@@ -724,7 +726,7 @@ vlan_ether_purgemulti(struct ifvlan *ifv)
memcpy(ifr->ifr_name, ifp->if_xname, IFNAMSIZ);
while ((mc = LIST_FIRST(&ifv->vlan_mc_listhead)) != NULL) {
- memcpy(&ifr->ifr_addr, &mc->mc_addr, ETHER_ADDR_LEN);
+ memcpy(&ifr->ifr_addr, &mc->mc_addr, mc->mc_addr.ss_len);
(void)(*ifp->if_ioctl)(ifp, SIOCDELMULTI, (caddr_t)ifr);
LIST_REMOVE(mc, mc_entries);
FREE(mc, M_DEVBUF);