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.. -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);