|
49 | 49 | #include <linux/if_arp.h> |
50 | 50 | #include <linux/skbuff.h> |
51 | 51 | #include <linux/can.h> |
| 52 | +#include <linux/can/can-ml.h> |
52 | 53 | #include <linux/can/core.h> |
53 | | -#include <linux/can/dev.h> /* for can_is_canxl_dev_mtu() */ |
54 | 54 | #include <linux/can/skb.h> |
55 | 55 | #include <linux/can/raw.h> |
56 | 56 | #include <net/sock.h> |
@@ -892,58 +892,21 @@ static void raw_put_canxl_vcid(struct raw_sock *ro, struct sk_buff *skb) |
892 | 892 | } |
893 | 893 | } |
894 | 894 |
|
895 | | -static inline bool raw_dev_cc_enabled(struct net_device *dev, |
896 | | - struct can_priv *priv) |
897 | | -{ |
898 | | - /* The CANXL-only mode disables error-signalling on the CAN bus |
899 | | - * which is needed to send CAN CC/FD frames |
900 | | - */ |
901 | | - if (priv) |
902 | | - return !can_dev_in_xl_only_mode(priv); |
903 | | - |
904 | | - /* virtual CAN interfaces always support CAN CC */ |
905 | | - return true; |
906 | | -} |
907 | | - |
908 | | -static inline bool raw_dev_fd_enabled(struct net_device *dev, |
909 | | - struct can_priv *priv) |
910 | | -{ |
911 | | - /* check FD ctrlmode on real CAN interfaces */ |
912 | | - if (priv) |
913 | | - return (priv->ctrlmode & CAN_CTRLMODE_FD); |
914 | | - |
915 | | - /* check MTU for virtual CAN FD interfaces */ |
916 | | - return (READ_ONCE(dev->mtu) >= CANFD_MTU); |
917 | | -} |
918 | | - |
919 | | -static inline bool raw_dev_xl_enabled(struct net_device *dev, |
920 | | - struct can_priv *priv) |
921 | | -{ |
922 | | - /* check XL ctrlmode on real CAN interfaces */ |
923 | | - if (priv) |
924 | | - return (priv->ctrlmode & CAN_CTRLMODE_XL); |
925 | | - |
926 | | - /* check MTU for virtual CAN XL interfaces */ |
927 | | - return can_is_canxl_dev_mtu(READ_ONCE(dev->mtu)); |
928 | | -} |
929 | | - |
930 | 895 | static unsigned int raw_check_txframe(struct raw_sock *ro, struct sk_buff *skb, |
931 | 896 | struct net_device *dev) |
932 | 897 | { |
933 | | - struct can_priv *priv = safe_candev_priv(dev); |
934 | | - |
935 | 898 | /* Classical CAN */ |
936 | | - if (can_is_can_skb(skb) && raw_dev_cc_enabled(dev, priv)) |
| 899 | + if (can_is_can_skb(skb) && can_cap_enabled(dev, CAN_CAP_CC)) |
937 | 900 | return CAN_MTU; |
938 | 901 |
|
939 | 902 | /* CAN FD */ |
940 | 903 | if (ro->fd_frames && can_is_canfd_skb(skb) && |
941 | | - raw_dev_fd_enabled(dev, priv)) |
| 904 | + can_cap_enabled(dev, CAN_CAP_FD)) |
942 | 905 | return CANFD_MTU; |
943 | 906 |
|
944 | 907 | /* CAN XL */ |
945 | 908 | if (ro->xl_frames && can_is_canxl_skb(skb) && |
946 | | - raw_dev_xl_enabled(dev, priv)) |
| 909 | + can_cap_enabled(dev, CAN_CAP_XL)) |
947 | 910 | return CANXL_MTU; |
948 | 911 |
|
949 | 912 | return 0; |
@@ -982,6 +945,12 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) |
982 | 945 | if (!dev) |
983 | 946 | return -ENXIO; |
984 | 947 |
|
| 948 | + /* no sending on a CAN device in read-only mode */ |
| 949 | + if (can_cap_enabled(dev, CAN_CAP_RO)) { |
| 950 | + err = -EACCES; |
| 951 | + goto put_dev; |
| 952 | + } |
| 953 | + |
985 | 954 | skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv), |
986 | 955 | msg->msg_flags & MSG_DONTWAIT, &err); |
987 | 956 | if (!skb) |
|
0 commit comments