raw.c (6f84981772535e670e4e2df051a672af229b6694) raw.c (3793301cbaa4a62d83e21f685307da7671f812ab)
1// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
2/* raw.c - Raw sockets for protocol family CAN
3 *
4 * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 118 unchanged lines hidden (view full) ---

127 struct sk_buff *skb;
128 unsigned int *pflags;
129
130 /* check the received tx sock reference */
131 if (!ro->recv_own_msgs && oskb->sk == sk)
132 return;
133
134 /* make sure to not pass oversized frames to the socket */
1// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
2/* raw.c - Raw sockets for protocol family CAN
3 *
4 * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 118 unchanged lines hidden (view full) ---

127 struct sk_buff *skb;
128 unsigned int *pflags;
129
130 /* check the received tx sock reference */
131 if (!ro->recv_own_msgs && oskb->sk == sk)
132 return;
133
134 /* make sure to not pass oversized frames to the socket */
135 if ((can_is_canfd_skb(oskb) && !ro->fd_frames && !ro->xl_frames) ||
136 (can_is_canxl_skb(oskb) && !ro->xl_frames))
135 if ((!ro->fd_frames && can_is_canfd_skb(oskb)) ||
136 (!ro->xl_frames && can_is_canxl_skb(oskb)))
137 return;
138
139 /* eliminate multiple filter matches for the same skb */
140 if (this_cpu_ptr(ro->uniq)->skb == oskb &&
141 this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) {
142 if (!ro->join_filters)
143 return;
144

--- 520 unchanged lines hidden (view full) ---

665
666 case CAN_RAW_FD_FRAMES:
667 if (optlen != sizeof(ro->fd_frames))
668 return -EINVAL;
669
670 if (copy_from_sockptr(&ro->fd_frames, optval, optlen))
671 return -EFAULT;
672
137 return;
138
139 /* eliminate multiple filter matches for the same skb */
140 if (this_cpu_ptr(ro->uniq)->skb == oskb &&
141 this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) {
142 if (!ro->join_filters)
143 return;
144

--- 520 unchanged lines hidden (view full) ---

665
666 case CAN_RAW_FD_FRAMES:
667 if (optlen != sizeof(ro->fd_frames))
668 return -EINVAL;
669
670 if (copy_from_sockptr(&ro->fd_frames, optval, optlen))
671 return -EFAULT;
672
673 /* Enabling CAN XL includes CAN FD */
674 if (ro->xl_frames && !ro->fd_frames) {
675 ro->fd_frames = ro->xl_frames;
676 return -EINVAL;
677 }
673 break;
674
675 case CAN_RAW_XL_FRAMES:
676 if (optlen != sizeof(ro->xl_frames))
677 return -EINVAL;
678
679 if (copy_from_sockptr(&ro->xl_frames, optval, optlen))
680 return -EFAULT;
681
678 break;
679
680 case CAN_RAW_XL_FRAMES:
681 if (optlen != sizeof(ro->xl_frames))
682 return -EINVAL;
683
684 if (copy_from_sockptr(&ro->xl_frames, optval, optlen))
685 return -EFAULT;
686
687 /* Enabling CAN XL includes CAN FD */
688 if (ro->xl_frames)
689 ro->fd_frames = ro->xl_frames;
682 break;
683
684 case CAN_RAW_JOIN_FILTERS:
685 if (optlen != sizeof(ro->join_filters))
686 return -EINVAL;
687
688 if (copy_from_sockptr(&ro->join_filters, optval, optlen))
689 return -EFAULT;

--- 91 unchanged lines hidden (view full) ---

781
782 if (put_user(len, optlen))
783 return -EFAULT;
784 if (copy_to_user(optval, val, len))
785 return -EFAULT;
786 return 0;
787}
788
690 break;
691
692 case CAN_RAW_JOIN_FILTERS:
693 if (optlen != sizeof(ro->join_filters))
694 return -EINVAL;
695
696 if (copy_from_sockptr(&ro->join_filters, optval, optlen))
697 return -EFAULT;

--- 91 unchanged lines hidden (view full) ---

789
790 if (put_user(len, optlen))
791 return -EFAULT;
792 if (copy_to_user(optval, val, len))
793 return -EFAULT;
794 return 0;
795}
796
797static bool raw_bad_txframe(struct raw_sock *ro, struct sk_buff *skb, int mtu)
798{
799 /* Classical CAN -> no checks for flags and device capabilities */
800 if (can_is_can_skb(skb))
801 return false;
802
803 /* CAN FD -> needs to be enabled and a CAN FD or CAN XL device */
804 if (ro->fd_frames && can_is_canfd_skb(skb) &&
805 (mtu == CANFD_MTU || can_is_canxl_dev_mtu(mtu)))
806 return false;
807
808 /* CAN XL -> needs to be enabled and a CAN XL device */
809 if (ro->xl_frames && can_is_canxl_skb(skb) &&
810 can_is_canxl_dev_mtu(mtu))
811 return false;
812
813 return true;
814}
815
789static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
790{
791 struct sock *sk = sock->sk;
792 struct raw_sock *ro = raw_sk(sk);
793 struct sockcm_cookie sockc;
794 struct sk_buff *skb;
795 struct net_device *dev;
796 int ifindex;

--- 31 unchanged lines hidden (view full) ---

828 can_skb_prv(skb)->skbcnt = 0;
829
830 /* fill the skb before testing for valid CAN frames */
831 err = memcpy_from_msg(skb_put(skb, size), msg, size);
832 if (err < 0)
833 goto free_skb;
834
835 err = -EINVAL;
816static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
817{
818 struct sock *sk = sock->sk;
819 struct raw_sock *ro = raw_sk(sk);
820 struct sockcm_cookie sockc;
821 struct sk_buff *skb;
822 struct net_device *dev;
823 int ifindex;

--- 31 unchanged lines hidden (view full) ---

855 can_skb_prv(skb)->skbcnt = 0;
856
857 /* fill the skb before testing for valid CAN frames */
858 err = memcpy_from_msg(skb_put(skb, size), msg, size);
859 if (err < 0)
860 goto free_skb;
861
862 err = -EINVAL;
836 if (ro->xl_frames && can_is_canxl_dev_mtu(dev->mtu)) {
837 /* CAN XL, CAN FD and Classical CAN */
838 if (!can_is_canxl_skb(skb) && !can_is_canfd_skb(skb) &&
839 !can_is_can_skb(skb))
840 goto free_skb;
841 } else if (ro->fd_frames && dev->mtu == CANFD_MTU) {
842 /* CAN FD and Classical CAN */
843 if (!can_is_canfd_skb(skb) && !can_is_can_skb(skb))
844 goto free_skb;
845 } else {
846 /* Classical CAN */
847 if (!can_is_can_skb(skb))
848 goto free_skb;
849 }
863 if (raw_bad_txframe(ro, skb, dev->mtu))
864 goto free_skb;
850
851 sockcm_init(&sockc, sk);
852 if (msg->msg_controllen) {
853 err = sock_cmsg_send(sk, msg, &sockc);
854 if (unlikely(err))
855 goto free_skb;
856 }
857

--- 143 unchanged lines hidden ---
865
866 sockcm_init(&sockc, sk);
867 if (msg->msg_controllen) {
868 err = sock_cmsg_send(sk, msg, &sockc);
869 if (unlikely(err))
870 goto free_skb;
871 }
872

--- 143 unchanged lines hidden ---