• Nicolas Boichat's avatar
    ath10k: adjust skb length in ath10k_sdio_mbox_rx_packet · b7139960
    Nicolas Boichat authored
    When the FW bundles multiple packets, pkt->act_len may be incorrect
    as it refers to the first packet only (however, the FW will only
    bundle packets that fit into the same pkt->alloc_len).
    
    Before this patch, the skb length would be set (incorrectly) to
    pkt->act_len in ath10k_sdio_mbox_rx_packet, and then later manually
    adjusted in ath10k_sdio_mbox_rx_process_packet.
    
    The first problem is that ath10k_sdio_mbox_rx_process_packet does not
    use proper skb_put commands to adjust the length (it directly changes
    skb->len), so we end up with a mismatch between skb->head + skb->tail
    and skb->data + skb->len. This is quite serious, and causes corruptions
    in the TCP stack, as the stack tries to coalesce packets, and relies
    on skb->tail being correct (that is, skb_tail_pointer must point to
    the first byte_after_ the data).
    
    Instead of re-adjusting the size in ath10k_sdio_mbox_rx_process_packet,
    this moves the code to ath10k_sdio_mbox_rx_packet, and also add a
    bounds check, as skb_put would crash the kernel if not enough space is
    available.
    
    Tested with QCA6174 SDIO with firmware
    WLAN.RMH.4.4.1-00007-QCARMSWP-1.
    
    Fixes: 8530b4e7 ("ath10k: sdio: set skb len for all rx packets")
    Signed-off-by: default avatarNicolas Boichat <drinkcat@chromium.org>
    Signed-off-by: default avatarWen Gong <wgong@codeaurora.org>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    b7139960
sdio.c 54.3 KB