]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - kernel/2.6/net/can/raw.c
Reorder #include directives.
[socketcan-devel.git] / kernel / 2.6 / net / can / raw.c
1 /*
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, the following disclaimer and
12  *    the referenced file 'COPYING'.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of Volkswagen nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * Alternatively, provided that this notice is retained in full, this
21  * software may be distributed under the terms of the GNU General
22  * Public License ("GPL") version 2 as distributed in the 'COPYING'
23  * file from the main directory of the linux kernel source.
24  *
25  * The provided data structures and external interfaces from this code
26  * are not restricted to be used by modules with a GPL compatible license.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
39  * DAMAGE.
40  *
41  * Send feedback to <socketcan-users@lists.berlios.de>
42  *
43  */
44
45 #include <linux/module.h>
46 #include <linux/version.h>
47 #include <linux/init.h>
48 #include <linux/net.h>
49 #include <linux/netdevice.h>
50 #include <linux/uio.h>
51 #include <linux/poll.h>
52 #include <linux/can.h>
53 #include <linux/can/core.h>
54 #include <linux/can/raw.h>
55 #include <net/sock.h>
56
57 #include <linux/can/version.h> /* for RCSID. Removed by mkpatch script */
58 RCSID("$Id$");
59
60 #define IDENT "raw"
61 #define CAN_RAW_VERSION CAN_VERSION
62 static __initdata const char banner[] =
63         KERN_INFO "can: raw protocol # rev " CAN_RAW_VERSION "\n";
64
65 MODULE_DESCRIPTION("PF_CAN raw protocol");
66 MODULE_LICENSE("Dual BSD/GPL");
67 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
68
69 #ifdef CONFIG_CAN_DEBUG_CORE
70 static int debug = 0;
71 module_param(debug, int, S_IRUGO);
72 MODULE_PARM_DESC(debug, "debug print mask: 1:debug, 2:frames, 4:skbs");
73 #endif
74
75 #ifdef CONFIG_CAN_RAW_USER
76 #define RAW_CAP (-1)
77 #else
78 #define RAW_CAP CAP_NET_RAW
79 #endif
80
81 #define MASK_ALL 0
82
83 /*
84  * A raw socket has a list of can_filters attached to it, each receiving
85  * the CAN frames matching that filter.  If the filter list is empty,
86  * no CAN frames will be received by the socket.  The default after
87  * opening the socket, is to have one filter which receives all frames.
88  * The filter list is allocated dynamically with the exception of the
89  * list containing only one item.  This common case is optimized by
90  * storing the single filter in dfilter, to avoid using dynamic memory.
91  */
92
93 struct raw_opt {
94         int bound;
95         int ifindex;
96         int loopback;
97         int recv_own_msgs;
98         int count;                 /* number of active filters */
99         struct can_filter dfilter; /* default/single filter */
100         struct can_filter *filter; /* pointer to filter(s) */
101         can_err_mask_t err_mask;
102         spinlock_t lock;
103 };
104
105 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
106 struct raw_sock {
107         struct sock    sk;
108         struct raw_opt opt;
109 };
110
111 static inline struct raw_opt *raw_sk(const struct sock *sk)
112 {
113         return &((struct raw_sock *)sk)->opt;
114 }
115 #else
116 static inline struct raw_opt *raw_sk(const struct sock *sk)
117 {
118         return (struct raw_opt *)sk->sk_protinfo;
119 }
120 #endif
121
122 static void raw_notifier(unsigned long msg, void *data)
123 {
124         struct sock *sk = (struct sock *)data;
125         struct raw_opt *ro = raw_sk(sk);
126
127         DBG("called for sock %p\n", sk);
128
129         switch (msg) {
130
131         case NETDEV_UNREGISTER:
132                 spin_lock(&ro->lock);
133                 ro->ifindex = 0;
134                 ro->bound   = 0;
135                 spin_unlock(&ro->lock);
136                 /* fallthrough */
137         case NETDEV_DOWN:
138                 sk->sk_err = ENETDOWN;
139                 if (!sock_flag(sk, SOCK_DEAD))
140                         sk->sk_error_report(sk);
141                 break;
142         }
143 }
144
145 static void raw_rcv(struct sk_buff *skb, void *data)
146 {
147         struct sock *sk = (struct sock*)data;
148         struct raw_opt *ro = raw_sk(sk);
149         struct sockaddr_can *addr;
150         int error;
151
152         DBG("received skbuff %p, sk %p\n", skb, sk);
153         DBG_SKB(skb);
154
155         if (!ro->recv_own_msgs) {
156                 /* check the received tx sock reference */
157                 if (*(struct sock **)skb->cb == sk) {
158                         DBG("trashed own tx msg\n");
159                         kfree_skb(skb);
160                         return;
161                 }
162         }
163
164         addr = (struct sockaddr_can *)skb->cb;
165         memset(addr, 0, sizeof(*addr));
166         addr->can_family  = AF_CAN;
167         addr->can_ifindex = skb->dev->ifindex;
168
169         error = sock_queue_rcv_skb(sk, skb);
170         if (error < 0) {
171                 DBG("sock_queue_rcv_skb failed: %d\n", error);
172                 DBG("freeing skbuff %p\n", skb);
173                 kfree_skb(skb);
174         }
175 }
176
177 static void raw_add_filters(struct net_device *dev, struct sock *sk)
178 {
179         struct raw_opt *ro = raw_sk(sk);
180         struct can_filter *filter = ro->filter;
181         int i;
182
183         for (i = 0; i < ro->count; i++) {
184                 can_rx_register(dev, filter[i].can_id, filter[i].can_mask,
185                                 raw_rcv, sk, IDENT);
186                 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
187                     filter[i].can_id, filter[i].can_mask,
188                     filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
189         }
190 }
191
192 static void raw_remove_filters(struct net_device *dev, struct sock *sk)
193 {
194         struct raw_opt *ro = raw_sk(sk);
195         struct can_filter *filter = ro->filter;
196         int i;
197
198         for (i = 0; i < ro->count; i++) {
199                 can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
200                                   raw_rcv, sk);
201                 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
202                     filter[i].can_id, filter[i].can_mask,
203                     filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
204         }
205 }
206
207 static int raw_init(struct sock *sk)
208 {
209         struct raw_opt *ro = raw_sk(sk);
210
211         ro->bound            = 0;
212
213         /* set default filter to single entry dfilter */
214         ro->dfilter.can_id   = 0;
215         ro->dfilter.can_mask = MASK_ALL;
216         ro->filter           = &ro->dfilter;
217         ro->count            = 1;
218
219         /* set default loopback behaviour */
220         ro->loopback         = 1;
221         ro->recv_own_msgs    = 0;
222
223         spin_lock_init(&ro->lock);
224
225         return 0;
226 }
227
228 static int raw_release(struct socket *sock)
229 {
230         struct sock *sk = sock->sk;
231         struct raw_opt *ro = raw_sk(sk);
232         struct net_device *dev = NULL;
233
234         DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
235             atomic_read(&sk->sk_refcnt));
236
237         spin_lock(&ro->lock);
238         if (ro->bound && ro->ifindex)
239                 dev = dev_get_by_index(ro->ifindex);
240         spin_unlock(&ro->lock);
241
242         /* remove current filters & unregister */
243         if (ro->bound)
244                 raw_remove_filters(dev, sk);
245
246         if (ro->count > 1)
247                 kfree(ro->filter);
248
249         /* remove current error mask */
250         if (ro->err_mask && ro->bound)
251                 can_rx_unregister(dev, 0, ro->err_mask | CAN_ERR_FLAG,
252                                   raw_rcv, sk);
253
254         if (dev) {
255                 can_dev_unregister(dev, raw_notifier, sk);
256                 dev_put(dev);
257         }
258
259         sock_put(sk);
260
261         return 0;
262 }
263
264 static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
265 {
266         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
267         struct sock *sk = sock->sk;
268         struct raw_opt *ro = raw_sk(sk);
269         struct net_device *dev;
270         int err = 0;
271
272         DBG("socket %p to device %d\n", sock, addr->can_ifindex);
273
274         if (len < sizeof(*addr))
275                 return -EINVAL;
276
277         lock_sock(sk);
278         spin_lock(&ro->lock);
279
280         if (ro->bound) {
281                 /* remove current bindings / notifier */
282                 if (ro->ifindex) {
283                         dev = dev_get_by_index(ro->ifindex);
284                         if (!dev) {
285                                 DBG("could not find device %d\n",
286                                     addr->can_ifindex);
287                                 err = -ENODEV;
288                                 goto out;
289                         }
290                         if (!(dev->flags & IFF_UP)) {
291                                 sk->sk_err = ENETDOWN;
292                                 if (!sock_flag(sk, SOCK_DEAD))
293                                         sk->sk_error_report(sk);
294                                 goto out;
295                         }
296                         can_dev_unregister(dev, raw_notifier, sk);
297                 } else
298                         dev = NULL;
299
300                 /* unregister current filters for this device */
301                 raw_remove_filters(dev, sk);
302
303                 if (dev)
304                         dev_put(dev);
305
306                 ro->bound = 0;
307         }
308
309         if (addr->can_ifindex) {
310                 dev = dev_get_by_index(addr->can_ifindex);
311                 if (!dev) {
312                         DBG("could not find device %d\n", addr->can_ifindex);
313                         err = -ENODEV;
314                         goto out;
315                 }
316                 if (!(dev->flags & IFF_UP)) {
317                         sk->sk_err = ENETDOWN;
318                         if (!sock_flag(sk, SOCK_DEAD))
319                                 sk->sk_error_report(sk);
320                         goto out;
321                 }
322                 can_dev_register(dev, raw_notifier, sk);
323         } else
324                 dev = NULL;
325
326         ro->ifindex = addr->can_ifindex;
327
328         /* filters set by default/setsockopt */
329         raw_add_filters(dev, sk);
330
331         /* error frame filter set by setsockopt */
332         if (ro->err_mask)
333                 can_rx_register(dev, 0, ro->err_mask | CAN_ERR_FLAG,
334                                 raw_rcv, sk, IDENT);
335
336         ro->bound = 1;
337
338  out:
339         spin_unlock(&ro->lock);
340         release_sock(sk);
341
342         if (dev)
343                 dev_put(dev);
344
345         return err;
346 }
347
348 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
349                        int *len, int peer)
350 {
351         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
352         struct sock *sk = sock->sk;
353         struct raw_opt *ro = raw_sk(sk);
354
355         if (peer)
356                 return -EOPNOTSUPP;
357
358         addr->can_family  = AF_CAN;
359         addr->can_ifindex = ro->ifindex;
360         *len = sizeof(*addr);
361
362         return 0;
363 }
364
365 static unsigned int raw_poll(struct file *file, struct socket *sock,
366                              poll_table *wait)
367 {
368         unsigned int mask = 0;
369
370         DBG("socket %p\n", sock);
371
372         mask = datagram_poll(file, sock, wait);
373         return mask;
374 }
375
376 static int raw_setsockopt(struct socket *sock, int level, int optname,
377                           char __user *optval, int optlen)
378 {
379         struct sock *sk = sock->sk;
380         struct raw_opt *ro = raw_sk(sk);
381         struct can_filter *filter = NULL;  /* dyn. alloc'ed filters */
382         struct can_filter sfilter;         /* single filter */
383         struct net_device *dev = NULL;
384         can_err_mask_t err_mask = 0;
385         int count = 0;
386         int err;
387
388         if (level != SOL_CAN_RAW)
389                 return -EINVAL;
390         if (optlen < 0)
391                 return -EINVAL;
392
393         switch (optname) {
394
395         case CAN_RAW_FILTER:
396                 if (optlen % sizeof(struct can_filter) != 0)
397                         return -EINVAL;
398
399                 count = optlen / sizeof(struct can_filter);
400
401                 if (count > 1) {
402                         /* filter does not fit into dfilter => alloc space */
403                         filter = kmalloc(optlen, GFP_KERNEL);
404                         if (!filter)
405                                 return -ENOMEM;
406
407                         err = copy_from_user(filter, optval, optlen);
408                         if (err) {
409                                 kfree(filter);
410                                 return err;
411                         }
412                 } else if (count == 1) {
413                         err = copy_from_user(&sfilter, optval, optlen);
414                         if (err)
415                                 return err;
416                 }
417
418                 lock_sock(sk);
419
420                 spin_lock(&ro->lock);
421                 if (ro->bound && ro->ifindex)
422                         dev = dev_get_by_index(ro->ifindex);
423                 spin_unlock(&ro->lock);
424
425                 /* remove current filters & unregister */
426                 if (ro->bound)
427                         raw_remove_filters(dev, sk);
428
429                 if (ro->count > 1)
430                         kfree(ro->filter);
431
432                 if (count == 1) {
433                         /* copy filter data for single filter */
434                         ro->dfilter = sfilter;
435                         filter = &ro->dfilter;
436                 }
437
438                 /* add new filters & register */
439                 ro->filter = filter;
440                 ro->count  = count;
441                 if (ro->bound)
442                         raw_add_filters(dev, sk);
443
444                 if (dev)
445                         dev_put(dev);
446
447                 release_sock(sk);
448
449                 break;
450
451         case CAN_RAW_ERR_FILTER:
452                 if (optlen != sizeof(err_mask))
453                         return -EINVAL;
454
455                 err = copy_from_user(&err_mask, optval, optlen);
456                 if (err)
457                         return err;
458
459                 err_mask &= CAN_ERR_MASK;
460
461                 if (ro->bound && ro->ifindex)
462                         dev = dev_get_by_index(ro->ifindex);
463
464                 /* remove current error mask */
465                 if (ro->err_mask && ro->bound)
466                         can_rx_unregister(dev, 0, ro->err_mask | CAN_ERR_FLAG,
467                                           raw_rcv, sk);
468
469                 /* add new error mask */
470                 ro->err_mask = err_mask;
471                 if (ro->err_mask && ro->bound)
472                         can_rx_register(dev, 0, ro->err_mask | CAN_ERR_FLAG,
473                                         raw_rcv, sk, IDENT);
474
475                 if (dev)
476                         dev_put(dev);
477
478                 break;
479
480         case CAN_RAW_LOOPBACK:
481                 if (optlen != sizeof(ro->loopback))
482                         return -EINVAL;
483
484                 err = copy_from_user(&ro->loopback, optval, optlen);
485                 if (err)
486                         return err;
487
488                 break;
489
490         case CAN_RAW_RECV_OWN_MSGS:
491                 if (optlen != sizeof(ro->recv_own_msgs))
492                         return -EINVAL;
493
494                 err = copy_from_user(&ro->recv_own_msgs, optval, optlen);
495                 if (err)
496                         return err;
497
498                 break;
499
500         default:
501                 return -ENOPROTOOPT;
502         }
503         return 0;
504 }
505
506 static int raw_getsockopt(struct socket *sock, int level, int optname,
507                           char __user *optval, int __user *optlen)
508 {
509         struct sock *sk = sock->sk;
510         struct raw_opt *ro = raw_sk(sk);
511         struct can_filter *filter = ro->filter;
512         int count = ro->count;
513         int len;
514         void *val = NULL;
515
516         if (level != SOL_CAN_RAW)
517                 return -EINVAL;
518         if (get_user(len, optlen))
519                 return -EFAULT;
520         if (len < 0)
521                 return -EINVAL;
522
523         switch (optname) {
524
525         case CAN_RAW_FILTER:
526                 if (count && filter) {
527                         int filter_size = count * sizeof(struct can_filter);
528                         if (len > filter_size)
529                                 len = filter_size;
530                         val = filter;
531                 } else
532                         len = 0;
533                 break;
534
535         case CAN_RAW_ERR_FILTER:
536                 if (len > sizeof(can_err_mask_t))
537                         len = sizeof(can_err_mask_t);
538                 val = &ro->err_mask;
539                 break;
540
541         case CAN_RAW_LOOPBACK:
542                 if (len > sizeof(int))
543                         len = sizeof(int);
544                 val = &ro->loopback;
545                 break;
546
547         case CAN_RAW_RECV_OWN_MSGS:
548                 if (len > sizeof(int))
549                         len = sizeof(int);
550                 val = &ro->recv_own_msgs;
551                 break;
552
553         default:
554                 return -ENOPROTOOPT;
555         }
556
557         if (put_user(len, optlen))
558                 return -EFAULT;
559         if (copy_to_user(optval, val, len))
560                 return -EFAULT;
561         return 0;
562 }
563
564 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
565                        struct msghdr *msg, size_t size)
566 {
567         struct sock *sk = sock->sk;
568         struct raw_opt *ro = raw_sk(sk);
569         struct sk_buff *skb;
570         struct net_device *dev;
571         int ifindex;
572         int err;
573
574         DBG("socket %p, sk %p\n", sock, sk);
575
576         if (msg->msg_name) {
577                 struct sockaddr_can *addr =
578                         (struct sockaddr_can *)msg->msg_name;
579
580                 if (addr->can_family != AF_CAN)
581                         return -EINVAL;
582
583                 ifindex = addr->can_ifindex;
584         } else
585                 ifindex = ro->ifindex;
586
587         dev = dev_get_by_index(ifindex);
588         if (!dev) {
589                 DBG("device %d not found\n", ifindex);
590                 return -ENXIO;
591         }
592
593         skb = alloc_skb(size, GFP_KERNEL);
594         if (!skb) {
595                 dev_put(dev);
596                 return -ENOMEM;
597         }
598
599         err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
600         if (err < 0) {
601                 kfree_skb(skb);
602                 dev_put(dev);
603                 return err;
604         }
605         skb->dev = dev;
606         skb->sk  = sk;
607
608         DBG("sending skbuff to interface %d\n", ifindex);
609         DBG_SKB(skb);
610
611         err = can_send(skb, ro->loopback);
612
613         dev_put(dev);
614
615         if (err)
616                 return err;
617
618         return size;
619 }
620
621 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
622                        struct msghdr *msg, size_t size, int flags)
623 {
624         struct sock *sk = sock->sk;
625         struct sk_buff *skb;
626         int error = 0;
627         int noblock;
628
629         DBG("socket %p, sk %p\n", sock, sk);
630
631         noblock =  flags & MSG_DONTWAIT;
632         flags   &= ~MSG_DONTWAIT;
633
634         skb = skb_recv_datagram(sk, flags, noblock, &error);
635         if (!skb)
636                 return error;
637
638         DBG("delivering skbuff %p\n", skb);
639         DBG_SKB(skb);
640
641         if (size < skb->len)
642                 msg->msg_flags |= MSG_TRUNC;
643         else
644                 size = skb->len;
645
646         error = memcpy_toiovec(msg->msg_iov, skb->data, size);
647         if (error < 0) {
648                 skb_free_datagram(sk, skb);
649                 return error;
650         }
651
652         sock_recv_timestamp(msg, sk, skb);
653
654         if (msg->msg_name) {
655                 msg->msg_namelen = sizeof(struct sockaddr_can);
656                 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
657         }
658
659         DBG("freeing sock %p, skbuff %p\n", sk, skb);
660         skb_free_datagram(sk, skb);
661
662         return size;
663 }
664
665 static struct proto_ops raw_ops = {
666         .family        = PF_CAN,
667         .release       = raw_release,
668         .bind          = raw_bind,
669         .connect       = sock_no_connect,
670         .socketpair    = sock_no_socketpair,
671         .accept        = sock_no_accept,
672         .getname       = raw_getname,
673         .poll          = raw_poll,
674         .ioctl         = NULL,          /* use can_ioctl() from af_can.c */
675         .listen        = sock_no_listen,
676         .shutdown      = sock_no_shutdown,
677         .setsockopt    = raw_setsockopt,
678         .getsockopt    = raw_getsockopt,
679         .sendmsg       = raw_sendmsg,
680         .recvmsg       = raw_recvmsg,
681         .mmap          = sock_no_mmap,
682         .sendpage      = sock_no_sendpage,
683 };
684
685 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
686 static struct proto raw_proto = {
687         .name       = "CAN_RAW",
688         .owner      = THIS_MODULE,
689         .obj_size   = sizeof(struct raw_sock),
690         .init       = raw_init,
691 };
692
693 static struct can_proto raw_can_proto = {
694         .type       = SOCK_RAW,
695         .protocol   = CAN_RAW,
696         .capability = RAW_CAP,
697         .ops        = &raw_ops,
698         .prot       = &raw_proto,
699 };
700 #else
701 static struct can_proto raw_can_proto = {
702         .type       = SOCK_RAW,
703         .protocol   = CAN_RAW,
704         .capability = RAW_CAP,
705         .ops        = &raw_ops,
706         .owner      = THIS_MODULE,
707         .obj_size   = sizeof(struct raw_opt),
708         .init       = raw_init,
709 };
710 #endif
711
712 static __init int raw_module_init(void)
713 {
714         printk(banner);
715
716         can_proto_register(&raw_can_proto);
717         return 0;
718 }
719
720 static __exit void raw_module_exit(void)
721 {
722         can_proto_unregister(&raw_can_proto);
723 }
724
725 module_init(raw_module_init);
726 module_exit(raw_module_exit);