4 * Copyright (c) 2002-2005 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/raw.h>
58 #include <linux/can/version.h>
66 static __initdata const char banner[] = KERN_INFO "CAN: raw socket protocol " VERSION "\n";
68 MODULE_DESCRIPTION("PF_CAN raw sockets");
69 MODULE_LICENSE("Dual BSD/GPL");
70 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
72 #ifdef CONFIG_CAN_DEBUG_CORE
74 module_param(debug, int, S_IRUGO);
75 #define DBG(args...) (debug & 1 ? \
76 (printk(KERN_DEBUG "RAW %s: ", __func__), \
78 #define DBG_SKB(skb) (debug & 4 ? can_debug_skb(skb) : 0)
84 static int raw_init(struct sock *sk);
85 static int raw_release(struct socket *sock);
86 static int raw_bind (struct socket *sock, struct sockaddr *uaddr, int len);
87 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
89 static unsigned int raw_poll(struct file *file, struct socket *sock,
91 static int raw_setsockopt(struct socket *sock, int level, int optname,
92 char __user *optval, int optlen);
93 static int raw_getsockopt(struct socket *sock, int level, int optname,
94 char __user *optval, int __user *optlen);
95 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
96 struct msghdr *msg, size_t size);
97 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
98 struct msghdr *msg, size_t size, int flags);
99 static void raw_rcv(struct sk_buff *skb, void *data);
100 static void raw_notifier(unsigned long msg, void *data);
102 static void raw_add_filters(struct net_device *dev, struct sock *sk);
103 static void raw_remove_filters(struct net_device *dev, struct sock *sk);
106 static struct proto_ops raw_ops = {
108 .release = raw_release,
110 .connect = sock_no_connect,
111 .socketpair = sock_no_socketpair,
112 .accept = sock_no_accept,
113 .getname = raw_getname,
115 .ioctl = NULL, /* use can_ioctl() from af_can.c */
116 .listen = sock_no_listen,
117 .shutdown = sock_no_shutdown,
118 .setsockopt = raw_setsockopt,
119 .getsockopt = raw_getsockopt,
120 .sendmsg = raw_sendmsg,
121 .recvmsg = raw_recvmsg,
122 .mmap = sock_no_mmap,
123 .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 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
160 #define raw_sk(sk) (&((struct raw_sock *)(sk))->opt)
162 static struct proto raw_proto = {
164 .owner = THIS_MODULE,
165 .obj_size = sizeof(struct raw_sock),
169 static struct can_proto raw_can_proto = {
172 .capability = RAW_CAP,
179 #define raw_sk(sk) ((struct raw_opt *)(sk)->sk_protinfo)
181 static struct can_proto raw_can_proto = {
184 .capability = RAW_CAP,
186 .owner = THIS_MODULE,
187 .obj_size = sizeof(struct raw_opt),
195 static __init int raw_module_init(void)
199 can_proto_register(&raw_can_proto);
203 static __exit void raw_module_exit(void)
205 can_proto_unregister(&raw_can_proto);
208 static int raw_init(struct sock *sk)
210 struct raw_opt *ro = raw_sk(sk);
214 /* set default filter to single entry dfilter */
215 ro->dfilter.can_id = 0;
216 ro->dfilter.can_mask = MASK_ALL;
217 ro->filter = &ro->dfilter;
220 /* set default loopback behaviour */
222 ro->recv_own_msgs = 0;
227 static int raw_release(struct socket *sock)
229 struct sock *sk = sock->sk;
230 struct raw_opt *ro = raw_sk(sk);
231 struct net_device *dev = NULL;
233 DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
234 atomic_read(&sk->sk_refcnt));
236 if (ro->bound && ro->ifindex)
237 dev = dev_get_by_index(ro->ifindex);
239 /* remove current filters & unregister */
241 raw_remove_filters(dev, sk);
245 /* remove current error mask */
246 if (ro->err_mask && ro->bound)
247 can_rx_unregister(dev, 0, ro->err_mask | CAN_ERR_FLAG, raw_rcv, sk);
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))
275 /* remove current bindings / notifier */
277 dev = dev_get_by_index(ro->ifindex);
279 DBG("could not find device %d\n",
283 if (!(dev->flags & IFF_UP)) {
284 sk->sk_err = ENETDOWN;
285 if (!sock_flag(sk, SOCK_DEAD))
286 sk->sk_error_report(sk);
289 can_dev_unregister(dev, raw_notifier, sk);
293 /* unregister current filters for this device */
294 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 raw_add_filters(dev, sk); /* filters set by default/setsockopt */
323 if (ro->err_mask) /* error frame filter set by setsockopt */
324 can_rx_register(dev, 0, ro->err_mask | CAN_ERR_FLAG, raw_rcv, sk, IDENT);
335 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
338 struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
339 struct sock *sk = sock->sk;
340 struct raw_opt *ro = raw_sk(sk);
345 addr->can_family = AF_CAN;
346 addr->can_ifindex = ro->ifindex;
347 *len = sizeof(*addr);
352 static unsigned int raw_poll(struct file *file, struct socket *sock,
355 unsigned int mask = 0;
357 DBG("socket %p\n", sock);
359 mask = datagram_poll(file, sock, wait);
363 static int raw_setsockopt(struct socket *sock, int level, int optname,
364 char __user *optval, int optlen)
366 struct sock *sk = sock->sk;
367 struct raw_opt *ro = raw_sk(sk);
368 struct can_filter *filter = NULL; /* dyn. alloc'ed filters */
369 struct can_filter sfilter; /* single filter */
370 struct net_device *dev = NULL;
371 can_err_mask_t err_mask = 0;
375 if (level != SOL_CAN_RAW)
380 if (optlen % sizeof(struct can_filter) != 0)
383 count = optlen / sizeof(struct can_filter);
385 if (count > 1) { /* does not fit into dfilter */
386 if (!(filter = kmalloc(optlen, GFP_KERNEL)))
388 if ((err = copy_from_user(filter, optval, optlen))) {
392 } else if (count == 1) {
393 if ((err = copy_from_user(&sfilter, optval, optlen)))
397 if (ro->bound && ro->ifindex)
398 dev = dev_get_by_index(ro->ifindex);
400 /* remove current filters & unregister */
402 raw_remove_filters(dev, sk);
406 if (count == 1) { /* copy data for single filter */
407 ro->dfilter = sfilter;
408 filter = &ro->dfilter;
411 /* add new filters & register */
415 raw_add_filters(dev, sk);
422 case CAN_RAW_ERR_FILTER:
423 if (optlen != sizeof(err_mask))
425 if ((err = copy_from_user(&err_mask, optval, optlen)))
428 err_mask &= CAN_ERR_MASK;
430 if (ro->bound && ro->ifindex)
431 dev = dev_get_by_index(ro->ifindex);
433 /* remove current error mask */
434 if (ro->err_mask && ro->bound)
435 can_rx_unregister(dev, 0, ro->err_mask | CAN_ERR_FLAG, raw_rcv, sk);
437 /* add new error mask */
438 ro->err_mask = err_mask;
439 if (ro->err_mask && ro->bound)
440 can_rx_register(dev, 0, ro->err_mask | CAN_ERR_FLAG, raw_rcv, sk, IDENT);
447 case CAN_RAW_LOOPBACK:
448 if (optlen != sizeof(ro->loopback))
450 if ((err = copy_from_user(&ro->loopback, optval, optlen)))
454 case CAN_RAW_RECV_OWN_MSGS:
455 if (optlen != sizeof(ro->recv_own_msgs))
457 if ((err = copy_from_user(&ro->recv_own_msgs, optval, optlen)))
467 static int raw_getsockopt(struct socket *sock, int level, int optname,
468 char __user *optval, int __user *optlen)
470 struct sock *sk = sock->sk;
471 struct raw_opt *ro = raw_sk(sk);
472 struct can_filter *filter = ro->filter;
473 int count = ro->count;
476 if (level != SOL_CAN_RAW)
481 if (get_user(len, optlen))
484 if (count && filter) {
485 int filter_size = count * sizeof(struct can_filter);
486 if (len < filter_size)
488 if (len > filter_size)
490 if (copy_to_user(optval, filter, len))
495 if (put_user(len, optlen))
500 case CAN_RAW_ERR_FILTER:
501 if (get_user(len, optlen))
504 if (len < sizeof(can_err_mask_t))
507 if (len > sizeof(can_err_mask_t))
508 len = sizeof(can_err_mask_t);
510 if (copy_to_user(optval, &ro->err_mask, len))
513 if (put_user(len, optlen))
518 case CAN_RAW_LOOPBACK:
519 if (get_user(len, optlen))
522 if (len < sizeof(int))
525 if (len > sizeof(int))
528 if (copy_to_user(optval, &ro->loopback, len))
531 if (put_user(len, optlen))
536 case CAN_RAW_RECV_OWN_MSGS:
537 if (get_user(len, optlen))
540 if (len < sizeof(int))
543 if (len > sizeof(int))
546 if (copy_to_user(optval, &ro->recv_own_msgs, len))
549 if (put_user(len, optlen))
560 static void raw_add_filters(struct net_device *dev, struct sock *sk)
562 struct raw_opt *ro = raw_sk(sk);
563 struct can_filter *filter = ro->filter;
566 for (i = 0; i < ro->count; i++) {
567 can_rx_register(dev, filter[i].can_id, filter[i].can_mask,
569 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
570 filter[i].can_id, filter[i].can_mask,
571 filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
575 static void raw_remove_filters(struct net_device *dev, struct sock *sk)
577 struct raw_opt *ro = raw_sk(sk);
578 struct can_filter *filter = ro->filter;
581 for (i = 0; i < ro->count; i++) {
582 can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
584 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
585 filter[i].can_id, filter[i].can_mask,
586 filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
590 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
591 struct msghdr *msg, size_t size)
593 struct sock *sk = sock->sk;
594 struct raw_opt *ro = raw_sk(sk);
596 struct net_device *dev;
600 DBG("socket %p, sk %p\n", sock, sk);
603 struct sockaddr_can *addr = (struct sockaddr_can *)msg->msg_name;
604 if (addr->can_family != AF_CAN)
606 ifindex = addr->can_ifindex;
608 ifindex = ro->ifindex;
610 if (!(dev = dev_get_by_index(ifindex))) {
611 DBG("device %d not found\n", ifindex);
615 if (!(skb = alloc_skb(size, GFP_KERNEL))) {
620 if ((err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size)) < 0) {
628 DBG("sending skbuff to interface %d\n", ifindex);
631 err = can_send(skb, ro->loopback);
641 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
642 struct msghdr *msg, size_t size, int flags)
644 struct sock *sk = sock->sk;
649 DBG("socket %p, sk %p\n", sock, sk);
651 noblock = flags & MSG_DONTWAIT;
652 flags &= ~MSG_DONTWAIT;
654 if (!(skb = skb_recv_datagram(sk, flags, noblock, &error)))
657 DBG("delivering skbuff %p\n", skb);
661 msg->msg_flags |= MSG_TRUNC;
665 if ((error = memcpy_toiovec(msg->msg_iov, skb->data, size)) < 0) {
666 skb_free_datagram(sk, skb);
670 sock_recv_timestamp(msg, sk, skb);
673 msg->msg_namelen = sizeof(struct sockaddr_can);
674 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
677 DBG("freeing sock %p, skbuff %p\n", sk, skb);
678 skb_free_datagram(sk, skb);
683 static void raw_rcv(struct sk_buff *skb, void *data)
685 struct sock *sk = (struct sock*)data;
686 struct raw_opt *ro = raw_sk(sk);
687 struct sockaddr_can *addr;
690 DBG("received skbuff %p, sk %p\n", skb, sk);
693 if (!ro->recv_own_msgs) {
694 if (*(struct sock **)skb->cb == sk) { /* tx sock reference */
695 DBG("trashed own tx msg\n");
701 addr = (struct sockaddr_can *)skb->cb;
702 memset(addr, 0, sizeof(*addr));
703 addr->can_family = AF_CAN;
704 addr->can_ifindex = skb->dev->ifindex;
706 if ((error = sock_queue_rcv_skb(sk, skb)) < 0) {
707 DBG("sock_queue_rcv_skb failed: %d\n", error);
708 DBG("freeing skbuff %p\n", skb);
713 static void raw_notifier(unsigned long msg, void *data)
715 struct sock *sk = (struct sock *)data;
716 struct raw_opt *ro = raw_sk(sk);
718 DBG("called for sock %p\n", sk);
721 case NETDEV_UNREGISTER:
726 sk->sk_err = ENETDOWN;
727 if (!sock_flag(sk, SOCK_DEAD))
728 sk->sk_error_report(sk);
734 module_init(raw_module_init);
735 module_exit(raw_module_exit);