Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 May 2023 18:46:51 GMT
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 4db5958a0691 - main - Mechanically convert if_hn(4) to IfAPI
Message-ID:  <202305021846.342IkpjX009193@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by jhibbits:

URL: https://cgit.FreeBSD.org/src/commit/?id=4db5958a0691755dbf232801d2f58f4bec0aeeb5

commit 4db5958a0691755dbf232801d2f58f4bec0aeeb5
Author:     Justin Hibbits <jhibbits@FreeBSD.org>
AuthorDate: 2022-09-26 14:34:28 +0000
Commit:     Justin Hibbits <jhibbits@FreeBSD.org>
CommitDate: 2023-05-02 18:34:47 +0000

    Mechanically convert if_hn(4) to IfAPI
    
    Reviewed by:    zlei
    Sponsored by:   Juniper Networks, Inc.
    Differential Revision: https://reviews.freebsd.org/D37855
---
 sys/dev/hyperv/netvsc/if_hn.c    | 663 +++++++++++++++++++++------------------
 sys/dev/hyperv/netvsc/if_hnvar.h |  10 +-
 2 files changed, 355 insertions(+), 318 deletions(-)

diff --git a/sys/dev/hyperv/netvsc/if_hn.c b/sys/dev/hyperv/netvsc/if_hn.c
index bd64d64963de..5d7002b8f65f 100644
--- a/sys/dev/hyperv/netvsc/if_hn.c
+++ b/sys/dev/hyperv/netvsc/if_hn.c
@@ -158,7 +158,7 @@ __FBSDID("$FreeBSD$");
 #define HN_LRO_LENLIM_MULTIRX_DEF	(12 * ETHERMTU)
 #define HN_LRO_LENLIM_DEF		(25 * ETHERMTU)
 /* YYY 2*MTU is a bit rough, but should be good enough. */
-#define HN_LRO_LENLIM_MIN(ifp)		(2 * (ifp)->if_mtu)
+#define HN_LRO_LENLIM_MIN(ifp)		(2 * if_getmtu(ifp))
 
 #define HN_LRO_ACKCNT_DEF		1
 
@@ -247,7 +247,7 @@ struct hn_rxinfo {
 
 struct hn_rxvf_setarg {
 	struct hn_rx_ring	*rxr;
-	struct ifnet		*vf_ifp;
+	if_t			vf_ifp;
 };
 
 #define HN_RXINFO_VLAN			0x0001
@@ -270,29 +270,29 @@ static void			hn_chan_callback(struct vmbus_channel *,
 				    void *);
 
 static void			hn_init(void *);
-static int			hn_ioctl(struct ifnet *, u_long, caddr_t);
+static int			hn_ioctl(if_t, u_long, caddr_t);
 #ifdef HN_IFSTART_SUPPORT
-static void			hn_start(struct ifnet *);
+static void			hn_start(if_t);
 #endif
-static int			hn_transmit(struct ifnet *, struct mbuf *);
-static void			hn_xmit_qflush(struct ifnet *);
-static int			hn_ifmedia_upd(struct ifnet *);
-static void			hn_ifmedia_sts(struct ifnet *,
+static int			hn_transmit(if_t, struct mbuf *);
+static void			hn_xmit_qflush(if_t);
+static int			hn_ifmedia_upd(if_t);
+static void			hn_ifmedia_sts(if_t,
 				    struct ifmediareq *);
 
-static void			hn_ifnet_event(void *, struct ifnet *, int);
-static void			hn_ifaddr_event(void *, struct ifnet *);
-static void			hn_ifnet_attevent(void *, struct ifnet *);
-static void			hn_ifnet_detevent(void *, struct ifnet *);
-static void			hn_ifnet_lnkevent(void *, struct ifnet *, int);
+static void			hn_ifnet_event(void *, if_t, int);
+static void			hn_ifaddr_event(void *, if_t);
+static void			hn_ifnet_attevent(void *, if_t);
+static void			hn_ifnet_detevent(void *, if_t);
+static void			hn_ifnet_lnkevent(void *, if_t, int);
 
 static bool			hn_ismyvf(const struct hn_softc *,
-				    const struct ifnet *);
+				    const if_t);
 static void			hn_rxvf_change(struct hn_softc *,
-				    struct ifnet *, bool);
-static void			hn_rxvf_set(struct hn_softc *, struct ifnet *);
+				    if_t, bool);
+static void			hn_rxvf_set(struct hn_softc *, if_t);
 static void			hn_rxvf_set_task(void *, int);
-static void			hn_xpnt_vf_input(struct ifnet *, struct mbuf *);
+static void			hn_xpnt_vf_input(if_t, struct mbuf *);
 static int			hn_xpnt_vf_iocsetflags(struct hn_softc *);
 static int			hn_xpnt_vf_iocsetcaps(struct hn_softc *,
 				    struct ifreq *);
@@ -416,9 +416,9 @@ static void			hn_destroy_tx_data(struct hn_softc *);
 static void			hn_txdesc_dmamap_destroy(struct hn_txdesc *);
 static void			hn_txdesc_gc(struct hn_tx_ring *,
 				    struct hn_txdesc *);
-static int			hn_encap(struct ifnet *, struct hn_tx_ring *,
+static int			hn_encap(if_t, struct hn_tx_ring *,
 				    struct hn_txdesc *, struct mbuf **);
-static int			hn_txpkt(struct ifnet *, struct hn_tx_ring *,
+static int			hn_txpkt(if_t, struct hn_tx_ring *,
 				    struct hn_txdesc *);
 static void			hn_set_chim_size(struct hn_softc *, int);
 static void			hn_set_tso_maxsize(struct hn_softc *, int, int);
@@ -426,7 +426,7 @@ static bool			hn_tx_ring_pending(struct hn_tx_ring *);
 static void			hn_tx_ring_qflush(struct hn_tx_ring *);
 static void			hn_resume_tx(struct hn_softc *, int);
 static void			hn_set_txagg(struct hn_softc *);
-static void			*hn_try_txagg(struct ifnet *,
+static void			*hn_try_txagg(if_t,
 				    struct hn_tx_ring *, struct hn_txdesc *,
 				    int);
 static int			hn_get_txswq_depth(const struct hn_tx_ring *);
@@ -617,7 +617,7 @@ static struct taskqueue		**hn_tx_taskque;/* shared TX taskqueues */
 
 static struct rmlock		hn_vfmap_lock;
 static int			hn_vfmap_size;
-static struct ifnet		**hn_vfmap;
+static if_t			*hn_vfmap;
 
 #ifndef RSS
 static const uint8_t
@@ -923,7 +923,7 @@ hn_set_rxfilter(struct hn_softc *sc, uint32_t filter)
 static int
 hn_rxfilter_config(struct hn_softc *sc)
 {
-	struct ifnet *ifp = sc->hn_ifp;
+	if_t ifp = sc->hn_ifp;
 	uint32_t filter;
 
 	HN_LOCK_ASSERT(sc);
@@ -933,15 +933,15 @@ hn_rxfilter_config(struct hn_softc *sc)
 	 * its RX filter is configured, so stick the synthetic device in
 	 * the promiscous mode.
 	 */
-	if ((ifp->if_flags & IFF_PROMISC) || (sc->hn_flags & HN_FLAG_RXVF)) {
+	if ((if_getflags(ifp) & IFF_PROMISC) || (sc->hn_flags & HN_FLAG_RXVF)) {
 		filter = NDIS_PACKET_TYPE_PROMISCUOUS;
 	} else {
 		filter = NDIS_PACKET_TYPE_DIRECTED;
-		if (ifp->if_flags & IFF_BROADCAST)
+		if (if_getflags(ifp) & IFF_BROADCAST)
 			filter |= NDIS_PACKET_TYPE_BROADCAST;
 		/* TODO: support multicast list */
-		if ((ifp->if_flags & IFF_ALLMULTI) ||
-		    !CK_STAILQ_EMPTY(&ifp->if_multiaddrs))
+		if ((if_getflags(ifp) & IFF_ALLMULTI) ||
+		    !if_maddr_empty(ifp))
 			filter |= NDIS_PACKET_TYPE_ALL_MULTICAST;
 	}
 	return (hn_set_rxfilter(sc, filter));
@@ -1098,16 +1098,16 @@ hn_rss_ind_fixup(struct hn_softc *sc)
 }
 
 static int
-hn_ifmedia_upd(struct ifnet *ifp __unused)
+hn_ifmedia_upd(if_t ifp __unused)
 {
 
 	return EOPNOTSUPP;
 }
 
 static void
-hn_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
+hn_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr)
 {
-	struct hn_softc *sc = ifp->if_softc;
+	struct hn_softc *sc = if_getsoftc(ifp);
 
 	ifmr->ifm_status = IFM_AVALID;
 	ifmr->ifm_active = IFM_ETHER;
@@ -1129,7 +1129,7 @@ hn_rxvf_set_task(void *xarg, int pending __unused)
 }
 
 static void
-hn_rxvf_set(struct hn_softc *sc, struct ifnet *vf_ifp)
+hn_rxvf_set(struct hn_softc *sc, if_t vf_ifp)
 {
 	struct hn_rx_ring *rxr;
 	struct hn_rxvf_setarg arg;
@@ -1154,40 +1154,40 @@ hn_rxvf_set(struct hn_softc *sc, struct ifnet *vf_ifp)
 }
 
 static bool
-hn_ismyvf(const struct hn_softc *sc, const struct ifnet *ifp)
+hn_ismyvf(const struct hn_softc *sc, const if_t ifp)
 {
-	const struct ifnet *hn_ifp;
+	if_t hn_ifp;
 
 	hn_ifp = sc->hn_ifp;
 
 	if (ifp == hn_ifp)
 		return (false);
 
-	if (ifp->if_alloctype != IFT_ETHER)
+	if (if_getalloctype(ifp) != IFT_ETHER)
 		return (false);
 
 	/* Ignore lagg/vlan interfaces */
-	if (strcmp(ifp->if_dname, "lagg") == 0 ||
-	    strcmp(ifp->if_dname, "vlan") == 0)
+	if (strcmp(if_getdname(ifp), "lagg") == 0 ||
+	    strcmp(if_getdname(ifp), "vlan") == 0)
 		return (false);
 
 	/*
-	 * During detach events ifp->if_addr might be NULL.
+	 * During detach events if_getifaddr(ifp) might be NULL.
 	 * Make sure the bcmp() below doesn't panic on that:
 	 */
-	if (ifp->if_addr == NULL || hn_ifp->if_addr == NULL)
+	if (if_getifaddr(ifp) == NULL || if_getifaddr(hn_ifp) == NULL)
 		return (false);
 
-	if (bcmp(IF_LLADDR(ifp), IF_LLADDR(hn_ifp), ETHER_ADDR_LEN) != 0)
+	if (bcmp(if_getlladdr(ifp), if_getlladdr(hn_ifp), ETHER_ADDR_LEN) != 0)
 		return (false);
 
 	return (true);
 }
 
 static void
-hn_rxvf_change(struct hn_softc *sc, struct ifnet *ifp, bool rxvf)
+hn_rxvf_change(struct hn_softc *sc, if_t ifp, bool rxvf)
 {
-	struct ifnet *hn_ifp;
+	if_t hn_ifp;
 
 	HN_LOCK(sc);
 
@@ -1209,7 +1209,7 @@ hn_rxvf_change(struct hn_softc *sc, struct ifnet *ifp, bool rxvf)
 			goto out;
 
 		sc->hn_flags &= ~HN_FLAG_RXVF;
-		if (hn_ifp->if_drv_flags & IFF_DRV_RUNNING)
+		if (if_getdrvflags(hn_ifp) & IFF_DRV_RUNNING)
 			hn_rxfilter_config(sc);
 		else
 			hn_set_rxfilter(sc, NDIS_PACKET_TYPE_NONE);
@@ -1231,19 +1231,19 @@ hn_rxvf_change(struct hn_softc *sc, struct ifnet *ifp, bool rxvf)
 		hn_resume_mgmt(sc);
 	}
 
-	devctl_notify("HYPERV_NIC_VF", hn_ifp->if_xname,
+	devctl_notify("HYPERV_NIC_VF", if_name(hn_ifp),
 	    rxvf ? "VF_UP" : "VF_DOWN", NULL);
 
 	if (bootverbose) {
 		if_printf(hn_ifp, "datapath is switched %s %s\n",
-		    rxvf ? "to" : "from", ifp->if_xname);
+		    rxvf ? "to" : "from", if_name(ifp));
 	}
 out:
 	HN_UNLOCK(sc);
 }
 
 static void
-hn_ifnet_event(void *arg, struct ifnet *ifp, int event)
+hn_ifnet_event(void *arg, if_t ifp, int event)
 {
 
 	if (event != IFNET_EVENT_UP && event != IFNET_EVENT_DOWN)
@@ -1252,16 +1252,16 @@ hn_ifnet_event(void *arg, struct ifnet *ifp, int event)
 }
 
 static void
-hn_ifaddr_event(void *arg, struct ifnet *ifp)
+hn_ifaddr_event(void *arg, if_t ifp)
 {
 
-	hn_rxvf_change(arg, ifp, ifp->if_flags & IFF_UP);
+	hn_rxvf_change(arg, ifp, if_getflags(ifp) & IFF_UP);
 }
 
 static int
 hn_xpnt_vf_iocsetcaps(struct hn_softc *sc, struct ifreq *ifr)
 {
-	struct ifnet *ifp, *vf_ifp;
+	if_t ifp, vf_ifp;
 	uint64_t tmp;
 	int error;
 
@@ -1273,9 +1273,9 @@ hn_xpnt_vf_iocsetcaps(struct hn_softc *sc, struct ifreq *ifr)
 	 * Fix up requested capabilities w/ supported capabilities,
 	 * since the supported capabilities could have been changed.
 	 */
-	ifr->ifr_reqcap &= ifp->if_capabilities;
+	ifr->ifr_reqcap &= if_getcapabilities(ifp);
 	/* Pass SIOCSIFCAP to VF. */
-	error = vf_ifp->if_ioctl(vf_ifp, SIOCSIFCAP, (caddr_t)ifr);
+	error = ifhwioctl(SIOCSIFCAP, vf_ifp, (caddr_t)ifr, curthread);
 
 	/*
 	 * NOTE:
@@ -1286,31 +1286,31 @@ hn_xpnt_vf_iocsetcaps(struct hn_softc *sc, struct ifreq *ifr)
 	/*
 	 * Merge VF's enabled capabilities.
 	 */
-	ifp->if_capenable = vf_ifp->if_capenable & ifp->if_capabilities;
+	if_setcapenable(ifp, if_getcapenable(vf_ifp) & if_getcapabilities(ifp));
 
-	tmp = vf_ifp->if_hwassist & HN_CSUM_IP_HWASSIST(sc);
-	if (ifp->if_capenable & IFCAP_TXCSUM)
-		ifp->if_hwassist |= tmp;
+	tmp = if_gethwassist(vf_ifp) & HN_CSUM_IP_HWASSIST(sc);
+	if (if_getcapenable(ifp) & IFCAP_TXCSUM)
+		if_sethwassistbits(ifp, tmp, 0);
 	else
-		ifp->if_hwassist &= ~tmp;
+		if_sethwassistbits(ifp, 0, tmp);
 
-	tmp = vf_ifp->if_hwassist & HN_CSUM_IP6_HWASSIST(sc);
-	if (ifp->if_capenable & IFCAP_TXCSUM_IPV6)
-		ifp->if_hwassist |= tmp;
+	tmp = if_gethwassist(vf_ifp) & HN_CSUM_IP6_HWASSIST(sc);
+	if (if_getcapenable(ifp) & IFCAP_TXCSUM_IPV6)
+		if_sethwassistbits(ifp, tmp, 0);
 	else
-		ifp->if_hwassist &= ~tmp;
+		if_sethwassistbits(ifp, 0, tmp);
 
-	tmp = vf_ifp->if_hwassist & CSUM_IP_TSO;
-	if (ifp->if_capenable & IFCAP_TSO4)
-		ifp->if_hwassist |= tmp;
+	tmp = if_gethwassist(vf_ifp) & CSUM_IP_TSO;
+	if (if_getcapenable(ifp) & IFCAP_TSO4)
+		if_sethwassistbits(ifp, tmp, 0);
 	else
-		ifp->if_hwassist &= ~tmp;
+		if_sethwassistbits(ifp, 0, tmp);
 
-	tmp = vf_ifp->if_hwassist & CSUM_IP6_TSO;
-	if (ifp->if_capenable & IFCAP_TSO6)
-		ifp->if_hwassist |= tmp;
+	tmp = if_gethwassist(vf_ifp) & CSUM_IP6_TSO;
+	if (if_getcapenable(ifp) & IFCAP_TSO6)
+		if_sethwassistbits(ifp, tmp, 0);
 	else
-		ifp->if_hwassist &= ~tmp;
+		if_sethwassistbits(ifp, 0, tmp);
 
 	return (error);
 }
@@ -1318,48 +1318,48 @@ hn_xpnt_vf_iocsetcaps(struct hn_softc *sc, struct ifreq *ifr)
 static int
 hn_xpnt_vf_iocsetflags(struct hn_softc *sc)
 {
-	struct ifnet *vf_ifp;
+	if_t vf_ifp;
 	struct ifreq ifr;
 
 	HN_LOCK_ASSERT(sc);
 	vf_ifp = sc->hn_vf_ifp;
 
 	memset(&ifr, 0, sizeof(ifr));
-	strlcpy(ifr.ifr_name, vf_ifp->if_xname, sizeof(ifr.ifr_name));
-	ifr.ifr_flags = vf_ifp->if_flags & 0xffff;
-	ifr.ifr_flagshigh = vf_ifp->if_flags >> 16;
-	return (vf_ifp->if_ioctl(vf_ifp, SIOCSIFFLAGS, (caddr_t)&ifr));
+	strlcpy(ifr.ifr_name, if_name(vf_ifp), sizeof(ifr.ifr_name));
+	ifr.ifr_flags = if_getflags(vf_ifp) & 0xffff;
+	ifr.ifr_flagshigh = if_getflags(vf_ifp) >> 16;
+	return (ifhwioctl(SIOCSIFFLAGS, vf_ifp, (caddr_t)&ifr, curthread));
 }
 
 static void
 hn_xpnt_vf_saveifflags(struct hn_softc *sc)
 {
-	struct ifnet *ifp = sc->hn_ifp;
+	if_t ifp = sc->hn_ifp;
 	int allmulti = 0;
 
 	HN_LOCK_ASSERT(sc);
 
 	/* XXX vlan(4) style mcast addr maintenance */
-	if (!CK_STAILQ_EMPTY(&ifp->if_multiaddrs))
+	if (!if_maddr_empty(ifp))
 		allmulti = IFF_ALLMULTI;
 
 	/* Always set the VF's if_flags */
-	sc->hn_vf_ifp->if_flags = ifp->if_flags | allmulti;
+	if_setflags(sc->hn_vf_ifp, if_getflags(ifp) | allmulti);
 }
 
 static void
-hn_xpnt_vf_input(struct ifnet *vf_ifp, struct mbuf *m)
+hn_xpnt_vf_input(if_t vf_ifp, struct mbuf *m)
 {
 	struct rm_priotracker pt;
-	struct ifnet *hn_ifp = NULL;
+	if_t hn_ifp = NULL;
 	struct mbuf *mn;
 
 	/*
 	 * XXX racy, if hn(4) ever detached.
 	 */
 	rm_rlock(&hn_vfmap_lock, &pt);
-	if (vf_ifp->if_index < hn_vfmap_size)
-		hn_ifp = hn_vfmap[vf_ifp->if_index];
+	if (if_getindex(vf_ifp) < hn_vfmap_size)
+		hn_ifp = hn_vfmap[if_getindex(vf_ifp)];
 	rm_runlock(&hn_vfmap_lock, &pt);
 
 	if (hn_ifp != NULL) {
@@ -1372,7 +1372,7 @@ hn_xpnt_vf_input(struct ifnet *vf_ifp, struct mbuf *m)
 			/*
 			 * Update VF stats.
 			 */
-			if ((vf_ifp->if_capenable & IFCAP_HWSTATS) == 0) {
+			if ((if_getcapenable(vf_ifp) & IFCAP_HWSTATS) == 0) {
 				if_inc_counter(vf_ifp, IFCOUNTER_IBYTES,
 				    mn->m_pkthdr.len);
 			}
@@ -1394,7 +1394,7 @@ hn_xpnt_vf_input(struct ifnet *vf_ifp, struct mbuf *m)
 		/*
 		 * Go through hn(4)'s if_input.
 		 */
-		hn_ifp->if_input(hn_ifp, m);
+		if_input(hn_ifp, m);
 	} else {
 		/*
 		 * In the middle of the transition; free this
@@ -1412,12 +1412,12 @@ hn_xpnt_vf_input(struct ifnet *vf_ifp, struct mbuf *m)
 static void
 hn_mtu_change_fixup(struct hn_softc *sc)
 {
-	struct ifnet *ifp;
+	if_t ifp;
 
 	HN_LOCK_ASSERT(sc);
 	ifp = sc->hn_ifp;
 
-	hn_set_tso_maxsize(sc, hn_tso_maxlen, ifp->if_mtu);
+	hn_set_tso_maxsize(sc, hn_tso_maxlen, if_getmtu(ifp));
 	if (sc->hn_rx_ring[0].hn_lro.lro_length_lim < HN_LRO_LENLIM_MIN(ifp))
 		hn_set_lro_lenlim(sc, HN_LRO_LENLIM_MIN(ifp));
 }
@@ -1483,7 +1483,7 @@ hn_rss_mbuf_hash(struct hn_softc *sc, uint32_t mbuf_hash)
 static void
 hn_vf_rss_fixup(struct hn_softc *sc, bool reconf)
 {
-	struct ifnet *ifp, *vf_ifp;
+	if_t ifp, vf_ifp;
 	struct ifrsshash ifrh;
 	struct ifrsskey ifrk;
 	int error;
@@ -1491,7 +1491,7 @@ hn_vf_rss_fixup(struct hn_softc *sc, bool reconf)
 
 	HN_LOCK_ASSERT(sc);
 	KASSERT(sc->hn_flags & HN_FLAG_SYNTH_ATTACHED,
-	    ("%s: synthetic parts are not attached", sc->hn_ifp->if_xname));
+	    ("%s: synthetic parts are not attached", if_name(sc->hn_ifp)));
 
 	if (sc->hn_rx_ring_inuse == 1) {
 		/* No RSS on synthetic parts; done. */
@@ -1510,21 +1510,21 @@ hn_vf_rss_fixup(struct hn_softc *sc, bool reconf)
 	 * supported.
 	 */
 	memset(&ifrk, 0, sizeof(ifrk));
-	strlcpy(ifrk.ifrk_name, vf_ifp->if_xname, sizeof(ifrk.ifrk_name));
-	error = vf_ifp->if_ioctl(vf_ifp, SIOCGIFRSSKEY, (caddr_t)&ifrk);
+	strlcpy(ifrk.ifrk_name, if_name(vf_ifp), sizeof(ifrk.ifrk_name));
+	error = ifhwioctl(SIOCGIFRSSKEY, vf_ifp, (caddr_t)&ifrk, curthread);
 	if (error) {
 		if_printf(ifp, "%s SIOCGIFRSSKEY failed: %d\n",
-		    vf_ifp->if_xname, error);
+		    if_name(vf_ifp), error);
 		goto done;
 	}
 	if (ifrk.ifrk_func != RSS_FUNC_TOEPLITZ) {
 		if_printf(ifp, "%s RSS function %u is not Toeplitz\n",
-		    vf_ifp->if_xname, ifrk.ifrk_func);
+		    if_name(vf_ifp), ifrk.ifrk_func);
 		goto done;
 	}
 	if (ifrk.ifrk_keylen != NDIS_HASH_KEYSIZE_TOEPLITZ) {
 		if_printf(ifp, "%s invalid RSS Toeplitz key length %d\n",
-		    vf_ifp->if_xname, ifrk.ifrk_keylen);
+		    if_name(vf_ifp), ifrk.ifrk_keylen);
 		goto done;
 	}
 
@@ -1532,16 +1532,16 @@ hn_vf_rss_fixup(struct hn_softc *sc, bool reconf)
 	 * Extract VF's RSS hash.  Only Toeplitz is supported.
 	 */
 	memset(&ifrh, 0, sizeof(ifrh));
-	strlcpy(ifrh.ifrh_name, vf_ifp->if_xname, sizeof(ifrh.ifrh_name));
-	error = vf_ifp->if_ioctl(vf_ifp, SIOCGIFRSSHASH, (caddr_t)&ifrh);
+	strlcpy(ifrh.ifrh_name, if_name(vf_ifp), sizeof(ifrh.ifrh_name));
+	error = ifhwioctl(SIOCGIFRSSHASH, vf_ifp, (caddr_t)&ifrh, curthread);
 	if (error) {
 		if_printf(ifp, "%s SIOCGRSSHASH failed: %d\n",
-		    vf_ifp->if_xname, error);
+		    if_name(vf_ifp), error);
 		goto done;
 	}
 	if (ifrh.ifrh_func != RSS_FUNC_TOEPLITZ) {
 		if_printf(ifp, "%s RSS function %u is not Toeplitz\n",
-		    vf_ifp->if_xname, ifrh.ifrh_func);
+		    if_name(vf_ifp), ifrh.ifrh_func);
 		goto done;
 	}
 
@@ -1549,7 +1549,7 @@ hn_vf_rss_fixup(struct hn_softc *sc, bool reconf)
 	if ((ifrh.ifrh_types & my_types) == 0) {
 		/* This disables RSS; ignore it then */
 		if_printf(ifp, "%s intersection of RSS types failed.  "
-		    "VF %#x, mine %#x\n", vf_ifp->if_xname,
+		    "VF %#x, mine %#x\n", if_name(vf_ifp),
 		    ifrh.ifrh_types, my_types);
 		goto done;
 	}
@@ -1650,7 +1650,7 @@ hn_vf_rss_restore(struct hn_softc *sc)
 
 	HN_LOCK_ASSERT(sc);
 	KASSERT(sc->hn_flags & HN_FLAG_SYNTH_ATTACHED,
-	    ("%s: synthetic parts are not attached", sc->hn_ifp->if_xname));
+	    ("%s: synthetic parts are not attached", if_name(sc->hn_ifp)));
 
 	if (sc->hn_rx_ring_inuse == 1)
 		goto done;
@@ -1677,7 +1677,7 @@ done:
 static void
 hn_xpnt_vf_setready(struct hn_softc *sc)
 {
-	struct ifnet *ifp, *vf_ifp;
+	if_t ifp, vf_ifp;
 	struct ifreq ifr;
 
 	HN_LOCK_ASSERT(sc);
@@ -1692,10 +1692,10 @@ hn_xpnt_vf_setready(struct hn_softc *sc)
 	/*
 	 * Save information for restoration.
 	 */
-	sc->hn_saved_caps = ifp->if_capabilities;
-	sc->hn_saved_tsomax = ifp->if_hw_tsomax;
-	sc->hn_saved_tsosegcnt = ifp->if_hw_tsomaxsegcount;
-	sc->hn_saved_tsosegsz = ifp->if_hw_tsomaxsegsize;
+	sc->hn_saved_caps = if_getcapabilities(ifp);
+	sc->hn_saved_tsomax = if_gethwtsomax(ifp);
+	sc->hn_saved_tsosegcnt = if_gethwtsomaxsegcount(ifp);
+	sc->hn_saved_tsosegsz = if_gethwtsomaxsegsize(ifp);
 
 	/*
 	 * Intersect supported/enabled capabilities.
@@ -1703,41 +1703,41 @@ hn_xpnt_vf_setready(struct hn_softc *sc)
 	 * NOTE:
 	 * if_hwassist is not changed here.
 	 */
-	ifp->if_capabilities &= vf_ifp->if_capabilities;
-	ifp->if_capenable &= ifp->if_capabilities;
+	if_setcapabilitiesbit(ifp, 0, if_getcapabilities(vf_ifp));
+	if_setcapenablebit(ifp, 0, if_getcapabilities(ifp));
 
 	/*
 	 * Fix TSO settings.
 	 */
-	if (ifp->if_hw_tsomax > vf_ifp->if_hw_tsomax)
-		ifp->if_hw_tsomax = vf_ifp->if_hw_tsomax;
-	if (ifp->if_hw_tsomaxsegcount > vf_ifp->if_hw_tsomaxsegcount)
-		ifp->if_hw_tsomaxsegcount = vf_ifp->if_hw_tsomaxsegcount;
-	if (ifp->if_hw_tsomaxsegsize > vf_ifp->if_hw_tsomaxsegsize)
-		ifp->if_hw_tsomaxsegsize = vf_ifp->if_hw_tsomaxsegsize;
+	if (if_gethwtsomax(ifp) > if_gethwtsomax(vf_ifp))
+		if_sethwtsomax(ifp, if_gethwtsomax(vf_ifp));
+	if (if_gethwtsomaxsegcount(ifp) > if_gethwtsomaxsegcount(vf_ifp))
+		if_sethwtsomaxsegcount(ifp, if_gethwtsomaxsegcount(vf_ifp));
+	if (if_gethwtsomaxsegsize(ifp) > if_gethwtsomaxsegsize(vf_ifp))
+		if_sethwtsomaxsegsize(ifp, if_gethwtsomaxsegsize(vf_ifp));
 
 	/*
 	 * Change VF's enabled capabilities.
 	 */
 	memset(&ifr, 0, sizeof(ifr));
-	strlcpy(ifr.ifr_name, vf_ifp->if_xname, sizeof(ifr.ifr_name));
-	ifr.ifr_reqcap = ifp->if_capenable;
+	strlcpy(ifr.ifr_name, if_name(vf_ifp), sizeof(ifr.ifr_name));
+	ifr.ifr_reqcap = if_getcapenable(ifp);
 	hn_xpnt_vf_iocsetcaps(sc, &ifr);
 
-	if (ifp->if_mtu != ETHERMTU) {
+	if (if_getmtu(ifp) != ETHERMTU) {
 		int error;
 
 		/*
 		 * Change VF's MTU.
 		 */
 		memset(&ifr, 0, sizeof(ifr));
-		strlcpy(ifr.ifr_name, vf_ifp->if_xname, sizeof(ifr.ifr_name));
-		ifr.ifr_mtu = ifp->if_mtu;
-		error = vf_ifp->if_ioctl(vf_ifp, SIOCSIFMTU, (caddr_t)&ifr);
+		strlcpy(ifr.ifr_name, if_name(vf_ifp), sizeof(ifr.ifr_name));
+		ifr.ifr_mtu = if_getmtu(ifp);
+		error = ifhwioctl(SIOCSIFMTU, vf_ifp, (caddr_t)&ifr, curthread);
 		if (error) {
 			if_printf(ifp, "%s SIOCSIFMTU %u failed\n",
-			    vf_ifp->if_xname, ifp->if_mtu);
-			if (ifp->if_mtu > ETHERMTU) {
+			    if_name(vf_ifp), if_getmtu(ifp));
+			if (if_getmtu(ifp) > ETHERMTU) {
 				if_printf(ifp, "change MTU to %d\n", ETHERMTU);
 
 				/*
@@ -1746,7 +1746,7 @@ hn_xpnt_vf_setready(struct hn_softc *sc)
 				 * failure of the adjustment will cause us
 				 * infinite headache.
 				 */
-				ifp->if_mtu = ETHERMTU;
+				if_setmtu(ifp, ETHERMTU);
 				hn_mtu_change_fixup(sc);
 			}
 		}
@@ -1815,22 +1815,22 @@ hn_xpnt_vf_init(struct hn_softc *sc)
 	HN_LOCK_ASSERT(sc);
 
 	KASSERT((sc->hn_xvf_flags & HN_XVFFLAG_ENABLED) == 0,
-	    ("%s: transparent VF was enabled", sc->hn_ifp->if_xname));
+	    ("%s: transparent VF was enabled", if_name(sc->hn_ifp)));
 
 	if (bootverbose) {
 		if_printf(sc->hn_ifp, "try bringing up %s\n",
-		    sc->hn_vf_ifp->if_xname);
+		    if_name(sc->hn_vf_ifp));
 	}
 
 	/*
 	 * Bring the VF up.
 	 */
 	hn_xpnt_vf_saveifflags(sc);
-	sc->hn_vf_ifp->if_flags |= IFF_UP;
+	if_setflagbits(sc->hn_ifp, IFF_UP, 0);
 	error = hn_xpnt_vf_iocsetflags(sc);
 	if (error) {
 		if_printf(sc->hn_ifp, "bringing up %s failed: %d\n",
-		    sc->hn_vf_ifp->if_xname, error);
+		    if_name(sc->hn_vf_ifp), error);
 		return;
 	}
 
@@ -1870,13 +1870,13 @@ hn_xpnt_vf_init_taskfunc(void *xsc, int pending __unused)
 		hn_xpnt_vf_setready(sc);
 	}
 
-	if (sc->hn_ifp->if_drv_flags & IFF_DRV_RUNNING) {
+	if (if_getdrvflags(sc->hn_ifp) & IFF_DRV_RUNNING) {
 		/*
 		 * Delayed VF initialization.
 		 */
 		if (bootverbose) {
 			if_printf(sc->hn_ifp, "delayed initialize %s\n",
-			    sc->hn_vf_ifp->if_xname);
+			    if_name(sc->hn_vf_ifp));
 		}
 		hn_xpnt_vf_init(sc);
 	}
@@ -1885,7 +1885,7 @@ done:
 }
 
 static void
-hn_ifnet_attevent(void *xsc, struct ifnet *ifp)
+hn_ifnet_attevent(void *xsc, if_t ifp)
 {
 	struct hn_softc *sc = xsc;
 
@@ -1899,47 +1899,48 @@ hn_ifnet_attevent(void *xsc, struct ifnet *ifp)
 
 	if (sc->hn_vf_ifp != NULL) {
 		if_printf(sc->hn_ifp, "%s was attached as VF\n",
-		    sc->hn_vf_ifp->if_xname);
+		    if_name(sc->hn_vf_ifp));
 		goto done;
 	}
 
-	if (hn_xpnt_vf && ifp->if_start != NULL) {
+	if (hn_xpnt_vf && if_getstartfn(ifp) != NULL) {
 		/*
 		 * ifnet.if_start is _not_ supported by transparent
 		 * mode VF; mainly due to the IFF_DRV_OACTIVE flag.
 		 */
 		if_printf(sc->hn_ifp, "%s uses if_start, which is unsupported "
-		    "in transparent VF mode.\n", ifp->if_xname);
+		    "in transparent VF mode.\n", if_name(sc->hn_vf_ifp));
+
 		goto done;
 	}
 
 	rm_wlock(&hn_vfmap_lock);
 
-	if (ifp->if_index >= hn_vfmap_size) {
-		struct ifnet **newmap;
+	if (if_getindex(ifp) >= hn_vfmap_size) {
+		if_t *newmap;
 		int newsize;
 
-		newsize = ifp->if_index + HN_VFMAP_SIZE_DEF;
-		newmap = malloc(sizeof(struct ifnet *) * newsize, M_DEVBUF,
+		newsize = if_getindex(ifp) + HN_VFMAP_SIZE_DEF;
+		newmap = malloc(sizeof(if_t) * newsize, M_DEVBUF,
 		    M_WAITOK | M_ZERO);
 
 		memcpy(newmap, hn_vfmap,
-		    sizeof(struct ifnet *) * hn_vfmap_size);
+		    sizeof(if_t) * hn_vfmap_size);
 		free(hn_vfmap, M_DEVBUF);
 		hn_vfmap = newmap;
 		hn_vfmap_size = newsize;
 	}
-	KASSERT(hn_vfmap[ifp->if_index] == NULL,
+	KASSERT(hn_vfmap[if_getindex(ifp)] == NULL,
 	    ("%s: ifindex %d was mapped to %s",
-	     ifp->if_xname, ifp->if_index, hn_vfmap[ifp->if_index]->if_xname));
-	hn_vfmap[ifp->if_index] = sc->hn_ifp;
+	     if_name(ifp), if_getindex(ifp), if_name(hn_vfmap[if_getindex(ifp)])));
+	hn_vfmap[if_getindex(ifp)] = sc->hn_ifp;
 
 	rm_wunlock(&hn_vfmap_lock);
 
 	/* NOTE: hn_vf_lock for hn_transmit()/hn_qflush() */
 	rm_wlock(&sc->hn_vf_lock);
 	KASSERT((sc->hn_xvf_flags & HN_XVFFLAG_ENABLED) == 0,
-	    ("%s: transparent VF was enabled", sc->hn_ifp->if_xname));
+	    ("%s: transparent VF was enabled", if_name(sc->hn_ifp)));
 	sc->hn_vf_ifp = ifp;
 	rm_wunlock(&sc->hn_vf_lock);
 
@@ -1950,8 +1951,8 @@ hn_ifnet_attevent(void *xsc, struct ifnet *ifp)
 		 * Install if_input for vf_ifp, which does vf_ifp -> hn_ifp.
 		 * Save vf_ifp's current if_input for later restoration.
 		 */
-		sc->hn_vf_input = ifp->if_input;
-		ifp->if_input = hn_xpnt_vf_input;
+		sc->hn_vf_input = if_getinputfn(ifp);
+		if_setinputfn(ifp, hn_xpnt_vf_input);
 
 		/*
 		 * Stop link status management; use the VF's.
@@ -1972,7 +1973,7 @@ done:
 }
 
 static void
-hn_ifnet_detevent(void *xsc, struct ifnet *ifp)
+hn_ifnet_detevent(void *xsc, if_t ifp)
 {
 	struct hn_softc *sc = xsc;
 
@@ -2001,8 +2002,8 @@ hn_ifnet_detevent(void *xsc, struct ifnet *ifp)
 		HN_LOCK(sc);
 
 		KASSERT(sc->hn_vf_input != NULL, ("%s VF input is not saved",
-		    sc->hn_ifp->if_xname));
-		ifp->if_input = sc->hn_vf_input;
+		    if_name(sc->hn_ifp)));
+		if_setinputfn(ifp, sc->hn_vf_input);
 		sc->hn_vf_input = NULL;
 
 		if ((sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) &&
@@ -2013,7 +2014,7 @@ hn_ifnet_detevent(void *xsc, struct ifnet *ifp)
 			/*
 			 * The VF was ready; restore some settings.
 			 */
-			sc->hn_ifp->if_capabilities = sc->hn_saved_caps;
+			if_setcapabilities(ifp, sc->hn_saved_caps);
 			/*
 			 * NOTE:
 			 * There is _no_ need to fixup if_capenable and
@@ -2022,10 +2023,10 @@ hn_ifnet_detevent(void *xsc, struct ifnet *ifp)
 			 * if_capabilites and the synthetic device's
 			 * if_capabilites.
 			 */
-			sc->hn_ifp->if_hw_tsomax = sc->hn_saved_tsomax;
-			sc->hn_ifp->if_hw_tsomaxsegcount =
-			    sc->hn_saved_tsosegcnt;
-			sc->hn_ifp->if_hw_tsomaxsegsize = sc->hn_saved_tsosegsz;
+			if_sethwtsomax(ifp, sc->hn_saved_tsomax);
+			if_sethwtsomaxsegcount(sc->hn_ifp,
+			    sc->hn_saved_tsosegcnt);
+			if_sethwtsomaxsegsize(ifp, sc->hn_saved_tsosegsz);
 		}
 
 		if (sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) {
@@ -2047,14 +2048,14 @@ hn_ifnet_detevent(void *xsc, struct ifnet *ifp)
 
 	rm_wlock(&hn_vfmap_lock);
 
-	KASSERT(ifp->if_index < hn_vfmap_size,
-	    ("ifindex %d, vfmapsize %d", ifp->if_index, hn_vfmap_size));
-	if (hn_vfmap[ifp->if_index] != NULL) {
-		KASSERT(hn_vfmap[ifp->if_index] == sc->hn_ifp,
+	KASSERT(if_getindex(ifp) < hn_vfmap_size,
+	    ("ifindex %d, vfmapsize %d", if_getindex(ifp), hn_vfmap_size));
+	if (hn_vfmap[if_getindex(ifp)] != NULL) {
+		KASSERT(hn_vfmap[if_getindex(ifp)] == sc->hn_ifp,
 		    ("%s: ifindex %d was mapped to %s",
-		     ifp->if_xname, ifp->if_index,
-		     hn_vfmap[ifp->if_index]->if_xname));
-		hn_vfmap[ifp->if_index] = NULL;
+		     if_name(ifp), if_getindex(ifp),
+		     if_name(hn_vfmap[if_getindex(ifp)])));
+		hn_vfmap[if_getindex(ifp)] = NULL;
 	}
 
 	rm_wunlock(&hn_vfmap_lock);
@@ -2063,7 +2064,7 @@ done:
 }
 
 static void
-hn_ifnet_lnkevent(void *xsc, struct ifnet *ifp, int link_state)
+hn_ifnet_lnkevent(void *xsc, if_t ifp, int link_state)
 {
 	struct hn_softc *sc = xsc;
 
@@ -2071,6 +2072,42 @@ hn_ifnet_lnkevent(void *xsc, struct ifnet *ifp, int link_state)
 		if_link_state_change(sc->hn_ifp, link_state);
 }
 
+static int
+hn_tsomax_sysctl(SYSCTL_HANDLER_ARGS)
+{
+	struct hn_softc *sc = arg1;
+	unsigned int tsomax;
+	int error;
+
+	tsomax = if_gethwtsomax(sc->hn_ifp);
+	error = sysctl_handle_int(oidp, &tsomax, 0, req);
+	return error;
+}
+
+static int
+hn_tsomaxsegcnt_sysctl(SYSCTL_HANDLER_ARGS)
+{
+	struct hn_softc *sc = arg1;
+	unsigned int tsomaxsegcnt;
+	int error;
+
+	tsomaxsegcnt = if_gethwtsomaxsegcount(sc->hn_ifp);
+	error = sysctl_handle_int(oidp, &tsomaxsegcnt, 0, req);
+	return error;
+}
+
+static int
+hn_tsomaxsegsz_sysctl(SYSCTL_HANDLER_ARGS)
+{
+	struct hn_softc *sc = arg1;
+	unsigned int tsomaxsegsz;
+	int error;
+
+	tsomaxsegsz = if_gethwtsomaxsegsize(sc->hn_ifp);
+	error = sysctl_handle_int(oidp, &tsomaxsegsz, 0, req);
+	return error;
+}
+
 static int
 hn_probe(device_t dev)
 {
@@ -2089,7 +2126,7 @@ hn_attach(device_t dev)
 	struct sysctl_oid_list *child;
 	struct sysctl_ctx_list *ctx;
 	uint8_t eaddr[ETHER_ADDR_LEN];
-	struct ifnet *ifp = NULL;
+	if_t ifp = NULL;
 	int error, ring_cnt, tx_ring_cnt;
 	uint32_t mtu;
 
@@ -2156,7 +2193,7 @@ hn_attach(device_t dev)
 	 * ether_ifattach().
 	 */
 	ifp = sc->hn_ifp = if_alloc(IFT_ETHER);
-	ifp->if_softc = sc;
+	if_setsoftc(ifp, sc);
 	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
 
 	/*
@@ -2281,14 +2318,15 @@ hn_attach(device_t dev)
 	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "hwassist",
 	    CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
 	    hn_hwassist_sysctl, "A", "hwassist");
-	SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "tso_max",
-	    CTLFLAG_RD, &ifp->if_hw_tsomax, 0, "max TSO size");
-	SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "tso_maxsegcnt",
-	    CTLFLAG_RD, &ifp->if_hw_tsomaxsegcount, 0,
-	    "max # of TSO segments");
-	SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "tso_maxsegsz",
-	    CTLFLAG_RD, &ifp->if_hw_tsomaxsegsize, 0,
-	    "max size of TSO segment");
+	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tso_max",
+	    CTLTYPE_UINT | CTLFLAG_RD, sc, 0, hn_tsomax_sysctl,
+	    "IU", "max TSO size");
+	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tso_maxsegcnt",
+	    CTLTYPE_UINT | CTLFLAG_RD, sc, 0, hn_tsomaxsegcnt_sysctl,
+	    "IU", "max # of TSO segments");
+	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tso_maxsegsz",
+	    CTLTYPE_UINT | CTLFLAG_RD, sc, 0, hn_tsomaxsegsz_sysctl,
+	    "IU", "max size of TSO segment");
 	SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rxfilter",
 	    CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
 	    hn_rxfilter_sysctl, "A", "rxfilter");
@@ -2370,60 +2408,59 @@ hn_attach(device_t dev)
 	 * Setup the ifnet for this interface.
 	 */
 
-	ifp->if_baudrate = IF_Gbps(10);
-	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
-	ifp->if_ioctl = hn_ioctl;
-	ifp->if_init = hn_init;
+	if_setbaudrate(ifp, IF_Gbps(10));
+	if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
+	if_setioctlfn(ifp, hn_ioctl);
+	if_setinitfn(ifp, hn_init);
 #ifdef HN_IFSTART_SUPPORT
 	if (hn_use_if_start) {
 		int qdepth = hn_get_txswq_depth(&sc->hn_tx_ring[0]);
 
-		ifp->if_start = hn_start;
-		IFQ_SET_MAXLEN(&ifp->if_snd, qdepth);
-		ifp->if_snd.ifq_drv_maxlen = qdepth - 1;
-		IFQ_SET_READY(&ifp->if_snd);
+		if_setstartfn(ifp, hn_start);
+		if_setsendqlen(ifp, qdepth);
+		if_setsendqready(ifp);
 	} else
 #endif
 	{
-		ifp->if_transmit = hn_transmit;
-		ifp->if_qflush = hn_xmit_qflush;
+		if_settransmitfn(ifp, hn_transmit);
+		if_setqflushfn(ifp, hn_xmit_qflush);
 	}
 
-	ifp->if_capabilities |= IFCAP_RXCSUM | IFCAP_LRO | IFCAP_LINKSTATE;
+	if_setcapabilitiesbit(ifp, IFCAP_RXCSUM | IFCAP_LRO | IFCAP_LINKSTATE, 0);
 #ifdef foo
 	/* We can't diff IPv6 packets from IPv4 packets on RX path. */
-	ifp->if_capabilities |= IFCAP_RXCSUM_IPV6;
+	if_setcapabilitiesbit(ifp, IFCAP_RXCSUM_IPV6, 0);
 #endif
 	if (sc->hn_caps & HN_CAP_VLAN) {
 		/* XXX not sure about VLAN_MTU. */
-		ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
+		if_setcapabilitiesbit(ifp, IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU, 0);
 	}
 
-	ifp->if_hwassist = sc->hn_tx_ring[0].hn_csum_assist;
-	if (ifp->if_hwassist & HN_CSUM_IP_MASK)
-		ifp->if_capabilities |= IFCAP_TXCSUM;
-	if (ifp->if_hwassist & HN_CSUM_IP6_MASK)
-		ifp->if_capabilities |= IFCAP_TXCSUM_IPV6;
+	if_sethwassist(ifp, sc->hn_tx_ring[0].hn_csum_assist);
+	if (if_gethwassist(ifp) & HN_CSUM_IP_MASK)
+		if_setcapabilitiesbit(ifp, IFCAP_TXCSUM, 0);
+	if (if_gethwassist(ifp) & HN_CSUM_IP6_MASK)
+		if_setcapabilitiesbit(ifp, IFCAP_TXCSUM_IPV6, 0);
 	if (sc->hn_caps & HN_CAP_TSO4) {
-		ifp->if_capabilities |= IFCAP_TSO4;
-		ifp->if_hwassist |= CSUM_IP_TSO;
+		if_setcapabilitiesbit(ifp, IFCAP_TSO4, 0);
+		if_sethwassistbits(ifp, CSUM_IP_TSO, 0);
 	}
 	if (sc->hn_caps & HN_CAP_TSO6) {
-		ifp->if_capabilities |= IFCAP_TSO6;
-		ifp->if_hwassist |= CSUM_IP6_TSO;
+		if_setcapabilitiesbit(ifp, IFCAP_TSO6, 0);
+		if_sethwassistbits(ifp, CSUM_IP6_TSO, 0);
 	}
 
 	/* Enable all available capabilities by default. */
-	ifp->if_capenable = ifp->if_capabilities;
+	if_setcapenable(ifp, if_getcapabilities(ifp));
 
 	/*
 	 * Disable IPv6 TSO and TXCSUM by default, they still can
 	 * be enabled through SIOCSIFCAP.
 	 */
-	ifp->if_capenable &= ~(IFCAP_TXCSUM_IPV6 | IFCAP_TSO6);
-	ifp->if_hwassist &= ~(HN_CSUM_IP6_MASK | CSUM_IP6_TSO);
+	if_setcapenablebit(ifp, 0, (IFCAP_TXCSUM_IPV6 | IFCAP_TSO6));
+	if_sethwassistbits(ifp, 0, (HN_CSUM_IP6_MASK | CSUM_IP6_TSO));
 
-	if (ifp->if_capabilities & (IFCAP_TSO6 | IFCAP_TSO4)) {
+	if (if_getcapabilities(ifp) & (IFCAP_TSO6 | IFCAP_TSO4)) {
 		/*
 		 * Lock hn_set_tso_maxsize() to simplify its
 		 * internal logic.
@@ -2431,23 +2468,23 @@ hn_attach(device_t dev)
 		HN_LOCK(sc);
 		hn_set_tso_maxsize(sc, hn_tso_maxlen, ETHERMTU);
 		HN_UNLOCK(sc);
-		ifp->if_hw_tsomaxsegcount = HN_TX_DATA_SEGCNT_MAX;
-		ifp->if_hw_tsomaxsegsize = PAGE_SIZE;
+		if_sethwtsomaxsegcount(ifp, HN_TX_DATA_SEGCNT_MAX);
+		if_sethwtsomaxsegsize(ifp, PAGE_SIZE);
 	}
*** 816 LINES SKIPPED ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202305021846.342IkpjX009193>