diff options
Diffstat (limited to 'net/can/raw.c')
| -rw-r--r-- | net/can/raw.c | 27 | 
1 files changed, 6 insertions, 21 deletions
| 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)  	if (!ro->recv_own_msgs && oskb->sk == sk)  		return; -	/* do not pass frames with DLC > 8 to a legacy socket */ -	if (!ro->fd_frames) { -		struct canfd_frame *cfd = (struct canfd_frame *)oskb->data; - -		if (unlikely(cfd->len > CAN_MAX_DLEN)) -			return; -	} +	/* do not pass non-CAN2.0 frames to a legacy socket */ +	if (!ro->fd_frames && oskb->len != CAN_MTU) +		return;  	/* clone the given skb to be able to enqueue it into the rcv queue */  	skb = skb_clone(oskb, GFP_ATOMIC); @@ -715,6 +711,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,  	skb->dev = dev;  	skb->sk  = sk; +	skb->priority = sk->sk_priority;  	err = can_send(skb, ro->loopback); @@ -737,9 +734,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,  		       struct msghdr *msg, size_t size, int flags)  {  	struct sock *sk = sock->sk; -	struct raw_sock *ro = raw_sk(sk);  	struct sk_buff *skb; -	int rxmtu;  	int err = 0;  	int noblock; @@ -750,20 +745,10 @@ static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,  	if (!skb)  		return err; -	/* -	 * when serving a legacy socket the DLC <= 8 is already checked inside -	 * raw_rcv(). Now check if we need to pass a canfd_frame to a legacy -	 * socket and cut the possible CANFD_MTU/CAN_MTU length to CAN_MTU -	 */ -	if (!ro->fd_frames) -		rxmtu = CAN_MTU; -	else -		rxmtu = skb->len; - -	if (size < rxmtu) +	if (size < skb->len)  		msg->msg_flags |= MSG_TRUNC;  	else -		size = rxmtu; +		size = skb->len;  	err = memcpy_toiovec(msg->msg_iov, skb->data, size);  	if (err < 0) { |