--- if_mxge.c 2008-01-15 14:14:24.000000000 -0500 +++ if_mxge.c.fake_ifp 2008-01-15 14:09:20.000000000 -0500 @@ -97,7 +97,11 @@ static int mxge_ticks; static int mxge_max_slices = 1; static int mxge_rss_hash_type = MXGEFW_RSS_HASH_TYPE_SRC_PORT; +#ifdef MXGE_FAKE_IFP +static int mxge_always_promisc = 1; +#else static int mxge_always_promisc = 0; +#endif static char *mxge_fw_unaligned = "mxge_ethp_z8e"; static char *mxge_fw_aligned = "mxge_eth_z8e"; static char *mxge_fw_rss_aligned = "mxge_rss_eth_z8e"; @@ -2357,6 +2361,9 @@ m->m_pkthdr.csum_data = 0xffff; m->m_pkthdr.csum_flags = CSUM_PSEUDO_HDR | CSUM_DATA_VALID; } +#ifdef MXGE_FAKE_IFP + ETHER_BPF_MTAP(ss->fake_ifp, m); +#endif /* pass the frame up the stack */ (*ifp->if_input)(ifp, m); } @@ -2417,6 +2424,9 @@ m->m_pkthdr.csum_data = 0xffff; m->m_pkthdr.csum_flags = CSUM_PSEUDO_HDR | CSUM_DATA_VALID; } +#ifdef MXGE_FAKE_IFP + ETHER_BPF_MTAP(ss->fake_ifp, m); +#endif /* pass the frame up the stack */ (*ifp->if_input)(ifp, m); } @@ -3697,6 +3707,91 @@ } } +#ifdef MXGE_FAKE_IFP + +static int +mxge_fake_ioctl(struct ifnet *ifp, u_long command, caddr_t data) +{ +#if 0 + struct mxge_slice_state *ss = ifp->sc; + mxge_softc_t *sc = ss->sc; + int err = ENOTTY; +#endif + + if (command == SIOCSIFFLAGS) + return 0; + else + return ENOTTY; +#if 0 + mtx_lock(&sc->driver_mtx); + if ((sc->ifp->if_flags & IFF_UP) == 0) + goto abort_with_mtx; + + if ((sc->ifp->if_flags & IFF_UP) && + (sc->ifp->if_drv_flags & IFF_DRV_RUNNING) { + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { + err = mxge_open(sc); + callout_reset(&sc->co_hdl, mxge_ticks, + mxge_tick, sc); + } else { + /* take care of promis can allmulti + flag chages */ + mxge_change_promisc(sc, + ifp->if_flags & IFF_PROMISC); + mxge_set_multicast_list(sc); + } + } else { + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + callout_stop(&sc->co_hdl); + mxge_close(sc); + } + } + +abort_with_mtx: + mtx_unlock(&sc->driver_mtx); +abort: + return err; +#endif +} + +static void +mxge_fake_start(struct ifnet *ifp) +{ + ifp->if_drv_flags |= IFF_DRV_OACTIVE; +} +static int +mxge_alloc_fake_ifp(struct mxge_slice_state *ss) +{ + struct ifnet *ifp; + mxge_softc_t *sc = ss->sc; + + ifp = if_alloc(IFT_ETHER); + if (ifp == NULL) + return ENOMEM; + ss->fake_ifp = ifp; + if (sc->fakename[0] == '\0') + snprintf(sc->fakename, sizeof (sc->fakename), + "%s:slice", sc->ifp->if_xname); + if_initname(ifp, sc->fakename, ss - sc->ss); + ifp->if_init = mxge_init; + ifp->if_ioctl = mxge_fake_ioctl; + ifp->if_start = mxge_fake_start; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ether_ifattach(ifp, sc->mac_addr); + return 0; +} + +static void +mxge_free_fake_ifp(struct mxge_slice_state *ss) +{ + if (ss->fake_ifp == NULL) + return; + + ether_ifdetach(ss->fake_ifp); + if_free(ss->fake_ifp); + ss->fake_ifp = NULL; +} +#endif static void mxge_free_slices(mxge_softc_t *sc) @@ -3719,6 +3814,9 @@ mxge_dma_free(&ss->rx_done.dma); ss->rx_done.entry = NULL; } +#ifdef MXGE_FAKE_IFP + mxge_free_fake_ifp(ss); +#endif } free(sc->ss, M_DEVBUF); sc->ss = NULL; @@ -3758,6 +3856,11 @@ ss->rx_done.entry = ss->rx_done.dma.addr; bzero(ss->rx_done.entry, bytes); +#ifdef MXGE_FAKE_IFP + err = mxge_alloc_fake_ifp(ss); + if (err != 0) + goto abort; +#endif /* * allocate the per-slice firmware stats; stats * (including tx) are used used only on the first --- if_mxge_var.h 2008-01-15 14:14:08.000000000 -0500 +++ if_mxge_var.h.fake_ifp 2008-01-15 14:09:32.000000000 -0500 @@ -155,6 +155,9 @@ mxge_dma_t fw_stats_dma; struct sysctl_oid *sysctl_tree; struct sysctl_ctx_list sysctl_ctx; +#ifdef MXGE_FAKE_IFP + struct ifnet* fake_ifp; +#endif char scratch[256]; }; @@ -223,6 +226,9 @@ char serial_number_string[64]; char cmd_mtx_name[16]; char driver_mtx_name[16]; +#ifdef MXGE_FAKE_IFP + char fakename[16]; +#endif }; #define MXGE_PCI_VENDOR_MYRICOM 0x14c1