git: 02f3b17fa596 - main - Mechanically convert Xen netfront/netback(4) to IfAPI
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 24 Apr 2023 14:12:11 UTC
The branch main has been updated by jhibbits: URL: https://cgit.FreeBSD.org/src/commit/?id=02f3b17fa5967b15d3841d9f7df56264557d1bfb commit 02f3b17fa5967b15d3841d9f7df56264557d1bfb Author: Justin Hibbits <jhibbits@FreeBSD.org> AuthorDate: 2022-03-01 17:52:45 +0000 Commit: Justin Hibbits <jhibbits@FreeBSD.org> CommitDate: 2023-04-24 13:54:23 +0000 Mechanically convert Xen netfront/netback(4) to IfAPI Reviewed by: zlei Sponsored by: Juniper Networks, Inc. Differential Revision: https://reviews.freebsd.org/D37800 --- sys/dev/xen/netback/netback.c | 124 ++++++++++++++-------------- sys/dev/xen/netfront/netfront.c | 179 ++++++++++++++++++++-------------------- 2 files changed, 153 insertions(+), 150 deletions(-) diff --git a/sys/dev/xen/netback/netback.c b/sys/dev/xen/netback/netback.c index ddd5218a8936..3c6ebde3ee49 100644 --- a/sys/dev/xen/netback/netback.c +++ b/sys/dev/xen/netback/netback.c @@ -147,20 +147,20 @@ static void xnb_attach_failed(struct xnb_softc *xnb, static int xnb_shutdown(struct xnb_softc *xnb); static int create_netdev(device_t dev); static int xnb_detach(device_t dev); -static int xnb_ifmedia_upd(struct ifnet *ifp); -static void xnb_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr); +static int xnb_ifmedia_upd(if_t ifp); +static void xnb_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr); static void xnb_intr(void *arg); static int xnb_send(netif_rx_back_ring_t *rxb, domid_t otherend, const struct mbuf *mbufc, gnttab_copy_table gnttab); static int xnb_recv(netif_tx_back_ring_t *txb, domid_t otherend, - struct mbuf **mbufc, struct ifnet *ifnet, + struct mbuf **mbufc, if_t ifnet, gnttab_copy_table gnttab); static int xnb_ring2pkt(struct xnb_pkt *pkt, const netif_tx_back_ring_t *tx_ring, RING_IDX start); static void xnb_txpkt2rsp(const struct xnb_pkt *pkt, netif_tx_back_ring_t *ring, int error); -static struct mbuf *xnb_pkt2mbufc(const struct xnb_pkt *pkt, struct ifnet *ifp); +static struct mbuf *xnb_pkt2mbufc(const struct xnb_pkt *pkt, if_t ifp); static int xnb_txpkt2gnttab(const struct xnb_pkt *pkt, struct mbuf *mbufc, gnttab_copy_table gnttab, @@ -180,9 +180,9 @@ static int xnb_rxpkt2rsp(const struct xnb_pkt *pkt, const gnttab_copy_table gnttab, int n_entries, netif_rx_back_ring_t *ring); static void xnb_stop(struct xnb_softc*); -static int xnb_ioctl(struct ifnet*, u_long, caddr_t); -static void xnb_start_locked(struct ifnet*); -static void xnb_start(struct ifnet*); +static int xnb_ioctl(if_t, u_long, caddr_t); +static void xnb_start_locked(if_t); +static void xnb_start(if_t); static void xnb_ifinit_locked(struct xnb_softc*); static void xnb_ifinit(void*); #ifdef XNB_DEBUG @@ -396,7 +396,7 @@ struct xnb_softc { struct ifmedia sc_media; /** Media carrier info */ - struct ifnet *xnb_ifp; + if_t xnb_ifp; /** Our own private carrier state */ unsigned carrier; @@ -1180,7 +1180,7 @@ xnb_setup_sysctl(struct xnb_softc *xnb) int create_netdev(device_t dev) { - struct ifnet *ifp; + if_t ifp; struct xnb_softc *xnb; int err = 0; uint32_t handle; @@ -1224,18 +1224,18 @@ create_netdev(device_t dev) if (err == 0) { /* Set up ifnet structure */ ifp = xnb->xnb_ifp = if_alloc(IFT_ETHER); - ifp->if_softc = xnb; + if_setsoftc(ifp, xnb); if_initname(ifp, xnb->if_name, IF_DUNIT_NONE); - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; - ifp->if_ioctl = xnb_ioctl; - ifp->if_start = xnb_start; - ifp->if_init = xnb_ifinit; - ifp->if_mtu = ETHERMTU; - ifp->if_snd.ifq_maxlen = NET_RX_RING_SIZE - 1; + if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST); + if_setioctlfn(ifp, xnb_ioctl); + if_setstartfn(ifp, xnb_start); + if_setinitfn(ifp, xnb_ifinit); + if_setmtu(ifp, ETHERMTU); + if_setsendqlen(ifp, NET_RX_RING_SIZE - 1); - ifp->if_hwassist = XNB_CSUM_FEATURES; - ifp->if_capabilities = IFCAP_HWCSUM; - ifp->if_capenable = IFCAP_HWCSUM; + if_sethwassist(ifp, XNB_CSUM_FEATURES); + if_setcapabilities(ifp, IFCAP_HWCSUM); + if_setcapenable(ifp, IFCAP_HWCSUM); ether_ifattach(ifp, xnb->mac); xnb->carrier = 0; @@ -1425,7 +1425,7 @@ static void xnb_intr(void *arg) { struct xnb_softc *xnb; - struct ifnet *ifp; + if_t ifp; netif_tx_back_ring_t *txb; RING_IDX req_prod_local; @@ -1449,7 +1449,7 @@ xnb_intr(void *arg) break; /* Send the packet to the generic network stack */ - (*xnb->xnb_ifp->if_input)(xnb->xnb_ifp, mbufc); + if_input(xnb->xnb_ifp, mbufc); } RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(txb, notify); @@ -1653,7 +1653,7 @@ xnb_txpkt2rsp(const struct xnb_pkt *pkt, netif_tx_back_ring_t *ring, * NULL on failure */ static struct mbuf* -xnb_pkt2mbufc(const struct xnb_pkt *pkt, struct ifnet *ifp) +xnb_pkt2mbufc(const struct xnb_pkt *pkt, if_t ifp) { /** * \todo consider using a memory pool for mbufs instead of @@ -1805,7 +1805,7 @@ xnb_update_mbufc(struct mbuf *mbufc, const gnttab_copy_table gnttab, */ static int xnb_recv(netif_tx_back_ring_t *txb, domid_t otherend, struct mbuf **mbufc, - struct ifnet *ifnet, gnttab_copy_table gnttab) + if_t ifnet, gnttab_copy_table gnttab) { struct xnb_pkt pkt; /* number of tx requests consumed to build the last packet */ @@ -2189,18 +2189,18 @@ xnb_add_mbuf_cksum(struct mbuf *mbufc) static void xnb_stop(struct xnb_softc *xnb) { - struct ifnet *ifp; + if_t ifp; mtx_assert(&xnb->sc_lock, MA_OWNED); ifp = xnb->xnb_ifp; - ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING | IFF_DRV_OACTIVE); if_link_state_change(ifp, LINK_STATE_DOWN); } static int -xnb_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +xnb_ioctl(if_t ifp, u_long cmd, caddr_t data) { - struct xnb_softc *xnb = ifp->if_softc; + struct xnb_softc *xnb = if_getsoftc(ifp); struct ifreq *ifr = (struct ifreq*) data; #ifdef INET struct ifaddr *ifa = (struct ifaddr*)data; @@ -2210,10 +2210,10 @@ xnb_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) switch (cmd) { case SIOCSIFFLAGS: mtx_lock(&xnb->sc_lock); - if (ifp->if_flags & IFF_UP) { + if (if_getflags(ifp) & IFF_UP) { xnb_ifinit_locked(xnb); } else { - if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) { xnb_stop(xnb); } } @@ -2227,14 +2227,14 @@ xnb_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) #ifdef INET mtx_lock(&xnb->sc_lock); if (ifa->ifa_addr->sa_family == AF_INET) { - ifp->if_flags |= IFF_UP; - if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { - ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | - IFF_DRV_OACTIVE); + if_setflagbits(ifp, IFF_UP, 0); + if (!(if_getdrvflags(ifp) & IFF_DRV_RUNNING)) { + if_setdrvflagbits(ifp, 0, + IFF_DRV_RUNNING | IFF_DRV_OACTIVE); if_link_state_change(ifp, LINK_STATE_DOWN); - ifp->if_drv_flags |= IFF_DRV_RUNNING; - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0); + if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE); if_link_state_change(ifp, LINK_STATE_UP); } @@ -2251,16 +2251,16 @@ xnb_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) case SIOCSIFCAP: mtx_lock(&xnb->sc_lock); if (ifr->ifr_reqcap & IFCAP_TXCSUM) { - ifp->if_capenable |= IFCAP_TXCSUM; - ifp->if_hwassist |= XNB_CSUM_FEATURES; + if_setcapenablebit(ifp, IFCAP_TXCSUM, 0); + if_sethwassistbits(ifp, XNB_CSUM_FEATURES, 0); } else { - ifp->if_capenable &= ~(IFCAP_TXCSUM); - ifp->if_hwassist &= ~(XNB_CSUM_FEATURES); + if_setcapenablebit(ifp, 0, IFCAP_TXCSUM); + if_sethwassistbits(ifp, 0, XNB_CSUM_FEATURES); } if ((ifr->ifr_reqcap & IFCAP_RXCSUM)) { - ifp->if_capenable |= IFCAP_RXCSUM; + if_setcapenablebit(ifp, IFCAP_RXCSUM, 0); } else { - ifp->if_capenable &= ~(IFCAP_RXCSUM); + if_setcapenablebit(ifp, 0, IFCAP_RXCSUM); } /* * TODO enable TSO4 and LRO once we no longer need @@ -2268,30 +2268,30 @@ xnb_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) */ #if 0 if (ifr->if_reqcap |= IFCAP_TSO4) { - if (IFCAP_TXCSUM & ifp->if_capenable) { + if (IFCAP_TXCSUM & if_getcapenable(ifp)) { printf("xnb: Xen netif requires that " "TXCSUM be enabled in order " "to use TSO4\n"); error = EINVAL; } else { - ifp->if_capenable |= IFCAP_TSO4; - ifp->if_hwassist |= CSUM_TSO; + if_setcapenablebit(ifp, IFCAP_TSO4, 0); + if_sethwassistbits(ifp, CSUM_TSO, 0); } } else { - ifp->if_capenable &= ~(IFCAP_TSO4); - ifp->if_hwassist &= ~(CSUM_TSO); + if_setcapenablebit(ifp, 0, IFCAP_TSO4); + if_sethwassistbits(ifp, 0, (CSUM_TSO)); } if (ifr->ifreqcap |= IFCAP_LRO) { - ifp->if_capenable |= IFCAP_LRO; + if_setcapenablebit(ifp, IFCAP_LRO, 0); } else { - ifp->if_capenable &= ~(IFCAP_LRO); + if_setcapenablebit(ifp, 0, IFCAP_LRO); } #endif mtx_unlock(&xnb->sc_lock); break; case SIOCSIFMTU: - ifp->if_mtu = ifr->ifr_mtu; - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + if_setmtu(ifp, ifr->ifr_mtu); + if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING); xnb_ifinit(xnb); break; case SIOCADDMULTI: @@ -2309,14 +2309,14 @@ xnb_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) } static void -xnb_start_locked(struct ifnet *ifp) +xnb_start_locked(if_t ifp) { netif_rx_back_ring_t *rxb; struct xnb_softc *xnb; struct mbuf *mbufc; RING_IDX req_prod_local; - xnb = ifp->if_softc; + xnb = if_getsoftc(ifp); rxb = &xnb->ring_configs[XNB_RING_TYPE_RX].back_ring.rx_ring; if (!xnb->carrier) @@ -2330,7 +2330,7 @@ xnb_start_locked(struct ifnet *ifp) for (;;) { int error; - IF_DEQUEUE(&ifp->if_snd, mbufc); + mbufc = if_dequeue(ifp); if (mbufc == NULL) break; error = xnb_send(rxb, xnb->otherend_id, mbufc, @@ -2342,7 +2342,7 @@ xnb_start_locked(struct ifnet *ifp) * Requeue pkt and send when space is * available. */ - IF_PREPEND(&ifp->if_snd, mbufc); + if_sendq_prepend(ifp, mbufc); /* * Perhaps the frontend missed an IRQ * and went to sleep. Notify it to wake @@ -2414,11 +2414,11 @@ xnb_send(netif_rx_back_ring_t *ring, domid_t otherend, const struct mbuf *mbufc, } static void -xnb_start(struct ifnet *ifp) +xnb_start(if_t ifp) { struct xnb_softc *xnb; - xnb = ifp->if_softc; + xnb = if_getsoftc(ifp); mtx_lock(&xnb->rx_lock); xnb_start_locked(ifp); mtx_unlock(&xnb->rx_lock); @@ -2428,19 +2428,19 @@ xnb_start(struct ifnet *ifp) static void xnb_ifinit_locked(struct xnb_softc *xnb) { - struct ifnet *ifp; + if_t ifp; ifp = xnb->xnb_ifp; mtx_assert(&xnb->sc_lock, MA_OWNED); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) + if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) return; xnb_stop(xnb); - ifp->if_drv_flags |= IFF_DRV_RUNNING; - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0); + if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE); if_link_state_change(ifp, LINK_STATE_UP); } @@ -2459,7 +2459,7 @@ xnb_ifinit(void *xsc) * state has changed. Since we don't have a physical carrier, we don't care */ static int -xnb_ifmedia_upd(struct ifnet *ifp) +xnb_ifmedia_upd(if_t ifp) { return (0); } @@ -2469,7 +2469,7 @@ xnb_ifmedia_upd(struct ifnet *ifp) * state is. Since we don't have a physical carrier, this is very simple */ static void -xnb_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) +xnb_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr) { ifmr->ifm_status = IFM_AVALID|IFM_ACTIVE; ifmr->ifm_active = IFM_ETHER|IFM_MANUAL; diff --git a/sys/dev/xen/netfront/netfront.c b/sys/dev/xen/netfront/netfront.c index cfb6172dbe19..b833dfc0a42d 100644 --- a/sys/dev/xen/netfront/netfront.c +++ b/sys/dev/xen/netfront/netfront.c @@ -129,7 +129,7 @@ static void xn_rxq_intr(struct netfront_rxq *); static void xn_txq_intr(struct netfront_txq *); static void xn_intr(void *); static int xn_assemble_tx_request(struct netfront_txq *, struct mbuf *); -static int xn_ioctl(struct ifnet *, u_long, caddr_t); +static int xn_ioctl(if_t, u_long, caddr_t); static void xn_ifinit_locked(struct netfront_info *); static void xn_ifinit(void *); static void xn_stop(struct netfront_info *); @@ -139,15 +139,15 @@ static void netif_free(struct netfront_info *info); static int netfront_detach(device_t dev); static int xn_txq_mq_start_locked(struct netfront_txq *, struct mbuf *); -static int xn_txq_mq_start(struct ifnet *, struct mbuf *); +static int xn_txq_mq_start(if_t, struct mbuf *); static int talk_to_backend(device_t dev, struct netfront_info *info); static int create_netdev(device_t dev); static void netif_disconnect_backend(struct netfront_info *info); static int setup_device(device_t dev, struct netfront_info *info, unsigned long); -static int xn_ifmedia_upd(struct ifnet *ifp); -static void xn_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr); +static int xn_ifmedia_upd(if_t ifp); +static void xn_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr); static int xn_connect(struct netfront_info *); static void xn_kick_rings(struct netfront_info *); @@ -215,7 +215,7 @@ struct netfront_txq { }; struct netfront_info { - struct ifnet *xn_ifp; + if_t xn_ifp; struct mtx sc_lock; @@ -637,14 +637,14 @@ talk_to_backend(device_t dev, struct netfront_info *info) message = "writing feature-sg"; goto abort_transaction; } - if ((info->xn_ifp->if_capenable & IFCAP_LRO) != 0) { + if ((if_getcapenable(info->xn_ifp) & IFCAP_LRO) != 0) { err = xs_printf(xst, node, "feature-gso-tcpv4", "%d", 1); if (err != 0) { message = "writing feature-gso-tcpv4"; goto abort_transaction; } } - if ((info->xn_ifp->if_capenable & IFCAP_RXCSUM) == 0) { + if ((if_getcapenable(info->xn_ifp) & IFCAP_RXCSUM) == 0) { err = xs_printf(xst, node, "feature-no-csum-offload", "%d", 1); if (err != 0) { message = "writing feature-no-csum-offload"; @@ -685,7 +685,7 @@ static void xn_txq_start(struct netfront_txq *txq) { struct netfront_info *np = txq->info; - struct ifnet *ifp = np->xn_ifp; + if_t ifp = np->xn_ifp; XN_TX_LOCK_ASSERT(txq); if (!drbr_empty(ifp, txq->br)) @@ -1007,6 +1007,12 @@ out: } #ifdef INET +static u_int +netfront_addr_cb(void *arg, struct ifaddr *a, u_int count) +{ + arp_ifinit((if_t)arg, a); + return (1); +} /** * If this interface has an ipv4 address, send an arp for it. This * helps to get the network going again after migrating hosts. @@ -1014,15 +1020,10 @@ out: static void netfront_send_fake_arp(device_t dev, struct netfront_info *info) { - struct ifnet *ifp; - struct ifaddr *ifa; + if_t ifp; ifp = info->xn_ifp; - CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { - if (ifa->ifa_addr->sa_family == AF_INET) { - arp_ifinit(ifp, ifa); - } - } + if_foreach_addr_type(ifp, AF_INET, netfront_addr_cb, ifp); } #endif @@ -1036,7 +1037,7 @@ netfront_backend_changed(device_t dev, XenbusState newstate) DPRINTK("newstate=%d\n", newstate); - CURVNET_SET(sc->xn_ifp->if_vnet); + CURVNET_SET(if_getvnet(sc->xn_ifp)); switch (newstate) { case XenbusStateInitialising: @@ -1228,7 +1229,7 @@ xn_release_rx_bufs(struct netfront_rxq *rxq) static void xn_rxeof(struct netfront_rxq *rxq) { - struct ifnet *ifp; + if_t ifp; struct netfront_info *np = rxq->info; #if (defined(INET) || defined(INET6)) struct lro_ctrl *lro = &rxq->lro; @@ -1313,16 +1314,16 @@ xn_rxeof(struct netfront_rxq *rxq) if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1); #if (defined(INET) || defined(INET6)) /* Use LRO if possible */ - if ((ifp->if_capenable & IFCAP_LRO) == 0 || + if ((if_getcapenable(ifp) & IFCAP_LRO) == 0 || lro->lro_cnt == 0 || tcp_lro_rx(lro, m, 0)) { /* * If LRO fails, pass up to the stack * directly. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } #else - (*ifp->if_input)(ifp, m); + if_input(ifp, m); #endif } @@ -1339,7 +1340,7 @@ xn_txeof(struct netfront_txq *txq) { RING_IDX i, prod; unsigned short id; - struct ifnet *ifp; + if_t ifp; netif_tx_response_t *txr; struct mbuf *m; struct netfront_info *np = txq->info; @@ -1387,7 +1388,7 @@ xn_txeof(struct netfront_txq *txq) txq->mbufs_cnt--; mbuf_release(m); /* Only mark the txq active if we've freed up at least one slot to try */ - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE); } txq->ring.rsp_cons = prod; @@ -1589,7 +1590,7 @@ static int xn_assemble_tx_request(struct netfront_txq *txq, struct mbuf *m_head) { struct netfront_info *np = txq->info; - struct ifnet *ifp = np->xn_ifp; + if_t ifp = np->xn_ifp; int otherend_id, error, nfrags; bus_dma_segment_t *segs = txq->segs; struct mbuf_xennet *tag; @@ -1768,7 +1769,7 @@ xn_assemble_tx_request(struct netfront_txq *txq, struct mbuf *m_head) static void xn_ifinit_locked(struct netfront_info *np) { - struct ifnet *ifp; + if_t ifp; int i; struct netfront_rxq *rxq; @@ -1776,7 +1777,7 @@ xn_ifinit_locked(struct netfront_info *np) ifp = np->xn_ifp; - if (ifp->if_drv_flags & IFF_DRV_RUNNING || !netfront_carrier_ok(np)) + if (if_getdrvflags(ifp) & IFF_DRV_RUNNING || !netfront_carrier_ok(np)) return; xn_stop(np); @@ -1791,8 +1792,8 @@ xn_ifinit_locked(struct netfront_info *np) XN_RX_UNLOCK(rxq); } - ifp->if_drv_flags |= IFF_DRV_RUNNING; - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0); + if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE); if_link_state_change(ifp, LINK_STATE_UP); } @@ -1807,9 +1808,9 @@ xn_ifinit(void *xsc) } static int -xn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +xn_ioctl(if_t ifp, u_long cmd, caddr_t data) { - struct netfront_info *sc = ifp->if_softc; + struct netfront_info *sc = if_getsoftc(ifp); struct ifreq *ifr = (struct ifreq *) data; device_t dev; #ifdef INET @@ -1824,8 +1825,8 @@ xn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) #ifdef INET XN_LOCK(sc); if (ifa->ifa_addr->sa_family == AF_INET) { - ifp->if_flags |= IFF_UP; - if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) + if_setflagbits(ifp, IFF_UP, 0); + if (!(if_getdrvflags(ifp) & IFF_DRV_RUNNING)) xn_ifinit_locked(sc); arp_ifinit(ifp, ifa); XN_UNLOCK(sc); @@ -1838,16 +1839,16 @@ xn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) #endif break; case SIOCSIFMTU: - if (ifp->if_mtu == ifr->ifr_mtu) + if (if_getmtu(ifp) == ifr->ifr_mtu) break; - ifp->if_mtu = ifr->ifr_mtu; - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + if_setmtu(ifp, ifr->ifr_mtu); + if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING); xn_ifinit(sc); break; case SIOCSIFFLAGS: XN_LOCK(sc); - if (ifp->if_flags & IFF_UP) { + if (if_getflags(ifp) & IFF_UP) { /* * If only the state of the PROMISC flag changed, * then just use the 'set promisc mode' command @@ -1858,24 +1859,24 @@ xn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) */ xn_ifinit_locked(sc); } else { - if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) { xn_stop(sc); } } - sc->xn_if_flags = ifp->if_flags; + sc->xn_if_flags = if_getflags(ifp); XN_UNLOCK(sc); break; case SIOCSIFCAP: - mask = ifr->ifr_reqcap ^ ifp->if_capenable; + mask = ifr->ifr_reqcap ^ if_getcapenable(ifp); reinit = 0; if (mask & IFCAP_TXCSUM) { - ifp->if_capenable ^= IFCAP_TXCSUM; - ifp->if_hwassist ^= XN_CSUM_FEATURES; + if_togglecapenable(ifp, IFCAP_TXCSUM); + if_togglehwassist(ifp, XN_CSUM_FEATURES); } if (mask & IFCAP_TSO4) { - ifp->if_capenable ^= IFCAP_TSO4; - ifp->if_hwassist ^= CSUM_TSO; + if_togglecapenable(ifp, IFCAP_TSO4); + if_togglehwassist(ifp, CSUM_TSO); } if (mask & (IFCAP_RXCSUM | IFCAP_LRO)) { @@ -1883,9 +1884,9 @@ xn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) reinit = 1; if (mask & IFCAP_RXCSUM) - ifp->if_capenable ^= IFCAP_RXCSUM; + if_togglecapenable(ifp, IFCAP_RXCSUM); if (mask & IFCAP_LRO) - ifp->if_capenable ^= IFCAP_LRO; + if_togglecapenable(ifp, IFCAP_LRO); } if (reinit == 0) @@ -1943,13 +1944,13 @@ xn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) static void xn_stop(struct netfront_info *sc) { - struct ifnet *ifp; + if_t ifp; XN_LOCK_ASSERT(sc); ifp = sc->xn_ifp; - ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING | IFF_DRV_OACTIVE); if_link_state_change(ifp, LINK_STATE_DOWN); } @@ -2077,9 +2078,9 @@ xn_query_features(struct netfront_info *np) "feature-gso-tcpv4", NULL, "%d", &val) != 0) val = 0; - np->xn_ifp->if_capabilities &= ~(IFCAP_TSO4|IFCAP_LRO); + if_setcapabilitiesbit(np->xn_ifp, 0, IFCAP_TSO4 | IFCAP_LRO); if (val) { - np->xn_ifp->if_capabilities |= IFCAP_TSO4|IFCAP_LRO; + if_setcapabilitiesbit(np->xn_ifp, IFCAP_TSO4 | IFCAP_LRO, 0); printf(" feature-gso-tcp4"); } @@ -2091,9 +2092,9 @@ xn_query_features(struct netfront_info *np) "feature-no-csum-offload", NULL, "%d", &val) != 0) val = 0; - np->xn_ifp->if_capabilities |= IFCAP_HWCSUM; + if_setcapabilitiesbit(np->xn_ifp, IFCAP_HWCSUM, 0); if (val) { - np->xn_ifp->if_capabilities &= ~(IFCAP_HWCSUM); + if_setcapabilitiesbit(np->xn_ifp, 0, IFCAP_HWCSUM); printf(" feature-no-csum-offload"); } @@ -2107,49 +2108,50 @@ xn_configure_features(struct netfront_info *np) #if (defined(INET) || defined(INET6)) int i; #endif - struct ifnet *ifp; + if_t ifp; ifp = np->xn_ifp; err = 0; - if ((ifp->if_capenable & ifp->if_capabilities) == ifp->if_capenable) { + if ((if_getcapenable(ifp) & if_getcapabilities(ifp)) == if_getcapenable(ifp)) { /* Current options are available, no need to do anything. */ return (0); } /* Try to preserve as many options as possible. */ - cap_enabled = ifp->if_capenable; - ifp->if_capenable = ifp->if_hwassist = 0; + cap_enabled = if_getcapenable(ifp); + if_setcapenable(ifp, 0); + if_sethwassist(ifp, 0); #if (defined(INET) || defined(INET6)) if ((cap_enabled & IFCAP_LRO) != 0) for (i = 0; i < np->num_queues; i++) tcp_lro_free(&np->rxq[i].lro); if (xn_enable_lro && - (ifp->if_capabilities & cap_enabled & IFCAP_LRO) != 0) { - ifp->if_capenable |= IFCAP_LRO; + (if_getcapabilities(ifp) & cap_enabled & IFCAP_LRO) != 0) { + if_setcapenablebit(ifp, IFCAP_LRO, 0); for (i = 0; i < np->num_queues; i++) { err = tcp_lro_init(&np->rxq[i].lro); if (err != 0) { device_printf(np->xbdev, "LRO initialization failed\n"); - ifp->if_capenable &= ~IFCAP_LRO; + if_setcapenablebit(ifp, 0, IFCAP_LRO); break; } np->rxq[i].lro.ifp = ifp; } } - if ((ifp->if_capabilities & cap_enabled & IFCAP_TSO4) != 0) { - ifp->if_capenable |= IFCAP_TSO4; - ifp->if_hwassist |= CSUM_TSO; + if ((if_getcapabilities(ifp) & cap_enabled & IFCAP_TSO4) != 0) { + if_setcapenablebit(ifp, IFCAP_TSO4, 0); + if_sethwassistbits(ifp, CSUM_TSO, 0); } #endif - if ((ifp->if_capabilities & cap_enabled & IFCAP_TXCSUM) != 0) { - ifp->if_capenable |= IFCAP_TXCSUM; - ifp->if_hwassist |= XN_CSUM_FEATURES; + if ((if_getcapabilities(ifp) & cap_enabled & IFCAP_TXCSUM) != 0) { + if_setcapenablebit(ifp, IFCAP_TXCSUM, 0); + if_sethwassistbits(ifp, XN_CSUM_FEATURES, 0); } - if ((ifp->if_capabilities & cap_enabled & IFCAP_RXCSUM) != 0) - ifp->if_capenable |= IFCAP_RXCSUM; + if ((if_getcapabilities(ifp) & cap_enabled & IFCAP_RXCSUM) != 0) + if_setcapenablebit(ifp, IFCAP_RXCSUM, 0); return (err); } @@ -2158,7 +2160,7 @@ static int xn_txq_mq_start_locked(struct netfront_txq *txq, struct mbuf *m) { struct netfront_info *np; - struct ifnet *ifp; + if_t ifp; struct buf_ring *br; int error, notify; @@ -2169,7 +2171,7 @@ xn_txq_mq_start_locked(struct netfront_txq *txq, struct mbuf *m) XN_TX_LOCK_ASSERT(txq); - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || + if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0 || !netfront_carrier_ok(np)) { if (m != NULL) error = drbr_enqueue(ifp, br, m); @@ -2209,13 +2211,13 @@ xn_txq_mq_start_locked(struct netfront_txq *txq, struct mbuf *m) } static int -xn_txq_mq_start(struct ifnet *ifp, struct mbuf *m) +xn_txq_mq_start(if_t ifp, struct mbuf *m) { struct netfront_info *np; struct netfront_txq *txq; int i, npairs, error; - np = ifp->if_softc; + np = if_getsoftc(ifp); npairs = np->num_queues; if (!netfront_carrier_ok(np)) @@ -2243,14 +2245,14 @@ xn_txq_mq_start(struct ifnet *ifp, struct mbuf *m) } static void -xn_qflush(struct ifnet *ifp) +xn_qflush(if_t ifp) { struct netfront_info *np; struct netfront_txq *txq; struct mbuf *m; int i; - np = ifp->if_softc; + np = if_getsoftc(ifp); for (i = 0; i < np->num_queues; i++) { txq = &np->txq[i]; @@ -2273,7 +2275,7 @@ create_netdev(device_t dev) { struct netfront_info *np; int err; - struct ifnet *ifp; + if_t ifp; np = device_get_softc(dev); @@ -2291,25 +2293,26 @@ create_netdev(device_t dev) /* Set up ifnet structure */ ifp = np->xn_ifp = if_alloc(IFT_ETHER); - ifp->if_softc = np; - if_initname(ifp, "xn", device_get_unit(dev)); - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; - ifp->if_ioctl = xn_ioctl; + if_setsoftc(ifp, np); + if_initname(ifp, "xn", device_get_unit(dev)); + if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST); + if_setioctlfn(ifp, xn_ioctl); - ifp->if_transmit = xn_txq_mq_start; - ifp->if_qflush = xn_qflush; + if_settransmitfn(ifp, xn_txq_mq_start); + if_setqflushfn(ifp, xn_qflush); - ifp->if_init = xn_ifinit; + if_setinitfn(ifp, xn_ifinit); - ifp->if_hwassist = XN_CSUM_FEATURES; + if_sethwassist(ifp, XN_CSUM_FEATURES); /* Enable all supported features at device creation. */ - ifp->if_capenable = ifp->if_capabilities = - IFCAP_HWCSUM|IFCAP_TSO4|IFCAP_LRO; - ifp->if_hw_tsomax = 65536 - (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN); - ifp->if_hw_tsomaxsegcount = MAX_TX_REQ_FRAGS; - ifp->if_hw_tsomaxsegsize = PAGE_SIZE; + if_setcapabilities(ifp, IFCAP_HWCSUM|IFCAP_TSO4|IFCAP_LRO); + if_setcapenable(ifp, if_getcapabilities(ifp)); + + if_sethwtsomax(ifp, 65536 - (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN)); + if_sethwtsomaxsegcount(ifp, MAX_TX_REQ_FRAGS); + if_sethwtsomaxsegsize(ifp, PAGE_SIZE); - ether_ifattach(ifp, np->mac); + ether_ifattach(ifp, np->mac); netfront_carrier_off(np); err = bus_dma_tag_create( @@ -2383,14 +2386,14 @@ netif_disconnect_backend(struct netfront_info *np) } static int -xn_ifmedia_upd(struct ifnet *ifp) +xn_ifmedia_upd(if_t ifp) { return (0); } static void -xn_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) +xn_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr) { ifmr->ifm_status = IFM_AVALID|IFM_ACTIVE;