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) { |
