|
@@ -54,6 +54,7 @@
|
|
|
#include <linux/skbuff.h>
|
|
|
#include <linux/can.h>
|
|
|
#include <linux/can/core.h>
|
|
|
+#include <linux/can/skb.h>
|
|
|
#include <linux/can/bcm.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <net/sock.h>
|
|
@@ -256,10 +257,13 @@ static void bcm_can_tx(struct bcm_op *op)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- skb = alloc_skb(CFSIZ, gfp_any());
|
|
|
+ skb = alloc_skb(CFSIZ + sizeof(struct can_skb_priv), gfp_any());
|
|
|
if (!skb)
|
|
|
goto out;
|
|
|
|
|
|
+ skb_reserve(skb, sizeof(struct can_skb_priv));
|
|
|
+ ((struct can_skb_priv *)(skb->head))->ifindex = dev->ifindex;
|
|
|
+
|
|
|
memcpy(skb_put(skb, CFSIZ), cf, CFSIZ);
|
|
|
|
|
|
/* send with loopback */
|
|
@@ -1199,11 +1203,12 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk)
|
|
|
if (!ifindex)
|
|
|
return -ENODEV;
|
|
|
|
|
|
- skb = alloc_skb(CFSIZ, GFP_KERNEL);
|
|
|
-
|
|
|
+ skb = alloc_skb(CFSIZ + sizeof(struct can_skb_priv), GFP_KERNEL);
|
|
|
if (!skb)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
+ skb_reserve(skb, sizeof(struct can_skb_priv));
|
|
|
+
|
|
|
err = memcpy_fromiovec(skb_put(skb, CFSIZ), msg->msg_iov, CFSIZ);
|
|
|
if (err < 0) {
|
|
|
kfree_skb(skb);
|
|
@@ -1216,6 +1221,7 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk)
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
+ ((struct can_skb_priv *)(skb->head))->ifindex = dev->ifindex;
|
|
|
skb->dev = dev;
|
|
|
skb->sk = sk;
|
|
|
err = can_send(skb, 1); /* send with loopback */
|