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