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/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>
54 #include <linux/can/af_can.h>
55 #include <linux/can/can_error.h>
56 #include <linux/can/raw.h>
57 #include <linux/can/version.h>
62 #define NAME "RAW sockets for LLCF"
64 static __initdata const char banner[] = BANNER(NAME);
66 MODULE_DESCRIPTION(NAME);
67 MODULE_LICENSE("Dual BSD/GPL");
68 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
72 module_param(debug, int, S_IRUGO);
73 #define DBG(args...) (debug & 1 ? \
74 (printk(KERN_DEBUG "RAW %s: ", __func__), \
76 #define DBG_SKB(skb) (debug & 4 ? can_debug_skb(skb) : 0)
82 static int raw_release(struct socket *sock);
83 static int raw_bind (struct socket *sock, struct sockaddr *uaddr, int len);
84 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
86 static unsigned int raw_poll(struct file *file, struct socket *sock,
88 static int raw_setsockopt(struct socket *sock, int level, int optname,
89 char __user *optval, int optlen);
90 static int raw_getsockopt(struct socket *sock, int level, int optname,
91 char __user *optval, int __user *optlen);
92 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
93 struct msghdr *msg, size_t size);
94 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
95 struct msghdr *msg, size_t size, int flags);
96 static void raw_rcv(struct sk_buff *skb, void *data);
97 static void raw_notifier(unsigned long msg, void *data);
99 static void raw_add_filters(struct net_device *dev, struct sock *sk);
100 static void raw_remove_filters(struct net_device *dev, struct sock *sk);
103 static struct proto_ops raw_ops = {
105 .release = raw_release,
107 .connect = sock_no_connect,
108 .socketpair = sock_no_socketpair,
109 .accept = sock_no_accept,
110 .getname = raw_getname,
112 .ioctl = NULL, /* use can_ioctl() from af_can.c */
113 .listen = sock_no_listen,
114 .shutdown = sock_no_shutdown,
115 .setsockopt = raw_setsockopt,
116 .getsockopt = raw_getsockopt,
117 .sendmsg = raw_sendmsg,
118 .recvmsg = raw_recvmsg,
119 .mmap = sock_no_mmap,
120 .sendpage = sock_no_sendpage,
128 struct can_filter *filter;
129 can_err_mask_t err_mask;
132 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
139 #define canraw_sk(sk) (&((struct raw_sock *)(sk))->opt)
141 static struct proto raw_proto = {
143 .owner = THIS_MODULE,
144 .obj_size = sizeof(struct raw_sock),
147 static struct can_proto raw_can_proto = {
154 #define canraw_sk(sk) ((struct raw_opt *)(sk)->sk_protinfo)
156 static struct can_proto raw_can_proto = {
158 .owner = THIS_MODULE,
159 .obj_size = sizeof(struct raw_opt),
166 static __init int raw_init(void)
170 can_proto_register(CAN_RAW, &raw_can_proto);
174 static __exit void raw_exit(void)
176 can_proto_unregister(CAN_RAW);
179 static int raw_release(struct socket *sock)
181 struct sock *sk = sock->sk;
182 struct net_device *dev = NULL;
184 DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
185 atomic_read(&sk->sk_refcnt));
187 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
188 dev = dev_get_by_index(canraw_sk(sk)->ifindex);
190 /* remove current filters & unregister */
191 if (canraw_sk(sk)->count > 0) {
192 if (canraw_sk(sk)->bound)
193 raw_remove_filters(dev, sk);
194 kfree(canraw_sk(sk)->filter);
195 } else if (canraw_sk(sk)->bound)
196 can_rx_unregister(dev, 0, MASK_ALL, raw_rcv, sk);
198 /* remove current error mask */
199 if (canraw_sk(sk)->err_mask && canraw_sk(sk)->bound)
200 can_rx_unregister(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk);
203 can_dev_unregister(dev, raw_notifier, sk);
212 static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
214 struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
215 struct sock *sk = sock->sk;
216 struct net_device *dev;
218 DBG("socket %p to device %d\n", sock, addr->can_ifindex);
220 if (len < sizeof(*addr))
223 if (canraw_sk(sk)->bound) {
227 /* remove current bindings */
228 if (canraw_sk(sk)->ifindex) {
229 dev = dev_get_by_index(canraw_sk(sk)->ifindex);
230 ; /* remove notifier */
233 if (canraw_sk(sk)->count > 0) {
234 raw_remove_filters(sk);
236 can_rx_unregister(dev, 0, MASK_ALL, raw_rcv, sk);
240 canraw_sk(sk)->bound = 0;
244 if (addr->can_ifindex) {
245 dev = dev_get_by_index(addr->can_ifindex);
247 DBG("could not find device %d\n", addr->can_ifindex);
250 if (!(dev->flags & IFF_UP)) {
251 sk->sk_err = ENETDOWN;
252 sk->sk_error_report(sk);
255 can_dev_register(dev, raw_notifier, sk);
259 canraw_sk(sk)->ifindex = addr->can_ifindex;
261 if (canraw_sk(sk)->count > 0) /* filters set by setsockopt */
262 raw_add_filters(dev, sk);
264 can_rx_register(dev, 0, MASK_ALL, raw_rcv, sk, IDENT);
266 if (canraw_sk(sk)->err_mask) /* error frame filter set by setsockopt */
267 can_rx_register(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk, IDENT);
269 canraw_sk(sk)->bound = 1;
278 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
281 struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
282 struct sock *sk = sock->sk;
287 addr->can_family = AF_CAN;
288 addr->can_ifindex = canraw_sk(sk)->ifindex;
289 *len = sizeof(*addr);
294 static unsigned int raw_poll(struct file *file, struct socket *sock,
297 unsigned int mask = 0;
299 DBG("socket %p\n", sock);
301 mask = datagram_poll(file, sock, wait);
305 static int raw_setsockopt(struct socket *sock, int level, int optname,
306 char __user *optval, int optlen)
308 struct sock *sk = sock->sk;
309 struct can_filter *filter = NULL;
310 struct net_device *dev = NULL;
311 can_err_mask_t err_mask = 0;
315 if (level != SOL_CAN_RAW)
321 if (optlen % sizeof(struct can_filter) != 0)
323 if (!(filter = kmalloc(optlen, GFP_KERNEL)))
325 if ((err = copy_from_user(filter, optval, optlen))) {
329 count = optlen / sizeof(struct can_filter);
332 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
333 dev = dev_get_by_index(canraw_sk(sk)->ifindex);
335 /* remove current filters & unregister */
336 if (canraw_sk(sk)->count > 0) {
338 if (canraw_sk(sk)->bound)
339 raw_remove_filters(dev, sk);
341 kfree(canraw_sk(sk)->filter);
342 canraw_sk(sk)->count = 0;
343 canraw_sk(sk)->filter = NULL;
344 } else if (canraw_sk(sk)->bound)
345 can_rx_unregister(dev, 0, MASK_ALL, raw_rcv, sk);
347 /* add new filters & register */
349 canraw_sk(sk)->filter = filter;
350 canraw_sk(sk)->count = count;
351 if (canraw_sk(sk)->bound)
352 raw_add_filters(dev, sk);
353 } else if (canraw_sk(sk)->bound)
354 can_rx_register(dev, 0, MASK_ALL, raw_rcv, sk, IDENT);
361 case CAN_RAW_ERR_FILTER:
363 if (optlen != sizeof(err_mask))
365 if ((err = copy_from_user(&err_mask, optval, optlen))) {
370 err_mask &= CAN_ERR_MASK;
372 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
373 dev = dev_get_by_index(canraw_sk(sk)->ifindex);
375 /* remove current error mask */
376 if (canraw_sk(sk)->err_mask && canraw_sk(sk)->bound)
377 can_rx_unregister(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk);
379 /* add new error mask */
381 canraw_sk(sk)->err_mask = err_mask;
382 if (canraw_sk(sk)->err_mask & canraw_sk(sk)->bound)
383 can_rx_register(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk, IDENT);
397 static int raw_getsockopt(struct socket *sock, int level, int optname,
398 char __user *optval, int __user *optlen)
400 struct sock *sk = sock->sk;
401 struct can_filter *filter = canraw_sk(sk)->filter;
404 if (level != SOL_CAN_RAW)
409 if (get_user(len, optlen))
413 int filter_size = canraw_sk(sk)->count * sizeof(struct can_filter);
414 if (len < filter_size)
416 if (len > filter_size)
418 if (copy_to_user(optval, filter, len))
422 if (put_user(len, optlen))
426 case CAN_RAW_ERR_FILTER:
427 if (get_user(len, optlen))
430 if (len < sizeof(can_err_mask_t))
433 if (len > sizeof(can_err_mask_t))
434 len = sizeof(can_err_mask_t);
436 if (copy_to_user(optval, &canraw_sk(sk)->err_mask, len))
439 if (put_user(len, optlen))
449 static void raw_add_filters(struct net_device *dev, struct sock *sk)
451 struct can_filter *filter = canraw_sk(sk)->filter;
454 for (i = 0; i < canraw_sk(sk)->count; i++) {
455 can_rx_register(dev, filter[i].can_id, filter[i].can_mask,
457 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
458 filter[i].can_id, filter[i].can_mask,
459 filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
463 static void raw_remove_filters(struct net_device *dev, struct sock *sk)
465 struct can_filter *filter = canraw_sk(sk)->filter;
468 for (i = 0; i < canraw_sk(sk)->count; i++) {
469 can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
471 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
472 filter[i].can_id, filter[i].can_mask,
473 filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
477 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
478 struct msghdr *msg, size_t size)
480 struct sock *sk = sock->sk;
482 struct net_device *dev;
486 DBG("socket %p, sk %p\n", sock, sk);
489 struct sockaddr_can *addr = (struct sockaddr_can *)msg->msg_name;
490 if (addr->can_family != AF_CAN)
492 ifindex = addr->can_ifindex;
494 ifindex = canraw_sk(sk)->ifindex;
496 if (!(dev = dev_get_by_index(ifindex))) {
497 DBG("device %d not found\n", ifindex);
501 skb = alloc_skb(size, GFP_KERNEL);
502 if ((err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size)) < 0) {
509 DBG("sending skbuff to interface %d\n", ifindex);
522 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
523 struct msghdr *msg, size_t size, int flags)
525 struct sock *sk = sock->sk;
530 DBG("socket %p, sk %p\n", sock, sk);
532 noblock = flags & MSG_DONTWAIT;
533 flags &= ~MSG_DONTWAIT;
534 if (!(skb = skb_recv_datagram(sk, flags, noblock, &error))) {
538 DBG("delivering skbuff %p\n", skb);
542 msg->msg_flags |= MSG_TRUNC;
545 if ((error = memcpy_toiovec(msg->msg_iov, skb->data, size)) < 0) {
546 skb_free_datagram(sk, skb);
550 sock_recv_timestamp(msg, sk, skb);
553 msg->msg_namelen = sizeof(struct sockaddr_can);
554 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
557 DBG("freeing sock %p, skbuff %p\n", sk, skb);
558 skb_free_datagram(sk, skb);
563 static void raw_rcv(struct sk_buff *skb, void *data)
565 struct sock *sk = (struct sock*)data;
566 struct sockaddr_can *addr;
569 DBG("received skbuff %p, sk %p\n", skb, sk);
572 addr = (struct sockaddr_can *)skb->cb;
573 memset(addr, 0, sizeof(*addr));
574 addr->can_family = AF_CAN;
575 addr->can_ifindex = skb->dev->ifindex;
577 if ((error = sock_queue_rcv_skb(sk, skb)) < 0) {
578 DBG("sock_queue_rcv_skb failed: %d\n", error);
579 DBG("freeing skbuff %p\n", skb);
584 static void raw_notifier(unsigned long msg, void *data)
586 struct sock *sk = (struct sock *)data;
588 DBG("called for sock %p\n", sk);
591 case NETDEV_UNREGISTER:
592 canraw_sk(sk)->ifindex = 0;
595 sk->sk_err = ENETDOWN;
596 sk->sk_error_report(sk);
602 module_init(raw_init);
603 module_exit(raw_exit);