Merge tag 'pinctrl-v5.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[linux-2.6-microblaze.git] / net / can / raw.c
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
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of Volkswagen nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * Alternatively, provided that this notice is retained in full, this
20  * software may be distributed under the terms of the GNU General
21  * Public License ("GPL") version 2, in which case the provisions of the
22  * GPL apply INSTEAD OF those given above.
23  *
24  * The provided data structures and external interfaces from this code
25  * are not restricted to be used by modules with a GPL compatible license.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
38  * DAMAGE.
39  *
40  */
41
42 #include <linux/module.h>
43 #include <linux/init.h>
44 #include <linux/uio.h>
45 #include <linux/net.h>
46 #include <linux/slab.h>
47 #include <linux/netdevice.h>
48 #include <linux/socket.h>
49 #include <linux/if_arp.h>
50 #include <linux/skbuff.h>
51 #include <linux/can.h>
52 #include <linux/can/core.h>
53 #include <linux/can/skb.h>
54 #include <linux/can/raw.h>
55 #include <net/sock.h>
56 #include <net/net_namespace.h>
57
58 MODULE_DESCRIPTION("PF_CAN raw protocol");
59 MODULE_LICENSE("Dual BSD/GPL");
60 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
61 MODULE_ALIAS("can-proto-1");
62
63 #define RAW_MIN_NAMELEN CAN_REQUIRED_SIZE(struct sockaddr_can, can_ifindex)
64
65 #define MASK_ALL 0
66
67 /* A raw socket has a list of can_filters attached to it, each receiving
68  * the CAN frames matching that filter.  If the filter list is empty,
69  * no CAN frames will be received by the socket.  The default after
70  * opening the socket, is to have one filter which receives all frames.
71  * The filter list is allocated dynamically with the exception of the
72  * list containing only one item.  This common case is optimized by
73  * storing the single filter in dfilter, to avoid using dynamic memory.
74  */
75
76 struct uniqframe {
77         int skbcnt;
78         const struct sk_buff *skb;
79         unsigned int join_rx_count;
80 };
81
82 struct raw_sock {
83         struct sock sk;
84         int bound;
85         int ifindex;
86         struct notifier_block notifier;
87         int loopback;
88         int recv_own_msgs;
89         int fd_frames;
90         int join_filters;
91         int count;                 /* number of active filters */
92         struct can_filter dfilter; /* default/single filter */
93         struct can_filter *filter; /* pointer to filter(s) */
94         can_err_mask_t err_mask;
95         struct uniqframe __percpu *uniq;
96 };
97
98 /* Return pointer to store the extra msg flags for raw_recvmsg().
99  * We use the space of one unsigned int beyond the 'struct sockaddr_can'
100  * in skb->cb.
101  */
102 static inline unsigned int *raw_flags(struct sk_buff *skb)
103 {
104         sock_skb_cb_check_size(sizeof(struct sockaddr_can) +
105                                sizeof(unsigned int));
106
107         /* return pointer after struct sockaddr_can */
108         return (unsigned int *)(&((struct sockaddr_can *)skb->cb)[1]);
109 }
110
111 static inline struct raw_sock *raw_sk(const struct sock *sk)
112 {
113         return (struct raw_sock *)sk;
114 }
115
116 static void raw_rcv(struct sk_buff *oskb, void *data)
117 {
118         struct sock *sk = (struct sock *)data;
119         struct raw_sock *ro = raw_sk(sk);
120         struct sockaddr_can *addr;
121         struct sk_buff *skb;
122         unsigned int *pflags;
123
124         /* check the received tx sock reference */
125         if (!ro->recv_own_msgs && oskb->sk == sk)
126                 return;
127
128         /* do not pass non-CAN2.0 frames to a legacy socket */
129         if (!ro->fd_frames && oskb->len != CAN_MTU)
130                 return;
131
132         /* eliminate multiple filter matches for the same skb */
133         if (this_cpu_ptr(ro->uniq)->skb == oskb &&
134             this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) {
135                 if (ro->join_filters) {
136                         this_cpu_inc(ro->uniq->join_rx_count);
137                         /* drop frame until all enabled filters matched */
138                         if (this_cpu_ptr(ro->uniq)->join_rx_count < ro->count)
139                                 return;
140                 } else {
141                         return;
142                 }
143         } else {
144                 this_cpu_ptr(ro->uniq)->skb = oskb;
145                 this_cpu_ptr(ro->uniq)->skbcnt = can_skb_prv(oskb)->skbcnt;
146                 this_cpu_ptr(ro->uniq)->join_rx_count = 1;
147                 /* drop first frame to check all enabled filters? */
148                 if (ro->join_filters && ro->count > 1)
149                         return;
150         }
151
152         /* clone the given skb to be able to enqueue it into the rcv queue */
153         skb = skb_clone(oskb, GFP_ATOMIC);
154         if (!skb)
155                 return;
156
157         /* Put the datagram to the queue so that raw_recvmsg() can get
158          * it from there. We need to pass the interface index to
159          * raw_recvmsg(). We pass a whole struct sockaddr_can in
160          * skb->cb containing the interface index.
161          */
162
163         sock_skb_cb_check_size(sizeof(struct sockaddr_can));
164         addr = (struct sockaddr_can *)skb->cb;
165         memset(addr, 0, sizeof(*addr));
166         addr->can_family = AF_CAN;
167         addr->can_ifindex = skb->dev->ifindex;
168
169         /* add CAN specific message flags for raw_recvmsg() */
170         pflags = raw_flags(skb);
171         *pflags = 0;
172         if (oskb->sk)
173                 *pflags |= MSG_DONTROUTE;
174         if (oskb->sk == sk)
175                 *pflags |= MSG_CONFIRM;
176
177         if (sock_queue_rcv_skb(sk, skb) < 0)
178                 kfree_skb(skb);
179 }
180
181 static int raw_enable_filters(struct net *net, struct net_device *dev,
182                               struct sock *sk, struct can_filter *filter,
183                               int count)
184 {
185         int err = 0;
186         int i;
187
188         for (i = 0; i < count; i++) {
189                 err = can_rx_register(net, dev, filter[i].can_id,
190                                       filter[i].can_mask,
191                                       raw_rcv, sk, "raw", sk);
192                 if (err) {
193                         /* clean up successfully registered filters */
194                         while (--i >= 0)
195                                 can_rx_unregister(net, dev, filter[i].can_id,
196                                                   filter[i].can_mask,
197                                                   raw_rcv, sk);
198                         break;
199                 }
200         }
201
202         return err;
203 }
204
205 static int raw_enable_errfilter(struct net *net, struct net_device *dev,
206                                 struct sock *sk, can_err_mask_t err_mask)
207 {
208         int err = 0;
209
210         if (err_mask)
211                 err = can_rx_register(net, dev, 0, err_mask | CAN_ERR_FLAG,
212                                       raw_rcv, sk, "raw", sk);
213
214         return err;
215 }
216
217 static void raw_disable_filters(struct net *net, struct net_device *dev,
218                                 struct sock *sk, struct can_filter *filter,
219                                 int count)
220 {
221         int i;
222
223         for (i = 0; i < count; i++)
224                 can_rx_unregister(net, dev, filter[i].can_id,
225                                   filter[i].can_mask, raw_rcv, sk);
226 }
227
228 static inline void raw_disable_errfilter(struct net *net,
229                                          struct net_device *dev,
230                                          struct sock *sk,
231                                          can_err_mask_t err_mask)
232
233 {
234         if (err_mask)
235                 can_rx_unregister(net, dev, 0, err_mask | CAN_ERR_FLAG,
236                                   raw_rcv, sk);
237 }
238
239 static inline void raw_disable_allfilters(struct net *net,
240                                           struct net_device *dev,
241                                           struct sock *sk)
242 {
243         struct raw_sock *ro = raw_sk(sk);
244
245         raw_disable_filters(net, dev, sk, ro->filter, ro->count);
246         raw_disable_errfilter(net, dev, sk, ro->err_mask);
247 }
248
249 static int raw_enable_allfilters(struct net *net, struct net_device *dev,
250                                  struct sock *sk)
251 {
252         struct raw_sock *ro = raw_sk(sk);
253         int err;
254
255         err = raw_enable_filters(net, dev, sk, ro->filter, ro->count);
256         if (!err) {
257                 err = raw_enable_errfilter(net, dev, sk, ro->err_mask);
258                 if (err)
259                         raw_disable_filters(net, dev, sk, ro->filter,
260                                             ro->count);
261         }
262
263         return err;
264 }
265
266 static int raw_notifier(struct notifier_block *nb,
267                         unsigned long msg, void *ptr)
268 {
269         struct net_device *dev = netdev_notifier_info_to_dev(ptr);
270         struct raw_sock *ro = container_of(nb, struct raw_sock, notifier);
271         struct sock *sk = &ro->sk;
272
273         if (!net_eq(dev_net(dev), sock_net(sk)))
274                 return NOTIFY_DONE;
275
276         if (dev->type != ARPHRD_CAN)
277                 return NOTIFY_DONE;
278
279         if (ro->ifindex != dev->ifindex)
280                 return NOTIFY_DONE;
281
282         switch (msg) {
283         case NETDEV_UNREGISTER:
284                 lock_sock(sk);
285                 /* remove current filters & unregister */
286                 if (ro->bound)
287                         raw_disable_allfilters(dev_net(dev), dev, sk);
288
289                 if (ro->count > 1)
290                         kfree(ro->filter);
291
292                 ro->ifindex = 0;
293                 ro->bound = 0;
294                 ro->count = 0;
295                 release_sock(sk);
296
297                 sk->sk_err = ENODEV;
298                 if (!sock_flag(sk, SOCK_DEAD))
299                         sk->sk_error_report(sk);
300                 break;
301
302         case NETDEV_DOWN:
303                 sk->sk_err = ENETDOWN;
304                 if (!sock_flag(sk, SOCK_DEAD))
305                         sk->sk_error_report(sk);
306                 break;
307         }
308
309         return NOTIFY_DONE;
310 }
311
312 static int raw_init(struct sock *sk)
313 {
314         struct raw_sock *ro = raw_sk(sk);
315
316         ro->bound            = 0;
317         ro->ifindex          = 0;
318
319         /* set default filter to single entry dfilter */
320         ro->dfilter.can_id   = 0;
321         ro->dfilter.can_mask = MASK_ALL;
322         ro->filter           = &ro->dfilter;
323         ro->count            = 1;
324
325         /* set default loopback behaviour */
326         ro->loopback         = 1;
327         ro->recv_own_msgs    = 0;
328         ro->fd_frames        = 0;
329         ro->join_filters     = 0;
330
331         /* alloc_percpu provides zero'ed memory */
332         ro->uniq = alloc_percpu(struct uniqframe);
333         if (unlikely(!ro->uniq))
334                 return -ENOMEM;
335
336         /* set notifier */
337         ro->notifier.notifier_call = raw_notifier;
338
339         register_netdevice_notifier(&ro->notifier);
340
341         return 0;
342 }
343
344 static int raw_release(struct socket *sock)
345 {
346         struct sock *sk = sock->sk;
347         struct raw_sock *ro;
348
349         if (!sk)
350                 return 0;
351
352         ro = raw_sk(sk);
353
354         unregister_netdevice_notifier(&ro->notifier);
355
356         lock_sock(sk);
357
358         /* remove current filters & unregister */
359         if (ro->bound) {
360                 if (ro->ifindex) {
361                         struct net_device *dev;
362
363                         dev = dev_get_by_index(sock_net(sk), ro->ifindex);
364                         if (dev) {
365                                 raw_disable_allfilters(dev_net(dev), dev, sk);
366                                 dev_put(dev);
367                         }
368                 } else {
369                         raw_disable_allfilters(sock_net(sk), NULL, sk);
370                 }
371         }
372
373         if (ro->count > 1)
374                 kfree(ro->filter);
375
376         ro->ifindex = 0;
377         ro->bound = 0;
378         ro->count = 0;
379         free_percpu(ro->uniq);
380
381         sock_orphan(sk);
382         sock->sk = NULL;
383
384         release_sock(sk);
385         sock_put(sk);
386
387         return 0;
388 }
389
390 static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
391 {
392         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
393         struct sock *sk = sock->sk;
394         struct raw_sock *ro = raw_sk(sk);
395         int ifindex;
396         int err = 0;
397         int notify_enetdown = 0;
398
399         if (len < RAW_MIN_NAMELEN)
400                 return -EINVAL;
401         if (addr->can_family != AF_CAN)
402                 return -EINVAL;
403
404         lock_sock(sk);
405
406         if (ro->bound && addr->can_ifindex == ro->ifindex)
407                 goto out;
408
409         if (addr->can_ifindex) {
410                 struct net_device *dev;
411
412                 dev = dev_get_by_index(sock_net(sk), addr->can_ifindex);
413                 if (!dev) {
414                         err = -ENODEV;
415                         goto out;
416                 }
417                 if (dev->type != ARPHRD_CAN) {
418                         dev_put(dev);
419                         err = -ENODEV;
420                         goto out;
421                 }
422                 if (!(dev->flags & IFF_UP))
423                         notify_enetdown = 1;
424
425                 ifindex = dev->ifindex;
426
427                 /* filters set by default/setsockopt */
428                 err = raw_enable_allfilters(sock_net(sk), dev, sk);
429                 dev_put(dev);
430         } else {
431                 ifindex = 0;
432
433                 /* filters set by default/setsockopt */
434                 err = raw_enable_allfilters(sock_net(sk), NULL, sk);
435         }
436
437         if (!err) {
438                 if (ro->bound) {
439                         /* unregister old filters */
440                         if (ro->ifindex) {
441                                 struct net_device *dev;
442
443                                 dev = dev_get_by_index(sock_net(sk),
444                                                        ro->ifindex);
445                                 if (dev) {
446                                         raw_disable_allfilters(dev_net(dev),
447                                                                dev, sk);
448                                         dev_put(dev);
449                                 }
450                         } else {
451                                 raw_disable_allfilters(sock_net(sk), NULL, sk);
452                         }
453                 }
454                 ro->ifindex = ifindex;
455                 ro->bound = 1;
456         }
457
458  out:
459         release_sock(sk);
460
461         if (notify_enetdown) {
462                 sk->sk_err = ENETDOWN;
463                 if (!sock_flag(sk, SOCK_DEAD))
464                         sk->sk_error_report(sk);
465         }
466
467         return err;
468 }
469
470 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
471                        int peer)
472 {
473         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
474         struct sock *sk = sock->sk;
475         struct raw_sock *ro = raw_sk(sk);
476
477         if (peer)
478                 return -EOPNOTSUPP;
479
480         memset(addr, 0, RAW_MIN_NAMELEN);
481         addr->can_family  = AF_CAN;
482         addr->can_ifindex = ro->ifindex;
483
484         return RAW_MIN_NAMELEN;
485 }
486
487 static int raw_setsockopt(struct socket *sock, int level, int optname,
488                           sockptr_t optval, unsigned int optlen)
489 {
490         struct sock *sk = sock->sk;
491         struct raw_sock *ro = raw_sk(sk);
492         struct can_filter *filter = NULL;  /* dyn. alloc'ed filters */
493         struct can_filter sfilter;         /* single filter */
494         struct net_device *dev = NULL;
495         can_err_mask_t err_mask = 0;
496         int count = 0;
497         int err = 0;
498
499         if (level != SOL_CAN_RAW)
500                 return -EINVAL;
501
502         switch (optname) {
503         case CAN_RAW_FILTER:
504                 if (optlen % sizeof(struct can_filter) != 0)
505                         return -EINVAL;
506
507                 if (optlen > CAN_RAW_FILTER_MAX * sizeof(struct can_filter))
508                         return -EINVAL;
509
510                 count = optlen / sizeof(struct can_filter);
511
512                 if (count > 1) {
513                         /* filter does not fit into dfilter => alloc space */
514                         filter = memdup_sockptr(optval, optlen);
515                         if (IS_ERR(filter))
516                                 return PTR_ERR(filter);
517                 } else if (count == 1) {
518                         if (copy_from_sockptr(&sfilter, optval, sizeof(sfilter)))
519                                 return -EFAULT;
520                 }
521
522                 lock_sock(sk);
523
524                 if (ro->bound && ro->ifindex)
525                         dev = dev_get_by_index(sock_net(sk), ro->ifindex);
526
527                 if (ro->bound) {
528                         /* (try to) register the new filters */
529                         if (count == 1)
530                                 err = raw_enable_filters(sock_net(sk), dev, sk,
531                                                          &sfilter, 1);
532                         else
533                                 err = raw_enable_filters(sock_net(sk), dev, sk,
534                                                          filter, count);
535                         if (err) {
536                                 if (count > 1)
537                                         kfree(filter);
538                                 goto out_fil;
539                         }
540
541                         /* remove old filter registrations */
542                         raw_disable_filters(sock_net(sk), dev, sk, ro->filter,
543                                             ro->count);
544                 }
545
546                 /* remove old filter space */
547                 if (ro->count > 1)
548                         kfree(ro->filter);
549
550                 /* link new filters to the socket */
551                 if (count == 1) {
552                         /* copy filter data for single filter */
553                         ro->dfilter = sfilter;
554                         filter = &ro->dfilter;
555                 }
556                 ro->filter = filter;
557                 ro->count  = count;
558
559  out_fil:
560                 if (dev)
561                         dev_put(dev);
562
563                 release_sock(sk);
564
565                 break;
566
567         case CAN_RAW_ERR_FILTER:
568                 if (optlen != sizeof(err_mask))
569                         return -EINVAL;
570
571                 if (copy_from_sockptr(&err_mask, optval, optlen))
572                         return -EFAULT;
573
574                 err_mask &= CAN_ERR_MASK;
575
576                 lock_sock(sk);
577
578                 if (ro->bound && ro->ifindex)
579                         dev = dev_get_by_index(sock_net(sk), ro->ifindex);
580
581                 /* remove current error mask */
582                 if (ro->bound) {
583                         /* (try to) register the new err_mask */
584                         err = raw_enable_errfilter(sock_net(sk), dev, sk,
585                                                    err_mask);
586
587                         if (err)
588                                 goto out_err;
589
590                         /* remove old err_mask registration */
591                         raw_disable_errfilter(sock_net(sk), dev, sk,
592                                               ro->err_mask);
593                 }
594
595                 /* link new err_mask to the socket */
596                 ro->err_mask = err_mask;
597
598  out_err:
599                 if (dev)
600                         dev_put(dev);
601
602                 release_sock(sk);
603
604                 break;
605
606         case CAN_RAW_LOOPBACK:
607                 if (optlen != sizeof(ro->loopback))
608                         return -EINVAL;
609
610                 if (copy_from_sockptr(&ro->loopback, optval, optlen))
611                         return -EFAULT;
612
613                 break;
614
615         case CAN_RAW_RECV_OWN_MSGS:
616                 if (optlen != sizeof(ro->recv_own_msgs))
617                         return -EINVAL;
618
619                 if (copy_from_sockptr(&ro->recv_own_msgs, optval, optlen))
620                         return -EFAULT;
621
622                 break;
623
624         case CAN_RAW_FD_FRAMES:
625                 if (optlen != sizeof(ro->fd_frames))
626                         return -EINVAL;
627
628                 if (copy_from_sockptr(&ro->fd_frames, optval, optlen))
629                         return -EFAULT;
630
631                 break;
632
633         case CAN_RAW_JOIN_FILTERS:
634                 if (optlen != sizeof(ro->join_filters))
635                         return -EINVAL;
636
637                 if (copy_from_sockptr(&ro->join_filters, optval, optlen))
638                         return -EFAULT;
639
640                 break;
641
642         default:
643                 return -ENOPROTOOPT;
644         }
645         return err;
646 }
647
648 static int raw_getsockopt(struct socket *sock, int level, int optname,
649                           char __user *optval, int __user *optlen)
650 {
651         struct sock *sk = sock->sk;
652         struct raw_sock *ro = raw_sk(sk);
653         int len;
654         void *val;
655         int err = 0;
656
657         if (level != SOL_CAN_RAW)
658                 return -EINVAL;
659         if (get_user(len, optlen))
660                 return -EFAULT;
661         if (len < 0)
662                 return -EINVAL;
663
664         switch (optname) {
665         case CAN_RAW_FILTER:
666                 lock_sock(sk);
667                 if (ro->count > 0) {
668                         int fsize = ro->count * sizeof(struct can_filter);
669
670                         /* user space buffer to small for filter list? */
671                         if (len < fsize) {
672                                 /* return -ERANGE and needed space in optlen */
673                                 err = -ERANGE;
674                                 if (put_user(fsize, optlen))
675                                         err = -EFAULT;
676                         } else {
677                                 if (len > fsize)
678                                         len = fsize;
679                                 if (copy_to_user(optval, ro->filter, len))
680                                         err = -EFAULT;
681                         }
682                 } else {
683                         len = 0;
684                 }
685                 release_sock(sk);
686
687                 if (!err)
688                         err = put_user(len, optlen);
689                 return err;
690
691         case CAN_RAW_ERR_FILTER:
692                 if (len > sizeof(can_err_mask_t))
693                         len = sizeof(can_err_mask_t);
694                 val = &ro->err_mask;
695                 break;
696
697         case CAN_RAW_LOOPBACK:
698                 if (len > sizeof(int))
699                         len = sizeof(int);
700                 val = &ro->loopback;
701                 break;
702
703         case CAN_RAW_RECV_OWN_MSGS:
704                 if (len > sizeof(int))
705                         len = sizeof(int);
706                 val = &ro->recv_own_msgs;
707                 break;
708
709         case CAN_RAW_FD_FRAMES:
710                 if (len > sizeof(int))
711                         len = sizeof(int);
712                 val = &ro->fd_frames;
713                 break;
714
715         case CAN_RAW_JOIN_FILTERS:
716                 if (len > sizeof(int))
717                         len = sizeof(int);
718                 val = &ro->join_filters;
719                 break;
720
721         default:
722                 return -ENOPROTOOPT;
723         }
724
725         if (put_user(len, optlen))
726                 return -EFAULT;
727         if (copy_to_user(optval, val, len))
728                 return -EFAULT;
729         return 0;
730 }
731
732 static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
733 {
734         struct sock *sk = sock->sk;
735         struct raw_sock *ro = raw_sk(sk);
736         struct sk_buff *skb;
737         struct net_device *dev;
738         int ifindex;
739         int err;
740
741         if (msg->msg_name) {
742                 DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
743
744                 if (msg->msg_namelen < RAW_MIN_NAMELEN)
745                         return -EINVAL;
746
747                 if (addr->can_family != AF_CAN)
748                         return -EINVAL;
749
750                 ifindex = addr->can_ifindex;
751         } else {
752                 ifindex = ro->ifindex;
753         }
754
755         dev = dev_get_by_index(sock_net(sk), ifindex);
756         if (!dev)
757                 return -ENXIO;
758
759         err = -EINVAL;
760         if (ro->fd_frames && dev->mtu == CANFD_MTU) {
761                 if (unlikely(size != CANFD_MTU && size != CAN_MTU))
762                         goto put_dev;
763         } else {
764                 if (unlikely(size != CAN_MTU))
765                         goto put_dev;
766         }
767
768         skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv),
769                                   msg->msg_flags & MSG_DONTWAIT, &err);
770         if (!skb)
771                 goto put_dev;
772
773         can_skb_reserve(skb);
774         can_skb_prv(skb)->ifindex = dev->ifindex;
775         can_skb_prv(skb)->skbcnt = 0;
776
777         err = memcpy_from_msg(skb_put(skb, size), msg, size);
778         if (err < 0)
779                 goto free_skb;
780
781         skb_setup_tx_timestamp(skb, sk->sk_tsflags);
782
783         skb->dev = dev;
784         skb->sk = sk;
785         skb->priority = sk->sk_priority;
786
787         err = can_send(skb, ro->loopback);
788
789         dev_put(dev);
790
791         if (err)
792                 goto send_failed;
793
794         return size;
795
796 free_skb:
797         kfree_skb(skb);
798 put_dev:
799         dev_put(dev);
800 send_failed:
801         return err;
802 }
803
804 static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
805                        int flags)
806 {
807         struct sock *sk = sock->sk;
808         struct sk_buff *skb;
809         int err = 0;
810         int noblock;
811
812         noblock = flags & MSG_DONTWAIT;
813         flags &= ~MSG_DONTWAIT;
814
815         if (flags & MSG_ERRQUEUE)
816                 return sock_recv_errqueue(sk, msg, size,
817                                           SOL_CAN_RAW, SCM_CAN_RAW_ERRQUEUE);
818
819         skb = skb_recv_datagram(sk, flags, noblock, &err);
820         if (!skb)
821                 return err;
822
823         if (size < skb->len)
824                 msg->msg_flags |= MSG_TRUNC;
825         else
826                 size = skb->len;
827
828         err = memcpy_to_msg(msg, skb->data, size);
829         if (err < 0) {
830                 skb_free_datagram(sk, skb);
831                 return err;
832         }
833
834         sock_recv_ts_and_drops(msg, sk, skb);
835
836         if (msg->msg_name) {
837                 __sockaddr_check_size(RAW_MIN_NAMELEN);
838                 msg->msg_namelen = RAW_MIN_NAMELEN;
839                 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
840         }
841
842         /* assign the flags that have been recorded in raw_rcv() */
843         msg->msg_flags |= *(raw_flags(skb));
844
845         skb_free_datagram(sk, skb);
846
847         return size;
848 }
849
850 static int raw_sock_no_ioctlcmd(struct socket *sock, unsigned int cmd,
851                                 unsigned long arg)
852 {
853         /* no ioctls for socket layer -> hand it down to NIC layer */
854         return -ENOIOCTLCMD;
855 }
856
857 static const struct proto_ops raw_ops = {
858         .family        = PF_CAN,
859         .release       = raw_release,
860         .bind          = raw_bind,
861         .connect       = sock_no_connect,
862         .socketpair    = sock_no_socketpair,
863         .accept        = sock_no_accept,
864         .getname       = raw_getname,
865         .poll          = datagram_poll,
866         .ioctl         = raw_sock_no_ioctlcmd,
867         .gettstamp     = sock_gettstamp,
868         .listen        = sock_no_listen,
869         .shutdown      = sock_no_shutdown,
870         .setsockopt    = raw_setsockopt,
871         .getsockopt    = raw_getsockopt,
872         .sendmsg       = raw_sendmsg,
873         .recvmsg       = raw_recvmsg,
874         .mmap          = sock_no_mmap,
875         .sendpage      = sock_no_sendpage,
876 };
877
878 static struct proto raw_proto __read_mostly = {
879         .name       = "CAN_RAW",
880         .owner      = THIS_MODULE,
881         .obj_size   = sizeof(struct raw_sock),
882         .init       = raw_init,
883 };
884
885 static const struct can_proto raw_can_proto = {
886         .type       = SOCK_RAW,
887         .protocol   = CAN_RAW,
888         .ops        = &raw_ops,
889         .prot       = &raw_proto,
890 };
891
892 static __init int raw_module_init(void)
893 {
894         int err;
895
896         pr_info("can: raw protocol\n");
897
898         err = can_proto_register(&raw_can_proto);
899         if (err < 0)
900                 pr_err("can: registration of raw protocol failed\n");
901
902         return err;
903 }
904
905 static __exit void raw_module_exit(void)
906 {
907         can_proto_unregister(&raw_can_proto);
908 }
909
910 module_init(raw_module_init);
911 module_exit(raw_module_exit);