struct net_device __rcu *peer;
 };
 
-static netdev_tx_t vxcan_xmit(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t vxcan_xmit(struct sk_buff *oskb, struct net_device *dev)
 {
        struct vxcan_priv *priv = netdev_priv(dev);
        struct net_device *peer;
-       struct canfd_frame *cfd = (struct canfd_frame *)skb->data;
+       struct canfd_frame *cfd = (struct canfd_frame *)oskb->data;
        struct net_device_stats *peerstats, *srcstats = &dev->stats;
+       struct sk_buff *skb;
        u8 len;
 
-       if (can_dropped_invalid_skb(dev, skb))
+       if (can_dropped_invalid_skb(dev, oskb))
                return NETDEV_TX_OK;
 
        rcu_read_lock();
        peer = rcu_dereference(priv->peer);
        if (unlikely(!peer)) {
-               kfree_skb(skb);
+               kfree_skb(oskb);
                dev->stats.tx_dropped++;
                goto out_unlock;
        }
 
-       skb = can_create_echo_skb(skb);
-       if (!skb)
+       skb = skb_clone(oskb, GFP_ATOMIC);
+       if (skb) {
+               consume_skb(oskb);
+       } else {
+               kfree(oskb);
                goto out_unlock;
+       }
 
        /* reset CAN GW hop counter */
        skb->csum_start = 0;