On Tue, Dec 03, 2013 at 01:07:17AM +0200, Paul Irofti wrote: > On Tue, Dec 03, 2013 at 12:47:30AM +0200, Paul Irofti wrote: > > Could people doing actual networking with urndis(4) please test the > > following diff and report if any regressions are encountered? > > > > I plan on commiting it by the end of the week if I don't hear anything > > bad in regards to the patch. > > > > To be more specific, this diff fixes a panic on detach when connecting > my phone to an OpenBSD machine.
Clarifying further, this is due to failure to setup a pipe in urndis_ctrl_init() which results in a TIMEOUT on receive with side-effects later on during detach due to assumptions regarding the existence of interface hooks during dohooks on if_detach tear-down. This results on dereferencing a NULL function pointer which triggers a panic. > > The ctrl methods on attach only use control messages and don't need any > pipe besides the default pipe which is always present. > > Thus the urndis_init() and, in turn, urndis_stop() funcalls are not > needed during attach. > > Besides from that they're also poorly written as they can fail and that > is not checked nor reported. This driver is in really poor shape. > > This diff just brings this awful driver closer to what other usb > ethernet drivers are doing. > > > Others diffs will probably follow in order to clean-up the current mess. > > > > Index: if_urndis.c > > =================================================================== > > RCS file: /cvs/src/sys/dev/usb/if_urndis.c,v > > retrieving revision 1.44 > > diff -u -p -r1.44 if_urndis.c > > --- if_urndis.c 21 Nov 2013 14:08:05 -0000 1.44 > > +++ if_urndis.c 28 Nov 2013 10:22:42 -0000 > > @@ -1363,6 +1363,7 @@ urndis_attach(struct device *parent, str > > sc = (void *)self; > > uaa = aux; > > > > + sc->sc_attached = 0; > > sc->sc_udev = uaa->device; > > id = usbd_get_interface_descriptor(uaa->iface); > > sc->sc_ifaceno_ctl = id->bInterfaceNumber; > > @@ -1447,14 +1448,11 @@ urndis_attach(struct device *parent, str > > > > IFQ_SET_READY(&ifp->if_snd); > > > > - urndis_init(sc); > > - > > s = splnet(); > > > > if (urndis_ctrl_query(sc, OID_802_3_PERMANENT_ADDRESS, NULL, 0, > > &buf, &bufsz) != RNDIS_STATUS_SUCCESS) { > > printf(": unable to get hardware address\n"); > > - urndis_stop(sc); > > splx(s); > > return; > > } > > @@ -1466,7 +1464,6 @@ urndis_attach(struct device *parent, str > > } else { > > printf(", invalid address\n"); > > free(buf, M_TEMP); > > - urndis_stop(sc); > > splx(s); > > return; > > } > > @@ -1478,7 +1475,6 @@ urndis_attach(struct device *parent, str > > if (urndis_ctrl_set(sc, OID_GEN_CURRENT_PACKET_FILTER, &filter, > > sizeof(filter)) != RNDIS_STATUS_SUCCESS) { > > printf("%s: unable to set data filters\n", DEVNAME(sc)); > > - urndis_stop(sc); > > splx(s); > > return; > > } > > >