2 * raw.c - Raw sockets for protocol family CAN
4 * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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.
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.
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
41 * Send feedback to <socketcan-users@lists.berlios.de>
45 #include <linux/autoconf.h>
46 #include <linux/module.h>
47 #include <linux/version.h>
48 #include <linux/init.h>
49 #include <linux/net.h>
50 #include <linux/netdevice.h>
51 #include <linux/uio.h>
52 #include <linux/poll.h>
55 #include <linux/can.h>
56 #include <linux/can/error.h>
57 #include <linux/can/core.h>
58 #include <linux/can/raw.h>
59 #include <linux/can/version.h>
64 static __initdata const char banner[] =
65 KERN_INFO "CAN: raw socket protocol " CAN_VERSION "\n";
67 MODULE_DESCRIPTION("PF_CAN raw sockets");
68 MODULE_LICENSE("Dual BSD/GPL");
69 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
71 #ifdef CONFIG_CAN_DEBUG_CORE
73 module_param(debug, int, S_IRUGO);
74 #define DBG(args...) (debug & 1 ? \
75 (printk(KERN_DEBUG "RAW %s: ", __func__), \
77 #define DBG_SKB(skb) (debug & 4 ? can_debug_skb(skb) : 0)
83 static int raw_init(struct sock *sk);
84 static int raw_release(struct socket *sock);
85 static int raw_bind (struct socket *sock, struct sockaddr *uaddr, int len);
86 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
88 static unsigned int raw_poll(struct file *file, struct socket *sock,
90 static int raw_setsockopt(struct socket *sock, int level, int optname,
91 char __user *optval, int optlen);
92 static int raw_getsockopt(struct socket *sock, int level, int optname,
93 char __user *optval, int __user *optlen);
94 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
95 struct msghdr *msg, size_t size);
96 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
97 struct msghdr *msg, size_t size, int flags);
98 static void raw_rcv(struct sk_buff *skb, void *data);
99 static void raw_notifier(unsigned long msg, void *data);
101 static void raw_add_filters(struct net_device *dev, struct sock *sk);
102 static void raw_remove_filters(struct net_device *dev, struct sock *sk);
105 static struct proto_ops raw_ops = {
107 .release = raw_release,
109 .connect = sock_no_connect,
110 .socketpair = sock_no_socketpair,
111 .accept = sock_no_accept,
112 .getname = raw_getname,
114 .ioctl = NULL, /* use can_ioctl() from af_can.c */
115 .listen = sock_no_listen,
116 .shutdown = sock_no_shutdown,
117 .setsockopt = raw_setsockopt,
118 .getsockopt = raw_getsockopt,
119 .sendmsg = raw_sendmsg,
120 .recvmsg = raw_recvmsg,
121 .mmap = sock_no_mmap,
122 .sendpage = sock_no_sendpage,
127 * A raw socket has a list of can_filters attached to it, each receiving
128 * the CAN frames matching that filter. If the filter list is empty,
129 * no CAN frames will be received by the socket. The default after
130 * opening the socket, is to have one filter which receives all frames.
131 * The filter list is allocated dynamically with the exception of the
132 * list containing only one item. This common case is optimized by
133 * storing the single filter in dfilter, to avoid using dynamic memory.
141 int count; /* number of active filters */
142 struct can_filter dfilter; /* default/single filter */
143 struct can_filter *filter; /* pointer to filter(s) */
144 can_err_mask_t err_mask;
147 #ifdef CONFIG_CAN_RAW_USER
150 #define RAW_CAP CAP_NET_RAW
153 #undef CAN_RAW_SUPPORT_REBIND /* allow bind on already bound socket */
155 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
161 #define raw_sk(sk) (&((struct raw_sock *)(sk))->opt)
163 static struct proto raw_proto = {
165 .owner = THIS_MODULE,
166 .obj_size = sizeof(struct raw_sock),
170 static struct can_proto raw_can_proto = {
173 .capability = RAW_CAP,
178 #define raw_sk(sk) ((struct raw_opt *)(sk)->sk_protinfo)
180 static struct can_proto raw_can_proto = {
183 .capability = RAW_CAP,
185 .owner = THIS_MODULE,
186 .obj_size = sizeof(struct raw_opt),
193 static __init int raw_module_init(void)
197 can_proto_register(&raw_can_proto);
201 static __exit void raw_module_exit(void)
203 can_proto_unregister(&raw_can_proto);
206 static int raw_init(struct sock *sk)
208 struct raw_opt *ro = raw_sk(sk);
212 /* set default filter to single entry dfilter */
213 ro->dfilter.can_id = 0;
214 ro->dfilter.can_mask = MASK_ALL;
215 ro->filter = &ro->dfilter;
218 /* set default loopback behaviour */
220 ro->recv_own_msgs = 0;
225 static int raw_release(struct socket *sock)
227 struct sock *sk = sock->sk;
228 struct raw_opt *ro = raw_sk(sk);
229 struct net_device *dev = NULL;
231 DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
232 atomic_read(&sk->sk_refcnt));
234 if (ro->bound && ro->ifindex)
235 dev = dev_get_by_index(ro->ifindex);
237 /* remove current filters & unregister */
239 raw_remove_filters(dev, sk);
244 /* remove current error mask */
245 if (ro->err_mask && ro->bound)
246 can_rx_unregister(dev, 0, ro->err_mask | CAN_ERR_FLAG,
250 can_dev_unregister(dev, raw_notifier, sk);
259 static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
261 struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
262 struct sock *sk = sock->sk;
263 struct raw_opt *ro = raw_sk(sk);
264 struct net_device *dev;
266 DBG("socket %p to device %d\n", sock, addr->can_ifindex);
268 if (len < sizeof(*addr))
272 #ifdef CAN_RAW_SUPPORT_REBIND
273 /* remove current bindings / notifier */
275 dev = dev_get_by_index(ro->ifindex);
277 DBG("could not find device %d\n",
281 if (!(dev->flags & IFF_UP)) {
282 sk->sk_err = ENETDOWN;
283 if (!sock_flag(sk, SOCK_DEAD))
284 sk->sk_error_report(sk);
287 can_dev_unregister(dev, raw_notifier, sk);
291 /* unregister current filters for this device */
292 raw_remove_filters(dev, sk);
303 if (addr->can_ifindex) {
304 dev = dev_get_by_index(addr->can_ifindex);
306 DBG("could not find device %d\n", addr->can_ifindex);
309 if (!(dev->flags & IFF_UP)) {
310 sk->sk_err = ENETDOWN;
311 if (!sock_flag(sk, SOCK_DEAD))
312 sk->sk_error_report(sk);
315 can_dev_register(dev, raw_notifier, sk);
319 ro->ifindex = addr->can_ifindex;
321 /* filters set by default/setsockopt */
322 raw_add_filters(dev, sk);
324 /* error frame filter set by setsockopt */
326 can_rx_register(dev, 0, ro->err_mask | CAN_ERR_FLAG,
338 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
341 struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
342 struct sock *sk = sock->sk;
343 struct raw_opt *ro = raw_sk(sk);
348 addr->can_family = AF_CAN;
349 addr->can_ifindex = ro->ifindex;
350 *len = sizeof(*addr);
355 static unsigned int raw_poll(struct file *file, struct socket *sock,
358 unsigned int mask = 0;
360 DBG("socket %p\n", sock);
362 mask = datagram_poll(file, sock, wait);
366 static int raw_setsockopt(struct socket *sock, int level, int optname,
367 char __user *optval, int optlen)
369 struct sock *sk = sock->sk;
370 struct raw_opt *ro = raw_sk(sk);
371 struct can_filter *filter = NULL; /* dyn. alloc'ed filters */
372 struct can_filter sfilter; /* single filter */
373 struct net_device *dev = NULL;
374 can_err_mask_t err_mask = 0;
378 if (level != SOL_CAN_RAW)
383 if (optlen % sizeof(struct can_filter) != 0)
386 count = optlen / sizeof(struct can_filter);
389 /* filter does not fit into dfilter => alloc space */
390 filter = kmalloc(optlen, GFP_KERNEL);
394 err = copy_from_user(filter, optval, optlen);
399 } else if (count == 1) {
400 err = copy_from_user(&sfilter, optval, optlen);
405 if (ro->bound && ro->ifindex)
406 dev = dev_get_by_index(ro->ifindex);
408 /* remove current filters & unregister */
410 raw_remove_filters(dev, sk);
416 /* copy filter data for single filter */
417 ro->dfilter = sfilter;
418 filter = &ro->dfilter;
421 /* add new filters & register */
425 raw_add_filters(dev, sk);
432 case CAN_RAW_ERR_FILTER:
433 if (optlen != sizeof(err_mask))
436 err = copy_from_user(&err_mask, optval, optlen);
440 err_mask &= CAN_ERR_MASK;
442 if (ro->bound && ro->ifindex)
443 dev = dev_get_by_index(ro->ifindex);
445 /* remove current error mask */
446 if (ro->err_mask && ro->bound)
447 can_rx_unregister(dev, 0, ro->err_mask | CAN_ERR_FLAG,
450 /* add new error mask */
451 ro->err_mask = err_mask;
452 if (ro->err_mask && ro->bound)
453 can_rx_register(dev, 0, ro->err_mask | CAN_ERR_FLAG,
461 case CAN_RAW_LOOPBACK:
462 if (optlen != sizeof(ro->loopback))
465 err = copy_from_user(&ro->loopback, optval, optlen);
471 case CAN_RAW_RECV_OWN_MSGS:
472 if (optlen != sizeof(ro->recv_own_msgs))
475 err = copy_from_user(&ro->recv_own_msgs, optval, optlen);
487 static int raw_getsockopt(struct socket *sock, int level, int optname,
488 char __user *optval, int __user *optlen)
490 struct sock *sk = sock->sk;
491 struct raw_opt *ro = raw_sk(sk);
492 struct can_filter *filter = ro->filter;
493 int count = ro->count;
496 if (level != SOL_CAN_RAW)
501 if (get_user(len, optlen))
504 if (count && filter) {
505 int filter_size = count * sizeof(struct can_filter);
506 if (len < filter_size)
508 if (len > filter_size)
510 if (copy_to_user(optval, filter, len))
515 if (put_user(len, optlen))
520 case CAN_RAW_ERR_FILTER:
521 if (get_user(len, optlen))
524 if (len < sizeof(can_err_mask_t))
527 if (len > sizeof(can_err_mask_t))
528 len = sizeof(can_err_mask_t);
530 if (copy_to_user(optval, &ro->err_mask, len))
533 if (put_user(len, optlen))
538 case CAN_RAW_LOOPBACK:
539 if (get_user(len, optlen))
542 if (len < sizeof(int))
545 if (len > sizeof(int))
548 if (copy_to_user(optval, &ro->loopback, len))
551 if (put_user(len, optlen))
556 case CAN_RAW_RECV_OWN_MSGS:
557 if (get_user(len, optlen))
560 if (len < sizeof(int))
563 if (len > sizeof(int))
566 if (copy_to_user(optval, &ro->recv_own_msgs, len))
569 if (put_user(len, optlen))
580 static void raw_add_filters(struct net_device *dev, struct sock *sk)
582 struct raw_opt *ro = raw_sk(sk);
583 struct can_filter *filter = ro->filter;
586 for (i = 0; i < ro->count; i++) {
587 can_rx_register(dev, filter[i].can_id, filter[i].can_mask,
589 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
590 filter[i].can_id, filter[i].can_mask,
591 filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
595 static void raw_remove_filters(struct net_device *dev, struct sock *sk)
597 struct raw_opt *ro = raw_sk(sk);
598 struct can_filter *filter = ro->filter;
601 for (i = 0; i < ro->count; i++) {
602 can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
604 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
605 filter[i].can_id, filter[i].can_mask,
606 filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
610 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
611 struct msghdr *msg, size_t size)
613 struct sock *sk = sock->sk;
614 struct raw_opt *ro = raw_sk(sk);
616 struct net_device *dev;
620 DBG("socket %p, sk %p\n", sock, sk);
623 struct sockaddr_can *addr =
624 (struct sockaddr_can *)msg->msg_name;
626 if (addr->can_family != AF_CAN)
629 ifindex = addr->can_ifindex;
631 ifindex = ro->ifindex;
633 dev = dev_get_by_index(ifindex);
635 DBG("device %d not found\n", ifindex);
639 skb = alloc_skb(size, GFP_KERNEL);
645 err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
654 DBG("sending skbuff to interface %d\n", ifindex);
657 err = can_send(skb, ro->loopback);
667 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
668 struct msghdr *msg, size_t size, int flags)
670 struct sock *sk = sock->sk;
675 DBG("socket %p, sk %p\n", sock, sk);
677 noblock = flags & MSG_DONTWAIT;
678 flags &= ~MSG_DONTWAIT;
680 skb = skb_recv_datagram(sk, flags, noblock, &error);
684 DBG("delivering skbuff %p\n", skb);
688 msg->msg_flags |= MSG_TRUNC;
692 error = memcpy_toiovec(msg->msg_iov, skb->data, size);
694 skb_free_datagram(sk, skb);
698 sock_recv_timestamp(msg, sk, skb);
701 msg->msg_namelen = sizeof(struct sockaddr_can);
702 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
705 DBG("freeing sock %p, skbuff %p\n", sk, skb);
706 skb_free_datagram(sk, skb);
711 static void raw_rcv(struct sk_buff *skb, void *data)
713 struct sock *sk = (struct sock*)data;
714 struct raw_opt *ro = raw_sk(sk);
715 struct sockaddr_can *addr;
718 DBG("received skbuff %p, sk %p\n", skb, sk);
721 if (!ro->recv_own_msgs) {
722 /* check the received tx sock reference */
723 if (*(struct sock **)skb->cb == sk) {
724 DBG("trashed own tx msg\n");
730 addr = (struct sockaddr_can *)skb->cb;
731 memset(addr, 0, sizeof(*addr));
732 addr->can_family = AF_CAN;
733 addr->can_ifindex = skb->dev->ifindex;
735 error = sock_queue_rcv_skb(sk, skb);
737 DBG("sock_queue_rcv_skb failed: %d\n", error);
738 DBG("freeing skbuff %p\n", skb);
743 static void raw_notifier(unsigned long msg, void *data)
745 struct sock *sk = (struct sock *)data;
746 struct raw_opt *ro = raw_sk(sk);
748 DBG("called for sock %p\n", sk);
751 case NETDEV_UNREGISTER:
756 sk->sk_err = ENETDOWN;
757 if (!sock_flag(sk, SOCK_DEAD))
758 sk->sk_error_report(sk);
764 module_init(raw_module_init);
765 module_exit(raw_module_exit);