Index: sys/dev/e1000/if_em.c =================================================================== --- sys/dev/e1000/if_em.c (revision 239685) +++ sys/dev/e1000/if_em.c (working copy) @@ -85,7 +85,7 @@ #include "e1000_api.h" #include "e1000_82571.h" #include "if_em.h" - +#include /********************************************************************* * Set this to one to display debug statistics *********************************************************************/ @@ -721,8 +721,7 @@ em_attach(device_t dev) em_get_hw_control(adapter); /* Tell the stack that the interface is not active */ - adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - adapter->ifp->if_drv_flags |= IFF_DRV_OACTIVE; + if_setdrvflagbits(adapter->ifp, IFF_DRV_OACTIVE, IFF_DRV_RUNNING); adapter->led_dev = led_create(em_led_func, adapter, device_get_nameunit(dev)); @@ -767,13 +766,13 @@ em_detach(device_t dev) INIT_DEBUGOUT("em_detach: begin"); /* Make sure VLANS are not using driver */ - if (adapter->ifp->if_vlantrunk != NULL) { + if (if_vlantrunkinuse(ifp)) { device_printf(dev,"Vlan in use, detach first\n"); return (EBUSY); } #ifdef DEVICE_POLLING - if (ifp->if_capenable & IFCAP_POLLING) + if (if_getcapenable(ifp) & IFCAP_POLLING) ether_poll_deregister(ifp); #endif @@ -861,15 +860,15 @@ em_resume(device_t dev) em_init_locked(adapter); em_init_manageability(adapter); - if ((ifp->if_flags & IFF_UP) && - (ifp->if_drv_flags & IFF_DRV_RUNNING) && adapter->link_active) { + if ((if_getflags(ifp) & IFF_UP) && + (if_getdrvflags(ifp) & IFF_DRV_RUNNING) && adapter->link_active) { for (int i = 0; i < adapter->num_queues; i++, txr++) { EM_TX_LOCK(txr); #ifdef EM_MULTIQUEUE if (!drbr_empty(ifp, txr->br)) em_mq_start_locked(ifp, txr, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + if(!if_sendq_empty(ifp)) em_start_locked(ifp, txr); #endif EM_TX_UNLOCK(txr); @@ -897,7 +896,7 @@ em_mq_start_locked(struct ifnet *ifp, struct tx_ri struct mbuf *next; int err = 0, enq = 0; - if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != + if ((if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != IFF_DRV_RUNNING || adapter->link_active == 0) { if (m != NULL) err = drbr_enqueue(ifp, txr->br, m); @@ -924,7 +923,7 @@ em_mq_start_locked(struct ifnet *ifp, struct tx_ri enq++; drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags); ETHER_BPF_MTAP(ifp, next); - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0) break; next = drbr_dequeue(ifp, txr->br); } @@ -938,7 +937,7 @@ em_mq_start_locked(struct ifnet *ifp, struct tx_ri if (txr->tx_avail < EM_MAX_SCATTER) em_txeof(txr); if (txr->tx_avail < EM_MAX_SCATTER) - ifp->if_drv_flags |= IFF_DRV_OACTIVE; + if_setdrvflagbits(ifp, IFF_DRV_OACTIVE,0); return (err); } @@ -948,7 +947,7 @@ em_mq_start_locked(struct ifnet *ifp, struct tx_ri static int em_mq_start(struct ifnet *ifp, struct mbuf *m) { - struct adapter *adapter = ifp->if_softc; + struct adapter *adapter = if_getsoftc(ifp); struct tx_ring *txr = adapter->tx_rings; int error; @@ -967,7 +966,7 @@ em_mq_start(struct ifnet *ifp, struct mbuf *m) static void em_qflush(struct ifnet *ifp) { - struct adapter *adapter = ifp->if_softc; + struct adapter *adapter = if_getsoftc(ifp); struct tx_ring *txr = adapter->tx_rings; struct mbuf *m; @@ -984,27 +983,27 @@ em_qflush(struct ifnet *ifp) static void em_start_locked(struct ifnet *ifp, struct tx_ring *txr) { - struct adapter *adapter = ifp->if_softc; + struct adapter *adapter = if_getsoftc(ifp); struct mbuf *m_head; EM_TX_LOCK_ASSERT(txr); - if ((ifp->if_drv_flags & (IFF_DRV_RUNNING|IFF_DRV_OACTIVE)) != + if ((if_getdrvflags(ifp) & (IFF_DRV_RUNNING|IFF_DRV_OACTIVE)) != IFF_DRV_RUNNING) return; if (!adapter->link_active) return; - while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) { + while (!if_sendq_empty(ifp)) { /* Call cleanup if number of TX descriptors low */ if (txr->tx_avail <= EM_TX_CLEANUP_THRESHOLD) em_txeof(txr); if (txr->tx_avail < EM_MAX_SCATTER) { - ifp->if_drv_flags |= IFF_DRV_OACTIVE; + if_setdrvflagbits(ifp,IFF_DRV_OACTIVE, 0); break; } - IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); + m_head = if_dequeue(ifp); if (m_head == NULL) break; /* @@ -1014,7 +1013,7 @@ em_start_locked(struct ifnet *ifp, struct tx_ring if (em_xmit(txr, &m_head)) { if (m_head == NULL) break; - IFQ_DRV_PREPEND(&ifp->if_snd, m_head); + if_sendq_prepend(ifp, m_head); break; } @@ -1032,10 +1031,10 @@ em_start_locked(struct ifnet *ifp, struct tx_ring static void em_start(struct ifnet *ifp) { - struct adapter *adapter = ifp->if_softc; + struct adapter *adapter = if_getsoftc(ifp); struct tx_ring *txr = adapter->tx_rings; - if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) { EM_TX_LOCK(txr); em_start_locked(ifp, txr); EM_TX_UNLOCK(txr); @@ -1044,6 +1043,7 @@ em_start(struct ifnet *ifp) } #endif /* EM_MULTIQUEUE */ + /********************************************************************* * Ioctl entry point * @@ -1056,7 +1056,7 @@ em_start(struct ifnet *ifp) static int em_ioctl(struct ifnet *ifp, u_long command, caddr_t data) { - struct adapter *adapter = ifp->if_softc; + struct adapter *adapter = if_getsoftc(ifp); struct ifreq *ifr = (struct ifreq *)data; #if defined(INET) || defined(INET6) struct ifaddr *ifa = (struct ifaddr *)data; @@ -1082,11 +1082,11 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_ ** so we avoid doing it when possible. */ if (avoid_reset) { - 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)) em_init(adapter); #ifdef INET - if (!(ifp->if_flags & IFF_NOARP)) + if (!(if_getflags(ifp) & IFF_NOARP)) arp_ifinit(ifp, ifa); #endif } else @@ -1155,6 +1155,7 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_ break; case SIOCADDMULTI: case SIOCDELMULTI: + IOCTL_DEBUGOUT("ioctl rcv'd: SIOC(ADD|DEL)MULTI"); if (ifp->if_drv_flags & IFF_DRV_RUNNING) { EM_CORE_LOCK(adapter); @@ -1166,7 +1167,9 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_ em_enable_intr(adapter); EM_CORE_UNLOCK(adapter); } + break; + case SIOCSIFMEDIA: /* Check SOL/IDER usage */ EM_CORE_LOCK(adapter); @@ -1189,7 +1192,7 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_ IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFCAP (Set Capabilities)"); reinit = 0; - mask = ifr->ifr_reqcap ^ ifp->if_capenable; + mask = ifr->ifr_reqcap ^ if_getcapenable(ifp); #ifdef DEVICE_POLLING if (mask & IFCAP_POLLING) { if (ifr->ifr_reqcap & IFCAP_POLLING) { @@ -1198,46 +1201,46 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_ return (error); EM_CORE_LOCK(adapter); em_disable_intr(adapter); - ifp->if_capenable |= IFCAP_POLLING; + if_setcapenablebit(ifp, IFCAP_POLLING, 0); EM_CORE_UNLOCK(adapter); } else { error = ether_poll_deregister(ifp); /* Enable interrupt even in error case */ EM_CORE_LOCK(adapter); em_enable_intr(adapter); - ifp->if_capenable &= ~IFCAP_POLLING; + if_setcapenablebit(ifp, 0, IFCAP_POLLING); EM_CORE_UNLOCK(adapter); } } #endif if (mask & IFCAP_HWCSUM) { - ifp->if_capenable ^= IFCAP_HWCSUM; + if_togglecapenable(ifp,IFCAP_HWCSUM); reinit = 1; } if (mask & IFCAP_TSO4) { - ifp->if_capenable ^= IFCAP_TSO4; + if_togglecapenable(ifp,IFCAP_TSO4); reinit = 1; } if (mask & IFCAP_VLAN_HWTAGGING) { - ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; + if_togglecapenable(ifp,IFCAP_VLAN_HWTAGGING); reinit = 1; } if (mask & IFCAP_VLAN_HWFILTER) { - ifp->if_capenable ^= IFCAP_VLAN_HWFILTER; + if_togglecapenable(ifp, IFCAP_VLAN_HWFILTER); reinit = 1; } if (mask & IFCAP_VLAN_HWTSO) { - ifp->if_capenable ^= IFCAP_VLAN_HWTSO; + if_togglecapenable(ifp, IFCAP_VLAN_HWTSO); reinit = 1; } if ((mask & IFCAP_WOL) && - (ifp->if_capabilities & IFCAP_WOL) != 0) { + (if_getcapabilities(ifp) & IFCAP_WOL) != 0) { if (mask & IFCAP_WOL_MCAST) - ifp->if_capenable ^= IFCAP_WOL_MCAST; + if_togglecapenable(ifp, IFCAP_WOL_MCAST); if (mask & IFCAP_WOL_MAGIC) - ifp->if_capenable ^= IFCAP_WOL_MAGIC; + if_togglecapenable(ifp, IFCAP_WOL_MAGIC); } - if (reinit && (ifp->if_drv_flags & IFF_DRV_RUNNING)) + if (reinit && (if_getdrvflags(ifp) & IFF_DRV_RUNNING)) em_init(adapter); VLAN_CAPABILITIES(ifp); break; @@ -1251,7 +1254,6 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_ return (error); } - /********************************************************************* * Init entry point * @@ -1302,12 +1304,12 @@ em_init_locked(struct adapter *adapter) /* Setup VLAN support, basic and offload if available */ E1000_WRITE_REG(&adapter->hw, E1000_VET, ETHERTYPE_VLAN); + if_clearhwassist(ifp); /* Set hardware offload abilities */ - ifp->if_hwassist = 0; - if (ifp->if_capenable & IFCAP_TXCSUM) - ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP); - if (ifp->if_capenable & IFCAP_TSO4) - ifp->if_hwassist |= CSUM_TSO; + if (if_getcapenable(ifp) & IFCAP_TXCSUM) + if_sethwassistbits(ifp, (CSUM_TCP | CSUM_UDP)); + if (if_getcapenable(ifp) & IFCAP_TSO4) + if_sethwassistbits(ifp, CSUM_TSO); /* Configure for OS presence */ em_init_manageability(adapter); @@ -1339,8 +1341,8 @@ em_init_locked(struct adapter *adapter) em_initialize_receive_unit(adapter); /* Use real VLAN Filter support? */ - if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) { - if (ifp->if_capenable & IFCAP_VLAN_HWFILTER) + if (if_getcapenable(ifp) & IFCAP_VLAN_HWTAGGING) { + if (if_getcapenable(ifp) & IFCAP_VLAN_HWFILTER) /* Use real VLAN Filter support */ em_setup_vlan_hw_support(adapter); else { @@ -1355,8 +1357,7 @@ em_init_locked(struct adapter *adapter) em_set_promisc(adapter); /* Set the interface as ACTIVE */ - ifp->if_drv_flags |= IFF_DRV_RUNNING; - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + if_setdrvflagbits(ifp, IFF_DRV_RUNNING, IFF_DRV_OACTIVE); callout_reset(&adapter->timer, hz, em_local_timer, adapter); e1000_clear_hw_cntrs_base_generic(&adapter->hw); @@ -1376,7 +1377,7 @@ em_init_locked(struct adapter *adapter) * Only enable interrupts if we are not polling, make sure * they are off otherwise. */ - if (ifp->if_capenable & IFCAP_POLLING) + if (if_getcapenable(ifp) & IFCAP_POLLING) em_disable_intr(adapter); else #endif /* DEVICE_POLLING */ @@ -1407,14 +1408,14 @@ em_init(void *arg) static int em_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) { - struct adapter *adapter = ifp->if_softc; + struct adapter *adapter = if_getsoftc(ifp); struct tx_ring *txr = adapter->tx_rings; struct rx_ring *rxr = adapter->rx_rings; u32 reg_icr; int rx_done; EM_CORE_LOCK(adapter); - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0) { EM_CORE_UNLOCK(adapter); return (0); } @@ -1439,7 +1440,7 @@ em_poll(struct ifnet *ifp, enum poll_cmd cmd, int if (!drbr_empty(ifp, txr->br)) em_mq_start_locked(ifp, txr, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + if(!if_sendq_empty(ifp)) em_start_locked(ifp, txr); #endif EM_TX_UNLOCK(txr); @@ -1454,7 +1455,11 @@ em_poll(struct ifnet *ifp, enum poll_cmd cmd, int * Fast Legacy/MSI Combined Interrupt Service routine * *********************************************************************/ +#if __FreeBSD_version >= 700000 static int +#else +static void +#endif em_irq_fast(void *arg) { struct adapter *adapter = arg; @@ -1505,7 +1510,8 @@ em_handle_que(void *context, int pending) struct rx_ring *rxr = adapter->rx_rings; - if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) { + bool more = em_rxeof(rxr, adapter->rx_process_limit, NULL); EM_TX_LOCK(txr); em_txeof(txr); @@ -1513,21 +1519,20 @@ em_handle_que(void *context, int pending) if (!drbr_empty(ifp, txr->br)) em_mq_start_locked(ifp, txr, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + if(!if_sendq_empty(ifp)) em_start_locked(ifp, txr); #endif EM_TX_UNLOCK(txr); - if (more) { - taskqueue_enqueue(adapter->tq, &adapter->que_task); - return; - } + if (more) { + taskqueue_enqueue(adapter->tq, &adapter->que_task); + return; + } } em_enable_intr(adapter); return; } - /********************************************************************* * * MSIX Interrupt Service Routines @@ -1547,7 +1552,7 @@ em_msix_tx(void *arg) if (!drbr_empty(ifp, txr->br)) em_mq_start_locked(ifp, txr, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + if(!if_sendq_empty(ifp)) em_start_locked(ifp, txr); #endif /* Reenable this interrupt */ @@ -1630,7 +1635,7 @@ em_handle_tx(void *context, int pending) if (!drbr_empty(ifp, txr->br)) em_mq_start_locked(ifp, txr, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + if(!if_sendq_empty(ifp)) em_start_locked(ifp, txr); #endif E1000_WRITE_REG(&adapter->hw, E1000_IMS, txr->ims); @@ -1644,7 +1649,7 @@ em_handle_link(void *context, int pending) struct tx_ring *txr = adapter->tx_rings; struct ifnet *ifp = adapter->ifp; - if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) + if (!(if_getdrvflags(ifp) & IFF_DRV_RUNNING)) return; EM_CORE_LOCK(adapter); @@ -1660,7 +1665,7 @@ em_handle_link(void *context, int pending) if (!drbr_empty(ifp, txr->br)) em_mq_start_locked(ifp, txr, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + if(if_sendq_empty(ifp)) em_start_locked(ifp, txr); #endif EM_TX_UNLOCK(txr); @@ -1681,7 +1686,7 @@ em_handle_link(void *context, int pending) static void em_media_status(struct ifnet *ifp, struct ifmediareq *ifmr) { - struct adapter *adapter = ifp->if_softc; + struct adapter *adapter = if_getsoftc(ifp); u_char fiber_type = IFM_1000_SX; INIT_DEBUGOUT("em_media_status: begin"); @@ -1733,7 +1738,7 @@ em_media_status(struct ifnet *ifp, struct ifmediar static int em_media_change(struct ifnet *ifp) { - struct adapter *adapter = ifp->if_softc; + struct adapter *adapter = if_getsoftc(ifp); struct ifmedia *ifm = &adapter->media; INIT_DEBUGOUT("em_media_change: begin"); @@ -1991,14 +1996,14 @@ retry: &txd_upper, &txd_lower); /* we need to make a final sentinel transmit desc */ tso_desc = TRUE; - } else if (m_head->m_pkthdr.csum_flags & CSUM_OFFLOAD) + } else + if (m_head->m_pkthdr.csum_flags & CSUM_OFFLOAD) em_transmit_checksum_setup(txr, m_head, ip_off, ip, &txd_upper, &txd_lower); if (m_head->m_flags & M_VLANTAG) { /* Set the vlan id. */ - txd_upper |= - (htole16(m_head->m_pkthdr.ether_vtag) << 16); + txd_upper |= htole16((if_getvtag(m_head)) << 16); /* Tell hardware to add tag */ txd_lower |= htole32(E1000_TXD_CMD_VLE); } @@ -2106,13 +2111,13 @@ em_set_promisc(struct adapter *adapter) reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); - if (ifp->if_flags & IFF_PROMISC) { + if (if_getflags(ifp) & IFF_PROMISC) { reg_rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE); /* Turn this on if you want to see bad packets */ if (em_debug_sbp) reg_rctl |= E1000_RCTL_SBP; E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl); - } else if (ifp->if_flags & IFF_ALLMULTI) { + } else if (if_getflags(ifp) & IFF_ALLMULTI) { reg_rctl |= E1000_RCTL_MPE; reg_rctl &= ~E1000_RCTL_UPE; E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl); @@ -2144,7 +2149,6 @@ static void em_set_multi(struct adapter *adapter) { struct ifnet *ifp = adapter->ifp; - struct ifmultiaddr *ifma; u32 reg_rctl = 0; u8 *mta; /* Multicast array memory */ int mcnt = 0; @@ -2169,17 +2173,8 @@ em_set_multi(struct adapter *adapter) #else if_maddr_rlock(ifp); #endif - TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; + if_setupmultiaddr(ifp, mta, &mcnt, MAX_NUM_MULTICAST_ADDRESSES); - if (mcnt == MAX_NUM_MULTICAST_ADDRESSES) - break; - - bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr), - &mta[mcnt * ETH_ADDR_LEN], ETH_ADDR_LEN); - mcnt++; - } #if __FreeBSD_version < 800000 IF_ADDR_UNLOCK(ifp); #else @@ -2267,7 +2262,7 @@ hung: device_printf(adapter->dev,"TX(%d) desc avail = %d," "Next TX to Clean = %d\n", txr->me, txr->tx_avail, txr->next_to_clean); - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0); adapter->watchdog_events++; adapter->pause_frames = 0; em_init_locked(adapter); @@ -2329,10 +2324,11 @@ em_update_link_status(struct adapter *adapter) "Full Duplex" : "Half Duplex")); adapter->link_active = 1; adapter->smartspeed = 0; - ifp->if_baudrate = adapter->link_speed * 1000000; + if_setbaudrate(ifp, adapter->link_speed * 1000000); if_link_state_change(ifp, LINK_STATE_UP); } else if (!link_check && (adapter->link_active == 1)) { - ifp->if_baudrate = adapter->link_speed = 0; + adapter->link_speed = 0; + if_setbaudrate(ifp, adapter->link_speed); adapter->link_duplex = 0; if (bootverbose) device_printf(dev, "Link is Down\n"); @@ -2368,8 +2364,7 @@ em_stop(void *arg) callout_stop(&adapter->timer); /* Tell the stack that the interface is no longer active */ - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - ifp->if_drv_flags |= IFF_DRV_OACTIVE; + if_setdrvflagbits(ifp, IFF_DRV_OACTIVE, IFF_DRV_RUNNING); /* Unarm watchdog timer. */ for (int i = 0; i < adapter->num_queues; i++, txr++) { @@ -2500,6 +2495,7 @@ em_allocate_legacy(struct adapter *adapter) TASK_INIT(&adapter->link_task, 0, em_handle_link, adapter); if ((error = bus_setup_intr(dev, adapter->res, INTR_TYPE_NET, em_irq_fast, NULL, adapter, &adapter->tag)) != 0) { + device_printf(dev, "Failed to register fast interrupt " "handler: %d\n", error); taskqueue_free(adapter->tq); @@ -2866,7 +2862,7 @@ em_reset(struct adapter *adapter) /* Workaround: no TX flow ctrl for PCH */ hw->fc.requested_mode = e1000_fc_rx_pause; hw->fc.pause_time = 0xFFFF; /* override */ - if (ifp->if_mtu > ETHERMTU) { + if (if_getmtu(ifp) > ETHERMTU) { hw->fc.high_water = 0x3500; hw->fc.low_water = 0x1500; } else { @@ -2881,14 +2877,14 @@ em_reset(struct adapter *adapter) hw->fc.pause_time = 0x0650; hw->fc.refresh_time = 0x0400; /* Jumbos need adjusted PBA */ - if (ifp->if_mtu > ETHERMTU) + if (if_getmtu(ifp) > ETHERMTU) E1000_WRITE_REG(hw, E1000_PBA, 12); else E1000_WRITE_REG(hw, E1000_PBA, 26); break; case e1000_ich9lan: case e1000_ich10lan: - if (ifp->if_mtu > ETHERMTU) { + if (if_getmtu(ifp) > ETHERMTU) { hw->fc.high_water = 0x2800; hw->fc.low_water = hw->fc.high_water - 8; break; @@ -2934,37 +2930,36 @@ em_setup_interface(device_t dev, struct adapter *a return (-1); } if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - ifp->if_init = em_init; - ifp->if_softc = adapter; - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; - ifp->if_ioctl = em_ioctl; + if_setinitfn(ifp, em_init); + if_setsoftc(ifp, adapter); + if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST); + if_setioctlfn(ifp, em_ioctl); #ifdef EM_MULTIQUEUE /* Multiqueue stack interface */ - ifp->if_transmit = em_mq_start; - ifp->if_qflush = em_qflush; + if_settransmit_fn(ifp, em_mq_start); + if_setqflush_fn(ifp, em_qflush); #else - ifp->if_start = em_start; - IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 1); - ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 1; - IFQ_SET_READY(&ifp->if_snd); + if_setstartfn(ifp, em_start); + if_setsendqlen(ifp, adapter->num_tx_desc - 1); + if_setsendqready(ifp); #endif ether_ifattach(ifp, adapter->hw.mac.addr); - ifp->if_capabilities = ifp->if_capenable = 0; + if_setcapabilities(ifp, 0); + if_setcapenable(ifp, 0); - ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM; - ifp->if_capabilities |= IFCAP_TSO4; + if_setcapabilitiesbit(ifp, IFCAP_HWCSUM | + IFCAP_VLAN_HWCSUM|IFCAP_TSO4, 0); /* * Tell the upper layer(s) we * support full VLAN capability */ - ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); - ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING - | IFCAP_VLAN_HWTSO - | IFCAP_VLAN_MTU; - ifp->if_capenable = ifp->if_capabilities; + if_setifheaderlen(ifp, sizeof(struct ether_vlan_header)); + if_setcapabilitiesbit(ifp, IFCAP_VLAN_HWTAGGING | + IFCAP_VLAN_HWTSO | IFCAP_VLAN_MTU, 0); + if_setcapenable(ifp, if_getcapabilities(ifp)); /* ** Don't turn this on by default, if vlans are @@ -2974,16 +2969,16 @@ em_setup_interface(device_t dev, struct adapter *a ** using vlans directly on the em driver you can ** enable this and get full hardware tag filtering. */ - ifp->if_capabilities |= IFCAP_VLAN_HWFILTER; + if_setcapabilitiesbit(ifp, IFCAP_VLAN_HWFILTER,0); #ifdef DEVICE_POLLING - ifp->if_capabilities |= IFCAP_POLLING; + if_setcapabilities(ifp, IFCAP_POLLING,0); #endif /* Enable only WOL MAGIC by default */ if (adapter->wol) { - ifp->if_capabilities |= IFCAP_WOL; - ifp->if_capenable |= IFCAP_WOL_MAGIC; + if_setcapabilitiesbit(ifp, IFCAP_WOL, 0); + if_setcapenablebit(ifp, IFCAP_WOL_MAGIC, 0); } /* @@ -3790,7 +3785,7 @@ em_txeof(struct tx_ring *txr) EM_TX_LOCK_ASSERT(txr); #ifdef DEV_NETMAP - if (ifp->if_capenable & IFCAP_NETMAP) { + if (if_getcapenable(ifp) & IFCAP_NETMAP) { struct netmap_adapter *na = NA(ifp); selwakeuppri(&na->tx_rings[txr->me].si, PI_NET); @@ -3856,7 +3851,7 @@ em_txeof(struct tx_ring *txr) tx_buffer = &txr->tx_buffers[first]; tx_desc = &txr->tx_base[first]; } - ++ifp->if_opackets; + if_incopackets(ifp, 1); /* See if we can continue to the next packet */ last = tx_buffer->next_eop; if (last != -1) { @@ -3890,8 +3885,9 @@ em_txeof(struct tx_ring *txr) * sanity. */ if (txr->tx_avail >= EM_MAX_SCATTER) - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + if_setdrvflagbits(ifp, IFF_DRV_OACTIVE, 0); + /* Disable watchdog if all clean */ if (txr->tx_avail == adapter->num_tx_desc) { txr->queue_status = EM_QUEUE_IDLE; @@ -4284,7 +4280,7 @@ em_initialize_receive_unit(struct adapter *adapter E1000_WRITE_REG(hw, E1000_RFCTL, E1000_RFCTL_ACK_DIS); } - if (ifp->if_capenable & IFCAP_RXCSUM) { + if (if_getcapenable(ifp) & IFCAP_RXCSUM) { rxcsum = E1000_READ_REG(hw, E1000_RXCSUM); rxcsum |= (E1000_RXCSUM_IPOFL | E1000_RXCSUM_TUOFL); E1000_WRITE_REG(hw, E1000_RXCSUM, rxcsum); @@ -4316,7 +4312,7 @@ em_initialize_receive_unit(struct adapter *adapter * In this driver it means we adjust RDT to * something different from na->num_rx_desc - 1. */ - if (ifp->if_capenable & IFCAP_NETMAP) { + if (if_getcapenable(ifp) & IFCAP_NETMAP) { struct netmap_adapter *na = NA(adapter->ifp); struct netmap_kring *kring = &na->rx_rings[i]; int t = na->num_rx_desc - 1 - kring->nr_hwavail; @@ -4331,13 +4327,13 @@ em_initialize_receive_unit(struct adapter *adapter if (((adapter->hw.mac.type == e1000_ich9lan) || (adapter->hw.mac.type == e1000_pch2lan) || (adapter->hw.mac.type == e1000_ich10lan)) && - (ifp->if_mtu > ETHERMTU)) { + (if_getmtu(ifp) > ETHERMTU)) { u32 rxdctl = E1000_READ_REG(hw, E1000_RXDCTL(0)); E1000_WRITE_REG(hw, E1000_RXDCTL(0), rxdctl | 3); } if (adapter->hw.mac.type == e1000_pch2lan) { - if (ifp->if_mtu > ETHERMTU) + if (if_getmtu(ifp) > ETHERMTU) e1000_lv_jumbo_workaround_ich8lan(hw, TRUE); else e1000_lv_jumbo_workaround_ich8lan(hw, FALSE); @@ -4363,7 +4359,7 @@ em_initialize_receive_unit(struct adapter *adapter else if (adapter->rx_mbuf_sz > MJUMPAGESIZE) rctl |= E1000_RCTL_SZ_8192 | E1000_RCTL_BSEX; - if (ifp->if_mtu > ETHERMTU) + if (if_getmtu(ifp) > ETHERMTU) rctl |= E1000_RCTL_LPE; else rctl &= ~E1000_RCTL_LPE; @@ -4401,7 +4397,7 @@ em_rxeof(struct rx_ring *rxr, int count, int *done EM_RX_LOCK(rxr); #ifdef DEV_NETMAP - if (ifp->if_capenable & IFCAP_NETMAP) { + if (if_getcapenable(ifp) & IFCAP_NETMAP) { struct netmap_adapter *na = NA(ifp); na->rx_rings[rxr->me].nr_kflags |= NKR_PENDINTR; @@ -4416,7 +4412,7 @@ em_rxeof(struct rx_ring *rxr, int count, int *done for (i = rxr->next_to_check, processed = 0; count != 0;) { - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0) break; bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, @@ -4434,7 +4430,7 @@ em_rxeof(struct rx_ring *rxr, int count, int *done if ((cur->errors & E1000_RXD_ERR_FRAME_ERR_MASK) || (rxr->discard == TRUE)) { - ifp->if_ierrors++; + if_incoerrors(ifp, 1); ++rxr->rx_discarded; if (!eop) /* Catch subsequent segs */ rxr->discard = TRUE; @@ -4466,8 +4462,8 @@ em_rxeof(struct rx_ring *rxr, int count, int *done if (eop) { --count; sendmp = rxr->fmp; - sendmp->m_pkthdr.rcvif = ifp; - ifp->if_ipackets++; + if_setrcvif(sendmp, ifp); + if_incipackets(ifp, 1); em_receive_checksum(cur, sendmp); #ifndef __NO_STRICT_ALIGNMENT if (adapter->max_frame_size > @@ -4476,8 +4472,8 @@ em_rxeof(struct rx_ring *rxr, int count, int *done goto skip; #endif if (status & E1000_RXD_STAT_VP) { - sendmp->m_pkthdr.ether_vtag = - le16toh(cur->special); + if_setvtag(sendmp, + le16toh(cur->special)); sendmp->m_flags |= M_VLANTAG; } #ifndef __NO_STRICT_ALIGNMENT @@ -4499,7 +4495,7 @@ next_desc: if (sendmp != NULL) { rxr->next_to_check = i; EM_RX_UNLOCK(rxr); - (*ifp->if_input)(ifp, sendmp); + if_input(ifp, sendmp); EM_RX_LOCK(rxr); i = rxr->next_to_check; } @@ -4641,10 +4637,10 @@ em_receive_checksum(struct e1000_rx_desc *rx_desc, static void em_register_vlan(void *arg, struct ifnet *ifp, u16 vtag) { - struct adapter *adapter = ifp->if_softc; + struct adapter *adapter = if_getsoftc(ifp); u32 index, bit; - if (ifp->if_softc != arg) /* Not our event */ + if ((void*)adapter != arg) /* Not our event */ return; if ((vtag == 0) || (vtag > 4095)) /* Invalid ID */ @@ -4656,7 +4652,7 @@ em_register_vlan(void *arg, struct ifnet *ifp, u16 adapter->shadow_vfta[index] |= (1 << bit); ++adapter->num_vlans; /* Re-init to load the changes */ - if (ifp->if_capenable & IFCAP_VLAN_HWFILTER) + if (if_getcapenable(ifp) & IFCAP_VLAN_HWFILTER) em_init_locked(adapter); EM_CORE_UNLOCK(adapter); } @@ -4668,10 +4664,10 @@ em_register_vlan(void *arg, struct ifnet *ifp, u16 static void em_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag) { - struct adapter *adapter = ifp->if_softc; + struct adapter *adapter = if_getsoftc(ifp); u32 index, bit; - if (ifp->if_softc != arg) + if (adapter != arg) return; if ((vtag == 0) || (vtag > 4095)) /* Invalid */ @@ -4683,7 +4679,7 @@ em_unregister_vlan(void *arg, struct ifnet *ifp, u adapter->shadow_vfta[index] &= ~(1 << bit); --adapter->num_vlans; /* Re-init to load the changes */ - if (ifp->if_capenable & IFCAP_VLAN_HWFILTER) + if (if_getcapenable(ifp) & IFCAP_VLAN_HWFILTER) em_init_locked(adapter); EM_CORE_UNLOCK(adapter); } @@ -4968,10 +4964,10 @@ em_enable_wakeup(device_t dev) ** Determine type of Wakeup: note that wol ** is set with all bits on by default. */ - if ((ifp->if_capenable & IFCAP_WOL_MAGIC) == 0) + if ((if_getcapenable(ifp) & IFCAP_WOL_MAGIC) == 0) adapter->wol &= ~E1000_WUFC_MAG; - if ((ifp->if_capenable & IFCAP_WOL_MCAST) == 0) + if ((if_getcapenable(ifp) & IFCAP_WOL_MCAST) == 0) adapter->wol &= ~E1000_WUFC_MC; else { rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); @@ -4994,7 +4990,7 @@ em_enable_wakeup(device_t dev) /* Request PME */ status = pci_read_config(dev, pmc + PCIR_POWER_STATUS, 2); status &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE); - if (ifp->if_capenable & IFCAP_WOL) + if (if_getcapenable(ifp) & IFCAP_WOL) status |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE; pci_write_config(dev, pmc + PCIR_POWER_STATUS, status, 2); @@ -5224,17 +5220,17 @@ em_update_stats_counters(struct adapter *adapter) } ifp = adapter->ifp; - ifp->if_collisions = adapter->stats.colc; + if_setcollisions(ifp, adapter->stats.colc); /* Rx Errors */ - ifp->if_ierrors = adapter->dropped_pkts + adapter->stats.rxerrc + + if_setierrors(ifp, adapter->dropped_pkts + adapter->stats.rxerrc + adapter->stats.crcerrs + adapter->stats.algnerrc + adapter->stats.ruc + adapter->stats.roc + - adapter->stats.mpc + adapter->stats.cexterr; + adapter->stats.mpc + adapter->stats.cexterr); /* Tx Errors */ - ifp->if_oerrors = adapter->stats.ecol + - adapter->stats.latecol + adapter->watchdog_events; + if_setoerrors(ifp, adapter->stats.ecol + adapter->stats.latecol + + adapter->watchdog_events); } /* Export a single 32-bit register via a read-only sysctl. */ @@ -5753,12 +5749,12 @@ em_print_debug_info(struct adapter *adapter) struct tx_ring *txr = adapter->tx_rings; struct rx_ring *rxr = adapter->rx_rings; - if (adapter->ifp->if_drv_flags & IFF_DRV_RUNNING) + if (if_getdrvflags(adapter->ifp) & IFF_DRV_RUNNING) printf("Interface is RUNNING "); else printf("Interface is NOT RUNNING\n"); - if (adapter->ifp->if_drv_flags & IFF_DRV_OACTIVE) + if (if_getdrvflags(adapter->ifp) & IFF_DRV_OACTIVE) printf("and INACTIVE\n"); else printf("and ACTIVE\n"); .include Index: sys/net/fb_ddi.c =================================================================== --- sys/net/fb_ddi.c (revision 0) +++ sys/net/fb_ddi.c (revision 0) @@ -0,0 +1,302 @@ +#include +#include +#include +#include +#include +#include "fb_ddi.h" + +int +if_setbaudrate(struct ifnet *ifp, int baudrate) +{ + ifp->if_baudrate = baudrate; + return 0; +} + + +int +if_getbaudrate(struct ifnet *ifp) +{ + return ifp->if_baudrate; +} + +int +if_setcapabilities(struct ifnet *ifp, int capabilities) +{ + ifp->if_capabilities = capabilities; + return 0; +} + +int +if_setcapabilitiesbit(struct ifnet *ifp, int setbit, int clearbit) +{ + ifp->if_capabilities |= setbit; + ifp->if_capabilities &= ~clearbit; + return 0; +} + +int +if_getcapabilities(struct ifnet *ifp) +{ + return ifp->if_capabilities; +} + +int +if_setcapenable(struct ifnet *ifp, int capabilities) +{ + ifp->if_capenable = capabilities; + return 0; +} + +int +if_setcapenablebit(struct ifnet *ifp, int setcap, int clearcap) +{ + if(setcap) + ifp->if_capenable |= setcap; + if(clearcap) + ifp->if_capenable &= ~clearcap; + return 0; +} + +int +if_togglecapenable(struct ifnet *ifp, int togglecap) +{ + ifp->if_capenable ^= togglecap; + return 0; +} + +int +if_getcapenable(struct ifnet *ifp) +{ + return ifp->if_capenable; +} + +int +if_setdrvflagbits(struct ifnet *ifp, int set_flags, int clear_flags) +{ + ifp->if_drv_flags |= set_flags; + ifp->if_drv_flags &= ~clear_flags; + return 0; +} + +int +if_getdrvflags(struct ifnet *ifp) +{ + return ifp->if_drv_flags; +} + +int +if_setflags(struct ifnet *ifp, int flags) +{ + ifp->if_flags = flags; + return 0; +} + +int +if_setflagbits(struct ifnet *ifp, int set, int clear) +{ + ifp->if_flags |= set; + ifp->if_flags &= ~clear; + return 0; +} + +int +if_getflags(struct ifnet *ifp) +{ + return ifp->if_flags; +} + +int +if_clearhwassist(struct ifnet *ifp) +{ + ifp->if_hwassist = 0; + return 0; +} + +int +if_sethwassistbits(struct ifnet *ifp, int hwassist_bit) +{ + ifp->if_hwassist |= hwassist_bit; + return 0; +} + +int +if_gethwassist(struct ifnet *ifp) +{ + return ifp->if_hwassist; +} + +int +if_setmtu(struct ifnet *ifp, int mtu) +{ + ifp->if_mtu = mtu; + return 0; +} + +int +if_getmtu(struct ifnet *ifp) +{ + return ifp->if_mtu; +} + +int +if_setsoftc(struct ifnet *ifp, void *softc) +{ + ifp->if_softc = softc; + return 0; +} + +void * +if_getsoftc(struct ifnet *ifp) +{ + return ifp->if_softc; +} + +void +if_setrcvif(struct mbuf *m, struct ifnet *ifp) +{ + m->m_pkthdr.rcvif = ifp; +} + +void +if_setvtag(struct mbuf *m, u_int16_t tag) +{ + m->m_pkthdr.ether_vtag = tag; +} + +u_int16_t +if_getvtag(struct mbuf *m){ + return m->m_pkthdr.ether_vtag; +} + +/* Statistics */ +int +if_incipackets(struct ifnet *ifp, int pkts) +{ + ifp->if_ipackets += pkts; + return 0; +} + +int +if_incopackets(struct ifnet *ifp, int pkts) +{ + ifp->if_opackets += pkts; + return 0; +} + +int +if_incierrors(struct ifnet *ifp, int ierrors) +{ + ifp->if_ierrors += ierrors; + return 0; +} + + +int +if_setierrors(struct ifnet *ifp, int ierrors) +{ + ifp->if_ierrors = ierrors; + return 0; +} + +int +if_setoerrors(struct ifnet *ifp, int oerrors) +{ + ifp->if_oerrors = oerrors; + return 0; +} + +int if_incoerrors(struct ifnet *ifp, int oerrors) +{ + ifp->if_oerrors += oerrors; + return 0; +} + +int +if_setcollisions(struct ifnet *ifp, int collisions) +{ + ifp->if_collisions = collisions; + return 0; +} + +int +if_sendq_empty(struct ifnet *ifp) +{ + return IFQ_DRV_IS_EMPTY(&ifp->if_snd); +} + +int +if_setsendqready(struct ifnet *ifp) +{ + IFQ_SET_READY(&ifp->if_snd); + return 0; +} + +int +if_setsendqlen(struct ifnet *ifp, int tx_desc_count) +{ + IFQ_SET_MAXLEN(&ifp->if_snd, tx_desc_count); + ifp->if_snd.ifq_drv_maxlen = tx_desc_count; + return 0; +} + +int +if_vlantrunkinuse(struct ifnet *ifp) +{ + return ifp->if_vlantrunk != NULL?1:0; +} + +int +if_input(struct ifnet *ifp, struct mbuf* sendmp) +{ + (*ifp->if_input)(ifp, sendmp); + return 0; + +} + +/* XXX */ +#ifndef ETH_ADDR_LEN +#define ETH_ADDR_LEN 6 +#endif + +int +if_setupmultiaddr(struct ifnet *ifp, u_int8_t *mta, int *cnt, int max) +{ + struct ifmultiaddr *ifma; + int mcnt = 0; + + TAILQ_FOREACH(ifma, &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), + &mta[mcnt * ETH_ADDR_LEN], ETH_ADDR_LEN); + mcnt++; + } + *cnt = mcnt; + return 0; +} + +struct mbuf * +if_dequeue(struct ifnet *ifp) +{ + struct mbuf *m; + IFQ_DRV_DEQUEUE(&ifp->if_snd, m); + return m; +} + +int +if_sendq_prepend(struct ifnet *ifp, struct mbuf *m) +{ + IFQ_DRV_PREPEND(&ifp->if_snd, m); + return 0; +} + +int +if_setifheaderlen(struct ifnet *ifp, int len) +{ + ifp->if_data.ifi_hdrlen = len; + return 0; +} Index: sys/net/fb_ddi.h =================================================================== --- sys/net/fb_ddi.h (revision 0) +++ sys/net/fb_ddi.h (revision 0) @@ -0,0 +1,60 @@ +#ifndef _FB_DDI_H_ +#define _FB_DDH_H_ +int if_setbaudrate(struct ifnet *ifp, int baudrate); +int if_getbaudrate( struct ifnet *ifp); +int if_setcapabilities(struct ifnet *ifp, int capabilities); +int if_setcapabilitiesbit(struct ifnet *ifp, int setbit, int clearbit); +int if_getcapabilities( struct ifnet *ifp); +int if_togglecapenable(struct ifnet *ifp, int togglecap); +int if_setcapenable(struct ifnet *ifp, int capenable); +int if_setcapenablebit(struct ifnet *ifp, int setcap, int clearcap); +int if_getcapenable( struct ifnet *ifp); +int if_setdrvflagbits(struct ifnet *ifp, int if_setflags, int clear_flags); +int if_getdrvflags(struct ifnet *ifp); + +int if_sethwassistbits(struct ifnet *ifp, int hwassist_bit); +int if_setsoftc(struct ifnet *ifp, void *softc); +int if_gethwassist(struct ifnet *ifp); + +void *if_getsoftc(struct ifnet *ifp); +int if_setflags(struct ifnet *ifp, int flags); +int if_setmtu(struct ifnet *ifp, int mtu); +int if_getmtu(struct ifnet *ifp); +int if_setflagbits(struct ifnet *ifp, int set, int clear); + +int if_getflags(struct ifnet *ifp); +int if_clearhwassist(struct ifnet *ifp); +int if_sendq_empty(struct ifnet *ifp); +int if_setsendqready(struct ifnet *ifp); +int if_setsendqlen(struct ifnet *ifp, int tx_desc_count); +int if_input(struct ifnet *ifp, struct mbuf* sendmp); +int if_setupmultiaddr(struct ifnet *ifp, u_int8_t *mta, int *cnt, int max); +int if_sendq_prepend(struct ifnet *ifp, struct mbuf *m); +struct mbuf *if_dequeue(struct ifnet *ifp); +int if_setifheaderlen(struct ifnet *ifp, int len); +void if_setrcvif(struct mbuf *m, struct ifnet *ifp); +void if_setvtag(struct mbuf *m, u_int16_t tag); +u_int16_t if_getvtag(struct mbuf *m); + +#define if_setinputfn(ifp, input) do{ ifp->if_input = input;} while(0) +#define if_setinitfn(ifp, init) do { ifp->if_init = init;}while(0) +#define if_setioctlfn(ifp, ioctl) do { ifp->if_ioctl = ioctl;} while(0) +#define if_setqflushfn(ifp, qflush) do {ifp->if_qflush = qflush;} while(0) +#define if_setstartfn(ifp, start) do { ifp->if_start = start;} while(0) +#define if_settransmitfn(ifp, transmit) do { ifp->if_transmit = transmit;}while(0) + + + + +int if_vlantrunkinuse(struct ifnet *ifp); + +/* Statistics */ + +int if_incipackets(struct ifnet *ifp, int pkt); +int if_incopackets(struct ifnet *ifp, int pkts); +int if_incierrors(struct ifnet *ifp, int ierrors); +int if_incoerrors(struct ifnet *ifp, int oerrors); +int if_setierrors(struct ifnet *ifp, int ierrors); +int if_setoerrors(struct ifnet *ifp, int oerrors); +int if_setcollisions(struct ifnet *ifp, int collisions); +#endif /* _FB_DDI_H_ */ Index: sys/sys/mbuf.h =================================================================== --- sys/sys/mbuf.h (revision 239685) +++ sys/sys/mbuf.h (working copy) @@ -111,6 +111,8 @@ struct m_tag { * Record/packet header in first mbuf of chain; valid only if M_PKTHDR is set. */ struct pkthdr { + uint32_t rcvidx; + uint32_t rnhidx; struct ifnet *rcvif; /* rcv interface */ /* variables for ip and tcp reassembly */ void *header; /* pointer to packet header */ Index: socketvar.h =================================================================== --- socketvar.h (revision 239653) +++ socketvar.h (revision 239654) @@ -125,6 +125,8 @@ struct socket { */ int so_fibnum; /* routing domain for this socket */ uint32_t so_user_cookie; + u_int so_oqueue; + u_short so_lrid; };