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