summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authordyoung <dyoung@NetBSD.org>2008-11-07 00:20:01 +0000
committerdyoung <dyoung@NetBSD.org>2008-11-07 00:20:01 +0000
commitde87fe677d8a6a5550686a03f180df394da699dc (patch)
tree5e781f3364b7131f35f9647c107b6bc403752ba2 /sys/dev
parentf455f7ee91e885925403e221d2f303a56ef60395 (diff)
*** Summary ***
When a link-layer address changes (e.g., ifconfig ex0 link 02:de:ad:be:ef:02 active), send a gratuitous ARP and/or a Neighbor Advertisement to update the network-/link-layer address bindings on our LAN peers. Refuse a change of ethernet address to the address 00:00:00:00:00:00 or to any multicast/broadcast address. (Thanks matt@.) Reorder ifnet ioctl operations so that driver ioctls may inherit the functions of their "class"---ether_ioctl(), fddi_ioctl(), et cetera---and the class ioctls may inherit from the generic ioctl, ifioctl_common(), but both driver- and class-ioctls may override the generic behavior. Make network drivers share more code. Distinguish a "factory" link-layer address from others for the purposes of both protecting that address from deletion and computing EUI64. Return consistent, appropriate error codes from network drivers. Improve readability. KNF. *** Details *** In if_attach(), always initialize the interface ioctl routine, ifnet->if_ioctl, if the driver has not already initialized it. Delete if_ioctl == NULL tests everywhere else, because it cannot happen. In the ioctl routines of network interfaces, inherit common ioctl behaviors by calling either ifioctl_common() or whichever ioctl routine is appropriate for the class of interface---e.g., ether_ioctl() for ethernets. Stop (ab)using SIOCSIFADDR and start to use SIOCINITIFADDR. In the user->kernel interface, SIOCSIFADDR's argument was an ifreq, but on the protocol->ifnet interface, SIOCSIFADDR's argument was an ifaddr. That was confusing, and it would work against me as I make it possible for a network interface to overload most ioctls. On the protocol->ifnet interface, replace SIOCSIFADDR with SIOCINITIFADDR. In ifioctl(), return EPERM if userland tries to invoke SIOCINITIFADDR. In ifioctl(), give the interface the first shot at handling most interface ioctls, and give the protocol the second shot, instead of the other way around. Finally, let compatibility code (COMPAT_OSOCK) take a shot. Pull device initialization out of switch statements under SIOCINITIFADDR. For example, pull ..._init() out of any switch statement that looks like this: switch (...->sa_family) { case ...: ..._init(); ... break; ... default: ..._init(); ... break; } Rewrite many if-else clauses that handle all permutations of IFF_UP and IFF_RUNNING to use a switch statement, switch (x & (IFF_UP|IFF_RUNNING)) { case 0: ... break; case IFF_RUNNING: ... break; case IFF_UP: ... break; case IFF_UP|IFF_RUNNING: ... break; } unifdef lots of code containing #ifdef FreeBSD, #ifdef NetBSD, and #ifdef SIOCSIFMTU, especially in fwip(4) and in ndis(4). In ipw(4), remove an if_set_sadl() call that is out of place. In nfe(4), reuse the jumbo MTU logic in ether_ioctl(). Let ethernets register a callback for setting h/w state such as promiscuous mode and the multicast filter in accord with a change in the if_flags: ether_set_ifflags_cb() registers a callback that returns ENETRESET if the caller should reset the ethernet by calling if_init(), 0 on success, != 0 on failure. Pull common code from ex(4), gem(4), nfe(4), sip(4), tlp(4), vge(4) into ether_ioctl(), and register if_flags callbacks for those drivers. Return ENOTTY instead of EINVAL for inappropriate ioctls. In zyd(4), use ENXIO instead of ENOTTY to indicate that the device is not any longer attached. Add to if_set_sadl() a boolean 'factory' argument that indicates whether a link-layer address was assigned by the factory or some other source. In a comment, recommend using the factory address for generating an EUI64, and update in6_get_hw_ifid() to prefer a factory address to any other link-layer address. Add a routing message, RTM_LLINFO_UPD, that tells protocols to update the binding of network-layer addresses to link-layer addresses. Implement this message in IPv4 and IPv6 by sending a gratuitous ARP or a neighbor advertisement, respectively. Generate RTM_LLINFO_UPD messages on a change of an interface's link-layer address. In ether_ioctl(), do not let SIOCALIFADDR set a link-layer address that is broadcast/multicast or equal to 00:00:00:00:00:00. Make ether_ioctl() call ifioctl_common() to handle ioctls that it does not understand. In gif(4), initialize if_softc and use it, instead of assuming that the gif_softc and ifp overlap. Let ifioctl_common() handle SIOCGIFADDR. Sprinkle rtcache_invariants(), which checks on DIAGNOSTIC kernels that certain invariants on a struct route are satisfied. In agr(4), rewrite agr_ioctl_filter() to be a bit more explicit about the ioctls that we do not allow on an agr(4) member interface. bzero -> memset. Delete unnecessary casts to void *. Use sockaddr_in_init() and sockaddr_in6_init(). Compare pointers with NULL instead of "testing truth". Replace some instances of (type *)0 with NULL. Change some K&R prototypes to ANSI C, and join lines.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/bi/if_ni.c26
-rw-r--r--sys/dev/ic/an.c6
-rw-r--r--sys/dev/ic/ath.c6
-rw-r--r--sys/dev/ic/atw.c6
-rw-r--r--sys/dev/ic/awi.c6
-rw-r--r--sys/dev/ic/dp8390.c13
-rw-r--r--sys/dev/ic/elinkxl.c37
-rw-r--r--sys/dev/ic/gem.c45
-rw-r--r--sys/dev/ic/hd64570.c18
-rw-r--r--sys/dev/ic/hme.c33
-rw-r--r--sys/dev/ic/i82586.c11
-rw-r--r--sys/dev/ic/lance.c32
-rw-r--r--sys/dev/ic/lemac.c10
-rw-r--r--sys/dev/ic/mb86950.c42
-rw-r--r--sys/dev/ic/mb86960.c28
-rw-r--r--sys/dev/ic/midway.c25
-rw-r--r--sys/dev/ic/pdq_ifsubr.c43
-rw-r--r--sys/dev/ic/rrunner.c10
-rw-r--r--sys/dev/ic/rt2560.c6
-rw-r--r--sys/dev/ic/rt2661.c6
-rw-r--r--sys/dev/ic/rtw.c8
-rw-r--r--sys/dev/ic/sgec.c25
-rw-r--r--sys/dev/ic/smc90cx6.c25
-rw-r--r--sys/dev/ic/smc91cxx.c32
-rw-r--r--sys/dev/ic/tropic.c50
-rw-r--r--sys/dev/ic/tulip.c41
-rw-r--r--sys/dev/ic/wi.c9
-rw-r--r--sys/dev/ieee1394/if_fwip.c27
-rw-r--r--sys/dev/if_ndis/if_ndis.c17
-rw-r--r--sys/dev/isa/if_eg.c31
-rw-r--r--sys/dev/isa/if_el.c31
-rw-r--r--sys/dev/isa/if_hp.c34
-rw-r--r--sys/dev/isa/if_iy.c31
-rw-r--r--sys/dev/marvell/if_gfe.c14
-rw-r--r--sys/dev/ofw/ofnet.c23
-rw-r--r--sys/dev/pci/cxgb_main.c10
-rw-r--r--sys/dev/pci/if_bge.c6
-rw-r--r--sys/dev/pci/if_de.c31
-rw-r--r--sys/dev/pci/if_dge.c6
-rw-r--r--sys/dev/pci/if_ipw.c7
-rw-r--r--sys/dev/pci/if_iwi.c6
-rw-r--r--sys/dev/pci/if_iwn.c6
-rw-r--r--sys/dev/pci/if_lmc.c10
-rw-r--r--sys/dev/pci/if_nfe.c64
-rw-r--r--sys/dev/pci/if_sip.c59
-rw-r--r--sys/dev/pci/if_sk.c6
-rw-r--r--sys/dev/pci/if_ti.c11
-rw-r--r--sys/dev/pci/if_txp.c18
-rw-r--r--sys/dev/pci/if_vge.c66
-rw-r--r--sys/dev/pci/if_wpi.c6
-rw-r--r--sys/dev/pcmcia/if_cnw.c31
-rw-r--r--sys/dev/pcmcia/if_ray.c17
-rw-r--r--sys/dev/pcmcia/if_xi.c35
-rw-r--r--sys/dev/ppbus/if_plip.c12
-rw-r--r--sys/dev/qbus/if_dmc.c10
-rw-r--r--sys/dev/qbus/if_qe.c26
-rw-r--r--sys/dev/sbus/be.c31
-rw-r--r--sys/dev/sbus/qe.c26
-rw-r--r--sys/dev/scsipi/if_se.c31
-rw-r--r--sys/dev/usb/if_aue.c10
-rw-r--r--sys/dev/usb/if_axe.c10
-rw-r--r--sys/dev/usb/if_cdce.c27
-rw-r--r--sys/dev/usb/if_cue.c10
-rw-r--r--sys/dev/usb/if_kue.c10
-rw-r--r--sys/dev/usb/if_rum.c27
-rw-r--r--sys/dev/usb/if_upl.c27
-rw-r--r--sys/dev/usb/if_ural.c27
-rw-r--r--sys/dev/usb/if_zyd.c24
68 files changed, 775 insertions, 735 deletions
diff --git a/sys/dev/bi/if_ni.c b/sys/dev/bi/if_ni.c
index 9fcc34f022d..4d97c424dbd 100644
--- a/sys/dev/bi/if_ni.c
+++ b/sys/dev/bi/if_ni.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ni.c,v 1.36 2008/07/09 17:51:21 joerg Exp $ */
+/* $NetBSD: if_ni.c,v 1.37 2008/11/07 00:20:02 dyoung Exp $ */
/*
* Copyright (c) 2000 Ludd, University of Lule}, Sweden. All rights reserved.
*
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ni.c,v 1.36 2008/07/09 17:51:21 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ni.c,v 1.37 2008/11/07 00:20:02 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -697,7 +697,7 @@ niioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
switch(ifa->ifa_addr->sa_family) {
#ifdef INET
@@ -710,27 +710,33 @@ niioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running,
* stop it.
*/
ifp->if_flags &= ~IFF_RUNNING;
ni_setup(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface it marked up and it is stopped, then
* start it.
*/
niinit(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0) {
+ break;
+ case IFF_UP|IFF_RUNNING:
/*
* Send a new setup packet to match any new changes.
* (Like IFF_PROMISC etc)
*/
ni_setup(sc);
+ break;
+ default:
+ break;
}
break;
@@ -751,8 +757,8 @@ niioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
default:
- error = EINVAL;
-
+ error = ether_ioctl(ifp, cmd, data);
+ break;
}
splx(s);
return (error);
diff --git a/sys/dev/ic/an.c b/sys/dev/ic/an.c
index 9bc8f9fc793..e5b78b5092c 100644
--- a/sys/dev/ic/an.c
+++ b/sys/dev/ic/an.c
@@ -1,4 +1,4 @@
-/* $NetBSD: an.c,v 1.52 2008/07/03 18:10:07 drochner Exp $ */
+/* $NetBSD: an.c,v 1.53 2008/11/07 00:20:02 dyoung Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
* Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved.
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: an.c,v 1.52 2008/07/03 18:10:07 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: an.c,v 1.53 2008/11/07 00:20:02 dyoung Exp $");
#include "bpfilter.h"
@@ -889,6 +889,8 @@ an_ioctl(struct ifnet *ifp, u_long command, void *data)
switch (command) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, command, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (sc->sc_enabled) {
/*
diff --git a/sys/dev/ic/ath.c b/sys/dev/ic/ath.c
index c85bfc4a53c..63f30cdc348 100644
--- a/sys/dev/ic/ath.c
+++ b/sys/dev/ic/ath.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ath.c,v 1.102 2008/07/09 19:47:24 joerg Exp $ */
+/* $NetBSD: ath.c,v 1.103 2008/11/07 00:20:02 dyoung Exp $ */
/*-
* Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
@@ -41,7 +41,7 @@
__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.104 2005/09/16 10:09:23 ru Exp $");
#endif
#ifdef __NetBSD__
-__KERNEL_RCSID(0, "$NetBSD: ath.c,v 1.102 2008/07/09 19:47:24 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ath.c,v 1.103 2008/11/07 00:20:02 dyoung Exp $");
#endif
/*
@@ -5148,6 +5148,8 @@ ath_ioctl(struct ifnet *ifp, u_long cmd, void *data)
ATH_LOCK(sc);
switch (cmd) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (IS_RUNNING(ifp)) {
/*
* To avoid rescanning another access point,
diff --git a/sys/dev/ic/atw.c b/sys/dev/ic/atw.c
index ae30c5a42e3..1f55bae6353 100644
--- a/sys/dev/ic/atw.c
+++ b/sys/dev/ic/atw.c
@@ -1,4 +1,4 @@
-/* $NetBSD: atw.c,v 1.140 2008/07/09 20:07:19 joerg Exp $ */
+/* $NetBSD: atw.c,v 1.141 2008/11/07 00:20:02 dyoung Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000, 2002, 2003, 2004 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: atw.c,v 1.140 2008/07/09 20:07:19 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: atw.c,v 1.141 2008/11/07 00:20:02 dyoung Exp $");
#include "bpfilter.h"
@@ -3838,6 +3838,8 @@ atw_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (ATW_IS_ENABLED(sc)) {
/*
diff --git a/sys/dev/ic/awi.c b/sys/dev/ic/awi.c
index e0cfe0ae529..220e548f204 100644
--- a/sys/dev/ic/awi.c
+++ b/sys/dev/ic/awi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: awi.c,v 1.80 2008/05/16 22:11:51 dyoung Exp $ */
+/* $NetBSD: awi.c,v 1.81 2008/11/07 00:20:02 dyoung Exp $ */
/*-
* Copyright (c) 1999,2000,2001 The NetBSD Foundation, Inc.
@@ -79,7 +79,7 @@
#include <sys/cdefs.h>
#ifdef __NetBSD__
-__KERNEL_RCSID(0, "$NetBSD: awi.c,v 1.80 2008/05/16 22:11:51 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: awi.c,v 1.81 2008/11/07 00:20:02 dyoung Exp $");
#endif
#ifdef __FreeBSD__
__FBSDID("$FreeBSD: src/sys/dev/awi/awi.c,v 1.30 2004/01/15 13:30:06 onoe Exp $");
@@ -902,6 +902,8 @@ awi_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (sc->sc_enabled) {
/*
diff --git a/sys/dev/ic/dp8390.c b/sys/dev/ic/dp8390.c
index 2b468f38cdd..034ea777ce6 100644
--- a/sys/dev/ic/dp8390.c
+++ b/sys/dev/ic/dp8390.c
@@ -1,4 +1,4 @@
-/* $NetBSD: dp8390.c,v 1.68 2008/03/12 14:31:11 cube Exp $ */
+/* $NetBSD: dp8390.c,v 1.69 2008/11/07 00:20:02 dyoung Exp $ */
/*
* Device driver for National Semiconductor DS8390/WD83C690 based ethernet
@@ -14,7 +14,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dp8390.c,v 1.68 2008/03/12 14:31:11 cube Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dp8390.c,v 1.69 2008/11/07 00:20:02 dyoung Exp $");
#include "opt_ipkdb.h"
#include "opt_inet.h"
@@ -873,25 +873,26 @@ dp8390_ioctl(ifp, cmd, data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
if ((error = dp8390_enable(sc)) != 0)
break;
ifp->if_flags |= IFF_UP;
+ dp8390_init(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- dp8390_init(sc);
arp_ifinit(ifp, ifa);
break;
#endif
default:
- dp8390_init(sc);
break;
}
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
case IFF_RUNNING:
/*
@@ -951,7 +952,7 @@ dp8390_ioctl(ifp, cmd, data)
break;
default:
- error = ENODEV;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/ic/elinkxl.c b/sys/dev/ic/elinkxl.c
index c515d60e4b2..8448e86e1da 100644
--- a/sys/dev/ic/elinkxl.c
+++ b/sys/dev/ic/elinkxl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: elinkxl.c,v 1.105 2008/04/28 20:23:49 martin Exp $ */
+/* $NetBSD: elinkxl.c,v 1.106 2008/11/07 00:20:02 dyoung Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: elinkxl.c,v 1.105 2008/04/28 20:23:49 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: elinkxl.c,v 1.106 2008/11/07 00:20:02 dyoung Exp $");
#include "bpfilter.h"
#include "rnd.h"
@@ -84,6 +84,8 @@ int exdebug = 0;
int ex_media_chg(struct ifnet *ifp);
void ex_media_stat(struct ifnet *ifp, struct ifmediareq *req);
+static int ex_ifflags_cb(struct ethercom *);
+
void ex_probe_media(struct ex_softc *);
void ex_set_filter(struct ex_softc *);
void ex_set_media(struct ex_softc *);
@@ -432,6 +434,7 @@ ex_config(struct ex_softc *sc)
if_attach(ifp);
ether_ifattach(ifp, macaddr);
+ ether_set_ifflags_cb(&sc->sc_ethercom, ex_ifflags_cb);
GO_WINDOW(1);
@@ -1437,6 +1440,20 @@ ex_intr(void *arg)
return ret;
}
+static int
+ex_ifflags_cb(struct ethercom *ec)
+{
+ struct ifnet *ifp = &ec->ec_if;
+ struct ex_softc *sc = ifp->if_softc;
+ int change = ifp->if_flags ^ sc->sc_if_flags;
+
+ if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0)
+ return ENETRESET;
+ else if ((change & IFF_PROMISC) != 0)
+ ex_set_mc(sc);
+ return 0;
+}
+
int
ex_ioctl(struct ifnet *ifp, u_long cmd, void *data)
{
@@ -1451,22 +1468,6 @@ ex_ioctl(struct ifnet *ifp, u_long cmd, void *data)
case SIOCGIFMEDIA:
error = ifmedia_ioctl(ifp, ifr, &sc->ex_mii.mii_media, cmd);
break;
- case SIOCSIFFLAGS:
- /* If the interface is up and running, only modify the receive
- * filter when setting promiscuous or debug mode. Otherwise
- * fall through to ether_ioctl, which will reset the chip.
- */
-#define RESETIGN (IFF_CANTCHANGE|IFF_DEBUG)
- if (((ifp->if_flags & (IFF_UP|IFF_RUNNING))
- == (IFF_UP|IFF_RUNNING))
- && ((ifp->if_flags & (~RESETIGN))
- == (sc->sc_if_flags & (~RESETIGN)))) {
- ex_set_mc(sc);
- error = 0;
- break;
-#undef RESETIGN
- }
- /* FALLTHROUGH */
default:
if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET)
break;
diff --git a/sys/dev/ic/gem.c b/sys/dev/ic/gem.c
index 9682f371762..c29b5b4c0a9 100644
--- a/sys/dev/ic/gem.c
+++ b/sys/dev/ic/gem.c
@@ -1,4 +1,4 @@
-/* $NetBSD: gem.c,v 1.78 2008/09/15 19:50:28 jdc Exp $ */
+/* $NetBSD: gem.c,v 1.79 2008/11/07 00:20:02 dyoung Exp $ */
/*
*
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gem.c,v 1.78 2008/09/15 19:50:28 jdc Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gem.c,v 1.79 2008/11/07 00:20:02 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -119,6 +119,8 @@ static int gem_mii_readreg(struct device *, int, int);
static void gem_mii_writereg(struct device *, int, int, int);
static void gem_mii_statchg(struct device *);
+static int gem_ifflags_cb(struct ethercom *);
+
void gem_statuschange(struct gem_softc *);
int gem_ser_mediachange(struct ifnet *);
@@ -451,6 +453,7 @@ gem_attach(sc, enaddr)
/* Attach the interface. */
if_attach(ifp);
ether_ifattach(ifp, enaddr);
+ ether_set_ifflags_cb(&sc->sc_ethercom, gem_ifflags_cb);
sc->sc_sh = shutdownhook_establish(gem_shutdown, sc);
if (sc->sc_sh == NULL)
@@ -2472,38 +2475,33 @@ gem_ser_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
ifmr->ifm_status = sc->sc_mii.mii_media_status;
}
+static int
+gem_ifflags_cb(struct ethercom *ec)
+{
+ struct ifnet *ifp = &ec->ec_if;
+ struct gem_softc *sc = ifp->if_softc;
+ int change = ifp->if_flags ^ sc->sc_if_flags;
+
+ if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0)
+ return ENETRESET;
+ else if ((change & IFF_PROMISC) != 0)
+ gem_setladrf(sc);
+ return 0;
+}
+
/*
* Process an ioctl request.
*/
int
-gem_ioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+gem_ioctl(struct ifnet *ifp, unsigned long cmd, void *data)
{
struct gem_softc *sc = ifp->if_softc;
int s, error = 0;
s = splnet();
- switch (cmd) {
- case SIOCSIFFLAGS:
-#define RESETIGN (IFF_CANTCHANGE|IFF_DEBUG)
- if (((ifp->if_flags & (IFF_UP|IFF_RUNNING))
- == (IFF_UP|IFF_RUNNING))
- && ((ifp->if_flags & (~RESETIGN))
- == (sc->sc_if_flags & (~RESETIGN)))) {
- gem_setladrf(sc);
- break;
- }
-#undef RESETIGN
- /*FALLTHROUGH*/
- default:
- if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET)
- break;
-
+ if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) {
error = 0;
-
if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI)
;
else if (ifp->if_flags & IFF_RUNNING) {
@@ -2513,7 +2511,6 @@ gem_ioctl(ifp, cmd, data)
*/
gem_setladrf(sc);
}
- break;
}
/* Try to get things going again */
diff --git a/sys/dev/ic/hd64570.c b/sys/dev/ic/hd64570.c
index d2cff14f78c..b78b8fd7e2e 100644
--- a/sys/dev/ic/hd64570.c
+++ b/sys/dev/ic/hd64570.c
@@ -1,4 +1,4 @@
-/* $NetBSD: hd64570.c,v 1.39 2008/04/08 12:07:26 cegger Exp $ */
+/* $NetBSD: hd64570.c,v 1.40 2008/11/07 00:20:02 dyoung Exp $ */
/*
* Copyright (c) 1999 Christian E. Hopps
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hd64570.c,v 1.39 2008/04/08 12:07:26 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hd64570.c,v 1.40 2008/11/07 00:20:02 dyoung Exp $");
#include "bpfilter.h"
#include "opt_inet.h"
@@ -926,10 +926,10 @@ sca_output(
}
static int
-sca_ioctl(ifp, cmd, addr)
+sca_ioctl(ifp, cmd, data)
struct ifnet *ifp;
u_long cmd;
- void *addr;
+ void *data;
{
struct ifreq *ifr;
struct ifaddr *ifa;
@@ -938,12 +938,12 @@ sca_ioctl(ifp, cmd, addr)
s = splnet();
- ifr = (struct ifreq *)addr;
- ifa = (struct ifaddr *)addr;
+ ifr = (struct ifreq *)data;
+ ifa = (struct ifaddr *)data;
error = 0;
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
switch(ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
@@ -997,6 +997,8 @@ sca_ioctl(ifp, cmd, addr)
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (ifr->ifr_flags & IFF_UP) {
ifp->if_flags |= IFF_UP;
sca_port_up(ifp->if_softc);
@@ -1008,7 +1010,7 @@ sca_ioctl(ifp, cmd, addr)
break;
default:
- error = EINVAL;
+ error = ifioctl_common(ifp, cmd, data);
}
splx(s);
diff --git a/sys/dev/ic/hme.c b/sys/dev/ic/hme.c
index 513009435bb..d693c863078 100644
--- a/sys/dev/ic/hme.c
+++ b/sys/dev/ic/hme.c
@@ -1,4 +1,4 @@
-/* $NetBSD: hme.c,v 1.66 2008/05/04 17:06:09 xtraeme Exp $ */
+/* $NetBSD: hme.c,v 1.67 2008/11/07 00:20:02 dyoung Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.66 2008/05/04 17:06:09 xtraeme Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.67 2008/11/07 00:20:02 dyoung Exp $");
/* #define HMEDEBUG */
@@ -1400,10 +1400,7 @@ hme_mediachange(ifp)
* Process an ioctl request.
*/
int
-hme_ioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+hme_ioctl(struct ifnet *ifp, unsigned long cmd, void *data)
{
struct hme_softc *sc = ifp->if_softc;
struct ifaddr *ifa = (struct ifaddr *)data;
@@ -1413,7 +1410,7 @@ hme_ioctl(ifp, cmd, data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
@@ -1435,25 +1432,32 @@ hme_ioctl(ifp, cmd, data)
case SIOCSIFFLAGS:
#ifdef HMEDEBUG
- sc->sc_debug = (ifp->if_flags & IFF_DEBUG) != 0 ? 1 : 0;
+ {
+ struct ifreq *ifr = data;
+ sc->sc_debug =
+ (ifr->ifr_flags & IFF_DEBUG) != 0 ? 1 : 0;
+ }
#endif
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running, then
* stop it.
*/
hme_stop(sc, false);
ifp->if_flags &= ~IFF_RUNNING;
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped, then
* start it.
*/
error = hme_init(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0) {
+ break;
+ case IFF_UP|IFF_RUNNING:
/*
* If setting debug or promiscuous mode, do not reset
* the chip; for everything else, call hme_init()
@@ -1468,6 +1472,9 @@ hme_ioctl(ifp, cmd, data)
error = hme_init(sc);
}
#undef RESETIGN
+ break;
+ case 0:
+ break;
}
if (sc->sc_ec_capenable != sc->sc_ethercom.ec_capenable)
diff --git a/sys/dev/ic/i82586.c b/sys/dev/ic/i82586.c
index cab9d284a19..882c3e91663 100644
--- a/sys/dev/ic/i82586.c
+++ b/sys/dev/ic/i82586.c
@@ -1,4 +1,4 @@
-/* $NetBSD: i82586.c,v 1.62 2008/04/28 20:23:50 martin Exp $ */
+/* $NetBSD: i82586.c,v 1.63 2008/11/07 00:20:02 dyoung Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -137,7 +137,7 @@ Mode of operation:
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i82586.c,v 1.62 2008/04/28 20:23:50 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i82586.c,v 1.63 2008/11/07 00:20:02 dyoung Exp $");
#include "bpfilter.h"
@@ -1772,10 +1772,7 @@ i82586_stop(
}
int
-i82586_ioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+i82586_ioctl(struct ifnet *ifp, unsigned long cmd, void *data)
{
struct ie_softc *sc = ifp->if_softc;
struct ifreq *ifr = (struct ifreq *)data;
@@ -1829,7 +1826,7 @@ again:
memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
sc->sc_ethercom.ec_if.if_flags |= IFF_ALLMULTI;
i82586_ioctl(&sc->sc_ethercom.ec_if,
- SIOCSIFFLAGS, (void *)0);
+ SIOCSIFFLAGS, NULL);
return;
}
ETHER_NEXT_MULTI(step, enm);
diff --git a/sys/dev/ic/lance.c b/sys/dev/ic/lance.c
index 55e8dd8257b..ece98f58cd2 100644
--- a/sys/dev/ic/lance.c
+++ b/sys/dev/ic/lance.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lance.c,v 1.41 2008/04/28 20:23:50 martin Exp $ */
+/* $NetBSD: lance.c,v 1.42 2008/11/07 00:20:02 dyoung Exp $ */
/*-
* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lance.c,v 1.41 2008/04/28 20:23:50 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lance.c,v 1.42 2008/11/07 00:20:02 dyoung Exp $");
#include "bpfilter.h"
#include "rnd.h"
@@ -543,31 +543,25 @@ lance_ioctl(struct ifnet *ifp, u_long cmd, void *data)
s = splnet();
switch (cmd) {
- case SIOCSIFADDR:
- case SIOCSIFFLAGS:
- error = ether_ioctl(ifp, cmd, data);
+ case SIOCGIFMEDIA:
+ case SIOCSIFMEDIA:
+ error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
break;
- case SIOCADDMULTI:
- case SIOCDELMULTI:
- if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) {
+ default:
+ if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET)
+ break;
+ error = 0;
+ if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI)
+ break;
+ if (ifp->if_flags & IFF_RUNNING) {
/*
* Multicast list has changed; set the hardware filter
* accordingly.
*/
- if (ifp->if_flags & IFF_RUNNING)
- lance_reset(sc);
- error = 0;
+ lance_reset(sc);
}
break;
- case SIOCGIFMEDIA:
- case SIOCSIFMEDIA:
- error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
- break;
-
- default:
- error = EINVAL;
- break;
}
splx(s);
diff --git a/sys/dev/ic/lemac.c b/sys/dev/ic/lemac.c
index e79ceffe234..dd8cce73a46 100644
--- a/sys/dev/ic/lemac.c
+++ b/sys/dev/ic/lemac.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lemac.c,v 1.35 2008/04/08 12:07:26 cegger Exp $ */
+/* $NetBSD: lemac.c,v 1.36 2008/11/07 00:20:02 dyoung Exp $ */
/*-
* Copyright (c) 1994, 1995, 1997 Matt Thomas <matt@3am-software.com>
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lemac.c,v 1.35 2008/04/08 12:07:26 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lemac.c,v 1.36 2008/11/07 00:20:02 dyoung Exp $");
#include "opt_inet.h"
#include "rnd.h"
@@ -757,7 +757,7 @@ lemac_ifioctl(
s = splnet();
switch (cmd) {
- case SIOCSIFADDR: {
+ case SIOCINITIFADDR: {
struct ifaddr *ifa = (struct ifaddr *)data;
ifp->if_flags |= IFF_UP;
@@ -779,6 +779,8 @@ lemac_ifioctl(
}
case SIOCSIFFLAGS: {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
lemac_init(sc);
break;
}
@@ -805,7 +807,7 @@ lemac_ifioctl(
}
default: {
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
}
diff --git a/sys/dev/ic/mb86950.c b/sys/dev/ic/mb86950.c
index b70b4f26539..62081069c0a 100644
--- a/sys/dev/ic/mb86950.c
+++ b/sys/dev/ic/mb86950.c
@@ -1,4 +1,4 @@
-/* $NetBSD: mb86950.c,v 1.11 2008/04/08 12:07:26 cegger Exp $ */
+/* $NetBSD: mb86950.c,v 1.12 2008/11/07 00:20:02 dyoung Exp $ */
/*
* All Rights Reserved, Copyright (C) Fujitsu Limited 1995
@@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mb86950.c,v 1.11 2008/04/08 12:07:26 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mb86950.c,v 1.12 2008/11/07 00:20:02 dyoung Exp $");
/*
* Device driver for Fujitsu mb86950 based Ethernet cards.
@@ -444,10 +444,7 @@ mb86950_watchdog(ifp)
* Process an ioctl request.
*/
int
-mb86950_ioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+mb86950_ioctl(struct ifnet *ifp, unsigned long cmd, void *data)
{
struct mb86950_softc *sc = ifp->if_softc;
struct ifaddr *ifa = (struct ifaddr *)data;
@@ -458,32 +455,34 @@ mb86950_ioctl(ifp, cmd, data)
s = splnet();
switch (cmd) {
- case SIOCSIFADDR:
- /* XXX depreciated ? What should I use instead? */
+ case SIOCINITIFADDR:
+ /* XXX deprecated ? What should I use instead? */
if ((error = mb86950_enable(sc)) != 0)
break;
ifp->if_flags |= IFF_UP;
+ mb86950_init(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- mb86950_init(sc);
arp_ifinit(ifp, ifa);
break;
#endif
default:
- mb86950_init(sc);
break;
}
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running, then
* stop it.
@@ -491,9 +490,8 @@ mb86950_ioctl(ifp, cmd, data)
mb86950_stop(sc);
ifp->if_flags &= ~IFF_RUNNING;
mb86950_disable(sc);
-
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped, then
* start it.
@@ -501,15 +499,19 @@ mb86950_ioctl(ifp, cmd, data)
if ((error = mb86950_enable(sc)) != 0)
break;
mb86950_init(sc);
-
- } else if ((ifp->if_flags & IFF_UP) != 0) {
+ break;
+ case IFF_UP|IFF_RUNNING:
/*
* Reset the interface to pick up changes in any other
* flags that affect hardware registers.
*/
-/* Setmode not supported
+#if 0
+ /* Setmode not supported */
mb86950_setmode(sc);
-*/
+#endif
+ break;
+ case 0:
+ break;
}
#if ESTAR_DEBUG >= 1
@@ -528,7 +530,7 @@ mb86950_ioctl(ifp, cmd, data)
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/ic/mb86960.c b/sys/dev/ic/mb86960.c
index 36e3dbda67e..6e1284ebadd 100644
--- a/sys/dev/ic/mb86960.c
+++ b/sys/dev/ic/mb86960.c
@@ -1,4 +1,4 @@
-/* $NetBSD: mb86960.c,v 1.70 2008/04/12 06:37:51 tsutsui Exp $ */
+/* $NetBSD: mb86960.c,v 1.71 2008/11/07 00:20:02 dyoung Exp $ */
/*
* All Rights Reserved, Copyright (C) Fujitsu Limited 1995
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mb86960.c,v 1.70 2008/04/12 06:37:51 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mb86960.c,v 1.71 2008/11/07 00:20:02 dyoung Exp $");
/*
* Device driver for Fujitsu MB86960A/MB86965A based Ethernet cards.
@@ -1188,27 +1188,29 @@ mb86960_ioctl(struct ifnet *ifp, u_long cmd, void *data)
s = splnet();
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
if ((error = mb86960_enable(sc)) != 0)
break;
ifp->if_flags |= IFF_UP;
+ mb86960_init(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- mb86960_init(sc);
arp_ifinit(ifp, ifa);
break;
#endif
default:
- mb86960_init(sc);
break;
}
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running, then
* stop it.
@@ -1216,8 +1218,8 @@ mb86960_ioctl(struct ifnet *ifp, u_long cmd, void *data)
mb86960_stop(sc);
ifp->if_flags &= ~IFF_RUNNING;
mb86960_disable(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped, then
* start it.
@@ -1225,12 +1227,16 @@ mb86960_ioctl(struct ifnet *ifp, u_long cmd, void *data)
if ((error = mb86960_enable(sc)) != 0)
break;
mb86960_init(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0) {
+ break;
+ case IFF_UP|IFF_RUNNING:
/*
* Reset the interface to pick up changes in any other
* flags that affect hardware registers.
*/
mb86960_setmode(sc);
+ break;
+ case 0:
+ break;
}
#if FE_DEBUG >= 1
/* "ifconfig fe0 debug" to print register dump. */
@@ -1267,7 +1273,7 @@ mb86960_ioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/ic/midway.c b/sys/dev/ic/midway.c
index ece0ddd7bdf..15bd91356c9 100644
--- a/sys/dev/ic/midway.c
+++ b/sys/dev/ic/midway.c
@@ -1,4 +1,4 @@
-/* $NetBSD: midway.c,v 1.82 2008/09/08 23:36:54 gmcgarry Exp $ */
+/* $NetBSD: midway.c,v 1.83 2008/11/07 00:20:02 dyoung Exp $ */
/* (sync'd to midway.c 1.68) */
/*
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: midway.c,v 1.82 2008/09/08 23:36:54 gmcgarry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: midway.c,v 1.83 2008/11/07 00:20:02 dyoung Exp $");
#include "opt_natm.h"
@@ -1199,39 +1199,30 @@ void *data;
#endif
break;
#endif
- case SIOCSIFADDR:
-#ifdef INET6
- case SIOCSIFADDR_IN6:
-#endif
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
+ en_reset(sc);
+ en_init(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- en_reset(sc);
- en_init(sc);
ifa->ifa_rtrequest = atm_rtrequest; /* ??? */
break;
#endif
#ifdef INET6
case AF_INET6:
- en_reset(sc);
- en_init(sc);
ifa->ifa_rtrequest = atm_rtrequest; /* ??? */
break;
#endif
default:
/* what to do if not INET? */
- en_reset(sc);
- en_init(sc);
break;
}
break;
- case SIOCGIFADDR:
- error = EINVAL;
- break;
-
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
#ifdef ATM_PVCEXT
/* point-2-point pvc is allowed to change if_flags */
if (((ifp->if_flags & IFF_UP) && !(ifp->if_flags & IFF_RUNNING))
@@ -1344,7 +1335,7 @@ void *data;
#endif /* ATM_PVCEXT */
default:
- error = EINVAL;
+ error = ifioctl_common(ifp, cmd, data);
break;
}
splx(s);
diff --git a/sys/dev/ic/pdq_ifsubr.c b/sys/dev/ic/pdq_ifsubr.c
index 2a713b97b33..ee57a6a2c8c 100644
--- a/sys/dev/ic/pdq_ifsubr.c
+++ b/sys/dev/ic/pdq_ifsubr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: pdq_ifsubr.c,v 1.52 2008/04/08 12:07:27 cegger Exp $ */
+/* $NetBSD: pdq_ifsubr.c,v 1.53 2008/11/07 00:20:02 dyoung Exp $ */
/*-
* Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com>
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pdq_ifsubr.c,v 1.52 2008/04/08 12:07:27 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pdq_ifsubr.c,v 1.53 2008/11/07 00:20:02 dyoung Exp $");
#ifdef __NetBSD__
#include "opt_inet.h"
@@ -105,21 +105,6 @@ __KERNEL_RCSID(0, "$NetBSD: pdq_ifsubr.c,v 1.52 2008/04/08 12:07:27 cegger Exp $
#include "pdqreg.h"
#endif
-#if defined(__bsdi__) && _BSDI_VERSION < 199506 /* XXX */
-static void
-arp_ifinit(
- struct arpcom *ac,
- struct ifaddr *ifa)
-{
- sc->sc_ac.ac_ipaddr = IA_SIN(ifa)->sin_addr;
- arpwhohas(&sc->sc_ac, &IA_SIN(ifa)->sin_addr);
-#if _BSDI_VERSION >= 199401
- ifa->ifa_rtrequest = arp_rtrequest;
- ifa->ifa_flags |= RTF_CLONING;
-#endif
-#endif
-
-
void
pdq_ifinit(
pdq_softc_t *sc)
@@ -425,35 +410,25 @@ pdq_ifioctl(
s = PDQ_OS_SPL_RAISE();
switch (cmd) {
- case SIOCSIFADDR: {
+ case SIOCINITIFADDR: {
struct ifaddr *ifa = (struct ifaddr *)data;
ifp->if_flags |= IFF_UP;
+ pdq_ifinit(sc);
switch(ifa->ifa_addr->sa_family) {
#if defined(INET)
- case AF_INET: {
- pdq_ifinit(sc);
+ case AF_INET:
PDQ_ARP_IFINIT(sc, ifa);
break;
- }
#endif /* INET */
-
-
- default: {
- pdq_ifinit(sc);
+ default:
break;
- }
}
break;
}
- case SIOCGIFADDR: {
- struct ifreq *ifr = (struct ifreq *)data;
- error = ifreq_setaddr(cmd, ifr,
- (const struct sockaddr *)sc->sc_if.if_sadl);
- break;
- }
-
case SIOCSIFFLAGS: {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
pdq_ifinit(sc);
break;
}
@@ -500,7 +475,7 @@ pdq_ifioctl(
#endif
default: {
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
}
diff --git a/sys/dev/ic/rrunner.c b/sys/dev/ic/rrunner.c
index b2f10476cd5..64da888621b 100644
--- a/sys/dev/ic/rrunner.c
+++ b/sys/dev/ic/rrunner.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rrunner.c,v 1.67 2008/06/08 12:43:51 tsutsui Exp $ */
+/* $NetBSD: rrunner.c,v 1.68 2008/11/07 00:20:02 dyoung Exp $ */
/*
* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rrunner.c,v 1.67 2008/06/08 12:43:51 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rrunner.c,v 1.68 2008/11/07 00:20:02 dyoung Exp $");
#include "opt_inet.h"
@@ -2939,7 +2939,7 @@ eshioctl(ifp, cmd, data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
if ((sc->sc_flags & ESH_FL_INITIALIZED) == 0) {
eshinit(sc);
@@ -2973,6 +2973,8 @@ eshioctl(ifp, cmd, data)
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if ((ifp->if_flags & IFF_UP) == 0 &&
(ifp->if_flags & IFF_RUNNING) != 0) {
/*
@@ -3021,7 +3023,7 @@ eshioctl(ifp, cmd, data)
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/ic/rt2560.c b/sys/dev/ic/rt2560.c
index b4546e4ec16..98ed35f74fa 100644
--- a/sys/dev/ic/rt2560.c
+++ b/sys/dev/ic/rt2560.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rt2560.c,v 1.19 2008/04/08 12:07:27 cegger Exp $ */
+/* $NetBSD: rt2560.c,v 1.20 2008/11/07 00:20:02 dyoung Exp $ */
/* $OpenBSD: rt2560.c,v 1.15 2006/04/20 20:31:12 miod Exp $ */
/* $FreeBSD: rt2560.c,v 1.3 2006/03/21 21:15:43 damien Exp $*/
@@ -24,7 +24,7 @@
* http://www.ralinktech.com/
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rt2560.c,v 1.19 2008/04/08 12:07:27 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rt2560.c,v 1.20 2008/11/07 00:20:02 dyoung Exp $");
#include "bpfilter.h"
@@ -2201,6 +2201,8 @@ rt2560_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (ifp->if_flags & IFF_RUNNING)
rt2560_update_promisc(sc);
diff --git a/sys/dev/ic/rt2661.c b/sys/dev/ic/rt2661.c
index c418b30300a..6c0fad757cb 100644
--- a/sys/dev/ic/rt2661.c
+++ b/sys/dev/ic/rt2661.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rt2661.c,v 1.24 2008/04/29 22:21:45 scw Exp $ */
+/* $NetBSD: rt2661.c,v 1.25 2008/11/07 00:20:03 dyoung Exp $ */
/* $OpenBSD: rt2661.c,v 1.17 2006/05/01 08:41:11 damien Exp $ */
/* $FreeBSD: rt2560.c,v 1.5 2006/06/02 19:59:31 csjp Exp $ */
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rt2661.c,v 1.24 2008/04/29 22:21:45 scw Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rt2661.c,v 1.25 2008/11/07 00:20:03 dyoung Exp $");
#include "bpfilter.h"
@@ -1931,6 +1931,8 @@ rt2661_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (ifp->if_flags & IFF_RUNNING)
rt2661_update_promisc(sc);
diff --git a/sys/dev/ic/rtw.c b/sys/dev/ic/rtw.c
index 46b549e52d5..bcad107b9c8 100644
--- a/sys/dev/ic/rtw.c
+++ b/sys/dev/ic/rtw.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rtw.c,v 1.104 2008/03/15 00:21:12 dyoung Exp $ */
+/* $NetBSD: rtw.c,v 1.105 2008/11/07 00:20:03 dyoung Exp $ */
/*-
* Copyright (c) 2004, 2005, 2006, 2007 David Young. All rights
* reserved.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.104 2008/03/15 00:21:12 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.105 2008/11/07 00:20:03 dyoung Exp $");
#include "bpfilter.h"
@@ -2970,7 +2970,9 @@ rtw_ioctl(struct ifnet *ifp, u_long cmd, void *data)
s = splnet();
if (cmd == SIOCSIFFLAGS) {
- if ((ifp->if_flags & IFF_UP) != 0) {
+ if ((rc = ifioctl_common(ifp, cmd, data)) != 0)
+ ;
+ else if ((ifp->if_flags & IFF_UP) != 0) {
if (device_is_active(sc->sc_dev))
rtw_pktfilt_load(sc);
else
diff --git a/sys/dev/ic/sgec.c b/sys/dev/ic/sgec.c
index afcaa429a31..91dde6b6a4a 100644
--- a/sys/dev/ic/sgec.c
+++ b/sys/dev/ic/sgec.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sgec.c,v 1.35 2008/03/11 05:34:01 matt Exp $ */
+/* $NetBSD: sgec.c,v 1.36 2008/11/07 00:20:03 dyoung Exp $ */
/*
* Copyright (c) 1999 Ludd, University of Lule}, Sweden. All rights reserved.
*
@@ -45,7 +45,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sgec.c,v 1.35 2008/03/11 05:34:01 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sgec.c,v 1.36 2008/11/07 00:20:03 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -547,7 +547,7 @@ zeioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
switch(ifa->ifa_addr->sa_family) {
#ifdef INET
@@ -560,8 +560,11 @@ zeioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running,
* stop it. (by disabling receive mechanism).
@@ -569,19 +572,23 @@ zeioctl(struct ifnet *ifp, u_long cmd, void *data)
ZE_WCSR(ZE_CSR6, ZE_RCSR(ZE_CSR6) &
~(ZE_NICSR6_ST|ZE_NICSR6_SR));
ifp->if_flags &= ~IFF_RUNNING;
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface it marked up and it is stopped, then
* start it.
*/
zeinit(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0) {
+ break;
+ case IFF_UP|IFF_RUNNING:
/*
* Send a new setup packet to match any new changes.
* (Like IFF_PROMISC etc)
*/
ze_setup(sc);
+ break;
+ case 0:
+ break;
}
break;
@@ -602,7 +609,7 @@ zeioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
}
splx(s);
diff --git a/sys/dev/ic/smc90cx6.c b/sys/dev/ic/smc90cx6.c
index 0b028bd86d2..f114dadf3c6 100644
--- a/sys/dev/ic/smc90cx6.c
+++ b/sys/dev/ic/smc90cx6.c
@@ -1,4 +1,4 @@
-/* $NetBSD: smc90cx6.c,v 1.56 2008/04/28 20:23:51 martin Exp $ */
+/* $NetBSD: smc90cx6.c,v 1.57 2008/11/07 00:20:03 dyoung Exp $ */
/*-
* Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smc90cx6.c,v 1.56 2008/04/28 20:23:51 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smc90cx6.c,v 1.57 2008/11/07 00:20:03 dyoung Exp $");
/* #define BAHSOFTCOPY */
#define BAHRETRANSMIT /**/
@@ -276,7 +276,7 @@ bah_reset(sc)
#endif
/* tell the routing level about the (possibly changed) link address */
- if_set_sadl(ifp, &linkaddress, sizeof(linkaddress));
+ if_set_sadl(ifp, &linkaddress, sizeof(linkaddress), false);
/* POR is NMI, but we need it below: */
sc->sc_intmask = BAH_RECON|BAH_POR;
@@ -922,36 +922,39 @@ bah_ioctl(ifp, cmd, data)
#endif
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
+ bah_init(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- bah_init(sc);
arp_ifinit(ifp, ifa);
break;
#endif
default:
- bah_init(sc);
break;
}
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running,
* then stop it.
*/
bah_stop(sc);
ifp->if_flags &= ~IFF_RUNNING;
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped, then
* start it.
*/
bah_init(sc);
+ break;
}
break;
@@ -969,7 +972,7 @@ bah_ioctl(ifp, cmd, data)
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
}
splx(s);
diff --git a/sys/dev/ic/smc91cxx.c b/sys/dev/ic/smc91cxx.c
index 20111bed330..dfa14a4b8e0 100644
--- a/sys/dev/ic/smc91cxx.c
+++ b/sys/dev/ic/smc91cxx.c
@@ -1,4 +1,4 @@
-/* $NetBSD: smc91cxx.c,v 1.70 2008/09/03 20:36:24 rjs Exp $ */
+/* $NetBSD: smc91cxx.c,v 1.71 2008/11/07 00:20:03 dyoung Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smc91cxx.c,v 1.70 2008/09/03 20:36:24 rjs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smc91cxx.c,v 1.71 2008/11/07 00:20:03 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -1353,27 +1353,29 @@ smc91cxx_ioctl(ifp, cmd, data)
s = splnet();
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
if ((error = smc91cxx_enable(sc)) != 0)
break;
ifp->if_flags |= IFF_UP;
+ smc91cxx_init(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- smc91cxx_init(sc);
- arp_ifinit(ifp, ifa);
- break;
+ arp_ifinit(ifp, ifa);
+ break;
#endif
default:
- smc91cxx_init(sc);
break;
}
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running,
* stop it.
@@ -1381,8 +1383,8 @@ smc91cxx_ioctl(ifp, cmd, data)
smc91cxx_stop(sc);
ifp->if_flags &= ~IFF_RUNNING;
smc91cxx_disable(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped,
* start it.
@@ -1390,12 +1392,16 @@ smc91cxx_ioctl(ifp, cmd, data)
if ((error = smc91cxx_enable(sc)) != 0)
break;
smc91cxx_init(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0) {
+ break;
+ case IFF_UP|IFF_RUNNING:
/*
* Reset the interface to pick up changes in any
* other flags that affect hardware registers.
*/
smc91cxx_reset(sc);
+ break;
+ case 0:
+ break;
}
break;
@@ -1423,7 +1429,7 @@ smc91cxx_ioctl(ifp, cmd, data)
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/ic/tropic.c b/sys/dev/ic/tropic.c
index ed056137874..7711758a8d2 100644
--- a/sys/dev/ic/tropic.c
+++ b/sys/dev/ic/tropic.c
@@ -1,4 +1,4 @@
-/* $NetBSD: tropic.c,v 1.34 2008/04/08 12:07:27 cegger Exp $ */
+/* $NetBSD: tropic.c,v 1.35 2008/11/07 00:20:03 dyoung Exp $ */
/*
* Ported to NetBSD by Onno van der Linden
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tropic.c,v 1.34 2008/04/08 12:07:27 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tropic.c,v 1.35 2008/11/07 00:20:03 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -1525,10 +1525,7 @@ struct ifnet *ifp;
* tr_ioctl - process an ioctl request
*/
int
-tr_ioctl(ifp, cmd, data)
-struct ifnet *ifp;
-u_long cmd;
-void *data;
+tr_ioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct tr_softc *sc = ifp->if_softc;
struct ifreq *ifr = (struct ifreq *) data;
@@ -1539,68 +1536,65 @@ void *data;
s = splnet();
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
if ((error = tr_enable(sc)) != 0)
break;
+ /* XXX if not running */
+ if ((ifp->if_flags & IFF_RUNNING) == 0) {
+ tr_init(sc); /* before arp_ifinit/arpwhohas */
+ tr_sleep(sc);
+ }
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- /* XXX if not running */
- if ((ifp->if_flags & IFF_RUNNING) == 0) {
- tr_init(sc); /* before arp_ifinit */
- tr_sleep(sc);
- }
arp_ifinit(ifp, ifa);
break;
#endif /*INET*/
default:
- /* XXX if not running */
- if ((ifp->if_flags & IFF_RUNNING) == 0) {
- tr_init(sc); /* before arpwhohas */
- tr_sleep(sc);
- }
break;
}
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
/*
* 1- If the adapter is DOWN , turn the device off
* ie. adapter down but still running
* 2- If the adapter is UP, turn the device on
* ie. adapter up but not running yet
*/
- if ((ifp->if_flags & (IFF_RUNNING | IFF_UP)) == IFF_RUNNING) {
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
tr_stop(sc);
ifp->if_flags &= ~IFF_RUNNING;
tr_disable(sc);
- }
- else if ((ifp->if_flags & (IFF_RUNNING | IFF_UP)) == IFF_UP) {
+ break;
+ case IFF_UP:
if ((error = tr_enable(sc)) != 0)
break;
tr_init(sc);
tr_sleep(sc);
- }
- else {
-/*
- * XXX handle other flag changes
- */
+ break;
+ default:
+ /*
+ * XXX handle other flag changes
+ */
+ break;
}
break;
case SIOCGIFMEDIA:
case SIOCSIFMEDIA:
error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
break;
-#ifdef SIOCSIFMTU
case SIOCSIFMTU:
if (ifr->ifr_mtu > sc->sc_maxmtu)
error = EINVAL;
else if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET)
error = 0;
break;
-#endif
default:
- error = EINVAL;
+ error = ifioctl_common(ifp, cmd, data);
}
splx(s);
return (error);
diff --git a/sys/dev/ic/tulip.c b/sys/dev/ic/tulip.c
index 8de88c536d1..3b73c5f6ff6 100644
--- a/sys/dev/ic/tulip.c
+++ b/sys/dev/ic/tulip.c
@@ -1,4 +1,4 @@
-/* $NetBSD: tulip.c,v 1.163 2008/04/28 20:23:51 martin Exp $ */
+/* $NetBSD: tulip.c,v 1.164 2008/11/07 00:20:03 dyoung Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000, 2002 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tulip.c,v 1.163 2008/04/28 20:23:51 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tulip.c,v 1.164 2008/11/07 00:20:03 dyoung Exp $");
#include "bpfilter.h"
@@ -93,6 +93,7 @@ static void tlp_watchdog(struct ifnet *);
static int tlp_ioctl(struct ifnet *, u_long, void *);
static int tlp_init(struct ifnet *);
static void tlp_stop(struct ifnet *, int);
+static int tlp_ifflags_cb(struct ethercom *);
static void tlp_rxdrain(struct tulip_softc *);
static int tlp_add_rxbuf(struct tulip_softc *, int);
@@ -525,6 +526,7 @@ tlp_attach(struct tulip_softc *sc, const u_int8_t *enaddr)
*/
if_attach(ifp);
ether_ifattach(ifp, enaddr);
+ ether_set_ifflags_cb(&sc->sc_ethercom, tlp_ifflags_cb);
#if NRND > 0
rnd_attach_source(&sc->sc_rnd_source, device_xname(&sc->sc_dev),
RND_TYPE_NET, 0);
@@ -958,6 +960,24 @@ tlp_watchdog(struct ifnet *ifp)
tlp_start(ifp);
}
+/* If the interface is up and running, only modify the receive
+ * filter when setting promiscuous or debug mode. Otherwise fall
+ * through to ether_ioctl, which will reset the chip.
+ */
+static int
+tlp_ifflags_cb(struct ethercom *ec)
+{
+ struct ifnet *ifp = &ec->ec_if;
+ struct tulip_softc *sc = ifp->if_softc;
+ int change = ifp->if_flags ^ sc->sc_if_flags;
+
+ if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0)
+ return ENETRESET;
+ if ((change & IFF_PROMISC) != 0)
+ (*sc->sc_filter_setup)(sc);
+ return 0;
+}
+
/*
* tlp_ioctl: [ifnet interface function]
*
@@ -977,23 +997,6 @@ tlp_ioctl(struct ifnet *ifp, u_long cmd, void *data)
case SIOCGIFMEDIA:
error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd);
break;
- case SIOCSIFFLAGS:
- /* If the interface is up and running, only modify the receive
- * filter when setting promiscuous or debug mode. Otherwise
- * fall through to ether_ioctl, which will reset the chip.
- */
-#define RESETIGN (IFF_CANTCHANGE|IFF_DEBUG)
- if (((ifp->if_flags & (IFF_UP|IFF_RUNNING))
- == (IFF_UP|IFF_RUNNING))
- && ((ifp->if_flags & (~RESETIGN))
- == (sc->sc_if_flags & (~RESETIGN)))) {
- /* Set up the receive filter. */
- (*sc->sc_filter_setup)(sc);
- error = 0;
- break;
-#undef RESETIGN
- }
- /* FALLTHROUGH */
default:
error = ether_ioctl(ifp, cmd, data);
if (error == ENETRESET) {
diff --git a/sys/dev/ic/wi.c b/sys/dev/ic/wi.c
index 4df8bd8e229..e58e248c09d 100644
--- a/sys/dev/ic/wi.c
+++ b/sys/dev/ic/wi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: wi.c,v 1.226 2008/04/28 20:23:51 martin Exp $ */
+/* $NetBSD: wi.c,v 1.227 2008/11/07 00:20:03 dyoung Exp $ */
/*-
* Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -99,7 +99,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.226 2008/04/28 20:23:51 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.227 2008/11/07 00:20:03 dyoung Exp $");
#define WI_HERMES_AUTOINC_WAR /* Work around data write autoinc bug. */
#define WI_HERMES_STATS_WAR /* Work around stats counter bug. */
@@ -1325,6 +1325,8 @@ wi_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
/*
* Can't do promisc and hostap at the same time. If all that's
* changing is the promisc flag, try to short-circuit a call to
@@ -2260,8 +2262,9 @@ wi_set_cfg(struct ifnet *ifp, u_long cmd, void *data)
len = (wreq.wi_len - 1) * 2;
switch (wreq.wi_type) {
case WI_RID_MAC_NODE:
+ /* XXX convert to SIOCALIFADDR, AF_LINK, IFLR_ACTIVE */
(void)memcpy(ic->ic_myaddr, wreq.wi_val, ETHER_ADDR_LEN);
- if_set_sadl(ifp, ic->ic_myaddr, ETHER_ADDR_LEN);
+ if_set_sadl(ifp, ic->ic_myaddr, ETHER_ADDR_LEN, false);
wi_write_rid(sc, WI_RID_MAC_NODE, ic->ic_myaddr,
IEEE80211_ADDR_LEN);
break;
diff --git a/sys/dev/ieee1394/if_fwip.c b/sys/dev/ieee1394/if_fwip.c
index 083a5877ba5..3163400d615 100644
--- a/sys/dev/ieee1394/if_fwip.c
+++ b/sys/dev/ieee1394/if_fwip.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_fwip.c,v 1.15 2008/06/24 10:13:51 gmcgarry Exp $ */
+/* $NetBSD: if_fwip.c,v 1.16 2008/11/07 00:20:07 dyoung Exp $ */
/*-
* Copyright (c) 2004
* Doug Rabson
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_fwip.c,v 1.15 2008/06/24 10:13:51 gmcgarry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_fwip.c,v 1.16 2008/11/07 00:20:07 dyoung Exp $");
#ifdef HAVE_KERNEL_OPTION_HEADERS
#include "opt_device_polling.h"
@@ -540,19 +540,13 @@ fwip_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
s = splfwnet();
- if (ifp->if_flags & IFF_UP) {
-#if defined(__FreeBSD__)
- if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
-#elif defined(__NetBSD__)
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ ;
+ else if (ifp->if_flags & IFF_UP) {
if (!(ifp->if_flags & IFF_RUNNING))
-#endif
FWIP_INIT(fwip);
} else {
-#if defined(__FreeBSD__)
- if (ifp->if_drv_flags & IFF_DRV_RUNNING)
-#elif defined(__NetBSD__)
if (ifp->if_flags & IFF_RUNNING)
-#endif
FWIP_STOP(fwip);
}
splx(s);
@@ -592,22 +586,11 @@ fwip_ioctl(struct ifnet *ifp, u_long cmd, void *data)
#endif /* DEVICE_POLLING */
break;
-#if (defined(__FreeBSD__) && __FreeBSD_version >= 500000) || defined(__NetBSD__)
default:
-#else
- case SIOCSIFADDR:
- case SIOCGIFADDR:
- case SIOCSIFMTU:
-#endif
s = splfwnet();
error = FIREWIRE_IOCTL(ifp, cmd, data);
splx(s);
return (error);
-#if defined(__DragonFly__) || \
- (defined(__FreeBSD__) && __FreeBSD_version < 500000)
- default:
- return (EINVAL);
-#endif
}
return error;
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c
index 7cacc2fcfd6..7b3db4b7733 100644
--- a/sys/dev/if_ndis/if_ndis.c
+++ b/sys/dev/if_ndis/if_ndis.c
@@ -35,7 +35,7 @@
__FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis.c,v 1.69.2.6 2005/03/31 04:24:36 wpaul Exp $");
#endif
#ifdef __NetBSD__
-__KERNEL_RCSID(0, "$NetBSD: if_ndis.c,v 1.18 2008/04/08 06:12:21 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ndis.c,v 1.19 2008/11/07 00:20:07 dyoung Exp $");
#endif
#ifdef __FreeBSD__
@@ -2522,10 +2522,7 @@ ndis_getstate_80211(sc)
}
static int
-ndis_ioctl(ifp, command, data)
- struct ifnet *ifp;
- u_long command;
- void * data;
+ndis_ioctl(struct ifnet *ifp, u_long command, void *data)
{
struct ndis_softc *sc = ifp->if_softc;
struct ifreq *ifr = (struct ifreq *) data;
@@ -2541,6 +2538,8 @@ ndis_ioctl(ifp, command, data)
switch(command) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, command, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (ifp->if_flags & IFF_RUNNING &&
ifp->if_flags & IFF_PROMISC &&
@@ -2561,11 +2560,7 @@ ndis_ioctl(ifp, command, data)
OID_GEN_CURRENT_PACKET_FILTER,
&sc->ndis_filter, &i);
} else
-#ifdef __FreeBSD__
- ndis_init(sc);
-#else /* __NetBSD__ */
ndis_init(ifp);
-#endif
} else {
if (ifp->if_flags & IFF_RUNNING)
ndis_stop(sc);
@@ -2618,11 +2613,7 @@ ndis_ioctl(ifp, command, data)
default:
sc->ndis_skip = 1;
if (sc->ndis_80211) {
-#ifdef __FreeBSD__
- error = ieee80211_ioctl(ifp, command, data);
-#else /* __NetBSD__ */
error = ieee80211_ioctl(&sc->ic, command, data);
-#endif
if (error == ENETRESET) {
ndis_setstate_80211(sc);
diff --git a/sys/dev/isa/if_eg.c b/sys/dev/isa/if_eg.c
index 60ff5f48a67..ae45d4a7e6f 100644
--- a/sys/dev/isa/if_eg.c
+++ b/sys/dev/isa/if_eg.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_eg.c,v 1.76 2008/04/08 20:08:49 cegger Exp $ */
+/* $NetBSD: if_eg.c,v 1.77 2008/11/07 00:20:07 dyoung Exp $ */
/*
* Copyright (c) 1993 Dean Huxley <dean@fsa.ca>
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_eg.c,v 1.76 2008/04/08 20:08:49 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_eg.c,v 1.77 2008/11/07 00:20:07 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -838,10 +838,7 @@ bad:
}
int
-egioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+egioctl(struct ifnet *ifp, unsigned long cmd, void *data)
{
struct eg_softc *sc = ifp->if_softc;
struct ifaddr *ifa = (struct ifaddr *)data;
@@ -851,39 +848,42 @@ egioctl(ifp, cmd, data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
+ eginit(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- eginit(sc);
arp_ifinit(ifp, ifa);
break;
#endif
default:
- eginit(sc);
break;
}
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running, then
* stop it.
*/
egstop(sc);
ifp->if_flags &= ~IFF_RUNNING;
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped, then
* start it.
*/
eginit(sc);
- } else {
+ break;
+ default:
sc->eg_pcb[0] = EG_CMD_GETSTATS;
sc->eg_pcb[1] = 0;
if (egwritePCB(sc->sc_iot, sc->sc_ioh, sc->eg_pcb) != 0) {
@@ -894,11 +894,12 @@ egioctl(ifp, cmd, data)
* IFF_MULTICAST, IFF_PROMISC,
* IFF_LINK0, IFF_LINK1,
*/
+ break;
}
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/isa/if_el.c b/sys/dev/isa/if_el.c
index e5a66d720af..58588b86a9a 100644
--- a/sys/dev/isa/if_el.c
+++ b/sys/dev/isa/if_el.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_el.c,v 1.80 2008/04/08 20:08:50 cegger Exp $ */
+/* $NetBSD: if_el.c,v 1.81 2008/11/07 00:20:07 dyoung Exp $ */
/*
* Copyright (c) 1994, Matthew E. Kimmel. Permission is hereby granted
@@ -19,7 +19,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_el.c,v 1.80 2008/04/08 20:08:50 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_el.c,v 1.81 2008/11/07 00:20:07 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -682,10 +682,7 @@ bad:
* Process an ioctl request. This code needs some work - it looks pretty ugly.
*/
int
-elioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+elioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct el_softc *sc = ifp->if_softc;
struct ifaddr *ifa = (struct ifaddr *)data;
@@ -695,49 +692,53 @@ elioctl(ifp, cmd, data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
+ elinit(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- elinit(sc);
arp_ifinit(ifp, ifa);
break;
#endif
default:
- elinit(sc);
break;
}
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running, then
* stop it.
*/
elstop(sc);
ifp->if_flags &= ~IFF_RUNNING;
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped, then
* start it.
*/
elinit(sc);
- } else {
+ break;
+ default:
/*
* Some other important flag might have changed, so
* reset.
*/
elreset(sc);
+ break;
}
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/isa/if_hp.c b/sys/dev/isa/if_hp.c
index 7356a39eb8e..7368a923190 100644
--- a/sys/dev/isa/if_hp.c
+++ b/sys/dev/isa/if_hp.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_hp.c,v 1.44 2008/04/08 20:08:50 cegger Exp $ */
+/* $NetBSD: if_hp.c,v 1.45 2008/11/07 00:20:07 dyoung Exp $ */
/* XXX THIS DRIVER IS BROKEN. IT WILL NOT EVEN COMPILE. */
@@ -80,7 +80,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_hp.c,v 1.44 2008/04/08 20:08:50 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_hp.c,v 1.45 2008/11/07 00:20:07 dyoung Exp $");
#include "hp.h"
#if NHP > 0
@@ -963,10 +963,7 @@ hpget(buf, totlen, off0, ifp)
/*
* Process an ioctl request.
*/
-hpioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+hpioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct ifaddr *ifa = (struct ifaddr *) data;
struct hp_softc *ns = &hp_softc[ifp->if_unit];
@@ -976,38 +973,43 @@ hpioctl(ifp, cmd, data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
+ hpinit(ifp->if_unit);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- hpinit(ifp->if_unit); /* before arpwhohas */
((struct arpcom *) ifp)->ac_ipaddr =
IA_SIN(ifa)->sin_addr;
arpwhohas((struct arpcom *) ifp, &IA_SIN(ifa)->sin_addr);
break;
#endif
default:
- hpinit(ifp->if_unit);
break;
}
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
#ifdef HP_DEBUG
printf("hp: setting flags, up: %s, running: %s\n",
ifp->if_flags & IFF_UP ? "yes" : "no",
ifp->if_flags & IFF_RUNNING ? "yes" : "no");
#endif
- if ((ifp->if_flags & IFF_UP) == 0 &&
- ifp->if_flags & IFF_RUNNING) {
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
ifp->if_flags &= ~IFF_RUNNING;
outb(ns->ns_port + ds_cmd, DSCM_STOP | DSCM_NODMA);
- } else
- if (ifp->if_flags & IFF_UP &&
- (ifp->if_flags & IFF_RUNNING) == 0)
- hpinit(ifp->if_unit);
+ break;
+ case IFF_UP:
+ hpinit(ifp->if_unit);
+ break;
+ default:
+ break;
+ }
break;
#ifdef notdef
@@ -1018,7 +1020,7 @@ hpioctl(ifp, cmd, data)
#endif
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
}
splx(s);
return (error);
diff --git a/sys/dev/isa/if_iy.c b/sys/dev/isa/if_iy.c
index 7d2626708f3..0341f34b866 100644
--- a/sys/dev/isa/if_iy.c
+++ b/sys/dev/isa/if_iy.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_iy.c,v 1.80 2008/04/28 20:23:52 martin Exp $ */
+/* $NetBSD: if_iy.c,v 1.81 2008/11/07 00:20:07 dyoung Exp $ */
/* #define IYDEBUG */
/* #define IYMEMDEBUG */
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iy.c,v 1.80 2008/04/28 20:23:52 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iy.c,v 1.81 2008/11/07 00:20:07 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -1186,10 +1186,7 @@ struct iy_softc *sc;
}
int
-iyioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+iyioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct iy_softc *sc;
struct ifaddr *ifa;
@@ -1209,46 +1206,50 @@ iyioctl(ifp, cmd, data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
+ iyinit(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- iyinit(sc);
arp_ifinit(ifp, ifa);
break;
#endif
default:
- iyinit(sc);
break;
}
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
sc->promisc = ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI);
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running, then
* stop it.
*/
iystop(sc);
ifp->if_flags &= ~IFF_RUNNING;
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped, then
* start it.
*/
iyinit(sc);
- } else {
+ break;
+ default:
/*
* Reset the interface to pick up changes in any other
* flags that affect hardware registers.
*/
iystop(sc);
iyinit(sc);
+ break;
}
#ifdef IYDEBUGX
if (ifp->if_flags & IFF_DEBUG)
@@ -1279,7 +1280,7 @@ iyioctl(ifp, cmd, data)
error = ifmedia_ioctl(ifp, ifr, &sc->iy_ifmedia, cmd);
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
}
splx(s);
return error;
diff --git a/sys/dev/marvell/if_gfe.c b/sys/dev/marvell/if_gfe.c
index e64e1c236d9..bdd07dd13bb 100644
--- a/sys/dev/marvell/if_gfe.c
+++ b/sys/dev/marvell/if_gfe.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_gfe.c,v 1.30 2008/06/10 22:44:07 he Exp $ */
+/* $NetBSD: if_gfe.c,v 1.31 2008/11/07 00:20:07 dyoung Exp $ */
/*
* Copyright (c) 2002 Allegro Networks, Inc., Wasabi Systems, Inc.
@@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_gfe.c,v 1.30 2008/06/10 22:44:07 he Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_gfe.c,v 1.31 2008/11/07 00:20:07 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -436,23 +436,25 @@ gfe_ifioctl(struct ifnet *ifp, u_long cmd, void *data)
s = splnet();
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
+ error = gfe_whack(sc, GE_WHACK_START);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- error = gfe_whack(sc, GE_WHACK_START);
if (error == 0)
arp_ifinit(ifp, ifa);
break;
#endif
default:
- error = gfe_whack(sc, GE_WHACK_START);
break;
}
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
case IFF_UP|IFF_RUNNING:/* active->active, update */
error = gfe_whack(sc, GE_WHACK_CHANGE);
@@ -490,7 +492,7 @@ gfe_ifioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
splx(s);
diff --git a/sys/dev/ofw/ofnet.c b/sys/dev/ofw/ofnet.c
index cad54273895..ea61f3f4c1d 100644
--- a/sys/dev/ofw/ofnet.c
+++ b/sys/dev/ofw/ofnet.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ofnet.c,v 1.41 2008/04/08 20:11:58 cegger Exp $ */
+/* $NetBSD: ofnet.c,v 1.42 2008/11/07 00:20:07 dyoung Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofnet.c,v 1.41 2008/04/08 20:11:58 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofnet.c,v 1.42 2008/11/07 00:20:07 dyoung Exp $");
#include "ofnet.h"
#include "opt_inet.h"
@@ -374,7 +374,7 @@ ofnet_ioctl(struct ifnet *ifp, u_long cmd, void *data)
int error = 0;
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
switch (ifa->ifa_addr->sa_family) {
@@ -389,20 +389,25 @@ ofnet_ioctl(struct ifnet *ifp, u_long cmd, void *data)
ofnet_init(of);
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/* If interface is down, but running, stop it. */
ofnet_stop(of);
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/* If interface is up, but not running, start it. */
ofnet_init(of);
- } else {
+ break;
+ default:
/* Other flags are ignored. */
+ break;
}
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
return error;
diff --git a/sys/dev/pci/cxgb_main.c b/sys/dev/pci/cxgb_main.c
index f9f1dc3df78..1385c281176 100644
--- a/sys/dev/pci/cxgb_main.c
+++ b/sys/dev/pci/cxgb_main.c
@@ -29,7 +29,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include <sys/cdefs.h>
#ifdef __NetBSD__
-__KERNEL_RCSID(0, "$NetBSD: cxgb_main.c,v 1.11 2008/02/07 01:21:55 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cxgb_main.c,v 1.12 2008/11/07 00:20:07 dyoung Exp $");
#endif
#ifdef __FreeBSD__
__FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_main.c,v 1.36 2007/09/11 23:49:27 kmacy Exp $");
@@ -2356,10 +2356,8 @@ cxgb_ioctl(struct ifnet *ifp, unsigned long command, void *data)
error = cxgb_set_mtu(p, ifr->ifr_mtu);
printf("SIOCSIFMTU: error=%d\n", error);
break;
- case SIOCSIFADDR:
- printf("SIOCSIFADDR:\n");
- case SIOCGIFADDR:
- printf("SIOCGIFADDR:\n");
+ case SIOCINITIFADDR:
+ printf("SIOCINITIFADDR:\n");
PORT_LOCK(p);
if (ifa->ifa_addr->sa_family == AF_INET) {
ifp->if_flags |= IFF_UP;
@@ -2372,6 +2370,8 @@ cxgb_ioctl(struct ifnet *ifp, unsigned long command, void *data)
break;
case SIOCSIFFLAGS:
printf("SIOCSIFFLAGS:\n");
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
callout_drain(&p->adapter->cxgb_tick_ch);
PORT_LOCK(p);
if (ifp->if_flags & IFF_UP) {
diff --git a/sys/dev/pci/if_bge.c b/sys/dev/pci/if_bge.c
index a212ec81a7a..9081e7d86ce 100644
--- a/sys/dev/pci/if_bge.c
+++ b/sys/dev/pci/if_bge.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_bge.c,v 1.152 2008/08/31 19:57:03 tron Exp $ */
+/* $NetBSD: if_bge.c,v 1.153 2008/11/07 00:20:07 dyoung Exp $ */
/*
* Copyright (c) 2001 Wind River Systems
@@ -79,7 +79,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.152 2008/08/31 19:57:03 tron Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.153 2008/11/07 00:20:07 dyoung Exp $");
#include "bpfilter.h"
#include "vlan.h"
@@ -4290,6 +4290,8 @@ bge_ioctl(struct ifnet *ifp, u_long command, void *data)
switch(command) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, command, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
/*
* If only the state of the PROMISC flag changed,
diff --git a/sys/dev/pci/if_de.c b/sys/dev/pci/if_de.c
index 70e55583111..2a14de765af 100644
--- a/sys/dev/pci/if_de.c
+++ b/sys/dev/pci/if_de.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_de.c,v 1.128 2008/04/10 19:13:36 cegger Exp $ */
+/* $NetBSD: if_de.c,v 1.129 2008/11/07 00:20:07 dyoung Exp $ */
/*-
* Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com)
@@ -37,7 +37,7 @@
* board which support 21040, 21041, or 21140 (mostly).
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_de.c,v 1.128 2008/04/10 19:13:36 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_de.c,v 1.129 2008/11/07 00:20:07 dyoung Exp $");
#define TULIP_HDR_DATA
@@ -4744,10 +4744,7 @@ tulip_txput_setup(
* defined or not.
*/
static int
-tulip_ifioctl(
- struct ifnet * ifp,
- ioctl_cmd_t cmd,
- void *data)
+tulip_ifioctl(struct ifnet *ifp, unsigned long cmd, void *data)
{
TULIP_PERFSTART(ifioctl)
tulip_softc_t * const sc = TULIP_IFP_TO_SOFTC(ifp);
@@ -4762,32 +4759,24 @@ tulip_ifioctl(
s = TULIP_RAISESPL();
#endif
switch (cmd) {
- case SIOCSIFADDR: {
+ case SIOCINITIFADDR: {
ifp->if_flags |= IFF_UP;
+ tulip_init(sc);
switch(ifa->ifa_addr->sa_family) {
#ifdef INET
- case AF_INET: {
- tulip_init(sc);
+ case AF_INET:
TULIP_ARP_IFINIT(sc, ifa);
break;
- }
#endif /* INET */
-
-
- default: {
- tulip_init(sc);
+ default:
break;
- }
}
break;
}
- case SIOCGIFADDR: {
- memcpy((void *) ((struct sockaddr *)&ifr->ifr_data)->sa_data,
- (void *) sc->tulip_enaddr, ETHER_ADDR_LEN);
- break;
- }
case SIOCSIFFLAGS: {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
#if !defined(IFM_ETHER)
int flags = 0;
if (ifp->if_flags & IFF_LINK0) flags |= 1;
@@ -4882,7 +4871,7 @@ tulip_ifioctl(
}
#endif
default: {
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
}
diff --git a/sys/dev/pci/if_dge.c b/sys/dev/pci/if_dge.c
index 49effc74840..6f2fc9c5d40 100644
--- a/sys/dev/pci/if_dge.c
+++ b/sys/dev/pci/if_dge.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_dge.c,v 1.21 2008/04/10 19:13:36 cegger Exp $ */
+/* $NetBSD: if_dge.c,v 1.22 2008/11/07 00:20:07 dyoung Exp $ */
/*
* Copyright (c) 2004, SUNET, Swedish University Computer Network.
@@ -80,7 +80,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_dge.c,v 1.21 2008/04/10 19:13:36 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_dge.c,v 1.22 2008/11/07 00:20:07 dyoung Exp $");
#include "bpfilter.h"
#include "rnd.h"
@@ -1428,6 +1428,8 @@ dge_ioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
/* extract link flags */
if ((ifp->if_flags & IFF_LINK0) == 0 &&
(ifp->if_flags & IFF_LINK1) == 0)
diff --git a/sys/dev/pci/if_ipw.c b/sys/dev/pci/if_ipw.c
index ee0995a42f0..41ba7ee63b1 100644
--- a/sys/dev/pci/if_ipw.c
+++ b/sys/dev/pci/if_ipw.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ipw.c,v 1.42 2008/10/30 00:27:32 joerg Exp $ */
+/* $NetBSD: if_ipw.c,v 1.43 2008/11/07 00:20:07 dyoung Exp $ */
/* FreeBSD: src/sys/dev/ipw/if_ipw.c,v 1.15 2005/11/13 17:17:40 damien Exp */
/*-
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ipw.c,v 1.42 2008/10/30 00:27:32 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ipw.c,v 1.43 2008/11/07 00:20:07 dyoung Exp $");
/*-
* Intel(R) PRO/Wireless 2100 MiniPCI driver
@@ -1616,6 +1616,8 @@ ipw_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (!(ifp->if_flags & IFF_RUNNING))
ipw_init(ifp);
@@ -1994,7 +1996,6 @@ ipw_config(struct ipw_softc *sc)
}
DPRINTF(("Setting MAC to %s\n", ether_sprintf(ic->ic_myaddr)));
- if_set_sadl(ifp, ic->ic_myaddr, IEEE80211_ADDR_LEN);
error = ipw_cmd(sc, IPW_CMD_SET_MAC_ADDRESS, ic->ic_myaddr,
IEEE80211_ADDR_LEN);
if (error != 0)
diff --git a/sys/dev/pci/if_iwi.c b/sys/dev/pci/if_iwi.c
index de0a6bf2781..ad569f2ee5b 100644
--- a/sys/dev/pci/if_iwi.c
+++ b/sys/dev/pci/if_iwi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_iwi.c,v 1.74 2008/10/30 00:27:32 joerg Exp $ */
+/* $NetBSD: if_iwi.c,v 1.75 2008/11/07 00:20:07 dyoung Exp $ */
/*-
* Copyright (c) 2004, 2005
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iwi.c,v 1.74 2008/10/30 00:27:32 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iwi.c,v 1.75 2008/11/07 00:20:07 dyoung Exp $");
/*-
* Intel(R) PRO/Wireless 2200BG/2225BG/2915ABG driver
@@ -1824,6 +1824,8 @@ iwi_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (!(ifp->if_flags & IFF_RUNNING))
iwi_init(ifp);
diff --git a/sys/dev/pci/if_iwn.c b/sys/dev/pci/if_iwn.c
index c79317efa41..df1643322ec 100644
--- a/sys/dev/pci/if_iwn.c
+++ b/sys/dev/pci/if_iwn.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_iwn.c,v 1.24 2008/11/06 12:03:43 blymn Exp $ */
+/* $NetBSD: if_iwn.c,v 1.25 2008/11/07 00:20:07 dyoung Exp $ */
/*-
* Copyright (c) 2007
@@ -18,7 +18,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.24 2008/11/06 12:03:43 blymn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.25 2008/11/07 00:20:07 dyoung Exp $");
/*
@@ -2296,6 +2296,8 @@ iwn_ioctl(struct ifnet *ifp, u_long cmd, void * data)
switch (cmd) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (!(ifp->if_flags & IFF_RUNNING))
iwn_init(ifp);
diff --git a/sys/dev/pci/if_lmc.c b/sys/dev/pci/if_lmc.c
index d86094f77b6..b6a9ce9f418 100644
--- a/sys/dev/pci/if_lmc.c
+++ b/sys/dev/pci/if_lmc.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_lmc.c,v 1.43 2008/06/27 00:53:41 gmcgarry Exp $ */
+/* $NetBSD: if_lmc.c,v 1.44 2008/11/07 00:20:07 dyoung Exp $ */
/*-
* Copyright (c) 2002-2006 David Boggs. <boggs@boggs.palo-alto.ca.us>
@@ -142,7 +142,7 @@
#if defined(__NetBSD__)
# include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_lmc.c,v 1.43 2008/06/27 00:53:41 gmcgarry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_lmc.c,v 1.44 2008/11/07 00:20:07 dyoung Exp $");
# include <sys/param.h> /* OS version */
/* -DLKM is passed on the compiler command line */
# include "opt_inet.h" /* INET6, INET */
@@ -3549,11 +3549,13 @@ rawip_ioctl(softc_t *sc, u_long cmd, void *data)
case SIOCDELMULTI:
if (sc->config.debug)
printf("%s: rawip_ioctl: SIOCADD/DELMULTI\n", NAME_UNIT);
- case SIOCAIFADDR:
case SIOCSIFFLAGS:
+ error = ifioctl_common(sc->ifp, cmd, data);
+ break;
+ case SIOCAIFADDR:
case SIOCSIFDSTADDR:
break;
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
sc->ifp->if_flags |= IFF_UP; /* a Unix tradition */
break;
case SIOCSIFMTU:
diff --git a/sys/dev/pci/if_nfe.c b/sys/dev/pci/if_nfe.c
index c81b0dfbfa3..17aada93db1 100644
--- a/sys/dev/pci/if_nfe.c
+++ b/sys/dev/pci/if_nfe.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_nfe.c,v 1.36 2008/06/17 12:59:32 cube Exp $ */
+/* $NetBSD: if_nfe.c,v 1.37 2008/11/07 00:20:07 dyoung Exp $ */
/* $OpenBSD: if_nfe.c,v 1.77 2008/02/05 16:52:50 brad Exp $ */
/*-
@@ -21,7 +21,7 @@
/* Driver for NVIDIA nForce MCP Fast Ethernet and Gigabit Ethernet */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_nfe.c,v 1.36 2008/06/17 12:59:32 cube Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_nfe.c,v 1.37 2008/11/07 00:20:07 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -74,6 +74,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_nfe.c,v 1.36 2008/06/17 12:59:32 cube Exp $");
#include <dev/pci/if_nfereg.h>
#include <dev/pci/if_nfevar.h>
+static int nfe_ifflags_cb(struct ethercom *);
+
int nfe_match(device_t, cfdata_t, void *);
void nfe_attach(device_t, device_t, void *);
void nfe_power(int, void *);
@@ -363,10 +365,8 @@ nfe_attach(device_t parent, device_t self, void *aux)
IFQ_SET_READY(&ifp->if_snd);
strlcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
-#ifdef notyet
if (sc->sc_flags & NFE_USE_JUMBO)
- ifp->if_hardmtu = NFE_JUMBO_MTU;
-#endif
+ sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
#if NVLAN > 0
if (sc->sc_flags & NFE_HW_VLAN)
@@ -400,6 +400,7 @@ nfe_attach(device_t parent, device_t self, void *aux)
if_attach(ifp);
ether_ifattach(ifp, sc->sc_enaddr);
+ ether_set_ifflags_cb(&sc->sc_ethercom, nfe_ifflags_cb);
callout_init(&sc->sc_tick_ch, 0);
callout_setfunc(&sc->sc_tick_ch, nfe_tick, sc);
@@ -572,18 +573,37 @@ nfe_intr(void *arg)
return handled;
}
+static int
+nfe_ifflags_cb(struct ethercom *ec)
+{
+ struct ifnet *ifp = &ec->ec_if;
+ struct nfe_softc *sc = ifp->if_softc;
+ int change = ifp->if_flags ^ sc->sc_if_flags;
+
+ /*
+ * If only the PROMISC flag changes, then
+ * don't do a full re-init of the chip, just update
+ * the Rx filter.
+ */
+ if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0)
+ return ENETRESET;
+ else if ((change & IFF_PROMISC) != 0)
+ nfe_setmulti(sc);
+
+ return 0;
+}
+
int
nfe_ioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct nfe_softc *sc = ifp->if_softc;
- struct ifreq *ifr = (struct ifreq *)data;
struct ifaddr *ifa = (struct ifaddr *)data;
int s, error = 0;
s = splnet();
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
nfe_init(ifp);
switch (ifa->ifa_addr->sa_family) {
@@ -596,35 +616,6 @@ nfe_ioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
}
break;
- case SIOCSIFMTU:
- if (ifr->ifr_mtu < ETHERMIN ||
- ((sc->sc_flags & NFE_USE_JUMBO) &&
- ifr->ifr_mtu > ETHERMTU_JUMBO) ||
- (!(sc->sc_flags & NFE_USE_JUMBO) &&
- ifr->ifr_mtu > ETHERMTU))
- error = EINVAL;
- else if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET)
- error = 0;
- break;
- case SIOCSIFFLAGS:
- if (ifp->if_flags & IFF_UP) {
- /*
- * If only the PROMISC or ALLMULTI flag changes, then
- * don't do a full re-init of the chip, just update
- * the Rx filter.
- */
- if ((ifp->if_flags & IFF_RUNNING) &&
- ((ifp->if_flags ^ sc->sc_if_flags) &
- (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
- nfe_setmulti(sc);
- } else
- nfe_init(ifp);
- } else {
- if (ifp->if_flags & IFF_RUNNING)
- nfe_stop(ifp, 1);
- }
- sc->sc_if_flags = ifp->if_flags;
- break;
default:
if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET)
break;
@@ -637,6 +628,7 @@ nfe_ioctl(struct ifnet *ifp, u_long cmd, void *data)
nfe_setmulti(sc);
break;
}
+ sc->sc_if_flags = ifp->if_flags;
splx(s);
diff --git a/sys/dev/pci/if_sip.c b/sys/dev/pci/if_sip.c
index 3f1b1a36ebe..c293ada8080 100644
--- a/sys/dev/pci/if_sip.c
+++ b/sys/dev/pci/if_sip.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_sip.c,v 1.134 2008/05/05 20:19:09 dyoung Exp $ */
+/* $NetBSD: if_sip.c,v 1.135 2008/11/07 00:20:07 dyoung Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -73,7 +73,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_sip.c,v 1.134 2008/05/05 20:19:09 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_sip.c,v 1.135 2008/11/07 00:20:07 dyoung Exp $");
#include "bpfilter.h"
#include "rnd.h"
@@ -559,6 +559,7 @@ sip_init_rxdesc(struct sip_softc *sc, int x)
#define SIP_TIMEOUT 1000
+static int sip_ifflags_cb(struct ethercom *);
static void sipcom_start(struct ifnet *);
static void sipcom_watchdog(struct ifnet *);
static int sipcom_ioctl(struct ifnet *, u_long, void *);
@@ -1283,6 +1284,7 @@ sipcom_attach(device_t parent, device_t self, void *aux)
*/
if_attach(ifp);
ether_ifattach(ifp, enaddr);
+ ether_set_ifflags_cb(&sc->sc_ethercom, sip_ifflags_cb);
sc->sc_prev.ec_capenable = sc->sc_ethercom.ec_capenable;
sc->sc_prev.is_vlan = VLAN_ATTACHED(&(sc)->sc_ethercom);
sc->sc_prev.if_capenable = ifp->if_capenable;
@@ -1719,6 +1721,30 @@ sipcom_watchdog(struct ifnet *ifp)
sipcom_start(ifp);
}
+/* If the interface is up and running, only modify the receive
+ * filter when setting promiscuous or debug mode. Otherwise fall
+ * through to ether_ioctl, which will reset the chip.
+ */
+static int
+sip_ifflags_cb(struct ethercom *ec)
+{
+#define COMPARE_EC(sc) (((sc)->sc_prev.ec_capenable \
+ == (sc)->sc_ethercom.ec_capenable) \
+ && ((sc)->sc_prev.is_vlan == \
+ VLAN_ATTACHED(&(sc)->sc_ethercom) ))
+#define COMPARE_IC(sc, ifp) ((sc)->sc_prev.if_capenable == (ifp)->if_capenable)
+ struct ifnet *ifp = &ec->ec_if;
+ struct sip_softc *sc = ifp->if_softc;
+ int change = ifp->if_flags ^ sc->sc_if_flags;
+
+ if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0 || !COMPARE_EC(sc) ||
+ !COMPARE_IC(sc, ifp))
+ return ENETRESET;
+ /* Set up the receive filter. */
+ (*sc->sc_model->sip_variant->sipv_set_filter)(sc);
+ return 0;
+}
+
/*
* sip_ioctl: [ifnet interface function]
*
@@ -1762,34 +1788,7 @@ sipcom_ioctl(struct ifnet *ifp, u_long cmd, void *data)
}
sc->sc_flowflags = ifr->ifr_media & IFM_ETH_FMASK;
}
- goto ethioctl;
- case SIOCSIFFLAGS:
- /* If the interface is up and running, only modify the receive
- * filter when setting promiscuous or debug mode. Otherwise
- * fall through to ether_ioctl, which will reset the chip.
- */
-
-#define COMPARE_EC(sc) (((sc)->sc_prev.ec_capenable \
- == (sc)->sc_ethercom.ec_capenable) \
- && ((sc)->sc_prev.is_vlan == \
- VLAN_ATTACHED(&(sc)->sc_ethercom) ))
-
-#define COMPARE_IC(sc, ifp) ((sc)->sc_prev.if_capenable == (ifp)->if_capenable)
-
-#define RESETIGN (IFF_CANTCHANGE|IFF_DEBUG)
- if (((ifp->if_flags & (IFF_UP|IFF_RUNNING))
- == (IFF_UP|IFF_RUNNING))
- && ((ifp->if_flags & (~RESETIGN))
- == (sc->sc_if_flags & (~RESETIGN)))
- && COMPARE_EC(sc) && COMPARE_IC(sc, ifp)) {
- /* Set up the receive filter. */
- (*sc->sc_model->sip_variant->sipv_set_filter)(sc);
- error = 0;
- break;
-#undef RESETIGN
- }
- /* FALLTHROUGH */
- ethioctl:
+ /*FALLTHROUGH*/
default:
if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET)
break;
diff --git a/sys/dev/pci/if_sk.c b/sys/dev/pci/if_sk.c
index 5c049ff8438..48da60c81d1 100644
--- a/sys/dev/pci/if_sk.c
+++ b/sys/dev/pci/if_sk.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_sk.c,v 1.54 2008/09/09 05:54:23 cegger Exp $ */
+/* $NetBSD: if_sk.c,v 1.55 2008/11/07 00:20:07 dyoung Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -115,7 +115,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_sk.c,v 1.54 2008/09/09 05:54:23 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_sk.c,v 1.55 2008/11/07 00:20:07 dyoung Exp $");
#include "bpfilter.h"
#include "rnd.h"
@@ -1003,6 +1003,8 @@ sk_ioctl(struct ifnet *ifp, u_long command, void *data)
case SIOCSIFFLAGS:
DPRINTFN(2, ("sk_ioctl IFFLAGS\n"));
+ if ((error = ifioctl_common(ifp, command, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (ifp->if_flags & IFF_RUNNING &&
ifp->if_flags & IFF_PROMISC &&
diff --git a/sys/dev/pci/if_ti.c b/sys/dev/pci/if_ti.c
index 6256bc4d5c5..bc134a7261b 100644
--- a/sys/dev/pci/if_ti.c
+++ b/sys/dev/pci/if_ti.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ti.c,v 1.81 2008/04/10 19:13:37 cegger Exp $ */
+/* $NetBSD: if_ti.c,v 1.82 2008/11/07 00:20:07 dyoung Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -81,7 +81,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ti.c,v 1.81 2008/04/10 19:13:37 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ti.c,v 1.82 2008/11/07 00:20:07 dyoung Exp $");
#include "bpfilter.h"
#include "opt_inet.h"
@@ -2706,7 +2706,7 @@ ti_ether_ioctl(struct ifnet *ifp, u_long cmd, void *data)
}
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
@@ -2737,8 +2737,7 @@ ti_ioctl(struct ifnet *ifp, u_long command, void *data)
s = splnet();
switch (command) {
- case SIOCSIFADDR:
- case SIOCGIFADDR:
+ case SIOCINITIFADDR:
error = ti_ether_ioctl(ifp, command, data);
break;
case SIOCSIFMTU:
@@ -2750,6 +2749,8 @@ ti_ioctl(struct ifnet *ifp, u_long command, void *data)
}
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, command, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
/*
* If only the state of the PROMISC flag changed,
diff --git a/sys/dev/pci/if_txp.c b/sys/dev/pci/if_txp.c
index 63de2682979..5439a68dde8 100644
--- a/sys/dev/pci/if_txp.c
+++ b/sys/dev/pci/if_txp.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_txp.c,v 1.26 2008/04/10 19:13:37 cegger Exp $ */
+/* $NetBSD: if_txp.c,v 1.27 2008/11/07 00:20:07 dyoung Exp $ */
/*
* Copyright (c) 2001
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_txp.c,v 1.26 2008/04/10 19:13:37 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_txp.c,v 1.27 2008/11/07 00:20:07 dyoung Exp $");
#include "bpfilter.h"
#include "opt_inet.h"
@@ -1254,10 +1254,7 @@ txp_dma_free(sc, dma)
}
int
-txp_ioctl(ifp, command, data)
- struct ifnet *ifp;
- u_long command;
- void *data;
+txp_ioctl(struct ifnet *ifp, u_long command, void *data)
{
struct txp_softc *sc = ifp->if_softc;
struct ifreq *ifr = (struct ifreq *)data;
@@ -1274,21 +1271,22 @@ txp_ioctl(ifp, command, data)
#endif
switch(command) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
+ txp_init(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- txp_init(sc);
arp_ifinit(ifp, ifa);
break;
#endif /* INET */
default:
- txp_init(sc);
break;
}
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, command, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
txp_init(sc);
} else {
@@ -1318,7 +1316,7 @@ txp_ioctl(ifp, command, data)
error = ifmedia_ioctl(ifp, ifr, &sc->sc_ifmedia, command);
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, command, data);
break;
}
diff --git a/sys/dev/pci/if_vge.c b/sys/dev/pci/if_vge.c
index ef8e2d3a80b..291b1566e13 100644
--- a/sys/dev/pci/if_vge.c
+++ b/sys/dev/pci/if_vge.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vge.c,v 1.41 2008/04/10 19:13:37 cegger Exp $ */
+/* $NetBSD: if_vge.c,v 1.42 2008/11/07 00:20:07 dyoung Exp $ */
/*-
* Copyright (c) 2004
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vge.c,v 1.41 2008/04/10 19:13:37 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vge.c,v 1.42 2008/11/07 00:20:07 dyoung Exp $");
/*
* VIA Networking Technologies VT612x PCI gigabit ethernet NIC driver.
@@ -115,8 +115,6 @@ __KERNEL_RCSID(0, "$NetBSD: if_vge.c,v 1.41 2008/04/10 19:13:37 cegger Exp $");
#include <dev/pci/if_vgereg.h>
-#define VGE_JUMBO_MTU 9000
-
#define VGE_IFQ_MAXLEN 64
#define VGE_RING_ALIGN 256
@@ -295,6 +293,8 @@ struct vge_softc {
static inline void vge_set_txaddr(struct vge_txfrag *, bus_addr_t);
static inline void vge_set_rxaddr(struct vge_rxdesc *, bus_addr_t);
+static int vge_ifflags_cb(struct ethercom *);
+
static int vge_match(struct device *, struct cfdata *, void *);
static void vge_attach(struct device *, struct device *, void *);
@@ -1054,6 +1054,7 @@ vge_attach(struct device *parent, struct device *self, void *aux)
*/
if_attach(ifp);
ether_ifattach(ifp, eaddr);
+ ether_set_ifflags_cb(&sc->sc_ethercom, vge_ifflags_cb);
callout_init(&sc->sc_timeout, 0);
callout_setfunc(&sc->sc_timeout, vge_tick, sc);
@@ -1996,6 +1997,26 @@ vge_miibus_statchg(struct device *self)
}
static int
+vge_ifflags_cb(struct ethercom *ec)
+{
+ struct ifnet *ifp = &ec->ec_if;
+ struct vge_softc *sc = ifp->if_softc;
+ int change = ifp->if_flags ^ sc->sc_if_flags;
+
+ if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0)
+ return ENETRESET;
+ else if ((change & IFF_PROMISC) == 0)
+ return 0;
+
+ if ((ifp->if_flags & IFF_PROMISC) == 0)
+ CSR_CLRBIT_1(sc, VGE_RXCTL, VGE_RXCTL_RX_PROMISC);
+ else
+ CSR_SETBIT_1(sc, VGE_RXCTL, VGE_RXCTL_RX_PROMISC);
+ vge_setmulti(sc);
+ return 0;
+}
+
+static int
vge_ioctl(struct ifnet *ifp, u_long command, void *data)
{
struct vge_softc *sc;
@@ -2008,41 +2029,8 @@ vge_ioctl(struct ifnet *ifp, u_long command, void *data)
s = splnet();
- switch (command) {
- case SIOCSIFMTU:
- if (ifr->ifr_mtu > VGE_JUMBO_MTU)
- error = EINVAL;
- else if ((error = ifioctl_common(ifp, command, data)) == ENETRESET)
- error = 0;
- break;
- case SIOCSIFFLAGS:
- if (ifp->if_flags & IFF_UP) {
- if (ifp->if_flags & IFF_RUNNING &&
- ifp->if_flags & IFF_PROMISC &&
- (sc->sc_if_flags & IFF_PROMISC) == 0) {
- CSR_SETBIT_1(sc, VGE_RXCTL,
- VGE_RXCTL_RX_PROMISC);
- vge_setmulti(sc);
- } else if (ifp->if_flags & IFF_RUNNING &&
- (ifp->if_flags & IFF_PROMISC) == 0 &&
- sc->sc_if_flags & IFF_PROMISC) {
- CSR_CLRBIT_1(sc, VGE_RXCTL,
- VGE_RXCTL_RX_PROMISC);
- vge_setmulti(sc);
- } else
- vge_init(ifp);
- } else {
- if (ifp->if_flags & IFF_RUNNING)
- vge_stop(sc);
- }
- sc->sc_if_flags = ifp->if_flags;
- break;
- default:
- if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
- break;
-
+ if ((error = ether_ioctl(ifp, command, data)) == ENETRESET) {
error = 0;
-
if (command != SIOCADDMULTI && command != SIOCDELMULTI)
;
else if (ifp->if_flags & IFF_RUNNING) {
@@ -2052,8 +2040,8 @@ vge_ioctl(struct ifnet *ifp, u_long command, void *data)
*/
vge_setmulti(sc);
}
- break;
}
+ sc->sc_if_flags = ifp->if_flags;
splx(s);
return error;
diff --git a/sys/dev/pci/if_wpi.c b/sys/dev/pci/if_wpi.c
index 0a5d31b14cf..5b64fe68487 100644
--- a/sys/dev/pci/if_wpi.c
+++ b/sys/dev/pci/if_wpi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_wpi.c,v 1.39 2008/07/02 03:42:55 cube Exp $ */
+/* $NetBSD: if_wpi.c,v 1.40 2008/11/07 00:20:07 dyoung Exp $ */
/*-
* Copyright (c) 2006, 2007
@@ -18,7 +18,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_wpi.c,v 1.39 2008/07/02 03:42:55 cube Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_wpi.c,v 1.40 2008/11/07 00:20:07 dyoung Exp $");
/*
* Driver for Intel PRO/Wireless 3945ABG 802.11 network adapters.
@@ -2035,6 +2035,8 @@ wpi_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (!(ifp->if_flags & IFF_RUNNING))
wpi_init(ifp);
diff --git a/sys/dev/pcmcia/if_cnw.c b/sys/dev/pcmcia/if_cnw.c
index ee94db14c6e..4aa5c235685 100644
--- a/sys/dev/pcmcia/if_cnw.c
+++ b/sys/dev/pcmcia/if_cnw.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_cnw.c,v 1.44 2008/04/28 20:23:56 martin Exp $ */
+/* $NetBSD: if_cnw.c,v 1.45 2008/11/07 00:20:12 dyoung Exp $ */
/*-
* Copyright (c) 1998, 2004 The NetBSD Foundation, Inc.
@@ -105,7 +105,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_cnw.c,v 1.44 2008/04/28 20:23:56 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_cnw.c,v 1.45 2008/11/07 00:20:12 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -1015,10 +1015,7 @@ cnw_intr(arg)
* Handle device ioctls.
*/
int
-cnw_ioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+cnw_ioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct cnw_softc *sc = ifp->if_softc;
struct ifaddr *ifa = (struct ifaddr *)data;
@@ -1027,7 +1024,7 @@ cnw_ioctl(ifp, cmd, data)
struct lwp *l = curlwp; /*XXX*/
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
case SIOCSIFFLAGS:
case SIOCADDMULTI:
case SIOCDELMULTI:
@@ -1050,40 +1047,46 @@ cnw_ioctl(ifp, cmd, data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
if (!(ifp->if_flags & IFF_RUNNING) &&
(error = cnw_enable(sc)) != 0)
break;
ifp->if_flags |= IFF_UP;
+ cnw_init(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- cnw_init(sc);
arp_ifinit(&sc->sc_ethercom.ec_if, ifa);
break;
#endif
default:
- cnw_init(sc);
break;
}
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == IFF_RUNNING) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* The interface is marked down and it is running, so
* stop it.
*/
cnw_disable(sc);
- } else if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == IFF_UP){
+ break;
+ case IFF_UP:
/*
* The interface is marked up and it is stopped, so
* start it.
*/
error = cnw_enable(sc);
- } else {
+ break;
+ default:
/* IFF_PROMISC may be changed */
cnw_init(sc);
+ break;
}
break;
@@ -1124,7 +1127,7 @@ cnw_ioctl(ifp, cmd, data)
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/pcmcia/if_ray.c b/sys/dev/pcmcia/if_ray.c
index 44406445262..9b854a8c3c6 100644
--- a/sys/dev/pcmcia/if_ray.c
+++ b/sys/dev/pcmcia/if_ray.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ray.c,v 1.70 2008/04/05 21:31:23 cegger Exp $ */
+/* $NetBSD: if_ray.c,v 1.71 2008/11/07 00:20:12 dyoung Exp $ */
/*
* Copyright (c) 2000 Christian E. Hopps
@@ -57,7 +57,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ray.c,v 1.70 2008/04/05 21:31:23 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ray.c,v 1.71 2008/11/07 00:20:12 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -870,10 +870,7 @@ ray_reset_resetloop(arg)
}
static int
-ray_ioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+ray_ioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct ieee80211_nwid nwid;
struct ray_param_req pr;
@@ -892,8 +889,8 @@ ray_ioctl(ifp, cmd, data)
RAY_DPRINTF(("%s: ioctl: cmd 0x%lx data 0x%lx\n", ifp->if_xname,
cmd, (long)data));
switch (cmd) {
- case SIOCSIFADDR:
- RAY_DPRINTF(("%s: ioctl: cmd SIOCSIFADDR\n", ifp->if_xname));
+ case SIOCINITIFADDR:
+ RAY_DPRINTF(("%s: ioctl: cmd SIOCINITIFADDR\n", ifp->if_xname));
if ((ifp->if_flags & IFF_RUNNING) == 0)
if ((error = ray_enable(sc)))
break;
@@ -911,6 +908,8 @@ ray_ioctl(ifp, cmd, data)
break;
case SIOCSIFFLAGS:
RAY_DPRINTF(("%s: ioctl: cmd SIOCSIFFLAGS\n", ifp->if_xname));
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if ((ifp->if_flags & IFF_RUNNING) == 0) {
if ((error = ray_enable(sc)))
@@ -1001,7 +1000,7 @@ ray_ioctl(ifp, cmd, data)
#endif
default:
RAY_DPRINTF(("%s: ioctl: unknown\n", ifp->if_xname));
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/pcmcia/if_xi.c b/sys/dev/pcmcia/if_xi.c
index 655d6bb2957..d66ab9c0be6 100644
--- a/sys/dev/pcmcia/if_xi.c
+++ b/sys/dev/pcmcia/if_xi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_xi.c,v 1.64 2008/04/05 21:31:23 cegger Exp $ */
+/* $NetBSD: if_xi.c,v 1.65 2008/11/07 00:20:12 dyoung Exp $ */
/* OpenBSD: if_xe.c,v 1.9 1999/09/16 11:28:42 niklas Exp */
/*
@@ -55,7 +55,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_xi.c,v 1.64 2008/04/05 21:31:23 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_xi.c,v 1.65 2008/11/07 00:20:12 dyoung Exp $");
#include "opt_inet.h"
#include "opt_ipx.h"
@@ -914,23 +914,22 @@ xi_ether_ioctl(ifp, cmd, data)
DPRINTF(XID_CONFIG, ("xi_ether_ioctl()\n"));
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
if ((error = xi_enable(sc)) != 0)
break;
ifp->if_flags |= IFF_UP;
+ xi_init(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- xi_init(sc);
arp_ifinit(ifp, ifa);
break;
#endif /* INET */
default:
- xi_init(sc);
break;
}
break;
@@ -943,10 +942,7 @@ xi_ether_ioctl(ifp, cmd, data)
}
STATIC int
-xi_ioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+xi_ioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct xi_softc *sc = ifp->if_softc;
int s, error = 0;
@@ -956,13 +952,16 @@ xi_ioctl(ifp, cmd, data)
s = splnet();
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
error = xi_ether_ioctl(ifp, cmd, data);
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running,
* stop it.
@@ -970,8 +969,8 @@ xi_ioctl(ifp, cmd, data)
xi_stop(sc);
ifp->if_flags &= ~IFF_RUNNING;
xi_disable(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped,
* start it.
@@ -979,12 +978,16 @@ xi_ioctl(ifp, cmd, data)
if ((error = xi_enable(sc)) != 0)
break;
xi_init(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0) {
+ break;
+ case IFF_UP|IFF_RUNNING:
/*
* Reset the interface to pick up changes in any
* other flags that affect hardware registers.
*/
xi_set_address(sc);
+ break;
+ case 0:
+ break;
}
break;
@@ -1009,7 +1012,7 @@ xi_ioctl(ifp, cmd, data)
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/ppbus/if_plip.c b/sys/dev/ppbus/if_plip.c
index 056657c4616..6c596403727 100644
--- a/sys/dev/ppbus/if_plip.c
+++ b/sys/dev/ppbus/if_plip.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_plip.c,v 1.21 2008/04/18 14:56:40 cegger Exp $ */
+/* $NetBSD: if_plip.c,v 1.22 2008/11/07 00:20:12 dyoung Exp $ */
/*-
* Copyright (c) 1997 Poul-Henning Kamp
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_plip.c,v 1.21 2008/04/18 14:56:40 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_plip.c,v 1.22 2008/11/07 00:20:12 dyoung Exp $");
/*
* Parallel port TCP/IP interfaces added. I looked at the driver from
@@ -345,7 +345,7 @@ lpfreetables (void)
/* Process an ioctl request. */
static int
-lpioctl (struct ifnet *ifp, u_long cmd, void *data)
+lpioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct lp_softc * sc = ifp->if_softc;
device_t dev = sc->ppbus_dev.sc_dev;
@@ -372,7 +372,7 @@ lpioctl (struct ifnet *ifp, u_long cmd, void *data)
error = EAFNOSUPPORT;
break;
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
if (ifa->ifa_addr->sa_family != AF_INET) {
error = EAFNOSUPPORT;
break;
@@ -380,6 +380,8 @@ lpioctl (struct ifnet *ifp, u_long cmd, void *data)
ifp->if_flags |= IFF_UP;
/* FALLTHROUGH */
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if((ifp->if_flags & (IFF_UP|IFF_RUNNING)) == IFF_UP) {
if((error = ppbus_request_bus(ppbus, dev, 0, 0)))
break;
@@ -459,7 +461,7 @@ lpioctl (struct ifnet *ifp, u_long cmd, void *data)
*/
default:
LP_PRINTF("LP:ioctl(0x%lx)\n", cmd);
- error = EINVAL;
+ error = ifioctl_common(ifp, cmd, data);
}
end:
diff --git a/sys/dev/qbus/if_dmc.c b/sys/dev/qbus/if_dmc.c
index 89811292e30..fe2ef1a55e1 100644
--- a/sys/dev/qbus/if_dmc.c
+++ b/sys/dev/qbus/if_dmc.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_dmc.c,v 1.16 2008/04/05 19:16:49 cegger Exp $ */
+/* $NetBSD: if_dmc.c,v 1.17 2008/11/07 00:20:12 dyoung Exp $ */
/*
* Copyright (c) 1982, 1986 Regents of the University of California.
* All rights reserved.
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_dmc.c,v 1.16 2008/04/05 19:16:49 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_dmc.c,v 1.17 2008/11/07 00:20:12 dyoung Exp $");
#undef DMCDEBUG /* for base table dump on fatal error */
@@ -841,7 +841,7 @@ dmcioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
if ((ifp->if_flags & IFF_RUNNING) == 0)
dmcinit(ifp);
@@ -853,6 +853,8 @@ dmcioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if ((ifp->if_flags & IFF_UP) == 0 &&
sc->sc_flag & DMC_RUNNING)
dmcdown(sc);
@@ -862,7 +864,7 @@ dmcioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
default:
- error = EINVAL;
+ error = ifioctl_common(ifp, cmd, data);
}
splx(s);
return (error);
diff --git a/sys/dev/qbus/if_qe.c b/sys/dev/qbus/if_qe.c
index 71b3f7a0093..7294933d9dd 100644
--- a/sys/dev/qbus/if_qe.c
+++ b/sys/dev/qbus/if_qe.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_qe.c,v 1.67 2008/03/11 05:34:01 matt Exp $ */
+/* $NetBSD: if_qe.c,v 1.68 2008/11/07 00:20:12 dyoung Exp $ */
/*
* Copyright (c) 1999 Ludd, University of Lule}, Sweden. All rights reserved.
*
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_qe.c,v 1.67 2008/03/11 05:34:01 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_qe.c,v 1.68 2008/11/07 00:20:12 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -660,7 +660,7 @@ qeioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
switch(ifa->ifa_addr->sa_family) {
#ifdef INET
@@ -673,8 +673,11 @@ qeioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running,
* stop it. (by disabling receive mechanism).
@@ -682,19 +685,23 @@ qeioctl(struct ifnet *ifp, u_long cmd, void *data)
QE_WCSR(QE_CSR_CSR,
QE_RCSR(QE_CSR_CSR) & ~QE_RCV_ENABLE);
ifp->if_flags &= ~IFF_RUNNING;
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface it marked up and it is stopped, then
* start it.
*/
qeinit(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0) {
+ break;
+ case IFF_UP|IFF_RUNNING:
/*
* Send a new setup packet to match any new changes.
* (Like IFF_PROMISC etc)
*/
qe_setup(sc);
+ break;
+ case 0:
+ break;
}
break;
@@ -715,8 +722,7 @@ qeioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
default:
- error = EINVAL;
-
+ error = ether_ioctl(ifp, cmd, data);
}
splx(s);
return (error);
diff --git a/sys/dev/sbus/be.c b/sys/dev/sbus/be.c
index 20b6e3992fd..ae7017c3cec 100644
--- a/sys/dev/sbus/be.c
+++ b/sys/dev/sbus/be.c
@@ -1,4 +1,4 @@
-/* $NetBSD: be.c,v 1.59 2008/05/04 17:14:41 xtraeme Exp $ */
+/* $NetBSD: be.c,v 1.60 2008/11/07 00:20:12 dyoung Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: be.c,v 1.59 2008/05/04 17:14:41 xtraeme Exp $");
+__KERNEL_RCSID(0, "$NetBSD: be.c,v 1.60 2008/11/07 00:20:12 dyoung Exp $");
#include "opt_ddb.h"
#include "opt_inet.h"
@@ -971,10 +971,7 @@ berint(sc)
}
int
-beioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+beioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct be_softc *sc = ifp->if_softc;
struct ifaddr *ifa = (struct ifaddr *)data;
@@ -984,44 +981,48 @@ beioctl(ifp, cmd, data)
s = splnet();
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
+ beinit(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- beinit(sc);
arp_ifinit(ifp, ifa);
break;
#endif /* INET */
default:
- beinit(sc);
break;
}
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running, then
* stop it.
*/
bestop(sc);
ifp->if_flags &= ~IFF_RUNNING;
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped, then
* start it.
*/
beinit(sc);
- } else {
+ break;
+ default:
/*
* Reset the interface to pick up changes in any other
* flags that affect hardware registers.
*/
bestop(sc);
beinit(sc);
+ break;
}
#ifdef BEDEBUG
if (ifp->if_flags & IFF_DEBUG)
@@ -1048,7 +1049,7 @@ beioctl(ifp, cmd, data)
error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
splx(s);
diff --git a/sys/dev/sbus/qe.c b/sys/dev/sbus/qe.c
index e5daf871b41..96f378e109f 100644
--- a/sys/dev/sbus/qe.c
+++ b/sys/dev/sbus/qe.c
@@ -1,4 +1,4 @@
-/* $NetBSD: qe.c,v 1.45 2008/04/28 20:23:57 martin Exp $ */
+/* $NetBSD: qe.c,v 1.46 2008/11/07 00:20:12 dyoung Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: qe.c,v 1.45 2008/04/28 20:23:57 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: qe.c,v 1.46 2008/11/07 00:20:12 dyoung Exp $");
#define QEDEBUG
@@ -923,46 +923,48 @@ qeioctl(ifp, cmd, data)
s = splnet();
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
+ qeinit(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
- qeinit(sc);
arp_ifinit(ifp, ifa);
break;
#endif /* INET */
default:
- qeinit(sc);
break;
}
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running, then
* stop it.
*/
qestop(sc);
ifp->if_flags &= ~IFF_RUNNING;
-
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped, then
* start it.
*/
qeinit(sc);
-
- } else {
+ break;
+ default:
/*
* Reset the interface to pick up changes in any other
* flags that affect hardware registers.
*/
qestop(sc);
qeinit(sc);
+ break;
}
#ifdef QEDEBUG
sc->sc_debug = (ifp->if_flags & IFF_DEBUG) != 0 ? 1 : 0;
diff --git a/sys/dev/scsipi/if_se.c b/sys/dev/scsipi/if_se.c
index 06edb68036c..efd8ec7f0de 100644
--- a/sys/dev/scsipi/if_se.c
+++ b/sys/dev/scsipi/if_se.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_se.c,v 1.72 2008/06/08 18:18:34 tsutsui Exp $ */
+/* $NetBSD: if_se.c,v 1.73 2008/11/07 00:20:12 dyoung Exp $ */
/*
* Copyright (c) 1997 Ian W. Dall <ian.dall@dsto.defence.gov.au>
@@ -59,7 +59,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_se.c,v 1.72 2008/06/08 18:18:34 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_se.c,v 1.73 2008/11/07 00:20:12 dyoung Exp $");
#include "opt_inet.h"
#include "opt_atalk.h"
@@ -977,10 +977,7 @@ se_stop(sc)
* Process an ioctl request.
*/
static int
-se_ioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- void *data;
+se_ioctl(struct ifnet *ifp, u_long cmd, void *data)
{
struct se_softc *sc = ifp->if_softc;
struct ifaddr *ifa = (struct ifaddr *)data;
@@ -992,7 +989,7 @@ se_ioctl(ifp, cmd, data)
switch (cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
if ((error = se_enable(sc)) != 0)
break;
ifp->if_flags |= IFF_UP;
@@ -1024,8 +1021,11 @@ se_ioctl(ifp, cmd, data)
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_RUNNING:
/*
* If interface is marked down and it is running, then
* stop it.
@@ -1033,8 +1033,8 @@ se_ioctl(ifp, cmd, data)
se_stop(sc);
ifp->if_flags &= ~IFF_RUNNING;
se_disable(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
+ break;
+ case IFF_UP:
/*
* If interface is marked up and it is stopped, then
* start it.
@@ -1042,12 +1042,15 @@ se_ioctl(ifp, cmd, data)
if ((error = se_enable(sc)) != 0)
break;
error = se_init(sc);
- } else if (sc->sc_enabled) {
+ break;
+ default:
/*
* Reset the interface to pick up changes in any other
* flags that affect hardware registers.
*/
- error = se_init(sc);
+ if (sc->sc_enabled)
+ error = se_init(sc);
+ break;
}
#ifdef SEDEBUG
if (ifp->if_flags & IFF_DEBUG)
@@ -1077,7 +1080,7 @@ se_ioctl(ifp, cmd, data)
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/usb/if_aue.c b/sys/dev/usb/if_aue.c
index 7f873f02e77..275fdd0b557 100644
--- a/sys/dev/usb/if_aue.c
+++ b/sys/dev/usb/if_aue.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_aue.c,v 1.111 2008/05/24 16:40:58 cube Exp $ */
+/* $NetBSD: if_aue.c,v 1.112 2008/11/07 00:20:12 dyoung Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000
* Bill Paul <wpaul@ee.columbia.edu>. All rights reserved.
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.111 2008/05/24 16:40:58 cube Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.112 2008/11/07 00:20:12 dyoung Exp $");
#if defined(__NetBSD__)
#include "opt_inet.h"
@@ -1587,7 +1587,7 @@ aue_ioctl(struct ifnet *ifp, u_long command, void *data)
s = splnet();
switch(command) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
aue_init(sc);
@@ -1612,6 +1612,8 @@ aue_ioctl(struct ifnet *ifp, u_long command, void *data)
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, command, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (ifp->if_flags & IFF_RUNNING &&
ifp->if_flags & IFF_PROMISC &&
@@ -1647,7 +1649,7 @@ aue_ioctl(struct ifnet *ifp, u_long command, void *data)
}
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, command, data);
break;
}
diff --git a/sys/dev/usb/if_axe.c b/sys/dev/usb/if_axe.c
index a56df4c9589..70724331af7 100644
--- a/sys/dev/usb/if_axe.c
+++ b/sys/dev/usb/if_axe.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_axe.c,v 1.25 2008/05/24 16:40:58 cube Exp $ */
+/* $NetBSD: if_axe.c,v 1.26 2008/11/07 00:20:12 dyoung Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000-2003
@@ -73,7 +73,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.25 2008/05/24 16:40:58 cube Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.26 2008/11/07 00:20:12 dyoung Exp $");
#if defined(__NetBSD__)
#include "opt_inet.h"
@@ -1134,7 +1134,7 @@ axe_ioctl(struct ifnet *ifp, u_long cmd, void *data)
int error = 0;
switch(cmd) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
axe_init(sc);
@@ -1159,6 +1159,8 @@ axe_ioctl(struct ifnet *ifp, u_long cmd, void *data)
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (ifp->if_flags & IFF_RUNNING &&
ifp->if_flags & IFF_PROMISC &&
@@ -1209,7 +1211,7 @@ axe_ioctl(struct ifnet *ifp, u_long cmd, void *data)
}
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, cmd, data);
break;
}
diff --git a/sys/dev/usb/if_cdce.c b/sys/dev/usb/if_cdce.c
index 9dccf439906..073a694930c 100644
--- a/sys/dev/usb/if_cdce.c
+++ b/sys/dev/usb/if_cdce.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_cdce.c,v 1.18 2008/09/24 07:19:18 ws Exp $ */
+/* $NetBSD: if_cdce.c,v 1.19 2008/11/07 00:20:12 dyoung Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000-2003 Bill Paul <wpaul@windriver.com>
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.18 2008/09/24 07:19:18 ws Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.19 2008/11/07 00:20:12 dyoung Exp $");
#include "bpfilter.h"
#ifdef __NetBSD__
#include "opt_inet.h"
@@ -434,7 +434,7 @@ cdce_ioctl(struct ifnet *ifp, u_long command, void *data)
s = splnet();
switch(command) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
cdce_init(sc);
switch (ifa->ifa_addr->sa_family) {
@@ -458,18 +458,23 @@ cdce_ioctl(struct ifnet *ifp, u_long command, void *data)
break;
case SIOCSIFFLAGS:
- if (ifp->if_flags & IFF_UP) {
- if (!(ifp->if_flags & IFF_RUNNING))
- cdce_init(sc);
- } else {
- if (ifp->if_flags & IFF_RUNNING)
- cdce_stop(sc);
+ if ((error = ifioctl_common(ifp, command, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_UP:
+ cdce_init(sc);
+ break;
+ case IFF_RUNNING:
+ cdce_stop(sc);
+ break;
+ default:
+ break;
}
- error = 0;
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, command, data);
break;
}
diff --git a/sys/dev/usb/if_cue.c b/sys/dev/usb/if_cue.c
index 807adcbec2e..1bd431d5a39 100644
--- a/sys/dev/usb/if_cue.c
+++ b/sys/dev/usb/if_cue.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_cue.c,v 1.53 2008/05/24 16:40:58 cube Exp $ */
+/* $NetBSD: if_cue.c,v 1.54 2008/11/07 00:20:12 dyoung Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000
* Bill Paul <wpaul@ee.columbia.edu>. All rights reserved.
@@ -56,7 +56,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.53 2008/05/24 16:40:58 cube Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.54 2008/11/07 00:20:12 dyoung Exp $");
#if defined(__NetBSD__)
#include "opt_inet.h"
@@ -1162,7 +1162,7 @@ cue_ioctl(struct ifnet *ifp, u_long command, void *data)
s = splnet();
switch(command) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
cue_init(sc);
@@ -1187,6 +1187,8 @@ cue_ioctl(struct ifnet *ifp, u_long command, void *data)
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, command, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (ifp->if_flags & IFF_RUNNING &&
ifp->if_flags & IFF_PROMISC &&
@@ -1213,7 +1215,7 @@ cue_ioctl(struct ifnet *ifp, u_long command, void *data)
error = 0;
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, command, data);
break;
}
diff --git a/sys/dev/usb/if_kue.c b/sys/dev/usb/if_kue.c
index ea63e36935c..e340fd53f2d 100644
--- a/sys/dev/usb/if_kue.c
+++ b/sys/dev/usb/if_kue.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_kue.c,v 1.63 2008/05/24 16:40:58 cube Exp $ */
+/* $NetBSD: if_kue.c,v 1.64 2008/11/07 00:20:12 dyoung Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000
* Bill Paul <wpaul@ee.columbia.edu>. All rights reserved.
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.63 2008/05/24 16:40:58 cube Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.64 2008/11/07 00:20:12 dyoung Exp $");
#if defined(__NetBSD__)
#include "opt_inet.h"
@@ -1069,7 +1069,7 @@ kue_ioctl(struct ifnet *ifp, u_long command, void *data)
s = splnet();
switch(command) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
kue_init(sc);
@@ -1094,6 +1094,8 @@ kue_ioctl(struct ifnet *ifp, u_long command, void *data)
break;
case SIOCSIFFLAGS:
+ if ((error = ifioctl_common(ifp, command, data)) != 0)
+ break;
if (ifp->if_flags & IFF_UP) {
if (ifp->if_flags & IFF_RUNNING &&
ifp->if_flags & IFF_PROMISC &&
@@ -1122,7 +1124,7 @@ kue_ioctl(struct ifnet *ifp, u_long command, void *data)
error = 0;
break;
default:
- error = EINVAL;
+ error = ether_ioctl(ifp, command, data);
break;
}
diff --git a/sys/dev/usb/if_rum.c b/sys/dev/usb/if_rum.c
index fc5b7e70701..8483b0a3717 100644
--- a/sys/dev/usb/if_rum.c
+++ b/sys/dev/usb/if_rum.c
@@ -1,5 +1,5 @@
/* $OpenBSD: if_rum.c,v 1.40 2006/09/18 16:20:20 damien Exp $ */
-/* $NetBSD: if_rum.c,v 1.23 2008/10/21 12:21:46 jun Exp $ */
+/* $NetBSD: if_rum.c,v 1.24 2008/11/07 00:20:12 dyoung Exp $ */
/*-
* Copyright (c) 2005-2007 Damien Bergamini <damien.bergamini@free.fr>
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_rum.c,v 1.23 2008/10/21 12:21:46 jun Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_rum.c,v 1.24 2008/11/07 00:20:12 dyoung Exp $");
#include "bpfilter.h"
@@ -1373,14 +1373,21 @@ rum_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
- if (ifp->if_flags & IFF_UP) {
- if (ifp->if_flags & IFF_RUNNING)
- rum_update_promisc(sc);
- else
- rum_init(ifp);
- } else {
- if (ifp->if_flags & IFF_RUNNING)
- rum_stop(ifp, 1);
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_UP|IFF_RUNNING:
+ rum_update_promisc(sc);
+ break;
+ case IFF_UP:
+ rum_init(ifp);
+ break;
+ case IFF_RUNNING:
+ rum_stop(ifp, 1);
+ break;
+ case 0:
+ break;
}
break;
diff --git a/sys/dev/usb/if_upl.c b/sys/dev/usb/if_upl.c
index 3a810983fac..fb7288fe15f 100644
--- a/sys/dev/usb/if_upl.c
+++ b/sys/dev/usb/if_upl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_upl.c,v 1.32 2008/05/24 16:40:58 cube Exp $ */
+/* $NetBSD: if_upl.c,v 1.33 2008/11/07 00:20:13 dyoung Exp $ */
/*
* Copyright (c) 2000 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.32 2008/05/24 16:40:58 cube Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.33 2008/11/07 00:20:13 dyoung Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -856,7 +856,7 @@ upl_ioctl(struct ifnet *ifp, u_long command, void *data)
s = splnet();
switch(command) {
- case SIOCSIFADDR:
+ case SIOCINITIFADDR:
ifp->if_flags |= IFF_UP;
upl_init(sc);
@@ -876,17 +876,22 @@ upl_ioctl(struct ifnet *ifp, u_long command, void *data)
break;
case SIOCSIFFLAGS:
- if (ifp->if_flags & IFF_UP) {
- if (!(ifp->if_flags & IFF_RUNNING))
- upl_init(sc);
- } else {
- if (ifp->if_flags & IFF_RUNNING)
- upl_stop(sc);
+ if ((error = ifioctl_common(ifp, command, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_UP:
+ upl_init(sc);
+ break;
+ case IFF_RUNNING:
+ upl_stop(sc);
+ break;
+ default:
+ break;
}
- error = 0;
break;
default:
- error = EINVAL;
+ error = ifioctl_common(ifp, command, data);
break;
}
diff --git a/sys/dev/usb/if_ural.c b/sys/dev/usb/if_ural.c
index 7e746794318..8da6bb10d77 100644
--- a/sys/dev/usb/if_ural.c
+++ b/sys/dev/usb/if_ural.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ural.c,v 1.30 2008/05/24 16:40:58 cube Exp $ */
+/* $NetBSD: if_ural.c,v 1.31 2008/11/07 00:20:13 dyoung Exp $ */
/* $FreeBSD: /repoman/r/ncvs/src/sys/dev/usb/if_ural.c,v 1.40 2006/06/02 23:14:40 sam Exp $ */
/*-
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ural.c,v 1.30 2008/05/24 16:40:58 cube Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ural.c,v 1.31 2008/11/07 00:20:13 dyoung Exp $");
#include "bpfilter.h"
@@ -1505,14 +1505,21 @@ ural_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
- if (ifp->if_flags & IFF_UP) {
- if (ifp->if_flags & IFF_RUNNING)
- ural_update_promisc(sc);
- else
- ural_init(ifp);
- } else {
- if (ifp->if_flags & IFF_RUNNING)
- ural_stop(ifp, 1);
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_UP|IFF_RUNNING:
+ ural_update_promisc(sc);
+ break;
+ case IFF_UP:
+ ural_init(ifp);
+ break;
+ case IFF_RUNNING:
+ ural_stop(ifp, 1);
+ break;
+ case 0:
+ break;
}
break;
diff --git a/sys/dev/usb/if_zyd.c b/sys/dev/usb/if_zyd.c
index 429d5422047..c324b313ba1 100644
--- a/sys/dev/usb/if_zyd.c
+++ b/sys/dev/usb/if_zyd.c
@@ -1,5 +1,5 @@
/* $OpenBSD: if_zyd.c,v 1.52 2007/02/11 00:08:04 jsg Exp $ */
-/* $NetBSD: if_zyd.c,v 1.14 2008/09/21 09:38:27 freza Exp $ */
+/* $NetBSD: if_zyd.c,v 1.15 2008/11/07 00:20:13 dyoung Exp $ */
/*-
* Copyright (c) 2006 by Damien Bergamini <damien.bergamini@free.fr>
@@ -22,7 +22,7 @@
* ZyDAS ZD1211/ZD1211B USB WLAN driver.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_zyd.c,v 1.14 2008/09/21 09:38:27 freza Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_zyd.c,v 1.15 2008/11/07 00:20:13 dyoung Exp $");
#include "bpfilter.h"
@@ -2419,18 +2419,24 @@ zyd_ioctl(struct ifnet *ifp, u_long cmd, void *data)
switch (cmd) {
case SIOCSIFFLAGS:
- if (ifp->if_flags & IFF_UP) {
- if (!(ifp->if_flags & IFF_RUNNING))
- zyd_init(ifp);
- } else {
- if (ifp->if_flags & IFF_RUNNING)
- zyd_stop(ifp, 1);
+ if ((error = ifioctl_common(ifp, cmd, data)) != 0)
+ break;
+ /* XXX re-use ether_ioctl() */
+ switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
+ case IFF_UP:
+ zyd_init(ifp);
+ break;
+ case IFF_RUNNING:
+ zyd_stop(ifp, 1);
+ break;
+ default:
+ break;
}
break;
default:
if (!sc->attached)
- error = ENOTTY;
+ error = ENXIO;
else
error = ieee80211_ioctl(ic, cmd, data);
}