int cdcef_ioctl(struct ifnet *ifp, u_long command, caddr_t data) { struct cdcef_softc *sc = ifp->if_softc; struct ifaddr *ifa = (struct ifaddr *)data; int s, error = 0; s = splnet(); switch (command) { case SIOCSIFADDR: ifp->if_flags |= IFF_UP; if (!(ifp->if_flags & IFF_RUNNING)) cdcef_init(sc); #ifdef INET if (ifa->ifa_addr->sa_family == AF_INET) arp_ifinit(&sc->sc_arpcom, ifa); #endif break; case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) { if (ifp->if_flags & IFF_RUNNING) error = ENETRESET; else cdcef_init(sc); } else { if (ifp->if_flags & IFF_RUNNING) cdcef_stop(sc); } break; default: error = ether_ioctl(ifp, &sc->sc_arpcom, command, data); } if (error == ENETRESET) error = 0; splx(s); return (error); }
int cdcef_encap(struct cdcef_softc *sc, struct mbuf *m, int idx) { usbf_status err; m_copydata(m, 0, m->m_pkthdr.len, sc->sc_buffer_in); /* NO CRC */ usbf_setup_xfer(sc->sc_xfer_in, sc->sc_pipe_in, sc, sc->sc_buffer_in, m->m_pkthdr.len, USBD_FORCE_SHORT_XFER | USBD_NO_COPY, 10000, cdcef_txeof); err = usbf_transfer(sc->sc_xfer_in); if (err && err != USBD_IN_PROGRESS) { printf("encap error\n"); cdcef_stop(sc); return (EIO); } sc->sc_xmit_mbuf = m; return (0); }