can: do not increase rx_bytes statistics for RTR frames
authorVincent Mailhol <mailhol.vincent@wanadoo.fr>
Tue, 7 Dec 2021 12:15:30 +0000 (21:15 +0900)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 5 Jan 2022 11:09:05 +0000 (12:09 +0100)
The actual payload length of the CAN Remote Transmission Request (RTR)
frames is always 0, i.e. no payload is transmitted on the wire.
However, those RTR frames still use the DLC to indicate the length of
the requested frame.

As such, net_device_stats::rx_bytes should not be increased for the
RTR frames.

This patch fixes all the CAN drivers.

Link: https://lore.kernel.org/all/20211207121531.42941-5-mailhol.vincent@wanadoo.fr
Cc: Marc Kleine-Budde <mkl@pengutronix.de>
Cc: Nicolas Ferre <nicolas.ferre@microchip.com>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
Cc: Ludovic Desroches <ludovic.desroches@microchip.com>
Cc: Chandrasekar Ramakrishnan <rcsekar@samsung.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Chen-Yu Tsai <wens@csie.org>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: Yasushi SHOJI <yashi@spacecubics.com>
Cc: Appana Durga Kedareswara rao <appana.durga.rao@xilinx.com>
Cc: Naga Sureshkumar Relli <naga.sureshkumar.relli@xilinx.com>
Cc: Michal Simek <michal.simek@xilinx.com>
Cc: Stephane Grosjean <s.grosjean@peak-system.com>
Tested-by: Jimmy Assarsson <extja@kvaser.com> # kvaser
Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Acked-by: Stefan Mätje <stefan.maetje@esd.eu> # esd_usb2
Tested-by: Stefan Mätje <stefan.maetje@esd.eu> # esd_usb2
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
30 files changed:
drivers/net/can/at91_can.c
drivers/net/can/c_can/c_can_main.c
drivers/net/can/cc770/cc770.c
drivers/net/can/dev/rx-offload.c
drivers/net/can/grcan.c
drivers/net/can/ifi_canfd/ifi_canfd.c
drivers/net/can/janz-ican3.c
drivers/net/can/kvaser_pciefd.c
drivers/net/can/m_can/m_can.c
drivers/net/can/mscan/mscan.c
drivers/net/can/pch_can.c
drivers/net/can/peak_canfd/peak_canfd.c
drivers/net/can/rcar/rcar_can.c
drivers/net/can/rcar/rcar_canfd.c
drivers/net/can/sja1000/sja1000.c
drivers/net/can/slcan.c
drivers/net/can/spi/hi311x.c
drivers/net/can/spi/mcp251x.c
drivers/net/can/sun4i_can.c
drivers/net/can/usb/ems_usb.c
drivers/net/can/usb/esd_usb2.c
drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c
drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c
drivers/net/can/usb/mcba_usb.c
drivers/net/can/usb/peak_usb/pcan_usb.c
drivers/net/can/usb/peak_usb/pcan_usb_fd.c
drivers/net/can/usb/peak_usb/pcan_usb_pro.c
drivers/net/can/usb/ucan.c
drivers/net/can/usb/usb_8dev.c
drivers/net/can/xilinx_can.c

index 3cd872c..97f1d08 100644 (file)
@@ -617,7 +617,9 @@ static void at91_read_msg(struct net_device *dev, unsigned int mb)
        at91_read_mb(dev, mb, cf);
 
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+       if (!(cf->can_id & CAN_RTR_FLAG))
+               stats->rx_bytes += cf->len;
+
        netif_receive_skb(skb);
 
        can_led_event(dev, CAN_LED_EVENT_RX);
index 670754a..29e9180 100644 (file)
@@ -403,10 +403,10 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, u32 ctrl)
                                frame->data[i + 1] = data >> 8;
                        }
                }
-       }
 
+               stats->rx_bytes += frame->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += frame->len;
 
        netif_receive_skb(skb);
        return 0;
index a5fd8cc..994073c 100644 (file)
@@ -489,10 +489,11 @@ static void cc770_rx(struct net_device *dev, unsigned int mo, u8 ctrl1)
                cf->len = can_cc_dlc2len((config & 0xf0) >> 4);
                for (i = 0; i < cf->len; i++)
                        cf->data[i] = cc770_read_reg(priv, msgobj[mo].data[i]);
-       }
 
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+
        netif_rx(skb);
 }
 
index 7dbf46b..7f80d8e 100644 (file)
@@ -56,7 +56,8 @@ static int can_rx_offload_napi_poll(struct napi_struct *napi, int quota)
                work_done++;
                if (!(cf->can_id & CAN_ERR_FLAG)) {
                        stats->rx_packets++;
-                       stats->rx_bytes += cf->len;
+                       if (!(cf->can_id & CAN_RTR_FLAG))
+                               stats->rx_bytes += cf->len;
                }
                netif_receive_skb(skb);
        }
index 78e2794..1b8ef97 100644 (file)
@@ -1211,11 +1211,11 @@ static int grcan_receive(struct net_device *dev, int budget)
                                shift = GRCAN_MSG_DATA_SHIFT(i);
                                cf->data[i] = (u8)(slot[j] >> shift);
                        }
-               }
 
-               /* Update statistics and read pointer */
+                       stats->rx_bytes += cf->len;
+               }
                stats->rx_packets++;
-               stats->rx_bytes += cf->len;
+
                netif_receive_skb(skb);
 
                rd = grcan_ring_add(rd, GRCAN_MSG_SIZE, dma->rx.size);
index e8318e9..b0a3473 100644 (file)
@@ -309,15 +309,15 @@ static void ifi_canfd_read_fifo(struct net_device *ndev)
                        *(u32 *)(cf->data + i) =
                                readl(priv->base + IFI_CANFD_RXFIFO_DATA + i);
                }
+
+               stats->rx_bytes += cf->len;
        }
+       stats->rx_packets++;
 
        /* Remove the packet from FIFO */
        writel(IFI_CANFD_RXSTCMD_REMOVE_MSG, priv->base + IFI_CANFD_RXSTCMD);
        writel(rx_irq_mask, priv->base + IFI_CANFD_INTERRUPT);
 
-       stats->rx_packets++;
-       stats->rx_bytes += cf->len;
-
        netif_receive_skb(skb);
 }
 
index 32006db..5c589aa 100644 (file)
@@ -1421,7 +1421,8 @@ static int ican3_recv_skb(struct ican3_dev *mod)
 
        /* update statistics, receive the skb */
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+       if (!(cf->can_id & CAN_RTR_FLAG))
+               stats->rx_bytes += cf->len;
        netif_receive_skb(skb);
 
 err_noalloc:
index ab672c9..017f2d3 100644 (file)
@@ -1185,20 +1185,21 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie,
 
        cf->len = can_fd_dlc2len(p->header[1] >> KVASER_PCIEFD_RPACKET_DLC_SHIFT);
 
-       if (p->header[0] & KVASER_PCIEFD_RPACKET_RTR)
+       if (p->header[0] & KVASER_PCIEFD_RPACKET_RTR) {
                cf->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cf->data, data, cf->len);
 
+               stats->rx_bytes += cf->len;
+       }
+       stats->rx_packets++;
+
        shhwtstamps = skb_hwtstamps(skb);
 
        shhwtstamps->hwtstamp =
                ns_to_ktime(div_u64(p->timestamp * 1000,
                                    pcie->freq_to_ticks_div));
 
-       stats->rx_bytes += cf->len;
-       stats->rx_packets++;
-
        return netif_rx(skb);
 }
 
index 30d94cb..ae23494 100644 (file)
@@ -518,14 +518,14 @@ static int m_can_read_fifo(struct net_device *dev, u32 rxfs)
                                      cf->data, DIV_ROUND_UP(cf->len, 4));
                if (err)
                        goto out_free_skb;
+
+               stats->rx_bytes += cf->len;
        }
+       stats->rx_packets++;
 
        /* acknowledge rx fifo 0 */
        m_can_write(cdev, M_CAN_RXF0A, fgi);
 
-       stats->rx_packets++;
-       stats->rx_bytes += cf->len;
-
        timestamp = FIELD_GET(RX_BUF_RXTS_MASK, fifo_header.dlc);
 
        m_can_receive_skb(cdev, skb, timestamp);
index 9e1cce0..59b8284 100644 (file)
@@ -404,7 +404,8 @@ static int mscan_rx_poll(struct napi_struct *napi, int quota)
                if (canrflg & MSCAN_RXF) {
                        mscan_get_rx_frame(dev, frame);
                        stats->rx_packets++;
-                       stats->rx_bytes += frame->len;
+                       if (!(frame->can_id & CAN_RTR_FLAG))
+                               stats->rx_bytes += frame->len;
                } else if (canrflg & MSCAN_ERR_IF) {
                        mscan_get_err_frame(dev, frame, canrflg);
                }
index 4bf9bfc..b46f9cf 100644 (file)
@@ -688,12 +688,12 @@ static int pch_can_rx_normal(struct net_device *ndev, u32 obj_num, int quota)
                                cf->data[i] = data_reg;
                                cf->data[i + 1] = data_reg >> 8;
                        }
-               }
 
-               rcv_pkts++;
+                       stats->rx_bytes += cf->len;
+               }
                stats->rx_packets++;
+               rcv_pkts++;
                quota--;
-               stats->rx_bytes += cf->len;
                netif_receive_skb(skb);
 
                pch_fifo_thresh(priv, obj_num);
index d5b8bc6..2166091 100644 (file)
@@ -310,12 +310,13 @@ static int pucan_handle_can_rx(struct peak_canfd_priv *priv,
        if (rx_msg_flags & PUCAN_MSG_EXT_ID)
                cf->can_id |= CAN_EFF_FLAG;
 
-       if (rx_msg_flags & PUCAN_MSG_RTR)
+       if (rx_msg_flags & PUCAN_MSG_RTR) {
                cf->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cf->data, msg->d, cf->len);
 
-       stats->rx_bytes += cf->len;
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
 
        pucan_netif_rx(skb, msg->ts_low, msg->ts_high);
index f408ed9..62bbd58 100644 (file)
@@ -662,12 +662,13 @@ static void rcar_can_rx_pkt(struct rcar_can_priv *priv)
                for (dlc = 0; dlc < cf->len; dlc++)
                        cf->data[dlc] =
                        readb(&priv->regs->mb[RCAR_CAN_RX_FIFO_MBX].data[dlc]);
+
+               stats->rx_bytes += cf->len;
        }
+       stats->rx_packets++;
 
        can_led_event(priv->ndev, CAN_LED_EVENT_RX);
 
-       stats->rx_bytes += cf->len;
-       stats->rx_packets++;
        netif_receive_skb(skb);
 }
 
index db9d628..b1eded2 100644 (file)
@@ -1550,7 +1550,8 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
 
        can_led_event(priv->ndev, CAN_LED_EVENT_RX);
 
-       stats->rx_bytes += cf->len;
+       if (!(cf->can_id & CAN_RTR_FLAG))
+               stats->rx_bytes += cf->len;
        stats->rx_packets++;
        netif_receive_skb(skb);
 }
index a65546c..4bf44d4 100644 (file)
@@ -372,15 +372,16 @@ static void sja1000_rx(struct net_device *dev)
        } else {
                for (i = 0; i < cf->len; i++)
                        cf->data[i] = priv->read_reg(priv, dreg++);
+
+               stats->rx_bytes += cf->len;
        }
+       stats->rx_packets++;
 
        cf->can_id = id;
 
        /* release receive buffer */
        sja1000_write_cmdreg(priv, CMD_RRB);
 
-       stats->rx_packets++;
-       stats->rx_bytes += cf->len;
        netif_rx(skb);
 
        can_led_event(dev, CAN_LED_EVENT_RX);
index 9a4ebda..5cf0345 100644 (file)
@@ -218,7 +218,9 @@ static void slc_bump(struct slcan *sl)
        skb_put_data(skb, &cf, sizeof(struct can_frame));
 
        sl->dev->stats.rx_packets++;
-       sl->dev->stats.rx_bytes += cf.len;
+       if (!(cf.can_id & CAN_RTR_FLAG))
+               sl->dev->stats.rx_bytes += cf.len;
+
        netif_rx_ni(skb);
 }
 
index a17641d..5066250 100644 (file)
@@ -343,14 +343,15 @@ static void hi3110_hw_rx(struct spi_device *spi)
        /* Data length */
        frame->len = can_cc_dlc2len(buf[HI3110_FIFO_WOTIME_DLC_OFF] & 0x0F);
 
-       if (buf[HI3110_FIFO_WOTIME_ID_OFF + 3] & HI3110_FIFO_WOTIME_ID_RTR)
+       if (buf[HI3110_FIFO_WOTIME_ID_OFF + 3] & HI3110_FIFO_WOTIME_ID_RTR) {
                frame->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(frame->data, buf + HI3110_FIFO_WOTIME_DAT_OFF,
                       frame->len);
 
+               priv->net->stats.rx_bytes += frame->len;
+       }
        priv->net->stats.rx_packets++;
-       priv->net->stats.rx_bytes += frame->len;
 
        can_led_event(priv->net, CAN_LED_EVENT_RX);
 
index 2fa1e85..0da965d 100644 (file)
@@ -730,11 +730,12 @@ static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx)
        }
        /* Data length */
        frame->len = can_cc_dlc2len(buf[RXBDLC_OFF] & RXBDLC_LEN_MASK);
-       if (!(frame->can_id & CAN_RTR_FLAG))
+       if (!(frame->can_id & CAN_RTR_FLAG)) {
                memcpy(frame->data, buf + RXBDAT_OFF, frame->len);
 
+               priv->net->stats.rx_bytes += frame->len;
+       }
        priv->net->stats.rx_packets++;
-       priv->net->stats.rx_bytes += frame->len;
 
        can_led_event(priv->net, CAN_LED_EVENT_RX);
 
index a2d8d77..e18868a 100644 (file)
@@ -501,18 +501,20 @@ static void sun4i_can_rx(struct net_device *dev)
        }
 
        /* remote frame ? */
-       if (fi & SUN4I_MSG_RTR_FLAG)
+       if (fi & SUN4I_MSG_RTR_FLAG) {
                id |= CAN_RTR_FLAG;
-       else
+       } else {
                for (i = 0; i < cf->len; i++)
                        cf->data[i] = readl(priv->base + dreg + i * 4);
 
+               stats->rx_bytes += cf->len;
+       }
+       stats->rx_packets++;
+
        cf->can_id = id;
 
        sun4i_can_write_cmdreg(priv, SUN4I_CMD_RELEASE_RBUF);
 
-       stats->rx_packets++;
-       stats->rx_bytes += cf->len;
        netif_rx(skb);
 
        can_led_event(dev, CAN_LED_EVENT_RX);
index 7cf6593..c9b6adf 100644 (file)
@@ -320,10 +320,11 @@ static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg)
        } else {
                for (i = 0; i < cf->len; i++)
                        cf->data[i] = msg->msg.can_msg.msg[i];
-       }
 
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+
        netif_rx(skb);
 }
 
index 5f6915a..9ac7ee4 100644 (file)
@@ -332,10 +332,11 @@ static void esd_usb2_rx_can_msg(struct esd_usb2_net_priv *priv,
                } else {
                        for (i = 0; i < cf->len; i++)
                                cf->data[i] = msg->msg.rx.data[i];
-               }
 
+                       stats->rx_bytes += cf->len;
+               }
                stats->rx_packets++;
-               stats->rx_bytes += cf->len;
+
                netif_rx(skb);
        }
 
index 60e7c5f..bc902da 100644 (file)
@@ -1206,13 +1206,15 @@ static void kvaser_usb_hydra_rx_msg_std(const struct kvaser_usb *dev,
 
        cf->len = can_cc_dlc2len(cmd->rx_can.dlc);
 
-       if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME)
+       if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME) {
                cf->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cf->data, cmd->rx_can.data, cf->len);
 
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+
        netif_rx(skb);
 }
 
@@ -1284,13 +1286,15 @@ static void kvaser_usb_hydra_rx_msg_ext(const struct kvaser_usb *dev,
                cf->len = can_cc_dlc2len(dlc);
        }
 
-       if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME)
+       if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME) {
                cf->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cf->data, cmd->rx_can.kcan_payload, cf->len);
 
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+
        netif_rx(skb);
 }
 
index d7e8e9b..891271a 100644 (file)
@@ -1068,7 +1068,8 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
        }
 
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
+       if (!(cf->can_id & CAN_RTR_FLAG))
+               stats->rx_bytes += cf->len;
        netif_rx(skb);
 }
 
index 162d2e1..4d20ea8 100644 (file)
@@ -452,13 +452,14 @@ static void mcba_usb_process_can(struct mcba_priv *priv,
 
        cf->len = can_cc_dlc2len(msg->dlc & MCBA_DLC_MASK);
 
-       if (msg->dlc & MCBA_DLC_RTR_MASK)
+       if (msg->dlc & MCBA_DLC_RTR_MASK) {
                cf->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cf->data, msg->data, cf->len);
 
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
-       stats->rx_bytes += cf->len;
 
        can_led_event(priv->netdev, CAN_LED_EVENT_RX);
        netif_rx(skb);
index a594178..17dc178 100644 (file)
@@ -677,15 +677,16 @@ static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len)
                /* Ignore next byte (client private id) if SRR bit is set */
                if (can_id_flags & PCAN_USB_TX_SRR)
                        mc->ptr++;
+
+               /* update statistics */
+               mc->netdev->stats.rx_bytes += cf->len;
        }
+       mc->netdev->stats.rx_packets++;
 
        /* convert timestamp into kernel time */
        hwts = skb_hwtstamps(skb);
        peak_usb_get_ts_time(&mc->pdev->time_ref, mc->ts16, &hwts->hwtstamp);
 
-       /* update statistics */
-       mc->netdev->stats.rx_packets++;
-       mc->netdev->stats.rx_bytes += cf->len;
        /* push the skb */
        netif_rx(skb);
 
index 185f5a9..65487ec 100644 (file)
@@ -507,13 +507,13 @@ static int pcan_usb_fd_decode_canmsg(struct pcan_usb_fd_if *usb_if,
        if (rx_msg_flags & PUCAN_MSG_EXT_ID)
                cfd->can_id |= CAN_EFF_FLAG;
 
-       if (rx_msg_flags & PUCAN_MSG_RTR)
+       if (rx_msg_flags & PUCAN_MSG_RTR) {
                cfd->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(cfd->data, rm->d, cfd->len);
-
+               netdev->stats.rx_bytes += cfd->len;
+       }
        netdev->stats.rx_packets++;
-       netdev->stats.rx_bytes += cfd->len;
 
        peak_usb_netif_rx_64(skb, le32_to_cpu(rm->ts_low),
                             le32_to_cpu(rm->ts_high));
index f6d1987..ebe087f 100644 (file)
@@ -536,17 +536,19 @@ static int pcan_usb_pro_handle_canmsg(struct pcan_usb_pro_interface *usb_if,
        if (rx->flags & PCAN_USBPRO_EXT)
                can_frame->can_id |= CAN_EFF_FLAG;
 
-       if (rx->flags & PCAN_USBPRO_RTR)
+       if (rx->flags & PCAN_USBPRO_RTR) {
                can_frame->can_id |= CAN_RTR_FLAG;
-       else
+       } else {
                memcpy(can_frame->data, rx->data, can_frame->len);
 
+               netdev->stats.rx_bytes += can_frame->len;
+       }
+       netdev->stats.rx_packets++;
+
        hwts = skb_hwtstamps(skb);
        peak_usb_get_ts_time(&usb_if->time_ref, le32_to_cpu(rx->ts32),
                             &hwts->hwtstamp);
 
-       netdev->stats.rx_packets++;
-       netdev->stats.rx_bytes += can_frame->len;
        netif_rx(skb);
 
        return 0;
index d582c39..3888990 100644 (file)
@@ -623,7 +623,8 @@ static void ucan_rx_can_msg(struct ucan_priv *up, struct ucan_message_in *m)
        /* don't count error frames as real packets */
        if (!(cf->can_id & CAN_ERR_FLAG)) {
                stats->rx_packets++;
-               stats->rx_bytes += cf->len;
+               if (!(cf->can_id & CAN_RTR_FLAG))
+                       stats->rx_bytes += cf->len;
        }
 
        /* pass it to Linux */
index c81ca5e..d0ef147 100644 (file)
@@ -472,13 +472,14 @@ static void usb_8dev_rx_can_msg(struct usb_8dev_priv *priv,
                if (msg->flags & USB_8DEV_EXTID)
                        cf->can_id |= CAN_EFF_FLAG;
 
-               if (msg->flags & USB_8DEV_RTR)
+               if (msg->flags & USB_8DEV_RTR) {
                        cf->can_id |= CAN_RTR_FLAG;
-               else
+               } else {
                        memcpy(cf->data, msg->data, cf->len);
-
+                       stats->rx_bytes += cf->len;
+               }
                stats->rx_packets++;
-               stats->rx_bytes += cf->len;
+
                netif_rx(skb);
 
                can_led_event(priv->netdev, CAN_LED_EVENT_RX);
index 275e240..ffca1cd 100644 (file)
@@ -787,10 +787,11 @@ static int xcan_rx(struct net_device *ndev, int frame_base)
                        *(__be32 *)(cf->data) = cpu_to_be32(data[0]);
                if (cf->len > 4)
                        *(__be32 *)(cf->data + 4) = cpu_to_be32(data[1]);
-       }
 
-       stats->rx_bytes += cf->len;
+               stats->rx_bytes += cf->len;
+       }
        stats->rx_packets++;
+
        netif_receive_skb(skb);
 
        return 1;
@@ -871,8 +872,11 @@ static int xcanfd_rx(struct net_device *ndev, int frame_base)
                        *(__be32 *)(cf->data + i) = cpu_to_be32(data[0]);
                }
        }
-       stats->rx_bytes += cf->len;
+
+       if (!(cf->can_id & CAN_RTR_FLAG))
+               stats->rx_bytes += cf->len;
        stats->rx_packets++;
+
        netif_receive_skb(skb);
 
        return 1;