예제 #1
0
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);
}
예제 #2
0
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);
}