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