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

Reply via email to