lkml.org 
[lkml]   [2020]   [Jun]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 134/191] net: usb: ax88179_178a: fix packet alignment padding
    Date
    From: Jeremy Kerr <jk@ozlabs.org>

    [ Upstream commit e869e7a17798d85829fa7d4f9bbe1eebd4b2d3f6 ]

    Using a AX88179 device (0b95:1790), I see two bytes of appended data on
    every RX packet. For example, this 48-byte ping, using 0xff as a
    payload byte:

    04:20:22.528472 IP 192.168.1.1 > 192.168.1.2: ICMP echo request, id 2447, seq 1, length 64
    0x0000: 000a cd35 ea50 000a cd35 ea4f 0800 4500
    0x0010: 0054 c116 4000 4001 f63e c0a8 0101 c0a8
    0x0020: 0102 0800 b633 098f 0001 87ea cd5e 0000
    0x0030: 0000 dcf2 0600 0000 0000 ffff ffff ffff
    0x0040: ffff ffff ffff ffff ffff ffff ffff ffff
    0x0050: ffff ffff ffff ffff ffff ffff ffff ffff
    0x0060: ffff 961f

    Those last two bytes - 96 1f - aren't part of the original packet.

    In the ax88179 RX path, the usbnet rx_fixup function trims a 2-byte
    'alignment pseudo header' from the start of the packet, and sets the
    length from a per-packet field populated by hardware. It looks like that
    length field *includes* the 2-byte header; the current driver assumes
    that it's excluded.

    This change trims the 2-byte alignment header after we've set the packet
    length, so the resulting packet length is correct. While we're moving
    the comment around, this also fixes the spelling of 'pseudo'.

    Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/usb/ax88179_178a.c | 11 ++++++-----
    1 file changed, 6 insertions(+), 5 deletions(-)

    diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
    index 559af8e6ad90f..0434ecf677122 100644
    --- a/drivers/net/usb/ax88179_178a.c
    +++ b/drivers/net/usb/ax88179_178a.c
    @@ -1396,10 +1396,10 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
    }

    if (pkt_cnt == 0) {
    - /* Skip IP alignment psudo header */
    - skb_pull(skb, 2);
    skb->len = pkt_len;
    - skb_set_tail_pointer(skb, pkt_len);
    + /* Skip IP alignment pseudo header */
    + skb_pull(skb, 2);
    + skb_set_tail_pointer(skb, skb->len);
    skb->truesize = pkt_len + sizeof(struct sk_buff);
    ax88179_rx_checksum(skb, pkt_hdr);
    return 1;
    @@ -1408,8 +1408,9 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
    ax_skb = skb_clone(skb, GFP_ATOMIC);
    if (ax_skb) {
    ax_skb->len = pkt_len;
    - ax_skb->data = skb->data + 2;
    - skb_set_tail_pointer(ax_skb, pkt_len);
    + /* Skip IP alignment pseudo header */
    + skb_pull(ax_skb, 2);
    + skb_set_tail_pointer(ax_skb, ax_skb->len);
    ax_skb->truesize = pkt_len + sizeof(struct sk_buff);
    ax88179_rx_checksum(ax_skb, pkt_hdr);
    usbnet_skb_return(dev, ax_skb);
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-29 22:28    [W:4.027 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site