/* * Standard usb ethernet communications device. */ #include #include #include #include #include "usb.h" #include "usbfs.h" #include "ether.h" static int okclass(Iface *iface) { return Class(iface->csp) == Clcomms && Subclass(iface->csp) == Scether; } static int getmac(Ether *ether) { int i; Usbdev *ud; uchar *b; Desc *dd; char *mac; ud = ether->dev->usb; for(i = 0; i < nelem(ud->ddesc); i++) if((dd = ud->ddesc[i]) != nil && okclass(dd->iface)){ b = (uchar*)&dd->data; if(b[1] == Dfunction && b[2] == Fnether){ mac = loaddevstr(ether->dev, b[3]); if(mac != nil && strlen(mac) != 12){ free(mac); mac = nil; } if(mac != nil){ parseaddr(ether->addr, mac); free(mac); return 0; } } } return -1; } int cdcreset(Ether *ether) { /* * Assume that all communication devices are going to * be std. ethernet communication devices. Specific controllers * must have been probed first. * NB: This ignores unions. */ if(ether->dev->usb->class == Clcomms) return getmac(ether); return -1; }