Merge tag 'drm-next-2021-07-08-1' of git://anongit.freedesktop.org/drm/drm
[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 list_head 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 static LIST_HEAD(raw_notifier_list);
99 static DEFINE_SPINLOCK(raw_notifier_lock);
100 static struct raw_sock *raw_busy_notifier;
101
102 /* Return pointer to store the extra msg flags for raw_recvmsg().
103  * We use the space of one unsigned int beyond the 'struct sockaddr_can'
104  * in skb->cb.
105  */
106 static inline unsigned int *raw_flags(struct sk_buff *skb)
107 {
108         sock_skb_cb_check_size(sizeof(struct sockaddr_can) +
109                                sizeof(unsigned int));
110
111         /* return pointer after struct sockaddr_can */
112         return (unsigned int *)(&((struct sockaddr_can *)skb->cb)[1]);
113 }
114
115 static inline struct raw_sock *raw_sk(const struct sock *sk)
116 {
117         return (struct raw_sock *)sk;
118 }
119
120 static void raw_rcv(struct sk_buff *oskb, void *data)
121 {
122         struct sock *sk = (struct sock *)data;
123         struct raw_sock *ro = raw_sk(sk);
124         struct sockaddr_can *addr;
125         struct sk_buff *skb;
126         unsigned int *pflags;
127
128         /* check the received tx sock reference */
129         if (!ro->recv_own_msgs && oskb->sk == sk)
130                 return;
131
132         /* do not pass non-CAN2.0 frames to a legacy socket */
133         if (!ro->fd_frames && oskb->len != CAN_MTU)
134                 return;
135
136         /* eliminate multiple filter matches for the same skb */
137         if (this_cpu_ptr(ro->uniq)->skb == oskb &&
138             this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) {
139                 if (ro->join_filters) {
140                         this_cpu_inc(ro->uniq->join_rx_count);
141                         /* drop frame until all enabled filters matched */
142                         if (this_cpu_ptr(ro->uniq)->join_rx_count < ro->count)
143                                 return;
144                 } else {
145                         return;
146                 }
147         } else {
148                 this_cpu_ptr(ro->uniq)->skb = oskb;
149                 this_cpu_ptr(ro->uniq)->skbcnt = can_skb_prv(oskb)->skbcnt;
150                 this_cpu_ptr(ro->uniq)->join_rx_count = 1;
151                 /* drop first frame to check all enabled filters? */
152                 if (ro->join_filters && ro->count > 1)
153                         return;
154         }
155
156         /* clone the given skb to be able to enqueue it into the rcv queue */
157         skb = skb_clone(oskb, GFP_ATOMIC);
158         if (!skb)
159                 return;
160
161         /* Put the datagram to the queue so that raw_recvmsg() can get
162          * it from there. We need to pass the interface index to
163          * raw_recvmsg(). We pass a whole struct sockaddr_can in
164          * skb->cb containing the interface index.
165          */
166
167         sock_skb_cb_check_size(sizeof(struct sockaddr_can));
168         addr = (struct sockaddr_can *)skb->cb;
169         memset(addr, 0, sizeof(*addr));
170         addr->can_family = AF_CAN;
171         addr->can_ifindex = skb->dev->ifindex;
172
173         /* add CAN specific message flags for raw_recvmsg() */
174         pflags = raw_flags(skb);
175         *pflags = 0;
176         if (oskb->sk)
177                 *pflags |= MSG_DONTROUTE;
178         if (oskb->sk == sk)
179                 *pflags |= MSG_CONFIRM;
180
181         if (sock_queue_rcv_skb(sk, skb) < 0)
182                 kfree_skb(skb);
183 }
184
185 static int raw_enable_filters(struct net *net, struct net_device *dev,
186                               struct sock *sk, struct can_filter *filter,
187                               int count)
188 {
189         int err = 0;
190         int i;
191
192         for (i = 0; i < count; i++) {
193                 err = can_rx_register(net, dev, filter[i].can_id,
194                                       filter[i].can_mask,
195                                       raw_rcv, sk, "raw", sk);
196                 if (err) {
197                         /* clean up successfully registered filters */
198                         while (--i >= 0)
199                                 can_rx_unregister(net, dev, filter[i].can_id,
200                                                   filter[i].can_mask,
201                                                   raw_rcv, sk);
202                         break;
203                 }
204         }
205
206         return err;
207 }
208
209 static int raw_enable_errfilter(struct net *net, struct net_device *dev,
210                                 struct sock *sk, can_err_mask_t err_mask)
211 {
212         int err = 0;
213
214         if (err_mask)
215                 err = can_rx_register(net, dev, 0, err_mask | CAN_ERR_FLAG,
216                                       raw_rcv, sk, "raw", sk);
217
218         return err;
219 }
220
221 static void raw_disable_filters(struct net *net, struct net_device *dev,
222                                 struct sock *sk, struct can_filter *filter,
223                                 int count)
224 {
225         int i;
226
227         for (i = 0; i < count; i++)
228                 can_rx_unregister(net, dev, filter[i].can_id,
229                                   filter[i].can_mask, raw_rcv, sk);
230 }
231
232 static inline void raw_disable_errfilter(struct net *net,
233                                          struct net_device *dev,
234                                          struct sock *sk,
235                                          can_err_mask_t err_mask)
236
237 {
238         if (err_mask)
239                 can_rx_unregister(net, dev, 0, err_mask | CAN_ERR_FLAG,
240                                   raw_rcv, sk);
241 }
242
243 static inline void raw_disable_allfilters(struct net *net,
244                                           struct net_device *dev,
245                                           struct sock *sk)
246 {
247         struct raw_sock *ro = raw_sk(sk);
248
249         raw_disable_filters(net, dev, sk, ro->filter, ro->count);
250         raw_disable_errfilter(net, dev, sk, ro->err_mask);
251 }
252
253 static int raw_enable_allfilters(struct net *net, struct net_device *dev,
254                                  struct sock *sk)
255 {
256         struct raw_sock *ro = raw_sk(sk);
257         int err;
258
259         err = raw_enable_filters(net, dev, sk, ro->filter, ro->count);
260         if (!err) {
261                 err = raw_enable_errfilter(net, dev, sk, ro->err_mask);
262                 if (err)
263                         raw_disable_filters(net, dev, sk, ro->filter,
264                                             ro->count);
265         }
266
267         return err;
268 }
269
270 static void raw_notify(struct raw_sock *ro, unsigned long msg,
271                        struct net_device *dev)
272 {
273         struct sock *sk = &ro->sk;
274
275         if (!net_eq(dev_net(dev), sock_net(sk)))
276                 return;
277
278         if (ro->ifindex != dev->ifindex)
279                 return;
280
281         switch (msg) {
282         case NETDEV_UNREGISTER:
283                 lock_sock(sk);
284                 /* remove current filters & unregister */
285                 if (ro->bound)
286                         raw_disable_allfilters(dev_net(dev), dev, sk);
287
288                 if (ro->count > 1)
289                         kfree(ro->filter);
290
291                 ro->ifindex = 0;
292                 ro->bound = 0;
293                 ro->count = 0;
294                 release_sock(sk);
295
296                 sk->sk_err = ENODEV;
297                 if (!sock_flag(sk, SOCK_DEAD))
298                         sk_error_report(sk);
299                 break;
300
301         case NETDEV_DOWN:
302                 sk->sk_err = ENETDOWN;
303                 if (!sock_flag(sk, SOCK_DEAD))
304                         sk_error_report(sk);
305                 break;
306         }
307 }
308
309 static int raw_notifier(struct notifier_block *nb, unsigned long msg,
310                         void *ptr)
311 {
312         struct net_device *dev = netdev_notifier_info_to_dev(ptr);
313
314         if (dev->type != ARPHRD_CAN)
315                 return NOTIFY_DONE;
316         if (msg != NETDEV_UNREGISTER && msg != NETDEV_DOWN)
317                 return NOTIFY_DONE;
318         if (unlikely(raw_busy_notifier)) /* Check for reentrant bug. */
319                 return NOTIFY_DONE;
320
321         spin_lock(&raw_notifier_lock);
322         list_for_each_entry(raw_busy_notifier, &raw_notifier_list, notifier) {
323                 spin_unlock(&raw_notifier_lock);
324                 raw_notify(raw_busy_notifier, msg, dev);
325                 spin_lock(&raw_notifier_lock);
326         }
327         raw_busy_notifier = NULL;
328         spin_unlock(&raw_notifier_lock);
329         return NOTIFY_DONE;
330 }
331
332 static int raw_init(struct sock *sk)
333 {
334         struct raw_sock *ro = raw_sk(sk);
335
336         ro->bound            = 0;
337         ro->ifindex          = 0;
338
339         /* set default filter to single entry dfilter */
340         ro->dfilter.can_id   = 0;
341         ro->dfilter.can_mask = MASK_ALL;
342         ro->filter           = &ro->dfilter;
343         ro->count            = 1;
344
345         /* set default loopback behaviour */
346         ro->loopback         = 1;
347         ro->recv_own_msgs    = 0;
348         ro->fd_frames        = 0;
349         ro->join_filters     = 0;
350
351         /* alloc_percpu provides zero'ed memory */
352         ro->uniq = alloc_percpu(struct uniqframe);
353         if (unlikely(!ro->uniq))
354                 return -ENOMEM;
355
356         /* set notifier */
357         spin_lock(&raw_notifier_lock);
358         list_add_tail(&ro->notifier, &raw_notifier_list);
359         spin_unlock(&raw_notifier_lock);
360
361         return 0;
362 }
363
364 static int raw_release(struct socket *sock)
365 {
366         struct sock *sk = sock->sk;
367         struct raw_sock *ro;
368
369         if (!sk)
370                 return 0;
371
372         ro = raw_sk(sk);
373
374         spin_lock(&raw_notifier_lock);
375         while (raw_busy_notifier == ro) {
376                 spin_unlock(&raw_notifier_lock);
377                 schedule_timeout_uninterruptible(1);
378                 spin_lock(&raw_notifier_lock);
379         }
380         list_del(&ro->notifier);
381         spin_unlock(&raw_notifier_lock);
382
383         lock_sock(sk);
384
385         /* remove current filters & unregister */
386         if (ro->bound) {
387                 if (ro->ifindex) {
388                         struct net_device *dev;
389
390                         dev = dev_get_by_index(sock_net(sk), ro->ifindex);
391                         if (dev) {
392                                 raw_disable_allfilters(dev_net(dev), dev, sk);
393                                 dev_put(dev);
394                         }
395                 } else {
396                         raw_disable_allfilters(sock_net(sk), NULL, sk);
397                 }
398         }
399
400         if (ro->count > 1)
401                 kfree(ro->filter);
402
403         ro->ifindex = 0;
404         ro->bound = 0;
405         ro->count = 0;
406         free_percpu(ro->uniq);
407
408         sock_orphan(sk);
409         sock->sk = NULL;
410
411         release_sock(sk);
412         sock_put(sk);
413
414         return 0;
415 }
416
417 static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
418 {
419         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
420         struct sock *sk = sock->sk;
421         struct raw_sock *ro = raw_sk(sk);
422         int ifindex;
423         int err = 0;
424         int notify_enetdown = 0;
425
426         if (len < RAW_MIN_NAMELEN)
427                 return -EINVAL;
428         if (addr->can_family != AF_CAN)
429                 return -EINVAL;
430
431         lock_sock(sk);
432
433         if (ro->bound && addr->can_ifindex == ro->ifindex)
434                 goto out;
435
436         if (addr->can_ifindex) {
437                 struct net_device *dev;
438
439                 dev = dev_get_by_index(sock_net(sk), addr->can_ifindex);
440                 if (!dev) {
441                         err = -ENODEV;
442                         goto out;
443                 }
444                 if (dev->type != ARPHRD_CAN) {
445                         dev_put(dev);
446                         err = -ENODEV;
447                         goto out;
448                 }
449                 if (!(dev->flags & IFF_UP))
450                         notify_enetdown = 1;
451
452                 ifindex = dev->ifindex;
453
454                 /* filters set by default/setsockopt */
455                 err = raw_enable_allfilters(sock_net(sk), dev, sk);
456                 dev_put(dev);
457         } else {
458                 ifindex = 0;
459
460                 /* filters set by default/setsockopt */
461                 err = raw_enable_allfilters(sock_net(sk), NULL, sk);
462         }
463
464         if (!err) {
465                 if (ro->bound) {
466                         /* unregister old filters */
467                         if (ro->ifindex) {
468                                 struct net_device *dev;
469
470                                 dev = dev_get_by_index(sock_net(sk),
471                                                        ro->ifindex);
472                                 if (dev) {
473                                         raw_disable_allfilters(dev_net(dev),
474                                                                dev, sk);
475                                         dev_put(dev);
476                                 }
477                         } else {
478                                 raw_disable_allfilters(sock_net(sk), NULL, sk);
479                         }
480                 }
481                 ro->ifindex = ifindex;
482                 ro->bound = 1;
483         }
484
485  out:
486         release_sock(sk);
487
488         if (notify_enetdown) {
489                 sk->sk_err = ENETDOWN;
490                 if (!sock_flag(sk, SOCK_DEAD))
491                         sk_error_report(sk);
492         }
493
494         return err;
495 }
496
497 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
498                        int peer)
499 {
500         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
501         struct sock *sk = sock->sk;
502         struct raw_sock *ro = raw_sk(sk);
503
504         if (peer)
505                 return -EOPNOTSUPP;
506
507         memset(addr, 0, RAW_MIN_NAMELEN);
508         addr->can_family  = AF_CAN;
509         addr->can_ifindex = ro->ifindex;
510
511         return RAW_MIN_NAMELEN;
512 }
513
514 static int raw_setsockopt(struct socket *sock, int level, int optname,
515                           sockptr_t optval, unsigned int optlen)
516 {
517         struct sock *sk = sock->sk;
518         struct raw_sock *ro = raw_sk(sk);
519         struct can_filter *filter = NULL;  /* dyn. alloc'ed filters */
520         struct can_filter sfilter;         /* single filter */
521         struct net_device *dev = NULL;
522         can_err_mask_t err_mask = 0;
523         int count = 0;
524         int err = 0;
525
526         if (level != SOL_CAN_RAW)
527                 return -EINVAL;
528
529         switch (optname) {
530         case CAN_RAW_FILTER:
531                 if (optlen % sizeof(struct can_filter) != 0)
532                         return -EINVAL;
533
534                 if (optlen > CAN_RAW_FILTER_MAX * sizeof(struct can_filter))
535                         return -EINVAL;
536
537                 count = optlen / sizeof(struct can_filter);
538
539                 if (count > 1) {
540                         /* filter does not fit into dfilter => alloc space */
541                         filter = memdup_sockptr(optval, optlen);
542                         if (IS_ERR(filter))
543                                 return PTR_ERR(filter);
544                 } else if (count == 1) {
545                         if (copy_from_sockptr(&sfilter, optval, sizeof(sfilter)))
546                                 return -EFAULT;
547                 }
548
549                 lock_sock(sk);
550
551                 if (ro->bound && ro->ifindex)
552                         dev = dev_get_by_index(sock_net(sk), ro->ifindex);
553
554                 if (ro->bound) {
555                         /* (try to) register the new filters */
556                         if (count == 1)
557                                 err = raw_enable_filters(sock_net(sk), dev, sk,
558                                                          &sfilter, 1);
559                         else
560                                 err = raw_enable_filters(sock_net(sk), dev, sk,
561                                                          filter, count);
562                         if (err) {
563                                 if (count > 1)
564                                         kfree(filter);
565                                 goto out_fil;
566                         }
567
568                         /* remove old filter registrations */
569                         raw_disable_filters(sock_net(sk), dev, sk, ro->filter,
570                                             ro->count);
571                 }
572
573                 /* remove old filter space */
574                 if (ro->count > 1)
575                         kfree(ro->filter);
576
577                 /* link new filters to the socket */
578                 if (count == 1) {
579                         /* copy filter data for single filter */
580                         ro->dfilter = sfilter;
581                         filter = &ro->dfilter;
582                 }
583                 ro->filter = filter;
584                 ro->count  = count;
585
586  out_fil:
587                 if (dev)
588                         dev_put(dev);
589
590                 release_sock(sk);
591
592                 break;
593
594         case CAN_RAW_ERR_FILTER:
595                 if (optlen != sizeof(err_mask))
596                         return -EINVAL;
597
598                 if (copy_from_sockptr(&err_mask, optval, optlen))
599                         return -EFAULT;
600
601                 err_mask &= CAN_ERR_MASK;
602
603                 lock_sock(sk);
604
605                 if (ro->bound && ro->ifindex)
606                         dev = dev_get_by_index(sock_net(sk), ro->ifindex);
607
608                 /* remove current error mask */
609                 if (ro->bound) {
610                         /* (try to) register the new err_mask */
611                         err = raw_enable_errfilter(sock_net(sk), dev, sk,
612                                                    err_mask);
613
614                         if (err)
615                                 goto out_err;
616
617                         /* remove old err_mask registration */
618                         raw_disable_errfilter(sock_net(sk), dev, sk,
619                                               ro->err_mask);
620                 }
621
622                 /* link new err_mask to the socket */
623                 ro->err_mask = err_mask;
624
625  out_err:
626                 if (dev)
627                         dev_put(dev);
628
629                 release_sock(sk);
630
631                 break;
632
633         case CAN_RAW_LOOPBACK:
634                 if (optlen != sizeof(ro->loopback))
635                         return -EINVAL;
636
637                 if (copy_from_sockptr(&ro->loopback, optval, optlen))
638                         return -EFAULT;
639
640                 break;
641
642         case CAN_RAW_RECV_OWN_MSGS:
643                 if (optlen != sizeof(ro->recv_own_msgs))
644                         return -EINVAL;
645
646                 if (copy_from_sockptr(&ro->recv_own_msgs, optval, optlen))
647                         return -EFAULT;
648
649                 break;
650
651         case CAN_RAW_FD_FRAMES:
652                 if (optlen != sizeof(ro->fd_frames))
653                         return -EINVAL;
654
655                 if (copy_from_sockptr(&ro->fd_frames, optval, optlen))
656                         return -EFAULT;
657
658                 break;
659
660         case CAN_RAW_JOIN_FILTERS:
661                 if (optlen != sizeof(ro->join_filters))
662                         return -EINVAL;
663
664                 if (copy_from_sockptr(&ro->join_filters, optval, optlen))
665                         return -EFAULT;
666
667                 break;
668
669         default:
670                 return -ENOPROTOOPT;
671         }
672         return err;
673 }
674
675 static int raw_getsockopt(struct socket *sock, int level, int optname,
676                           char __user *optval, int __user *optlen)
677 {
678         struct sock *sk = sock->sk;
679         struct raw_sock *ro = raw_sk(sk);
680         int len;
681         void *val;
682         int err = 0;
683
684         if (level != SOL_CAN_RAW)
685                 return -EINVAL;
686         if (get_user(len, optlen))
687                 return -EFAULT;
688         if (len < 0)
689                 return -EINVAL;
690
691         switch (optname) {
692         case CAN_RAW_FILTER:
693                 lock_sock(sk);
694                 if (ro->count > 0) {
695                         int fsize = ro->count * sizeof(struct can_filter);
696
697                         /* user space buffer to small for filter list? */
698                         if (len < fsize) {
699                                 /* return -ERANGE and needed space in optlen */
700                                 err = -ERANGE;
701                                 if (put_user(fsize, optlen))
702                                         err = -EFAULT;
703                         } else {
704                                 if (len > fsize)
705                                         len = fsize;
706                                 if (copy_to_user(optval, ro->filter, len))
707                                         err = -EFAULT;
708                         }
709                 } else {
710                         len = 0;
711                 }
712                 release_sock(sk);
713
714                 if (!err)
715                         err = put_user(len, optlen);
716                 return err;
717
718         case CAN_RAW_ERR_FILTER:
719                 if (len > sizeof(can_err_mask_t))
720                         len = sizeof(can_err_mask_t);
721                 val = &ro->err_mask;
722                 break;
723
724         case CAN_RAW_LOOPBACK:
725                 if (len > sizeof(int))
726                         len = sizeof(int);
727                 val = &ro->loopback;
728                 break;
729
730         case CAN_RAW_RECV_OWN_MSGS:
731                 if (len > sizeof(int))
732                         len = sizeof(int);
733                 val = &ro->recv_own_msgs;
734                 break;
735
736         case CAN_RAW_FD_FRAMES:
737                 if (len > sizeof(int))
738                         len = sizeof(int);
739                 val = &ro->fd_frames;
740                 break;
741
742         case CAN_RAW_JOIN_FILTERS:
743                 if (len > sizeof(int))
744                         len = sizeof(int);
745                 val = &ro->join_filters;
746                 break;
747
748         default:
749                 return -ENOPROTOOPT;
750         }
751
752         if (put_user(len, optlen))
753                 return -EFAULT;
754         if (copy_to_user(optval, val, len))
755                 return -EFAULT;
756         return 0;
757 }
758
759 static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
760 {
761         struct sock *sk = sock->sk;
762         struct raw_sock *ro = raw_sk(sk);
763         struct sk_buff *skb;
764         struct net_device *dev;
765         int ifindex;
766         int err;
767
768         if (msg->msg_name) {
769                 DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
770
771                 if (msg->msg_namelen < RAW_MIN_NAMELEN)
772                         return -EINVAL;
773
774                 if (addr->can_family != AF_CAN)
775                         return -EINVAL;
776
777                 ifindex = addr->can_ifindex;
778         } else {
779                 ifindex = ro->ifindex;
780         }
781
782         dev = dev_get_by_index(sock_net(sk), ifindex);
783         if (!dev)
784                 return -ENXIO;
785
786         err = -EINVAL;
787         if (ro->fd_frames && dev->mtu == CANFD_MTU) {
788                 if (unlikely(size != CANFD_MTU && size != CAN_MTU))
789                         goto put_dev;
790         } else {
791                 if (unlikely(size != CAN_MTU))
792                         goto put_dev;
793         }
794
795         skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv),
796                                   msg->msg_flags & MSG_DONTWAIT, &err);
797         if (!skb)
798                 goto put_dev;
799
800         can_skb_reserve(skb);
801         can_skb_prv(skb)->ifindex = dev->ifindex;
802         can_skb_prv(skb)->skbcnt = 0;
803
804         err = memcpy_from_msg(skb_put(skb, size), msg, size);
805         if (err < 0)
806                 goto free_skb;
807
808         skb_setup_tx_timestamp(skb, sk->sk_tsflags);
809
810         skb->dev = dev;
811         skb->sk = sk;
812         skb->priority = sk->sk_priority;
813
814         err = can_send(skb, ro->loopback);
815
816         dev_put(dev);
817
818         if (err)
819                 goto send_failed;
820
821         return size;
822
823 free_skb:
824         kfree_skb(skb);
825 put_dev:
826         dev_put(dev);
827 send_failed:
828         return err;
829 }
830
831 static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
832                        int flags)
833 {
834         struct sock *sk = sock->sk;
835         struct sk_buff *skb;
836         int err = 0;
837         int noblock;
838
839         noblock = flags & MSG_DONTWAIT;
840         flags &= ~MSG_DONTWAIT;
841
842         if (flags & MSG_ERRQUEUE)
843                 return sock_recv_errqueue(sk, msg, size,
844                                           SOL_CAN_RAW, SCM_CAN_RAW_ERRQUEUE);
845
846         skb = skb_recv_datagram(sk, flags, noblock, &err);
847         if (!skb)
848                 return err;
849
850         if (size < skb->len)
851                 msg->msg_flags |= MSG_TRUNC;
852         else
853                 size = skb->len;
854
855         err = memcpy_to_msg(msg, skb->data, size);
856         if (err < 0) {
857                 skb_free_datagram(sk, skb);
858                 return err;
859         }
860
861         sock_recv_ts_and_drops(msg, sk, skb);
862
863         if (msg->msg_name) {
864                 __sockaddr_check_size(RAW_MIN_NAMELEN);
865                 msg->msg_namelen = RAW_MIN_NAMELEN;
866                 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
867         }
868
869         /* assign the flags that have been recorded in raw_rcv() */
870         msg->msg_flags |= *(raw_flags(skb));
871
872         skb_free_datagram(sk, skb);
873
874         return size;
875 }
876
877 static int raw_sock_no_ioctlcmd(struct socket *sock, unsigned int cmd,
878                                 unsigned long arg)
879 {
880         /* no ioctls for socket layer -> hand it down to NIC layer */
881         return -ENOIOCTLCMD;
882 }
883
884 static const struct proto_ops raw_ops = {
885         .family        = PF_CAN,
886         .release       = raw_release,
887         .bind          = raw_bind,
888         .connect       = sock_no_connect,
889         .socketpair    = sock_no_socketpair,
890         .accept        = sock_no_accept,
891         .getname       = raw_getname,
892         .poll          = datagram_poll,
893         .ioctl         = raw_sock_no_ioctlcmd,
894         .gettstamp     = sock_gettstamp,
895         .listen        = sock_no_listen,
896         .shutdown      = sock_no_shutdown,
897         .setsockopt    = raw_setsockopt,
898         .getsockopt    = raw_getsockopt,
899         .sendmsg       = raw_sendmsg,
900         .recvmsg       = raw_recvmsg,
901         .mmap          = sock_no_mmap,
902         .sendpage      = sock_no_sendpage,
903 };
904
905 static struct proto raw_proto __read_mostly = {
906         .name       = "CAN_RAW",
907         .owner      = THIS_MODULE,
908         .obj_size   = sizeof(struct raw_sock),
909         .init       = raw_init,
910 };
911
912 static const struct can_proto raw_can_proto = {
913         .type       = SOCK_RAW,
914         .protocol   = CAN_RAW,
915         .ops        = &raw_ops,
916         .prot       = &raw_proto,
917 };
918
919 static struct notifier_block canraw_notifier = {
920         .notifier_call = raw_notifier
921 };
922
923 static __init int raw_module_init(void)
924 {
925         int err;
926
927         pr_info("can: raw protocol\n");
928
929         err = can_proto_register(&raw_can_proto);
930         if (err < 0)
931                 pr_err("can: registration of raw protocol failed\n");
932         else
933                 register_netdevice_notifier(&canraw_notifier);
934
935         return err;
936 }
937
938 static __exit void raw_module_exit(void)
939 {
940         can_proto_unregister(&raw_can_proto);
941         unregister_netdevice_notifier(&canraw_notifier);
942 }
943
944 module_init(raw_module_init);
945 module_exit(raw_module_exit);