Merge tag 'trace-v5.14-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[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                 rtnl_lock();
550                 lock_sock(sk);
551
552                 if (ro->bound && ro->ifindex) {
553                         dev = dev_get_by_index(sock_net(sk), ro->ifindex);
554                         if (!dev) {
555                                 if (count > 1)
556                                         kfree(filter);
557                                 err = -ENODEV;
558                                 goto out_fil;
559                         }
560                 }
561
562                 if (ro->bound) {
563                         /* (try to) register the new filters */
564                         if (count == 1)
565                                 err = raw_enable_filters(sock_net(sk), dev, sk,
566                                                          &sfilter, 1);
567                         else
568                                 err = raw_enable_filters(sock_net(sk), dev, sk,
569                                                          filter, count);
570                         if (err) {
571                                 if (count > 1)
572                                         kfree(filter);
573                                 goto out_fil;
574                         }
575
576                         /* remove old filter registrations */
577                         raw_disable_filters(sock_net(sk), dev, sk, ro->filter,
578                                             ro->count);
579                 }
580
581                 /* remove old filter space */
582                 if (ro->count > 1)
583                         kfree(ro->filter);
584
585                 /* link new filters to the socket */
586                 if (count == 1) {
587                         /* copy filter data for single filter */
588                         ro->dfilter = sfilter;
589                         filter = &ro->dfilter;
590                 }
591                 ro->filter = filter;
592                 ro->count  = count;
593
594  out_fil:
595                 if (dev)
596                         dev_put(dev);
597
598                 release_sock(sk);
599                 rtnl_unlock();
600
601                 break;
602
603         case CAN_RAW_ERR_FILTER:
604                 if (optlen != sizeof(err_mask))
605                         return -EINVAL;
606
607                 if (copy_from_sockptr(&err_mask, optval, optlen))
608                         return -EFAULT;
609
610                 err_mask &= CAN_ERR_MASK;
611
612                 rtnl_lock();
613                 lock_sock(sk);
614
615                 if (ro->bound && ro->ifindex) {
616                         dev = dev_get_by_index(sock_net(sk), ro->ifindex);
617                         if (!dev) {
618                                 err = -ENODEV;
619                                 goto out_err;
620                         }
621                 }
622
623                 /* remove current error mask */
624                 if (ro->bound) {
625                         /* (try to) register the new err_mask */
626                         err = raw_enable_errfilter(sock_net(sk), dev, sk,
627                                                    err_mask);
628
629                         if (err)
630                                 goto out_err;
631
632                         /* remove old err_mask registration */
633                         raw_disable_errfilter(sock_net(sk), dev, sk,
634                                               ro->err_mask);
635                 }
636
637                 /* link new err_mask to the socket */
638                 ro->err_mask = err_mask;
639
640  out_err:
641                 if (dev)
642                         dev_put(dev);
643
644                 release_sock(sk);
645                 rtnl_unlock();
646
647                 break;
648
649         case CAN_RAW_LOOPBACK:
650                 if (optlen != sizeof(ro->loopback))
651                         return -EINVAL;
652
653                 if (copy_from_sockptr(&ro->loopback, optval, optlen))
654                         return -EFAULT;
655
656                 break;
657
658         case CAN_RAW_RECV_OWN_MSGS:
659                 if (optlen != sizeof(ro->recv_own_msgs))
660                         return -EINVAL;
661
662                 if (copy_from_sockptr(&ro->recv_own_msgs, optval, optlen))
663                         return -EFAULT;
664
665                 break;
666
667         case CAN_RAW_FD_FRAMES:
668                 if (optlen != sizeof(ro->fd_frames))
669                         return -EINVAL;
670
671                 if (copy_from_sockptr(&ro->fd_frames, optval, optlen))
672                         return -EFAULT;
673
674                 break;
675
676         case CAN_RAW_JOIN_FILTERS:
677                 if (optlen != sizeof(ro->join_filters))
678                         return -EINVAL;
679
680                 if (copy_from_sockptr(&ro->join_filters, optval, optlen))
681                         return -EFAULT;
682
683                 break;
684
685         default:
686                 return -ENOPROTOOPT;
687         }
688         return err;
689 }
690
691 static int raw_getsockopt(struct socket *sock, int level, int optname,
692                           char __user *optval, int __user *optlen)
693 {
694         struct sock *sk = sock->sk;
695         struct raw_sock *ro = raw_sk(sk);
696         int len;
697         void *val;
698         int err = 0;
699
700         if (level != SOL_CAN_RAW)
701                 return -EINVAL;
702         if (get_user(len, optlen))
703                 return -EFAULT;
704         if (len < 0)
705                 return -EINVAL;
706
707         switch (optname) {
708         case CAN_RAW_FILTER:
709                 lock_sock(sk);
710                 if (ro->count > 0) {
711                         int fsize = ro->count * sizeof(struct can_filter);
712
713                         /* user space buffer to small for filter list? */
714                         if (len < fsize) {
715                                 /* return -ERANGE and needed space in optlen */
716                                 err = -ERANGE;
717                                 if (put_user(fsize, optlen))
718                                         err = -EFAULT;
719                         } else {
720                                 if (len > fsize)
721                                         len = fsize;
722                                 if (copy_to_user(optval, ro->filter, len))
723                                         err = -EFAULT;
724                         }
725                 } else {
726                         len = 0;
727                 }
728                 release_sock(sk);
729
730                 if (!err)
731                         err = put_user(len, optlen);
732                 return err;
733
734         case CAN_RAW_ERR_FILTER:
735                 if (len > sizeof(can_err_mask_t))
736                         len = sizeof(can_err_mask_t);
737                 val = &ro->err_mask;
738                 break;
739
740         case CAN_RAW_LOOPBACK:
741                 if (len > sizeof(int))
742                         len = sizeof(int);
743                 val = &ro->loopback;
744                 break;
745
746         case CAN_RAW_RECV_OWN_MSGS:
747                 if (len > sizeof(int))
748                         len = sizeof(int);
749                 val = &ro->recv_own_msgs;
750                 break;
751
752         case CAN_RAW_FD_FRAMES:
753                 if (len > sizeof(int))
754                         len = sizeof(int);
755                 val = &ro->fd_frames;
756                 break;
757
758         case CAN_RAW_JOIN_FILTERS:
759                 if (len > sizeof(int))
760                         len = sizeof(int);
761                 val = &ro->join_filters;
762                 break;
763
764         default:
765                 return -ENOPROTOOPT;
766         }
767
768         if (put_user(len, optlen))
769                 return -EFAULT;
770         if (copy_to_user(optval, val, len))
771                 return -EFAULT;
772         return 0;
773 }
774
775 static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
776 {
777         struct sock *sk = sock->sk;
778         struct raw_sock *ro = raw_sk(sk);
779         struct sk_buff *skb;
780         struct net_device *dev;
781         int ifindex;
782         int err;
783
784         if (msg->msg_name) {
785                 DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
786
787                 if (msg->msg_namelen < RAW_MIN_NAMELEN)
788                         return -EINVAL;
789
790                 if (addr->can_family != AF_CAN)
791                         return -EINVAL;
792
793                 ifindex = addr->can_ifindex;
794         } else {
795                 ifindex = ro->ifindex;
796         }
797
798         dev = dev_get_by_index(sock_net(sk), ifindex);
799         if (!dev)
800                 return -ENXIO;
801
802         err = -EINVAL;
803         if (ro->fd_frames && dev->mtu == CANFD_MTU) {
804                 if (unlikely(size != CANFD_MTU && size != CAN_MTU))
805                         goto put_dev;
806         } else {
807                 if (unlikely(size != CAN_MTU))
808                         goto put_dev;
809         }
810
811         skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv),
812                                   msg->msg_flags & MSG_DONTWAIT, &err);
813         if (!skb)
814                 goto put_dev;
815
816         can_skb_reserve(skb);
817         can_skb_prv(skb)->ifindex = dev->ifindex;
818         can_skb_prv(skb)->skbcnt = 0;
819
820         err = memcpy_from_msg(skb_put(skb, size), msg, size);
821         if (err < 0)
822                 goto free_skb;
823
824         skb_setup_tx_timestamp(skb, sk->sk_tsflags);
825
826         skb->dev = dev;
827         skb->sk = sk;
828         skb->priority = sk->sk_priority;
829
830         err = can_send(skb, ro->loopback);
831
832         dev_put(dev);
833
834         if (err)
835                 goto send_failed;
836
837         return size;
838
839 free_skb:
840         kfree_skb(skb);
841 put_dev:
842         dev_put(dev);
843 send_failed:
844         return err;
845 }
846
847 static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
848                        int flags)
849 {
850         struct sock *sk = sock->sk;
851         struct sk_buff *skb;
852         int err = 0;
853         int noblock;
854
855         noblock = flags & MSG_DONTWAIT;
856         flags &= ~MSG_DONTWAIT;
857
858         if (flags & MSG_ERRQUEUE)
859                 return sock_recv_errqueue(sk, msg, size,
860                                           SOL_CAN_RAW, SCM_CAN_RAW_ERRQUEUE);
861
862         skb = skb_recv_datagram(sk, flags, noblock, &err);
863         if (!skb)
864                 return err;
865
866         if (size < skb->len)
867                 msg->msg_flags |= MSG_TRUNC;
868         else
869                 size = skb->len;
870
871         err = memcpy_to_msg(msg, skb->data, size);
872         if (err < 0) {
873                 skb_free_datagram(sk, skb);
874                 return err;
875         }
876
877         sock_recv_ts_and_drops(msg, sk, skb);
878
879         if (msg->msg_name) {
880                 __sockaddr_check_size(RAW_MIN_NAMELEN);
881                 msg->msg_namelen = RAW_MIN_NAMELEN;
882                 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
883         }
884
885         /* assign the flags that have been recorded in raw_rcv() */
886         msg->msg_flags |= *(raw_flags(skb));
887
888         skb_free_datagram(sk, skb);
889
890         return size;
891 }
892
893 static int raw_sock_no_ioctlcmd(struct socket *sock, unsigned int cmd,
894                                 unsigned long arg)
895 {
896         /* no ioctls for socket layer -> hand it down to NIC layer */
897         return -ENOIOCTLCMD;
898 }
899
900 static const struct proto_ops raw_ops = {
901         .family        = PF_CAN,
902         .release       = raw_release,
903         .bind          = raw_bind,
904         .connect       = sock_no_connect,
905         .socketpair    = sock_no_socketpair,
906         .accept        = sock_no_accept,
907         .getname       = raw_getname,
908         .poll          = datagram_poll,
909         .ioctl         = raw_sock_no_ioctlcmd,
910         .gettstamp     = sock_gettstamp,
911         .listen        = sock_no_listen,
912         .shutdown      = sock_no_shutdown,
913         .setsockopt    = raw_setsockopt,
914         .getsockopt    = raw_getsockopt,
915         .sendmsg       = raw_sendmsg,
916         .recvmsg       = raw_recvmsg,
917         .mmap          = sock_no_mmap,
918         .sendpage      = sock_no_sendpage,
919 };
920
921 static struct proto raw_proto __read_mostly = {
922         .name       = "CAN_RAW",
923         .owner      = THIS_MODULE,
924         .obj_size   = sizeof(struct raw_sock),
925         .init       = raw_init,
926 };
927
928 static const struct can_proto raw_can_proto = {
929         .type       = SOCK_RAW,
930         .protocol   = CAN_RAW,
931         .ops        = &raw_ops,
932         .prot       = &raw_proto,
933 };
934
935 static struct notifier_block canraw_notifier = {
936         .notifier_call = raw_notifier
937 };
938
939 static __init int raw_module_init(void)
940 {
941         int err;
942
943         pr_info("can: raw protocol\n");
944
945         err = can_proto_register(&raw_can_proto);
946         if (err < 0)
947                 pr_err("can: registration of raw protocol failed\n");
948         else
949                 register_netdevice_notifier(&canraw_notifier);
950
951         return err;
952 }
953
954 static __exit void raw_module_exit(void)
955 {
956         can_proto_unregister(&raw_can_proto);
957         unregister_netdevice_notifier(&canraw_notifier);
958 }
959
960 module_init(raw_module_init);
961 module_exit(raw_module_exit);