struct sk_buff *skb;
        struct chnl_net *priv  = container_of(layr, struct chnl_net, chnl);
        int pktlen;
-       int err = 0;
        const u8 *ip_version;
        u8 buf;
 
 
        /* check the version of IP */
        ip_version = skb_header_pointer(skb, 0, 1, &buf);
-       if (!ip_version)
-               return -EINVAL;
+
        switch (*ip_version >> 4) {
        case 4:
                skb->protocol = htons(ETH_P_IP);
                skb->protocol = htons(ETH_P_IPV6);
                break;
        default:
+               priv->netdev->stats.rx_errors++;
                return -EINVAL;
        }
 
        priv->netdev->stats.rx_packets++;
        priv->netdev->stats.rx_bytes += pktlen;
 
-       return err;
+       return 0;
 }
 
 static int delete_device(struct chnl_net *dev)
 
        if (skb->len > priv->netdev->mtu) {
                pr_warn("Size of skb exceeded MTU\n");
+               dev->stats.tx_errors++;
                return -ENOSPC;
        }
 
        if (!priv->flowenabled) {
                pr_debug("dropping packets flow off\n");
+               dev->stats.tx_dropped++;
                return NETDEV_TX_BUSY;
        }
 
        /* Send the packet down the stack. */
        result = priv->chnl.dn->transmit(priv->chnl.dn, pkt);
        if (result) {
-               if (result == -EAGAIN)
-                       result = NETDEV_TX_BUSY;
+               dev->stats.tx_dropped++;
                return result;
        }