On Sat, Aug 18, 2018 at 11:05:04PM +0300, Artturi Alm wrote:
> On Thu, Jan 11, 2018 at 12:41:29AM +0200, Artturi Alm wrote:
> > On Wed, Sep 13, 2017 at 05:51:27AM +0300, Artturi Alm wrote:
> > > Hi,
> > >
> > > even after having recently updated the phone to a newer version of
> > > android,
> > > i'm still spammed by urndis w/msg on subject.
> > >
> > > doesn't really matter to me what you do to silence it, but something like
> > > below does work for me, and thanks in advacne:)
> > > -Artturi
> > >
> >
> > ping?
> > i was told i don't reason my diffs, so here's sorry attempt:
> > $ dmesg | wc -l
> > 1040
> > $ dmesg | grep urndis_decap | wc -l
> > 1039
> >
> > either of the diffs below would work for me.
> > -Artturi
> >
> >
> > ... this ...
> >
> > diff --git a/sys/dev/usb/if_urndis.c b/sys/dev/usb/if_urndis.c
> > index 5d148da4ab5..7dc12573c0d 100644
> > --- a/sys/dev/usb/if_urndis.c
> > +++ b/sys/dev/usb/if_urndis.c
> > @@ -834,11 +834,11 @@ urndis_decap(struct urndis_softc *sc, struct
> > urndis_chain *c, u_int32_t len)
> > len));
> >
> > if (len < sizeof(*msg)) {
> > - printf("%s: urndis_decap invalid buffer len %u < "
> > + DPRINTF(("%s: urndis_decap invalid buffer len %u < "
> > "minimum header %zu\n",
> > DEVNAME(sc),
> > len,
> > - sizeof(*msg));
> > + sizeof(*msg)));
> > return;
> > }
> >
> >
> >
> > ... or this ...
> >
> > diff --git a/sys/dev/usb/if_urndis.c b/sys/dev/usb/if_urndis.c
> > index 5d148da4ab5..4b2c6e89ec9 100644
> > --- a/sys/dev/usb/if_urndis.c
> > +++ b/sys/dev/usb/if_urndis.c
> > @@ -834,6 +834,8 @@ urndis_decap(struct urndis_softc *sc, struct
> > urndis_chain *c, u_int32_t len)
> > len));
> >
> > if (len < sizeof(*msg)) {
> > + if (len == 1) /* workaround for spamming androids */
> > + return;
> > printf("%s: urndis_decap invalid buffer len %u < "
> > "minimum header %zu\n",
> > DEVNAME(sc),
>
> Hi,
>
> this should fix the urndis_decap() spam more properly by allowing operation
> as is needed by the linux(android) gadget/function code for usb rndis too,
> which is explained there to be
> "zlp framing on tx for strict CDC-Ether conformance",
> and our cdce(4) does have somewhat similar if (total_len <= 1) goto done;.
>
> also, i think the _decap spam is as bad as it is because of those returns,
> dropping valid packet met before "error", leading to retries likely being
> the same; triggering the spam loop..
>
pong? the spam and dropping of a valid packet is not correct.
this is far from making the driver bug-free/following the spec,
but definately worth fixing as the only user-visible annoyance.
i don't think i can explain why any better than is done here:
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/usb-short-packets
above is specifically about/for rndis, even if the url doesn't hint so,
and there is a note it'll take two minutes to read..
> -Artturi
>
>
> diff --git sys/dev/usb/if_urndis.c sys/dev/usb/if_urndis.c
> index 5d148da4ab5..136e3e22af8 100644
> --- sys/dev/usb/if_urndis.c
> +++ sys/dev/usb/if_urndis.c
> @@ -820,13 +820,15 @@ urndis_decap(struct urndis_softc *sc, struct
> urndis_chain *c, u_int32_t len)
> struct mbuf_list ml = MBUF_LIST_INITIALIZER();
> struct rndis_packet_msg *msg;
> struct ifnet *ifp;
> + int got;
> int s;
> int offset;
>
> ifp = GET_IFP(sc);
> + got = 0;
> offset = 0;
>
> - while (len > 0) {
> + while (len > 1) {
> msg = (struct rndis_packet_msg *)((char*)c->sc_buf + offset);
> m = c->sc_mbuf;
>
> @@ -839,7 +841,7 @@ urndis_decap(struct urndis_softc *sc, struct urndis_chain
> *c, u_int32_t len)
> DEVNAME(sc),
> len,
> sizeof(*msg));
> - return;
> + break;
> }
>
> DPRINTF(("%s: urndis_decap len %u data(off:%u len:%u) "
> @@ -859,14 +861,14 @@ urndis_decap(struct urndis_softc *sc, struct
> urndis_chain *c, u_int32_t len)
> DEVNAME(sc),
> letoh32(msg->rm_type),
> REMOTE_NDIS_PACKET_MSG);
> - return;
> + break;
> }
> if (letoh32(msg->rm_len) < sizeof(*msg)) {
> printf("%s: urndis_decap invalid msg len %u < %zu\n",
> DEVNAME(sc),
> letoh32(msg->rm_len),
> sizeof(*msg));
> - return;
> + break;
> }
> if (letoh32(msg->rm_len) > len) {
> printf("%s: urndis_decap invalid msg len %u > buffer "
> @@ -874,7 +876,7 @@ urndis_decap(struct urndis_softc *sc, struct urndis_chain
> *c, u_int32_t len)
> DEVNAME(sc),
> letoh32(msg->rm_len),
> len);
> - return;
> + break;
> }
>
> if (letoh32(msg->rm_dataoffset) +
> @@ -889,7 +891,7 @@ urndis_decap(struct urndis_softc *sc, struct urndis_chain
> *c, u_int32_t len)
> letoh32(msg->rm_dataoffset) +
> letoh32(msg->rm_datalen) + RNDIS_HEADER_OFFSET,
> letoh32(msg->rm_len));
> - return;
> + break;
> }
>
> if (letoh32(msg->rm_datalen) < sizeof(struct ether_header)) {
> @@ -899,7 +901,7 @@ urndis_decap(struct urndis_softc *sc, struct urndis_chain
> *c, u_int32_t len)
> DEVNAME(sc),
> letoh32(msg->rm_datalen),
> sizeof(struct ether_header)));
> - return;
> + break;
> }
>
> memcpy(mtod(m, char*),
> @@ -911,11 +913,14 @@ urndis_decap(struct urndis_softc *sc, struct
> urndis_chain *c, u_int32_t len)
> ifp->if_ierrors++;
> } else {
> ml_enqueue(&ml, m);
> + got++;
> }
>
> offset += letoh32(msg->rm_len);
> len -= letoh32(msg->rm_len);
> }
> + if (!got)
> + return;
>
> s = splnet();
> if_input(ifp, &ml);