diff options
Diffstat (limited to 'net/can')
-rw-r--r-- | net/can/af_can.c | 3 | ||||
-rw-r--r-- | net/can/bcm.c | 4 | ||||
-rw-r--r-- | net/can/raw.c | 27 |
3 files changed, 10 insertions, 24 deletions
diff --git a/net/can/af_can.c b/net/can/af_can.c index d249874a366d..a27f8aad9e99 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c | |||
@@ -57,6 +57,7 @@ | |||
57 | #include <linux/skbuff.h> | 57 | #include <linux/skbuff.h> |
58 | #include <linux/can.h> | 58 | #include <linux/can.h> |
59 | #include <linux/can/core.h> | 59 | #include <linux/can/core.h> |
60 | #include <linux/can/skb.h> | ||
60 | #include <linux/ratelimit.h> | 61 | #include <linux/ratelimit.h> |
61 | #include <net/net_namespace.h> | 62 | #include <net/net_namespace.h> |
62 | #include <net/sock.h> | 63 | #include <net/sock.h> |
@@ -290,7 +291,7 @@ int can_send(struct sk_buff *skb, int loop) | |||
290 | return -ENOMEM; | 291 | return -ENOMEM; |
291 | } | 292 | } |
292 | 293 | ||
293 | newskb->sk = skb->sk; | 294 | can_skb_set_owner(newskb, skb->sk); |
294 | newskb->ip_summed = CHECKSUM_UNNECESSARY; | 295 | newskb->ip_summed = CHECKSUM_UNNECESSARY; |
295 | newskb->pkt_type = PACKET_BROADCAST; | 296 | newskb->pkt_type = PACKET_BROADCAST; |
296 | } | 297 | } |
diff --git a/net/can/bcm.c b/net/can/bcm.c index 3fc737b214c7..dcb75c0e66c1 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
@@ -268,7 +268,7 @@ static void bcm_can_tx(struct bcm_op *op) | |||
268 | 268 | ||
269 | /* send with loopback */ | 269 | /* send with loopback */ |
270 | skb->dev = dev; | 270 | skb->dev = dev; |
271 | skb->sk = op->sk; | 271 | can_skb_set_owner(skb, op->sk); |
272 | can_send(skb, 1); | 272 | can_send(skb, 1); |
273 | 273 | ||
274 | /* update statistics */ | 274 | /* update statistics */ |
@@ -1223,7 +1223,7 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk) | |||
1223 | 1223 | ||
1224 | can_skb_prv(skb)->ifindex = dev->ifindex; | 1224 | can_skb_prv(skb)->ifindex = dev->ifindex; |
1225 | skb->dev = dev; | 1225 | skb->dev = dev; |
1226 | skb->sk = sk; | 1226 | can_skb_set_owner(skb, sk); |
1227 | err = can_send(skb, 1); /* send with loopback */ | 1227 | err = can_send(skb, 1); /* send with loopback */ |
1228 | dev_put(dev); | 1228 | dev_put(dev); |
1229 | 1229 | ||
diff --git a/net/can/raw.c b/net/can/raw.c index 07d72d852324..081e81fd017f 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
@@ -121,13 +121,9 @@ static void raw_rcv(struct sk_buff *oskb, void *data) | |||
121 | if (!ro->recv_own_msgs && oskb->sk == sk) | 121 | if (!ro->recv_own_msgs && oskb->sk == sk) |
122 | return; | 122 | return; |
123 | 123 | ||
124 | /* do not pass frames with DLC > 8 to a legacy socket */ | 124 | /* do not pass non-CAN2.0 frames to a legacy socket */ |
125 | if (!ro->fd_frames) { | 125 | if (!ro->fd_frames && oskb->len != CAN_MTU) |
126 | struct canfd_frame *cfd = (struct canfd_frame *)oskb->data; | 126 | return; |
127 | |||
128 | if (unlikely(cfd->len > CAN_MAX_DLEN)) | ||
129 | return; | ||
130 | } | ||
131 | 127 | ||
132 | /* clone the given skb to be able to enqueue it into the rcv queue */ | 128 | /* clone the given skb to be able to enqueue it into the rcv queue */ |
133 | skb = skb_clone(oskb, GFP_ATOMIC); | 129 | skb = skb_clone(oskb, GFP_ATOMIC); |
@@ -715,6 +711,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
715 | 711 | ||
716 | skb->dev = dev; | 712 | skb->dev = dev; |
717 | skb->sk = sk; | 713 | skb->sk = sk; |
714 | skb->priority = sk->sk_priority; | ||
718 | 715 | ||
719 | err = can_send(skb, ro->loopback); | 716 | err = can_send(skb, ro->loopback); |
720 | 717 | ||
@@ -737,9 +734,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
737 | struct msghdr *msg, size_t size, int flags) | 734 | struct msghdr *msg, size_t size, int flags) |
738 | { | 735 | { |
739 | struct sock *sk = sock->sk; | 736 | struct sock *sk = sock->sk; |
740 | struct raw_sock *ro = raw_sk(sk); | ||
741 | struct sk_buff *skb; | 737 | struct sk_buff *skb; |
742 | int rxmtu; | ||
743 | int err = 0; | 738 | int err = 0; |
744 | int noblock; | 739 | int noblock; |
745 | 740 | ||
@@ -750,20 +745,10 @@ static int raw_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
750 | if (!skb) | 745 | if (!skb) |
751 | return err; | 746 | return err; |
752 | 747 | ||
753 | /* | 748 | if (size < skb->len) |
754 | * when serving a legacy socket the DLC <= 8 is already checked inside | ||
755 | * raw_rcv(). Now check if we need to pass a canfd_frame to a legacy | ||
756 | * socket and cut the possible CANFD_MTU/CAN_MTU length to CAN_MTU | ||
757 | */ | ||
758 | if (!ro->fd_frames) | ||
759 | rxmtu = CAN_MTU; | ||
760 | else | ||
761 | rxmtu = skb->len; | ||
762 | |||
763 | if (size < rxmtu) | ||
764 | msg->msg_flags |= MSG_TRUNC; | 749 | msg->msg_flags |= MSG_TRUNC; |
765 | else | 750 | else |
766 | size = rxmtu; | 751 | size = skb->len; |
767 | 752 | ||
768 | err = memcpy_toiovec(msg->msg_iov, skb->data, size); | 753 | err = memcpy_toiovec(msg->msg_iov, skb->data, size); |
769 | if (err < 0) { | 754 | if (err < 0) { |