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

Reply via email to