From owner-svn-src-head@FreeBSD.ORG Mon Jun 2 18:26:11 2014 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 4F670124; Mon, 2 Jun 2014 18:26:11 +0000 (UTC) Received: from mail-qa0-x236.google.com (mail-qa0-x236.google.com [IPv6:2607:f8b0:400d:c00::236]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id CC8642547; Mon, 2 Jun 2014 18:26:10 +0000 (UTC) Received: by mail-qa0-f54.google.com with SMTP id j15so3321511qaq.13 for ; Mon, 02 Jun 2014 11:26:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=aQcmRmTxysgzmiS90UB6iHPvvzXBleUlj7rnnYMYCG8=; b=OGQbWK3cAdLUDmy6XoUD9z8LIzMXvyHmCLL5L6KXXeVZYVPJsas3Kt4Lm8HT3A4Kl9 C2Xo92Q++E7VOe+ugA38bJ8dDfcv44FLfgxnbevlfWLRYcSmU0kMvS6o2KnI1lZr83VB Uqrce3lLLoTEB+ehczPaVKTxdZX9SKY6jm8TfU0AVmec0avm85WazHfLxqjHbOuUczg3 clllvar9AfyTs7QePvcFrmDHUTh44lmv5lLXTV2oybRELQ2CzO9xgPAnGoOCOXaWe/QU tnpMnLPgaC/wG8Z4mBtHDfMKsXpnxJzesQpNm5h9+BHeFl5uKL22VhXf5BW+R57hiQWx SKZw== MIME-Version: 1.0 X-Received: by 10.229.213.66 with SMTP id gv2mr51533329qcb.13.1401733570000; Mon, 02 Jun 2014 11:26:10 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.224.43.134 with HTTP; Mon, 2 Jun 2014 11:26:09 -0700 (PDT) In-Reply-To: <201406021754.s52Hsd1B039620@svn.freebsd.org> References: <201406021754.s52Hsd1B039620@svn.freebsd.org> Date: Mon, 2 Jun 2014 11:26:09 -0700 X-Google-Sender-Auth: L5hDQtppeg1HqgJb3L_36jdTJnE Message-ID: Subject: Re: svn commit: r266974 - in head/sys: dev/dc dev/fxp dev/mii dev/netmap kern net From: Adrian Chadd To: Marcel Moolenaar Content-Type: text/plain; charset=UTF-8 Cc: "svn-src-head@freebsd.org" , "svn-src-all@freebsd.org" , "src-committers@freebsd.org" X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Jun 2014 18:26:11 -0000 Woo! Would you mind doing up a 30 second "what convert X to Y" document so I can do the driveby on the wireless stack and drivers? I'll look at the script but since the wifi stack sits in between the normal network stack layering, I just want to make sure I get all of the right bits converted over all at the same time and have it have a good chance of working. Thanks! -a On 2 June 2014 10:54, Marcel Moolenaar wrote: > Author: marcel > Date: Mon Jun 2 17:54:39 2014 > New Revision: 266974 > URL: http://svnweb.freebsd.org/changeset/base/266974 > > Log: > Introduce a procedural interface to the ifnet structure. The new > interface allows the ifnet structure to be defined as an opaque > type in NIC drivers. This then allows the ifnet structure to be > changed without a need to change or recompile NIC drivers. > > Put differently, NIC drivers can be written and compiled once and > be used with different network stack implementations, provided of > course that those network stack implementations have an API and > ABI compatible interface. > > This commit introduces the 'if_t' type to replace 'struct ifnet *' > as the type of a network interface. The 'if_t' type is defined as > 'void *' to enable the compiler to perform type conversion to > 'struct ifnet *' and vice versa where needed and without warnings. > The functions that implement the API are the only functions that > need to have an explicit cast. > > The MII code has been converted to use the driver API to avoid > unnecessary code churn. Code churn comes from having to work with > both converted and unconverted drivers in correlation with having > callback functions that take an interface. By converting the MII > code first, the callback functions can be defined so that the > compiler will perform the typecasts automatically. > > As soon as all drivers have been converted, the if_t type can be > redefined as needed and the API functions can be fix to not need > an explicit cast. > > The immediate benefactors of this change are: > 1. Juniper Networks - The network stack implementation in Junos > is entirely different from FreeBSD's one and this change > allows Juniper to build "stock" NIC drivers that can be used > in combination with both the FreeBSD and Junos stacks. > 2. FreeBSD - This change opens the door towards changing ifnet > and implementing new features and optimizations in the network > stack without it requiring a change in the many NIC drivers > FreeBSD has. > > Submitted by: Anuranjan Shukla > Reviewed by: glebius@ > Obtained from: Juniper Networks, Inc. > > Modified: > head/sys/dev/dc/dcphy.c > head/sys/dev/dc/pnphy.c > head/sys/dev/fxp/inphy.c > head/sys/dev/mii/brgphy.c > head/sys/dev/mii/e1000phy.c > head/sys/dev/mii/ip1000phy.c > head/sys/dev/mii/jmphy.c > head/sys/dev/mii/mii.c > head/sys/dev/mii/miivar.h > head/sys/dev/mii/nsphy.c > head/sys/dev/mii/rgephy.c > head/sys/dev/mii/truephy.c > head/sys/dev/netmap/netmap_generic.c > head/sys/dev/netmap/netmap_kern.h > head/sys/kern/kern_poll.c > head/sys/net/if.c > head/sys/net/if_media.h > head/sys/net/if_var.h > head/sys/net/ifq.h > > Modified: head/sys/dev/dc/dcphy.c > ============================================================================== > --- head/sys/dev/dc/dcphy.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/dc/dcphy.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -153,7 +153,7 @@ dcphy_attach(device_t dev) > &dcphy_funcs, 0); > > /*PHY_RESET(sc);*/ > - dc_sc = sc->mii_pdata->mii_ifp->if_softc; > + dc_sc = if_getsoftc(sc->mii_pdata->mii_ifp); > CSR_WRITE_4(dc_sc, DC_10BTSTAT, 0); > CSR_WRITE_4(dc_sc, DC_10BTCTRL, 0); > > @@ -191,7 +191,7 @@ dcphy_service(struct mii_softc *sc, stru > int reg; > u_int32_t mode; > > - dc_sc = mii->mii_ifp->if_softc; > + dc_sc = if_getsoftc(mii->mii_ifp); > > switch (cmd) { > case MII_POLLSTAT: > @@ -201,7 +201,7 @@ dcphy_service(struct mii_softc *sc, stru > /* > * If the interface is not up, don't do anything. > */ > - if ((mii->mii_ifp->if_flags & IFF_UP) == 0) > + if ((if_getflags(mii->mii_ifp) & IFF_UP) == 0) > break; > > mii->mii_media_active = IFM_NONE; > @@ -251,7 +251,7 @@ dcphy_service(struct mii_softc *sc, stru > /* > * Is the interface even up? > */ > - if ((mii->mii_ifp->if_flags & IFF_UP) == 0) > + if ((if_getflags(mii->mii_ifp) & IFF_UP) == 0) > return (0); > > /* > @@ -298,12 +298,12 @@ dcphy_status(struct mii_softc *sc) > int anlpar, tstat; > struct dc_softc *dc_sc; > > - dc_sc = mii->mii_ifp->if_softc; > + dc_sc = if_getsoftc(mii->mii_ifp); > > mii->mii_media_status = IFM_AVALID; > mii->mii_media_active = IFM_ETHER; > > - if ((mii->mii_ifp->if_flags & IFF_UP) == 0) > + if ((if_getflags(mii->mii_ifp) & IFF_UP) == 0) > return; > > tstat = CSR_READ_4(dc_sc, DC_10BTSTAT); > @@ -378,7 +378,7 @@ dcphy_auto(struct mii_softc *mii) > { > struct dc_softc *sc; > > - sc = mii->mii_pdata->mii_ifp->if_softc; > + sc = if_getsoftc(mii->mii_pdata->mii_ifp); > > DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_PORTSEL); > DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_FULLDUPLEX); > @@ -399,7 +399,7 @@ dcphy_reset(struct mii_softc *mii) > { > struct dc_softc *sc; > > - sc = mii->mii_pdata->mii_ifp->if_softc; > + sc = if_getsoftc(mii->mii_pdata->mii_ifp); > > DC_CLRBIT(sc, DC_SIARESET, DC_SIA_RESET); > DELAY(1000); > > Modified: head/sys/dev/dc/pnphy.c > ============================================================================== > --- head/sys/dev/dc/pnphy.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/dc/pnphy.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -152,7 +152,7 @@ pnphy_service(struct mii_softc *sc, stru > /* > * If the interface is not up, don't do anything. > */ > - if ((mii->mii_ifp->if_flags & IFF_UP) == 0) > + if ((if_getflags(mii->mii_ifp) & IFF_UP) == 0) > break; > > /* > @@ -180,7 +180,7 @@ pnphy_service(struct mii_softc *sc, stru > /* > * Is the interface even up? > */ > - if ((mii->mii_ifp->if_flags & IFF_UP) == 0) > + if ((if_getflags(mii->mii_ifp) & IFF_UP) == 0) > return (0); > > break; > @@ -201,7 +201,7 @@ pnphy_status(struct mii_softc *sc) > int reg; > struct dc_softc *dc_sc; > > - dc_sc = mii->mii_ifp->if_softc; > + dc_sc = if_getsoftc(mii->mii_ifp); > > mii->mii_media_status = IFM_AVALID; > mii->mii_media_active = IFM_ETHER; > > Modified: head/sys/dev/fxp/inphy.c > ============================================================================== > --- head/sys/dev/fxp/inphy.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/fxp/inphy.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -122,7 +122,7 @@ inphy_service(struct mii_softc *sc, stru > /* > * If the interface is not up, don't do anything. > */ > - if ((mii->mii_ifp->if_flags & IFF_UP) == 0) > + if ((if_getflags(mii->mii_ifp) & IFF_UP) == 0) > break; > > mii_phy_setmedia(sc); > > Modified: head/sys/dev/mii/brgphy.c > ============================================================================== > --- head/sys/dev/mii/brgphy.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/mii/brgphy.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); > #include > #include > #include > +#include > > #include > #include > @@ -197,7 +198,7 @@ brgphy_attach(device_t dev) > struct bge_softc *bge_sc = NULL; > struct bce_softc *bce_sc = NULL; > struct mii_softc *sc; > - struct ifnet *ifp; > + if_t ifp; > > bsc = device_get_softc(dev); > sc = &bsc->mii_sc; > @@ -209,10 +210,10 @@ brgphy_attach(device_t dev) > ifp = sc->mii_pdata->mii_ifp; > > /* Find the MAC driver associated with this PHY. */ > - if (strcmp(ifp->if_dname, "bge") == 0) > - bge_sc = ifp->if_softc; > - else if (strcmp(ifp->if_dname, "bce") == 0) > - bce_sc = ifp->if_softc; > + if (strcmp(if_getdname(ifp), "bge") == 0) > + bge_sc = if_getsoftc(ifp); > + else if (strcmp(if_getdname(ifp), "bce") == 0) > + bce_sc = if_getsoftc(ifp); > > /* Handle any special cases based on the PHY ID */ > switch (sc->mii_mpd_oui) { > @@ -879,7 +880,7 @@ brgphy_reset(struct mii_softc *sc) > { > struct bge_softc *bge_sc = NULL; > struct bce_softc *bce_sc = NULL; > - struct ifnet *ifp; > + if_t ifp; > int i, val; > > /* > @@ -932,10 +933,10 @@ brgphy_reset(struct mii_softc *sc) > ifp = sc->mii_pdata->mii_ifp; > > /* Find the driver associated with this PHY. */ > - if (strcmp(ifp->if_dname, "bge") == 0) { > - bge_sc = ifp->if_softc; > - } else if (strcmp(ifp->if_dname, "bce") == 0) { > - bce_sc = ifp->if_softc; > + if (strcmp(if_getdname(ifp), "bge") == 0) { > + bge_sc = if_getsoftc(ifp); > + } else if (strcmp(if_getdname(ifp), "bce") == 0) { > + bce_sc = if_getsoftc(ifp); > } > > if (bge_sc) { > @@ -954,7 +955,7 @@ brgphy_reset(struct mii_softc *sc) > brgphy_fixup_jitter_bug(sc); > > if (bge_sc->bge_flags & BGE_FLAG_JUMBO) > - brgphy_jumbo_settings(sc, ifp->if_mtu); > + brgphy_jumbo_settings(sc, if_getmtu(ifp)); > > if ((bge_sc->bge_phy_flags & BGE_PHY_NO_WIRESPEED) == 0) > brgphy_ethernet_wirespeed(sc); > @@ -1065,11 +1066,11 @@ brgphy_reset(struct mii_softc *sc) > (BCE_CHIP_REV(bce_sc) == BCE_CHIP_REV_Bx)) > brgphy_fixup_disable_early_dac(sc); > > - brgphy_jumbo_settings(sc, ifp->if_mtu); > + brgphy_jumbo_settings(sc, if_getmtu(ifp)); > brgphy_ethernet_wirespeed(sc); > } else { > brgphy_fixup_ber_bug(sc); > - brgphy_jumbo_settings(sc, ifp->if_mtu); > + brgphy_jumbo_settings(sc, if_getmtu(ifp)); > brgphy_ethernet_wirespeed(sc); > } > } > > Modified: head/sys/dev/mii/e1000phy.c > ============================================================================== > --- head/sys/dev/mii/e1000phy.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/mii/e1000phy.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -132,14 +132,14 @@ static int > e1000phy_attach(device_t dev) > { > struct mii_softc *sc; > - struct ifnet *ifp; > + if_t ifp; > > sc = device_get_softc(dev); > > mii_phy_dev_attach(dev, MIIF_NOMANPAUSE, &e1000phy_funcs, 0); > > ifp = sc->mii_pdata->mii_ifp; > - if (strcmp(ifp->if_dname, "msk") == 0 && > + if (strcmp(if_getdname(ifp), "msk") == 0 && > (sc->mii_flags & MIIF_MACPRIV0) != 0) > sc->mii_flags |= MIIF_PHYPRIV0; > > > Modified: head/sys/dev/mii/ip1000phy.c > ============================================================================== > --- head/sys/dev/mii/ip1000phy.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/mii/ip1000phy.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); > #include > #include > #include > +#include > #include > > #include > @@ -109,7 +110,7 @@ ip1000phy_attach(device_t dev) > ma = device_get_ivars(dev); > flags = MIIF_NOISOLATE | MIIF_NOMANPAUSE; > if (MII_MODEL(ma->mii_id2) == MII_MODEL_xxICPLUS_IP1000A && > - strcmp(ma->mii_data->mii_ifp->if_dname, "stge") == 0 && > + strcmp(if_getdname(ma->mii_data->mii_ifp), "stge") == 0 && > (miibus_get_flags(dev) & MIIF_MACPRIV0) != 0) > flags |= MIIF_PHYPRIV0; > mii_phy_dev_attach(dev, flags, &ip1000phy_funcs, 1); > > Modified: head/sys/dev/mii/jmphy.c > ============================================================================== > --- head/sys/dev/mii/jmphy.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/mii/jmphy.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -105,7 +105,7 @@ jmphy_attach(device_t dev) > > ma = device_get_ivars(dev); > flags = 0; > - if (strcmp(ma->mii_data->mii_ifp->if_dname, "jme") == 0 && > + if (strcmp(if_getdname(ma->mii_data->mii_ifp), "jme") == 0 && > (miibus_get_flags(dev) & MIIF_MACPRIV0) != 0) > flags |= MIIF_PHYPRIV0; > mii_phy_dev_attach(dev, flags, &jmphy_funcs, 1); > > Modified: head/sys/dev/mii/mii.c > ============================================================================== > --- head/sys/dev/mii/mii.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/mii/mii.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -106,7 +106,7 @@ driver_t miibus_driver = { > }; > > struct miibus_ivars { > - struct ifnet *ifp; > + if_t ifp; > ifm_change_cb_t ifmedia_upd; > ifm_stat_cb_t ifmedia_sts; > u_int mii_flags; > @@ -147,8 +147,8 @@ miibus_attach(device_t dev) > ifmedia_init(&mii->mii_media, IFM_IMASK, ivars->ifmedia_upd, > ivars->ifmedia_sts); > mii->mii_ifp = ivars->ifp; > - mii->mii_ifp->if_capabilities |= IFCAP_LINKSTATE; > - mii->mii_ifp->if_capenable |= IFCAP_LINKSTATE; > + if_setcapabilitiesbit(mii->mii_ifp, IFCAP_LINKSTATE, 0); > + if_setcapenablebit(mii->mii_ifp, IFCAP_LINKSTATE, 0); > LIST_INIT(&mii->mii_phys); > > return (bus_generic_attach(dev)); > @@ -308,7 +308,7 @@ miibus_statchg(device_t dev) > MIIBUS_STATCHG(parent); > > mii = device_get_softc(dev); > - mii->mii_ifp->if_baudrate = ifmedia_baudrate(mii->mii_media_active); > + if_setbaudrate(mii->mii_ifp, ifmedia_baudrate(mii->mii_media_active)); > } > > static void > @@ -330,7 +330,7 @@ miibus_linkchg(device_t dev) > link_state = LINK_STATE_DOWN; > } else > link_state = LINK_STATE_UNKNOWN; > - if_link_state_change(mii->mii_ifp, link_state); > + if_linkstate_change_drv(mii->mii_ifp, link_state); > } > > static void > @@ -358,7 +358,7 @@ miibus_mediainit(device_t dev) > * the PHYs to the network interface driver parent. > */ > int > -mii_attach(device_t dev, device_t *miibus, struct ifnet *ifp, > +mii_attach(device_t dev, device_t *miibus, void *ifp, > ifm_change_cb_t ifmedia_upd, ifm_stat_cb_t ifmedia_sts, int capmask, > int phyloc, int offloc, int flags) > { > > Modified: head/sys/dev/mii/miivar.h > ============================================================================== > --- head/sys/dev/mii/miivar.h Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/mii/miivar.h Mon Jun 2 17:54:39 2014 (r266974) > @@ -36,6 +36,7 @@ > #define _DEV_MII_MIIVAR_H_ > > #include > +#include /* XXX driver API temporary */ > > /* > * Media Independent Interface data structure defintions > @@ -57,7 +58,7 @@ typedef void (*mii_statchg_t)(struct dev > */ > struct mii_data { > struct ifmedia mii_media; /* media information */ > - struct ifnet *mii_ifp; /* pointer back to network interface */ > + if_t mii_ifp; /* pointer back to network interface */ > > /* > * For network interfaces with multiple PHYs, a list of all > @@ -246,7 +247,7 @@ MIIBUS_ACCESSOR(flags, FLAGS, u_int) > extern devclass_t miibus_devclass; > extern driver_t miibus_driver; > > -int mii_attach(device_t, device_t *, struct ifnet *, ifm_change_cb_t, > +int mii_attach(device_t, device_t *, if_t, ifm_change_cb_t, > ifm_stat_cb_t, int, int, int, int); > void mii_down(struct mii_data *); > int mii_mediachg(struct mii_data *); > > Modified: head/sys/dev/mii/nsphy.c > ============================================================================== > --- head/sys/dev/mii/nsphy.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/mii/nsphy.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -186,7 +186,7 @@ nsphy_service(struct mii_softc *sc, stru > */ > reg |= 0x0100 | 0x0400; > > - if (strcmp(mii->mii_ifp->if_dname, "fxp") == 0) > + if (strcmp(if_getdname(mii->mii_ifp), "fxp") == 0) > PHY_WRITE(sc, MII_NSPHY_PCR, reg); > > mii_phy_setmedia(sc); > > Modified: head/sys/dev/mii/rgephy.c > ============================================================================== > --- head/sys/dev/mii/rgephy.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/mii/rgephy.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$"); > #include > #include > #include > +#include > #include > > #include > @@ -118,7 +119,7 @@ rgephy_attach(device_t dev) > sc = device_get_softc(dev); > ma = device_get_ivars(dev); > flags = 0; > - if (strcmp(ma->mii_data->mii_ifp->if_dname, "re") == 0) > + if (strcmp(if_getdname(ma->mii_data->mii_ifp), "re") == 0) > flags |= MIIF_PHYPRIV0; > mii_phy_dev_attach(dev, flags, &rgephy_funcs, 0); > > > Modified: head/sys/dev/mii/truephy.c > ============================================================================== > --- head/sys/dev/mii/truephy.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/mii/truephy.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -265,7 +265,7 @@ truephy_reset(struct mii_softc *sc) > > mii_phy_reset(sc); > > - if (TRUEPHY_FRAMELEN(sc->mii_pdata->mii_ifp->if_mtu) > 2048) { > + if (TRUEPHY_FRAMELEN((if_getmtu(sc->mii_pdata->mii_ifp)) > 2048)) { > int conf; > > conf = PHY_READ(sc, TRUEPHY_CONF); > > Modified: head/sys/dev/netmap/netmap_generic.c > ============================================================================== > --- head/sys/dev/netmap/netmap_generic.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/netmap/netmap_generic.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -804,3 +804,9 @@ generic_netmap_attach(struct ifnet *ifp) > > return retval; > } > + > +struct netmap_adapter * > +netmap_getna(if_t ifp) > +{ > + return (NA((struct ifnet *)ifp)); > +} > > Modified: head/sys/dev/netmap/netmap_kern.h > ============================================================================== > --- head/sys/dev/netmap/netmap_kern.h Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/dev/netmap/netmap_kern.h Mon Jun 2 17:54:39 2014 (r266974) > @@ -1262,6 +1262,7 @@ void netmap_catch_tx(struct netmap_gener > int generic_xmit_frame(struct ifnet *ifp, struct mbuf *m, void *addr, u_int len, u_int ring_nr); > int generic_find_num_desc(struct ifnet *ifp, u_int *tx, u_int *rx); > void generic_find_num_queues(struct ifnet *ifp, u_int *txq, u_int *rxq); > +struct netmap_adapter *netmap_getna(if_t ifp); > > /* > * netmap_mitigation API. This is used by the generic adapter > @@ -1376,5 +1377,4 @@ void bdg_mismatch_datapath(struct netmap > struct netmap_vp_adapter *dst_na, > struct nm_bdg_fwd *ft_p, struct netmap_ring *ring, > u_int *j, u_int lim, u_int *howmany); > - > #endif /* _NET_NETMAP_KERN_H_ */ > > Modified: head/sys/kern/kern_poll.c > ============================================================================== > --- head/sys/kern/kern_poll.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/kern/kern_poll.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -451,6 +451,19 @@ netisr_poll(void) > mtx_unlock(&poll_mtx); > } > > +/* The following should be temporary, till all drivers use the driver API */ > +int > +ether_poll_register_drv(poll_handler_drv_t *h, if_t ifh) > +{ > + return (ether_poll_register((poll_handler_t *)h, (struct ifnet *)ifh)); > +} > + > +int > +ether_poll_deregister_drv(if_t ifh) > +{ > + return (ether_poll_deregister((struct ifnet *)ifh)); > +} > + > /* > * Try to register routine for polling. Returns 0 if successful > * (and polling should be enabled), error code otherwise. > > Modified: head/sys/net/if.c > ============================================================================== > --- head/sys/net/if.c Mon Jun 2 17:34:08 2014 (r266973) > +++ head/sys/net/if.c Mon Jun 2 17:54:39 2014 (r266974) > @@ -63,12 +63,16 @@ > #include > #include > > +#include > +#include > #include > #include > #include > #include > #include > #include > +#include > +#include > #include > #include > #include > @@ -1400,17 +1404,17 @@ if_addr_runlock(struct ifnet *ifp) > } > > void > -if_maddr_rlock(struct ifnet *ifp) > +if_maddr_rlock(if_t ifp) > { > > - IF_ADDR_RLOCK(ifp); > + IF_ADDR_RLOCK((struct ifnet *)ifp); > } > > void > -if_maddr_runlock(struct ifnet *ifp) > +if_maddr_runlock(if_t ifp) > { > > - IF_ADDR_RUNLOCK(ifp); > + IF_ADDR_RUNLOCK((struct ifnet *)ifp); > } > > /* > @@ -3461,3 +3465,644 @@ if_deregister_com_alloc(u_char type) > if_com_alloc[type] = NULL; > if_com_free[type] = NULL; > } > + > +/* API for driver access to network stack owned ifnet.*/ > +uint64_t > +if_setbaudrate(void *arg, uint64_t baudrate) > +{ > + struct ifnet *ifp = arg; > + uint64_t oldbrate; > + > + oldbrate = ifp->if_baudrate; > + ifp->if_baudrate = baudrate; > + return (oldbrate); > +} > + > +uint64_t > +if_getbaudrate(if_t ifp) > +{ > + > + return (((struct ifnet *)ifp)->if_baudrate); > +} > + > +int > +if_setcapabilities(if_t ifp, int capabilities) > +{ > + ((struct ifnet *)ifp)->if_capabilities = capabilities; > + return (0); > +} > + > +int > +if_setcapabilitiesbit(if_t ifp, int setbit, int clearbit) > +{ > + ((struct ifnet *)ifp)->if_capabilities |= setbit; > + ((struct ifnet *)ifp)->if_capabilities &= ~clearbit; > + > + return (0); > +} > + > +int > +if_getcapabilities(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_capabilities; > +} > + > +int > +if_setcapenable(if_t ifp, int capabilities) > +{ > + ((struct ifnet *)ifp)->if_capenable = capabilities; > + return (0); > +} > + > +int > +if_setcapenablebit(if_t ifp, int setcap, int clearcap) > +{ > + if(setcap) > + ((struct ifnet *)ifp)->if_capenable |= setcap; > + if(clearcap) > + ((struct ifnet *)ifp)->if_capenable &= ~clearcap; > + > + return (0); > +} > + > +const char * > +if_getdname(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_dname; > +} > + > +int > +if_togglecapenable(if_t ifp, int togglecap) > +{ > + ((struct ifnet *)ifp)->if_capenable ^= togglecap; > + return (0); > +} > + > +int > +if_getcapenable(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_capenable; > +} > + > +/* > + * This is largely undesirable because it ties ifnet to a device, but does > + * provide flexiblity for an embedded product vendor. Should be used with > + * the understanding that it violates the interface boundaries, and should be > + * a last resort only. > + */ > +int > +if_setdev(if_t ifp, void *dev) > +{ > + return (0); > +} > + > +int > +if_setdrvflagbits(if_t ifp, int set_flags, int clear_flags) > +{ > + ((struct ifnet *)ifp)->if_drv_flags |= set_flags; > + ((struct ifnet *)ifp)->if_drv_flags &= ~clear_flags; > + > + return (0); > +} > + > +int > +if_getdrvflags(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_drv_flags; > +} > + > +int > +if_setdrvflags(if_t ifp, int flags) > +{ > + ((struct ifnet *)ifp)->if_drv_flags = flags; > + return (0); > +} > + > + > +int > +if_setflags(if_t ifp, int flags) > +{ > + ((struct ifnet *)ifp)->if_flags = flags; > + return (0); > +} > + > +int > +if_setflagbits(if_t ifp, int set, int clear) > +{ > + ((struct ifnet *)ifp)->if_flags |= set; > + ((struct ifnet *)ifp)->if_flags &= ~clear; > + > + return (0); > +} > + > +int > +if_getflags(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_flags; > +} > + > +int > +if_clearhwassist(if_t ifp) > +{ > + ((struct ifnet *)ifp)->if_hwassist = 0; > + return (0); > +} > + > +int > +if_sethwassistbits(if_t ifp, int toset, int toclear) > +{ > + ((struct ifnet *)ifp)->if_hwassist |= toset; > + ((struct ifnet *)ifp)->if_hwassist &= ~toclear; > + > + return (0); > +} > + > +int > +if_sethwassist(if_t ifp, int hwassist_bit) > +{ > + ((struct ifnet *)ifp)->if_hwassist = hwassist_bit; > + return (0); > +} > + > +int > +if_gethwassist(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_hwassist; > +} > + > +int > +if_setmtu(if_t ifp, int mtu) > +{ > + ((struct ifnet *)ifp)->if_mtu = mtu; > + return (0); > +} > + > +int > +if_getmtu(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_mtu; > +} > + > +int > +if_setsoftc(if_t ifp, void *softc) > +{ > + ((struct ifnet *)ifp)->if_softc = softc; > + return (0); > +} > + > +void * > +if_getsoftc(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_softc; > +} > + > +void > +if_setrcvif(struct mbuf *m, if_t ifp) > +{ > + m->m_pkthdr.rcvif = (struct ifnet *)ifp; > +} > + > +void > +if_setvtag(struct mbuf *m, uint16_t tag) > +{ > + m->m_pkthdr.ether_vtag = tag; > +} > + > +uint16_t > +if_getvtag(struct mbuf *m) > +{ > + > + return (m->m_pkthdr.ether_vtag); > +} > + > +/* Statistics */ > +int > +if_incipackets(if_t ifp, int pkts) > +{ > + ((struct ifnet *)ifp)->if_ipackets += pkts; > + return (0); > +} > + > +int > +if_incopackets(if_t ifp, int pkts) > +{ > + ((struct ifnet *)ifp)->if_opackets += pkts; > + return (0); > +} > + > +int > +if_incierrors(if_t ifp, int ierrors) > +{ > + ((struct ifnet *)ifp)->if_ierrors += ierrors; > + return (0); > +} > + > + > +int > +if_setierrors(if_t ifp, int ierrors) > +{ > + ((struct ifnet *)ifp)->if_ierrors = ierrors; > + return (0); > +} > + > +int > +if_setoerrors(if_t ifp, int oerrors) > +{ > + ((struct ifnet *)ifp)->if_oerrors = oerrors; > + return (0); > +} > + > +int if_incoerrors(if_t ifp, int oerrors) > +{ > + ((struct ifnet *)ifp)->if_oerrors += oerrors; > + return (0); > +} > + > +int if_inciqdrops(if_t ifp, int val) > +{ > + ((struct ifnet *)ifp)->if_iqdrops += val; > + return (0); > +} > + > +int > +if_setcollisions(if_t ifp, int collisions) > +{ > + ((struct ifnet *)ifp)->if_collisions = collisions; > + return (0); > +} > + > +int > +if_inccollisions(if_t ifp, int collisions) > +{ > + ((struct ifnet *)ifp)->if_collisions += collisions; > + return (0); > +} > + > +int > +if_setipackets(if_t ifp, int pkts) > +{ > + ((struct ifnet *)ifp)->if_ipackets = pkts; > + return (0); > +} > + > +int > +if_setopackets(if_t ifp, int pkts) > +{ > + ((struct ifnet *)ifp)->if_opackets = pkts; > + return (0); > +} > + > +int > +if_incobytes(if_t ifp, int bytes) > +{ > + ((struct ifnet *)ifp)->if_obytes += bytes; > + return (0); > +} > + > +int > +if_setibytes(if_t ifp, int bytes) > +{ > + ((struct ifnet *)ifp)->if_ibytes = bytes; > + return (0); > +} > + > +int > +if_setobytes(if_t ifp, int bytes) > +{ > + ((struct ifnet *)ifp)->if_obytes = bytes; > + return (0); > +} > + > + > +int > +if_sendq_empty(if_t ifp) > +{ > + return IFQ_DRV_IS_EMPTY(&((struct ifnet *)ifp)->if_snd); > +} > + > +int if_getiqdrops(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_iqdrops; > +} > + > +int > +if_incimcasts(if_t ifp, int mcast) > +{ > + ((struct ifnet *)ifp)->if_imcasts += mcast; > + return (0); > +} > + > + > +int > +if_incomcasts(if_t ifp, int mcast) > +{ > + ((struct ifnet *)ifp)->if_omcasts += mcast; > + return (0); > +} > + > +int > +if_setimcasts(if_t ifp, int mcast) > +{ > + ((struct ifnet *)ifp)->if_imcasts = mcast; > + return (0); > +} > + > + > +struct ifaddr * > +if_getifaddr(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_addr; > +} > + > +int > +if_getamcount(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_amcount; > +} > + > + > +int > +if_setsendqready(if_t ifp) > +{ > + IFQ_SET_READY(&((struct ifnet *)ifp)->if_snd); > + return (0); > +} > + > +int > +if_setsendqlen(if_t ifp, int tx_desc_count) > +{ > + IFQ_SET_MAXLEN(&((struct ifnet *)ifp)->if_snd, tx_desc_count); > + ((struct ifnet *)ifp)->if_snd.ifq_drv_maxlen = tx_desc_count; > + > + return (0); > +} > + > +int > +if_vlantrunkinuse(if_t ifp) > +{ > + return ((struct ifnet *)ifp)->if_vlantrunk != NULL?1:0; > +} > + > +int > +if_input(if_t ifp, struct mbuf* sendmp) > +{ > + (*((struct ifnet *)ifp)->if_input)((struct ifnet *)ifp, sendmp); > + return (0); > + > +} > + > +/* XXX */ > +#ifndef ETH_ADDR_LEN > +#define ETH_ADDR_LEN 6 > +#endif > + > +int > +if_setupmultiaddr(if_t ifp, void *mta, int *cnt, int max) > +{ > + struct ifmultiaddr *ifma; > + uint8_t *lmta = (uint8_t *)mta; > + int mcnt = 0; > + > + TAILQ_FOREACH(ifma, &((struct ifnet *)ifp)->if_multiaddrs, ifma_link) { > + if (ifma->ifma_addr->sa_family != AF_LINK) > + continue; > + > + if (mcnt == max) > + break; > + > + bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr), > + &lmta[mcnt * ETH_ADDR_LEN], ETH_ADDR_LEN); > + mcnt++; > + } > + *cnt = mcnt; > + > + return (0); > +} > + > +int > +if_multiaddr_array(if_t ifp, void *mta, int *cnt, int max) > +{ > + int error; > + > + if_maddr_rlock(ifp); > + error = if_setupmultiaddr(ifp, mta, cnt, max); > + if_maddr_runlock(ifp); > + return (error); > +} > + > +int > +if_multiaddr_count(if_t ifp, int max) > +{ > + struct ifmultiaddr *ifma; > + int count; > + > + count = 0; > + if_maddr_rlock(ifp); > + TAILQ_FOREACH(ifma, &((struct ifnet *)ifp)->if_multiaddrs, ifma_link) { > + if (ifma->ifma_addr->sa_family != AF_LINK) > + continue; > + count++; > + if (count == max) > + break; > + } > + if_maddr_runlock(ifp); > + return (count); > +} > + > +struct mbuf * > +if_dequeue(if_t ifp) > +{ > + struct mbuf *m; > + IFQ_DRV_DEQUEUE(&((struct ifnet *)ifp)->if_snd, m); > + > + return (m); > +} > + > +int > +if_sendq_prepend(if_t ifp, struct mbuf *m) > +{ > + IFQ_DRV_PREPEND(&((struct ifnet *)ifp)->if_snd, m); > + return (0); > +} > + > +int > +if_setifheaderlen(if_t ifp, int len) > +{ > + ((struct ifnet *)ifp)->if_data.ifi_hdrlen = len; > + return (0); > +} > + > +caddr_t > +if_getlladdr(if_t ifp) > +{ > + return (IF_LLADDR((struct ifnet *)ifp)); > +} > + > +void * > +if_gethandle(u_char type) > +{ > + return (if_alloc(type)); > +} > + > +void > +if_bpfmtap(if_t ifh, struct mbuf *m) > +{ > + struct ifnet *ifp = (struct ifnet *)ifh; > + > + BPF_MTAP(ifp, m); > +} > + > +void > +if_etherbpfmtap(if_t ifh, struct mbuf *m) > +{ > + struct ifnet *ifp = (struct ifnet *)ifh; > + > + ETHER_BPF_MTAP(ifp, m); > +} > + > +void > +if_vlancap(if_t ifh) > +{ > + struct ifnet *ifp = (struct ifnet *)ifh; > + VLAN_CAPABILITIES(ifp); > +} > + > +void > +if_setinitfn(if_t ifp, void (*init_fn)(void *)) > +{ > + ((struct ifnet *)ifp)->if_init = init_fn; > +} > + > +void > +if_setioctlfn(if_t ifp, int (*ioctl_fn)(void *, u_long, caddr_t)) > +{ > + ((struct ifnet *)ifp)->if_ioctl = (void *)ioctl_fn; > +} > + > +void > +if_setstartfn(if_t ifp, void (*start_fn)(void *)) > +{ > + ((struct ifnet *)ifp)->if_start = (void *)start_fn; > +} > + > +void > +if_settransmitfn(if_t ifp, if_transmit_fn_t start_fn) > +{ > + ((struct ifnet *)ifp)->if_transmit = start_fn; > +} > + > +void if_setqflushfn(if_t ifp, if_qflush_fn_t flush_fn) > +{ > + ((struct ifnet *)ifp)->if_qflush = flush_fn; > + > +} > + > +/* These wrappers are hopefully temporary, till all drivers use drvapi */ > +#ifdef INET > +void > +arp_ifinit_drv(if_t ifh, struct ifaddr *ifa) > +{ > + arp_ifinit((struct ifnet *)ifh, ifa); > +} > +#endif > + > +void > +ether_ifattach_drv(if_t ifh, const u_int8_t *lla) > +{ > + ether_ifattach((struct ifnet *)ifh, lla); > +} > > *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** >