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/config.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>
65 #define NAME "RAW sockets for LLCF"
67 static __initdata const char banner[] = BANNER(NAME);
69 MODULE_DESCRIPTION(NAME);
70 MODULE_LICENSE("Dual BSD/GPL");
71 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
73 #ifdef CONFIG_CAN_DEBUG_CORE
75 module_param(debug, int, S_IRUGO);
76 #define DBG(args...) (debug & 1 ? \
77 (printk(KERN_DEBUG "RAW %s: ", __func__), \
79 #define DBG_SKB(skb) (debug & 4 ? can_debug_skb(skb) : 0)
85 static int raw_init(struct sock *sk);
86 static int raw_release(struct socket *sock);
87 static int raw_bind (struct socket *sock, struct sockaddr *uaddr, int len);
88 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
90 static unsigned int raw_poll(struct file *file, struct socket *sock,
92 static int raw_setsockopt(struct socket *sock, int level, int optname,
93 char __user *optval, int optlen);
94 static int raw_getsockopt(struct socket *sock, int level, int optname,
95 char __user *optval, int __user *optlen);
96 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
97 struct msghdr *msg, size_t size);
98 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
99 struct msghdr *msg, size_t size, int flags);
100 static void raw_rcv(struct sk_buff *skb, void *data);
101 static void raw_notifier(unsigned long msg, void *data);
103 static void raw_add_filters(struct net_device *dev, struct sock *sk);
104 static void raw_remove_filters(struct net_device *dev, struct sock *sk);
107 static struct proto_ops raw_ops = {
109 .release = raw_release,
111 .connect = sock_no_connect,
112 .socketpair = sock_no_socketpair,
113 .accept = sock_no_accept,
114 .getname = raw_getname,
116 .ioctl = NULL, /* use can_ioctl() from af_can.c */
117 .listen = sock_no_listen,
118 .shutdown = sock_no_shutdown,
119 .setsockopt = raw_setsockopt,
120 .getsockopt = raw_getsockopt,
121 .sendmsg = raw_sendmsg,
122 .recvmsg = raw_recvmsg,
123 .mmap = sock_no_mmap,
124 .sendpage = sock_no_sendpage,
133 int count; /* number of active filters */
134 struct can_filter dfilter; /* default/single filter space */
135 struct can_filter *filter; /* pointer to filter(s) */
136 can_err_mask_t err_mask;
139 #ifdef CONFIG_CAN_RAW_USER
140 #define RAW_CAP CAP_NET_RAW
145 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
152 #define canraw_sk(sk) (&((struct raw_sock *)(sk))->opt)
154 static struct proto raw_proto = {
156 .owner = THIS_MODULE,
157 .obj_size = sizeof(struct raw_sock),
161 static struct can_proto raw_can_proto = {
164 .capability = RAW_CAP,
171 #define canraw_sk(sk) ((struct raw_opt *)(sk)->sk_protinfo)
173 static struct can_proto raw_can_proto = {
176 .capability = RAW_CAP,
178 .owner = THIS_MODULE,
179 .obj_size = sizeof(struct raw_opt),
187 static __init int raw_module_init(void)
191 can_proto_register(&raw_can_proto);
195 static __exit void raw_module_exit(void)
197 can_proto_unregister(&raw_can_proto);
200 static int raw_init(struct sock *sk)
202 canraw_sk(sk)->bound = 0;
204 /* set default filter to single entry dfilter */
205 canraw_sk(sk)->dfilter.can_id = 0;
206 canraw_sk(sk)->dfilter.can_mask = MASK_ALL;
207 canraw_sk(sk)->filter = &canraw_sk(sk)->dfilter;
208 canraw_sk(sk)->count = 1;
210 /* set default message behaviour */
211 canraw_sk(sk)->loopback = 1;
212 canraw_sk(sk)->recv_own_msgs = 0;
217 static int raw_release(struct socket *sock)
219 struct sock *sk = sock->sk;
220 struct net_device *dev = NULL;
222 DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
223 atomic_read(&sk->sk_refcnt));
225 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
226 dev = dev_get_by_index(canraw_sk(sk)->ifindex);
228 /* remove current filters & unregister */
229 if (canraw_sk(sk)->bound)
230 raw_remove_filters(dev, sk);
231 if (canraw_sk(sk)->count > 1)
232 kfree(canraw_sk(sk)->filter);
234 /* remove current error mask */
235 if (canraw_sk(sk)->err_mask && canraw_sk(sk)->bound)
236 can_rx_unregister(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk);
239 can_dev_unregister(dev, raw_notifier, sk);
248 static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
250 struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
251 struct sock *sk = sock->sk;
252 struct net_device *dev;
254 DBG("socket %p to device %d\n", sock, addr->can_ifindex);
256 if (len < sizeof(*addr))
259 if (canraw_sk(sk)->bound) {
263 /* remove current bindings / notifier */
264 if (canraw_sk(sk)->ifindex) {
265 dev = dev_get_by_index(canraw_sk(sk)->ifindex);
267 DBG("could not find device %d\n",
271 if (!(dev->flags & IFF_UP)) {
272 sk->sk_err = ENETDOWN;
273 sk->sk_error_report(sk);
276 can_dev_unregister(dev, raw_notifier, sk);
280 /* unregister current filters for this device */
281 raw_remove_filters(dev, sk);
283 /* the filter(s) content is just available here */
288 canraw_sk(sk)->bound = 0;
292 if (addr->can_ifindex) {
293 dev = dev_get_by_index(addr->can_ifindex);
295 DBG("could not find device %d\n", addr->can_ifindex);
298 if (!(dev->flags & IFF_UP)) {
299 sk->sk_err = ENETDOWN;
300 sk->sk_error_report(sk);
303 can_dev_register(dev, raw_notifier, sk);
307 canraw_sk(sk)->ifindex = addr->can_ifindex;
309 raw_add_filters(dev, sk); /* filters set by default/setsockopt */
311 if (canraw_sk(sk)->err_mask) /* error frame filter set by setsockopt */
312 can_rx_register(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk, IDENT);
314 canraw_sk(sk)->bound = 1;
323 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
326 struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
327 struct sock *sk = sock->sk;
332 addr->can_family = AF_CAN;
333 addr->can_ifindex = canraw_sk(sk)->ifindex;
334 *len = sizeof(*addr);
339 static unsigned int raw_poll(struct file *file, struct socket *sock,
342 unsigned int mask = 0;
344 DBG("socket %p\n", sock);
346 mask = datagram_poll(file, sock, wait);
350 static int raw_setsockopt(struct socket *sock, int level, int optname,
351 char __user *optval, int optlen)
353 struct sock *sk = sock->sk;
354 struct can_filter *filter = NULL;
355 struct net_device *dev = NULL;
356 can_err_mask_t err_mask = 0;
360 if (level != SOL_CAN_RAW)
365 if (optlen % sizeof(struct can_filter) != 0)
368 count = optlen / sizeof(struct can_filter);
370 if (count > 1) { /* does not fit into dfilter */
371 if (!(filter = kmalloc(optlen, GFP_KERNEL)))
373 if ((err = copy_from_user(filter, optval, optlen))) {
379 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
380 dev = dev_get_by_index(canraw_sk(sk)->ifindex);
382 /* remove current filters & unregister */
383 if (canraw_sk(sk)->bound)
384 raw_remove_filters(dev, sk);
385 if (canraw_sk(sk)->count > 1)
386 kfree(canraw_sk(sk)->filter);
388 if (count == 1) { /* copy data for single filter */
389 filter = &canraw_sk(sk)->dfilter;
390 if ((err = copy_from_user(filter, optval, optlen))) {
391 /* zero filters to prevent double kfree */
392 canraw_sk(sk)->count = 0;
399 /* add new filters & register */
400 canraw_sk(sk)->filter = filter;
401 canraw_sk(sk)->count = count;
402 if (canraw_sk(sk)->bound)
403 raw_add_filters(dev, sk);
410 case CAN_RAW_ERR_FILTER:
412 if (optlen != sizeof(err_mask))
414 if ((err = copy_from_user(&err_mask, optval, optlen)))
418 err_mask &= CAN_ERR_MASK;
420 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
421 dev = dev_get_by_index(canraw_sk(sk)->ifindex);
423 /* remove current error mask */
424 if (canraw_sk(sk)->err_mask && canraw_sk(sk)->bound)
425 can_rx_unregister(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk);
427 /* add new error mask */
429 canraw_sk(sk)->err_mask = err_mask;
430 if (canraw_sk(sk)->err_mask & canraw_sk(sk)->bound)
431 can_rx_register(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk, IDENT);
439 case CAN_RAW_LOOPBACK:
441 if (optlen != sizeof(canraw_sk(sk)->loopback))
443 if ((err = copy_from_user(&canraw_sk(sk)->loopback, optval, optlen)))
448 case CAN_RAW_RECV_OWN_MSGS:
450 if (optlen != sizeof(canraw_sk(sk)->recv_own_msgs))
452 if ((err = copy_from_user(&canraw_sk(sk)->recv_own_msgs, optval, optlen)))
463 static int raw_getsockopt(struct socket *sock, int level, int optname,
464 char __user *optval, int __user *optlen)
466 struct sock *sk = sock->sk;
467 struct can_filter *filter = canraw_sk(sk)->filter;
468 int count = canraw_sk(sk)->count;
471 if (level != SOL_CAN_RAW)
476 if (get_user(len, optlen))
479 if (count && filter) {
480 int filter_size = count * sizeof(struct can_filter);
481 if (len < filter_size)
483 if (len > filter_size)
485 if (copy_to_user(optval, filter, len))
490 if (put_user(len, optlen))
495 case CAN_RAW_ERR_FILTER:
496 if (get_user(len, optlen))
499 if (len < sizeof(can_err_mask_t))
502 if (len > sizeof(can_err_mask_t))
503 len = sizeof(can_err_mask_t);
505 if (copy_to_user(optval, &canraw_sk(sk)->err_mask, len))
508 if (put_user(len, optlen))
513 case CAN_RAW_LOOPBACK:
514 if (get_user(len, optlen))
517 if (len < sizeof(int))
520 if (len > sizeof(int))
523 if (copy_to_user(optval, &canraw_sk(sk)->loopback, len))
526 if (put_user(len, optlen))
531 case CAN_RAW_RECV_OWN_MSGS:
532 if (get_user(len, optlen))
535 if (len < sizeof(int))
538 if (len > sizeof(int))
541 if (copy_to_user(optval, &canraw_sk(sk)->recv_own_msgs, len))
544 if (put_user(len, optlen))
555 static void raw_add_filters(struct net_device *dev, struct sock *sk)
557 struct can_filter *filter = canraw_sk(sk)->filter;
560 for (i = 0; i < canraw_sk(sk)->count; i++) {
561 can_rx_register(dev, filter[i].can_id, filter[i].can_mask,
563 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
564 filter[i].can_id, filter[i].can_mask,
565 filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
569 static void raw_remove_filters(struct net_device *dev, struct sock *sk)
571 struct can_filter *filter = canraw_sk(sk)->filter;
574 for (i = 0; i < canraw_sk(sk)->count; i++) {
575 can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
577 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
578 filter[i].can_id, filter[i].can_mask,
579 filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
583 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
584 struct msghdr *msg, size_t size)
586 struct sock *sk = sock->sk;
588 struct net_device *dev;
592 DBG("socket %p, sk %p\n", sock, sk);
595 struct sockaddr_can *addr = (struct sockaddr_can *)msg->msg_name;
596 if (addr->can_family != AF_CAN)
598 ifindex = addr->can_ifindex;
600 ifindex = canraw_sk(sk)->ifindex;
602 if (!(dev = dev_get_by_index(ifindex))) {
603 DBG("device %d not found\n", ifindex);
607 if (!(skb = alloc_skb(size, GFP_KERNEL))) {
612 if ((err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size)) < 0) {
620 DBG("sending skbuff to interface %d\n", ifindex);
623 err = can_send(skb, canraw_sk(sk)->loopback);
633 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
634 struct msghdr *msg, size_t size, int flags)
636 struct sock *sk = sock->sk;
641 DBG("socket %p, sk %p\n", sock, sk);
643 noblock = flags & MSG_DONTWAIT;
644 flags &= ~MSG_DONTWAIT;
646 if (!(skb = skb_recv_datagram(sk, flags, noblock, &error)))
649 DBG("delivering skbuff %p\n", skb);
653 msg->msg_flags |= MSG_TRUNC;
657 if ((error = memcpy_toiovec(msg->msg_iov, skb->data, size)) < 0) {
658 skb_free_datagram(sk, skb);
662 sock_recv_timestamp(msg, sk, skb);
665 msg->msg_namelen = sizeof(struct sockaddr_can);
666 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
669 DBG("freeing sock %p, skbuff %p\n", sk, skb);
670 skb_free_datagram(sk, skb);
675 static void raw_rcv(struct sk_buff *skb, void *data)
677 struct sock *sk = (struct sock*)data;
678 struct sockaddr_can *addr;
681 DBG("received skbuff %p, sk %p\n", skb, sk);
684 if (!canraw_sk(sk)->recv_own_msgs) {
685 if (*(struct sock **)skb->cb == sk) { /* tx sock reference */
686 DBG("trashed own tx msg\n");
692 addr = (struct sockaddr_can *)skb->cb;
693 memset(addr, 0, sizeof(*addr));
694 addr->can_family = AF_CAN;
695 addr->can_ifindex = skb->dev->ifindex;
697 if ((error = sock_queue_rcv_skb(sk, skb)) < 0) {
698 DBG("sock_queue_rcv_skb failed: %d\n", error);
699 DBG("freeing skbuff %p\n", skb);
704 static void raw_notifier(unsigned long msg, void *data)
706 struct sock *sk = (struct sock *)data;
708 DBG("called for sock %p\n", sk);
711 case NETDEV_UNREGISTER:
712 canraw_sk(sk)->ifindex = 0;
713 canraw_sk(sk)->bound = 0;
716 sk->sk_err = ENETDOWN;
717 sk->sk_error_report(sk);
723 module_init(raw_module_init);
724 module_exit(raw_module_exit);