net: wan: fsl_qmc_hdlc: Discard received CRC
commit e549360069b4a57e111b8222fc072f3c7c1688ab upstream. Received frame from QMC contains the CRC. Upper layers don't need this CRC and tcpdump mentioned trailing junk data due to this CRC presence. As some other HDLC driver, simply discard this CRC. Fixes: d0f2258e79fd ("net: wan: Add support for QMC HDLC") Cc: stable@vger.kernel.org Signed-off-by: Herve Codina <herve.codina@bootlin.com> Reviewed-by: Simon Horman <horms@kernel.org> Link: https://patch.msgid.link/20240730063133.179598-1-herve.codina@bootlin.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
f223d2b4ac
commit
2c9d235def
@ -250,6 +250,7 @@ static void qmc_hcld_recv_complete(void *context, size_t length, unsigned int fl
|
||||
struct qmc_hdlc_desc *desc = context;
|
||||
struct net_device *netdev;
|
||||
struct qmc_hdlc *qmc_hdlc;
|
||||
size_t crc_size;
|
||||
int ret;
|
||||
|
||||
netdev = desc->netdev;
|
||||
@ -268,15 +269,26 @@ static void qmc_hcld_recv_complete(void *context, size_t length, unsigned int fl
|
||||
if (flags & QMC_RX_FLAG_HDLC_CRC) /* CRC error */
|
||||
netdev->stats.rx_crc_errors++;
|
||||
kfree_skb(desc->skb);
|
||||
} else {
|
||||
netdev->stats.rx_packets++;
|
||||
netdev->stats.rx_bytes += length;
|
||||
|
||||
skb_put(desc->skb, length);
|
||||
desc->skb->protocol = hdlc_type_trans(desc->skb, netdev);
|
||||
netif_rx(desc->skb);
|
||||
goto re_queue;
|
||||
}
|
||||
|
||||
/* Discard the CRC */
|
||||
crc_size = qmc_hdlc->is_crc32 ? 4 : 2;
|
||||
if (length < crc_size) {
|
||||
netdev->stats.rx_length_errors++;
|
||||
kfree_skb(desc->skb);
|
||||
goto re_queue;
|
||||
}
|
||||
length -= crc_size;
|
||||
|
||||
netdev->stats.rx_packets++;
|
||||
netdev->stats.rx_bytes += length;
|
||||
|
||||
skb_put(desc->skb, length);
|
||||
desc->skb->protocol = hdlc_type_trans(desc->skb, netdev);
|
||||
netif_rx(desc->skb);
|
||||
|
||||
re_queue:
|
||||
/* Re-queue a transfer using the same descriptor */
|
||||
ret = qmc_hdlc_recv_queue(qmc_hdlc, desc, desc->dma_size);
|
||||
if (ret) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user