4 This patch adds the CAN raw protocol.
6 Signed-off-by: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
7 Signed-off-by: Urs Thuermann <urs.thuermann@volkswagen.de>
10 include/linux/can/raw.h | 31 +
11 net/can/Kconfig | 26 +
13 net/can/raw.c | 757 ++++++++++++++++++++++++++++++++++++++++++++++++
14 4 files changed, 817 insertions(+)
16 Index: linux-2.6.22/include/linux/can/raw.h
17 ===================================================================
18 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
19 +++ linux-2.6.22/include/linux/can/raw.h 2007-07-16 21:48:14.000000000 +0200
24 + * Definitions for raw CAN sockets
26 + * Authors: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
27 + * Urs Thuermann <urs.thuermann@volkswagen.de>
28 + * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
29 + * All rights reserved.
31 + * Send feedback to <socketcan-users@lists.berlios.de>
38 +#include <linux/can.h>
40 +#define SOL_CAN_RAW (SOL_CAN_BASE + CAN_RAW)
42 +/* for socket options affecting the socket (not the global system) */
45 + CAN_RAW_FILTER = 1, /* set 0 .. n can_filter(s) */
46 + CAN_RAW_ERR_FILTER, /* set filter for error frames */
47 + CAN_RAW_LOOPBACK, /* local loopback (default:on) */
48 + CAN_RAW_RECV_OWN_MSGS /* receive my own msgs (default:off) */
52 Index: linux-2.6.22/net/can/Kconfig
53 ===================================================================
54 --- linux-2.6.22.orig/net/can/Kconfig 2007-07-16 21:42:28.000000000 +0200
55 +++ linux-2.6.22/net/can/Kconfig 2007-07-16 21:48:14.000000000 +0200
57 If you want CAN support, you should say Y here and also to the
58 specific driver for your controller(s) below.
61 + tristate "Raw CAN Protocol (raw access with CAN-ID filtering)"
65 + The Raw CAN protocol option offers access to the CAN bus via
66 + the BSD socket API. You probably want to use the raw socket in
67 + most cases where no higher level protocol is being used. The raw
68 + socket has several filter options e.g. ID-Masking / Errorframes.
69 + To receive/send raw CAN messages, use AF_CAN with protocol CAN_RAW.
72 + bool "Allow non-root users to access Raw CAN Protocol sockets"
76 + The Controller Area Network is a local field bus transmitting only
77 + broadcast messages without any routing and security concepts.
78 + In the majority of cases the user application has to deal with
79 + raw CAN frames. Therefore it might be reasonable NOT to restrict
80 + the CAN access only to the user root, as known from other networks.
81 + Since CAN_RAW sockets can only send and receive frames to/from CAN
82 + interfaces this does not affect security of others networks.
83 + Say Y here if you want non-root users to be able to access CAN_RAW
87 bool "CAN Core debugging messages"
89 Index: linux-2.6.22/net/can/Makefile
90 ===================================================================
91 --- linux-2.6.22.orig/net/can/Makefile 2007-07-16 21:42:28.000000000 +0200
92 +++ linux-2.6.22/net/can/Makefile 2007-07-16 21:48:14.000000000 +0200
95 obj-$(CONFIG_CAN) += can.o
96 can-objs := af_can.o proc.o
98 +obj-$(CONFIG_CAN_RAW) += can-raw.o
99 +can-raw-objs := raw.o
100 Index: linux-2.6.22/net/can/raw.c
101 ===================================================================
102 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
103 +++ linux-2.6.22/net/can/raw.c 2007-07-16 21:49:00.000000000 +0200
106 + * raw.c - Raw sockets for protocol family CAN
108 + * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
109 + * All rights reserved.
111 + * Redistribution and use in source and binary forms, with or without
112 + * modification, are permitted provided that the following conditions
114 + * 1. Redistributions of source code must retain the above copyright
115 + * notice, this list of conditions, the following disclaimer and
116 + * the referenced file 'COPYING'.
117 + * 2. Redistributions in binary form must reproduce the above copyright
118 + * notice, this list of conditions and the following disclaimer in the
119 + * documentation and/or other materials provided with the distribution.
120 + * 3. Neither the name of Volkswagen nor the names of its contributors
121 + * may be used to endorse or promote products derived from this software
122 + * without specific prior written permission.
124 + * Alternatively, provided that this notice is retained in full, this
125 + * software may be distributed under the terms of the GNU General
126 + * Public License ("GPL") version 2 as distributed in the 'COPYING'
127 + * file from the main directory of the linux kernel source.
129 + * The provided data structures and external interfaces from this code
130 + * are not restricted to be used by modules with a GPL compatible license.
132 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
133 + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
134 + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
135 + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
136 + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
137 + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
138 + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
139 + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
140 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
141 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
142 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
145 + * Send feedback to <socketcan-users@lists.berlios.de>
149 +#include <linux/module.h>
150 +#include <linux/init.h>
151 +#include <linux/uio.h>
152 +#include <linux/poll.h>
153 +#include <linux/net.h>
154 +#include <linux/netdevice.h>
155 +#include <linux/socket.h>
156 +#include <linux/if_arp.h>
157 +#include <linux/skbuff.h>
158 +#include <linux/can.h>
159 +#include <linux/can/core.h>
160 +#include <linux/can/raw.h>
161 +#include <net/sock.h>
164 +#define CAN_RAW_VERSION CAN_VERSION
165 +static __initdata const char banner[] =
166 + KERN_INFO "can: raw protocol (rev " CAN_RAW_VERSION ")\n";
168 +MODULE_DESCRIPTION("PF_CAN raw protocol");
169 +MODULE_LICENSE("Dual BSD/GPL");
170 +MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
172 +#ifdef CONFIG_CAN_DEBUG_CORE
174 +module_param(debug, int, S_IRUGO);
175 +MODULE_PARM_DESC(debug, "debug print mask: 1:debug, 2:frames, 4:skbs");
178 +#ifdef CONFIG_CAN_RAW_USER
179 +#define RAW_CAP (-1)
181 +#define RAW_CAP CAP_NET_RAW
187 + * A raw socket has a list of can_filters attached to it, each receiving
188 + * the CAN frames matching that filter. If the filter list is empty,
189 + * no CAN frames will be received by the socket. The default after
190 + * opening the socket, is to have one filter which receives all frames.
191 + * The filter list is allocated dynamically with the exception of the
192 + * list containing only one item. This common case is optimized by
193 + * storing the single filter in dfilter, to avoid using dynamic memory.
200 + struct notifier_block notifier;
203 + int count; /* number of active filters */
204 + struct can_filter dfilter; /* default/single filter */
205 + struct can_filter *filter; /* pointer to filter(s) */
206 + can_err_mask_t err_mask;
209 +static inline struct raw_sock *raw_sk(const struct sock *sk)
211 + return (struct raw_sock *)sk;
214 +static void raw_rcv(struct sk_buff *skb, void *data)
216 + struct sock *sk = (struct sock *)data;
217 + struct raw_sock *ro = raw_sk(sk);
218 + struct sockaddr_can *addr;
221 + DBG("received skbuff %p, sk %p\n", skb, sk);
224 + if (!ro->recv_own_msgs) {
225 + /* check the received tx sock reference */
226 + if (skb->sk == sk) {
227 + DBG("trashed own tx msg\n");
233 + addr = (struct sockaddr_can *)skb->cb;
234 + memset(addr, 0, sizeof(*addr));
235 + addr->can_family = AF_CAN;
236 + addr->can_ifindex = skb->dev->ifindex;
238 + error = sock_queue_rcv_skb(sk, skb);
240 + DBG("sock_queue_rcv_skb failed: %d\n", error);
241 + DBG("freeing skbuff %p\n", skb);
246 +static void raw_enable_filters(struct net_device *dev, struct sock *sk)
248 + struct raw_sock *ro = raw_sk(sk);
249 + struct can_filter *filter = ro->filter;
252 + for (i = 0; i < ro->count; i++) {
253 + DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
254 + filter[i].can_id, filter[i].can_mask,
255 + filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
257 + can_rx_register(dev, filter[i].can_id, filter[i].can_mask,
258 + raw_rcv, sk, IDENT);
262 +static void raw_enable_errfilter(struct net_device *dev, struct sock *sk)
264 + struct raw_sock *ro = raw_sk(sk);
267 + can_rx_register(dev, 0, ro->err_mask | CAN_ERR_FLAG,
268 + raw_rcv, sk, IDENT);
271 +static void raw_disable_filters(struct net_device *dev, struct sock *sk)
273 + struct raw_sock *ro = raw_sk(sk);
274 + struct can_filter *filter = ro->filter;
277 + for (i = 0; i < ro->count; i++) {
278 + DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
279 + filter[i].can_id, filter[i].can_mask,
280 + filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
282 + can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
287 +static void raw_disable_errfilter(struct net_device *dev, struct sock *sk)
289 + struct raw_sock *ro = raw_sk(sk);
292 + can_rx_unregister(dev, 0, ro->err_mask | CAN_ERR_FLAG,
296 +static int raw_notifier(struct notifier_block *nb,
297 + unsigned long msg, void *data)
299 + struct net_device *dev = (struct net_device *)data;
300 + struct raw_sock *ro = container_of(nb, struct raw_sock, notifier);
301 + struct sock *sk = &ro->sk;
303 + DBG("msg %ld for dev %p (%s idx %d) sk %p ro->ifindex %d\n",
304 + msg, dev, dev->name, dev->ifindex, sk, ro->ifindex);
306 + if (dev->type != ARPHRD_CAN)
307 + return NOTIFY_DONE;
309 + if (ro->ifindex != dev->ifindex)
310 + return NOTIFY_DONE;
314 + case NETDEV_UNREGISTER:
316 + /* remove current filters & unregister */
318 + raw_disable_filters(dev, sk);
319 + raw_disable_errfilter(dev, sk);
330 + sk->sk_err = ENODEV;
331 + if (!sock_flag(sk, SOCK_DEAD))
332 + sk->sk_error_report(sk);
336 + sk->sk_err = ENETDOWN;
337 + if (!sock_flag(sk, SOCK_DEAD))
338 + sk->sk_error_report(sk);
342 + return NOTIFY_DONE;
345 +static int raw_init(struct sock *sk)
347 + struct raw_sock *ro = raw_sk(sk);
352 + /* set default filter to single entry dfilter */
353 + ro->dfilter.can_id = 0;
354 + ro->dfilter.can_mask = MASK_ALL;
355 + ro->filter = &ro->dfilter;
358 + /* set default loopback behaviour */
360 + ro->recv_own_msgs = 0;
363 + ro->notifier.notifier_call = raw_notifier;
365 + register_netdevice_notifier(&ro->notifier);
370 +static int raw_release(struct socket *sock)
372 + struct sock *sk = sock->sk;
373 + struct raw_sock *ro = raw_sk(sk);
375 + DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
376 + atomic_read(&sk->sk_refcnt));
378 + unregister_netdevice_notifier(&ro->notifier);
382 + /* remove current filters & unregister */
385 + struct net_device *dev = dev_get_by_index(ro->ifindex);
387 + raw_disable_filters(dev, sk);
388 + raw_disable_errfilter(dev, sk);
392 + raw_disable_filters(NULL, sk);
393 + raw_disable_errfilter(NULL, sk);
410 +static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
412 + struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
413 + struct sock *sk = sock->sk;
414 + struct raw_sock *ro = raw_sk(sk);
416 + int notify_enetdown = 0;
418 + DBG("socket %p to device %d\n", sock, addr->can_ifindex);
420 + if (len < sizeof(*addr))
426 + /* unregister current filters for this device */
428 + struct net_device *dev = dev_get_by_index(ro->ifindex);
430 + raw_disable_filters(dev, sk);
431 + raw_disable_errfilter(dev, sk);
437 + raw_disable_filters(NULL, sk);
438 + raw_disable_errfilter(NULL, sk);
444 + if (addr->can_ifindex) {
445 + struct net_device *dev = dev_get_by_index(addr->can_ifindex);
447 + DBG("could not find device %d\n", addr->can_ifindex);
451 + if (dev->type != ARPHRD_CAN) {
452 + DBG("device %d no CAN device\n", addr->can_ifindex);
457 + if (!(dev->flags & IFF_UP))
458 + notify_enetdown = 1;
460 + ro->ifindex = dev->ifindex;
462 + /* filters set by default/setsockopt */
463 + raw_enable_filters(dev, sk);
464 + raw_enable_errfilter(dev, sk);
470 + /* filters set by default/setsockopt */
471 + raw_enable_filters(NULL, sk);
472 + raw_enable_errfilter(NULL, sk);
480 + if (notify_enetdown) {
481 + sk->sk_err = ENETDOWN;
482 + if (!sock_flag(sk, SOCK_DEAD))
483 + sk->sk_error_report(sk);
489 +static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
490 + int *len, int peer)
492 + struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
493 + struct sock *sk = sock->sk;
494 + struct raw_sock *ro = raw_sk(sk);
497 + return -EOPNOTSUPP;
499 + addr->can_family = AF_CAN;
500 + addr->can_ifindex = ro->ifindex;
502 + *len = sizeof(*addr);
507 +static unsigned int raw_poll(struct file *file, struct socket *sock,
510 + unsigned int mask = 0;
512 + DBG("socket %p\n", sock);
514 + mask = datagram_poll(file, sock, wait);
518 +static int raw_setsockopt(struct socket *sock, int level, int optname,
519 + char __user *optval, int optlen)
521 + struct sock *sk = sock->sk;
522 + struct raw_sock *ro = raw_sk(sk);
523 + struct can_filter *filter = NULL; /* dyn. alloc'ed filters */
524 + struct can_filter sfilter; /* single filter */
525 + struct net_device *dev = NULL;
526 + can_err_mask_t err_mask = 0;
530 + if (level != SOL_CAN_RAW)
537 + case CAN_RAW_FILTER:
538 + if (optlen % sizeof(struct can_filter) != 0)
541 + count = optlen / sizeof(struct can_filter);
544 + /* filter does not fit into dfilter => alloc space */
545 + filter = kmalloc(optlen, GFP_KERNEL);
549 + err = copy_from_user(filter, optval, optlen);
554 + } else if (count == 1) {
555 + err = copy_from_user(&sfilter, optval, optlen);
562 + if (ro->bound && ro->ifindex)
563 + dev = dev_get_by_index(ro->ifindex);
565 + /* remove current filters & unregister */
567 + raw_disable_filters(dev, sk);
573 + /* copy filter data for single filter */
574 + ro->dfilter = sfilter;
575 + filter = &ro->dfilter;
578 + /* add new filters & register */
579 + ro->filter = filter;
582 + raw_enable_filters(dev, sk);
591 + case CAN_RAW_ERR_FILTER:
592 + if (optlen != sizeof(err_mask))
595 + err = copy_from_user(&err_mask, optval, optlen);
599 + err_mask &= CAN_ERR_MASK;
603 + if (ro->bound && ro->ifindex)
604 + dev = dev_get_by_index(ro->ifindex);
606 + /* remove current error mask */
608 + raw_disable_errfilter(dev, sk);
610 + ro->err_mask = err_mask;
612 + /* add new error mask */
614 + raw_enable_errfilter(dev, sk);
623 + case CAN_RAW_LOOPBACK:
624 + if (optlen != sizeof(ro->loopback))
627 + err = copy_from_user(&ro->loopback, optval, optlen);
633 + case CAN_RAW_RECV_OWN_MSGS:
634 + if (optlen != sizeof(ro->recv_own_msgs))
637 + err = copy_from_user(&ro->recv_own_msgs, optval, optlen);
644 + return -ENOPROTOOPT;
649 +static int raw_getsockopt(struct socket *sock, int level, int optname,
650 + char __user *optval, int __user *optlen)
652 + struct sock *sk = sock->sk;
653 + struct raw_sock *ro = raw_sk(sk);
658 + if (level != SOL_CAN_RAW)
660 + if (get_user(len, optlen))
667 + case CAN_RAW_FILTER:
669 + if (ro->count > 0) {
670 + int fsize = ro->count * sizeof(struct can_filter);
673 + err = copy_to_user(optval, ro->filter, len);
679 + err = put_user(len, optlen);
682 + case CAN_RAW_ERR_FILTER:
683 + if (len > sizeof(can_err_mask_t))
684 + len = sizeof(can_err_mask_t);
685 + val = &ro->err_mask;
688 + case CAN_RAW_LOOPBACK:
689 + if (len > sizeof(int))
691 + val = &ro->loopback;
694 + case CAN_RAW_RECV_OWN_MSGS:
695 + if (len > sizeof(int))
697 + val = &ro->recv_own_msgs;
701 + return -ENOPROTOOPT;
704 + if (put_user(len, optlen))
706 + if (copy_to_user(optval, val, len))
711 +static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
712 + struct msghdr *msg, size_t size)
714 + struct sock *sk = sock->sk;
715 + struct raw_sock *ro = raw_sk(sk);
716 + struct sk_buff *skb;
717 + struct net_device *dev;
721 + DBG("socket %p, sk %p\n", sock, sk);
723 + if (msg->msg_name) {
724 + struct sockaddr_can *addr =
725 + (struct sockaddr_can *)msg->msg_name;
727 + if (addr->can_family != AF_CAN)
730 + ifindex = addr->can_ifindex;
732 + ifindex = ro->ifindex;
734 + dev = dev_get_by_index(ifindex);
736 + DBG("device %d not found\n", ifindex);
740 + skb = alloc_skb(size, GFP_KERNEL);
746 + err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
755 + DBG("sending skbuff to interface %d\n", ifindex);
758 + err = can_send(skb, ro->loopback);
768 +static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
769 + struct msghdr *msg, size_t size, int flags)
771 + struct sock *sk = sock->sk;
772 + struct sk_buff *skb;
776 + DBG("socket %p, sk %p\n", sock, sk);
778 + noblock = flags & MSG_DONTWAIT;
779 + flags &= ~MSG_DONTWAIT;
781 + skb = skb_recv_datagram(sk, flags, noblock, &error);
785 + DBG("delivering skbuff %p\n", skb);
788 + if (size < skb->len)
789 + msg->msg_flags |= MSG_TRUNC;
793 + error = memcpy_toiovec(msg->msg_iov, skb->data, size);
795 + skb_free_datagram(sk, skb);
799 + sock_recv_timestamp(msg, sk, skb);
801 + if (msg->msg_name) {
802 + msg->msg_namelen = sizeof(struct sockaddr_can);
803 + memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
806 + DBG("freeing sock %p, skbuff %p\n", sk, skb);
807 + skb_free_datagram(sk, skb);
812 +static struct proto_ops raw_ops = {
814 + .release = raw_release,
816 + .connect = sock_no_connect,
817 + .socketpair = sock_no_socketpair,
818 + .accept = sock_no_accept,
819 + .getname = raw_getname,
821 + .ioctl = NULL, /* use can_ioctl() from af_can.c */
822 + .listen = sock_no_listen,
823 + .shutdown = sock_no_shutdown,
824 + .setsockopt = raw_setsockopt,
825 + .getsockopt = raw_getsockopt,
826 + .sendmsg = raw_sendmsg,
827 + .recvmsg = raw_recvmsg,
828 + .mmap = sock_no_mmap,
829 + .sendpage = sock_no_sendpage,
832 +static struct proto raw_proto = {
834 + .owner = THIS_MODULE,
835 + .obj_size = sizeof(struct raw_sock),
839 +static struct can_proto raw_can_proto = {
841 + .protocol = CAN_RAW,
842 + .capability = RAW_CAP,
844 + .prot = &raw_proto,
847 +static __init int raw_module_init(void)
851 + can_proto_register(&raw_can_proto);
855 +static __exit void raw_module_exit(void)
857 + can_proto_unregister(&raw_can_proto);
860 +module_init(raw_module_init);
861 +module_exit(raw_module_exit);