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