]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - kernel/2.6/net/can/raw.c
f6f8b53b59acc3ed812d1fec226f7b9e1a409a03
[socketcan-devel.git] / kernel / 2.6 / net / can / raw.c
1 /*
2  * raw.c
3  *
4  * Copyright (c) 2002-2005 Volkswagen Group Electronic Research
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
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.
19  *
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.
24  *
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.
27  *
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
39  * DAMAGE.
40  *
41  * Send feedback to <socketcan-users@lists.berlios.de>
42  *
43  */
44
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>
52 #include <net/sock.h>
53
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>
58
59
60 RCSID("$Id$");
61
62 #define NAME "RAW sockets for LLCF"
63 #define IDENT "raw"
64 static __initdata const char banner[] = BANNER(NAME);
65
66 MODULE_DESCRIPTION(NAME);
67 MODULE_LICENSE("Dual BSD/GPL");
68 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
69
70 #ifdef DEBUG
71 static int debug = 0;
72 module_param(debug, int, S_IRUGO);
73 #define DBG(args...)       (debug & 1 ? \
74                                (printk(KERN_DEBUG "RAW %s: ", __func__), \
75                                 printk(args)) : 0)
76 #define DBG_SKB(skb)       (debug & 4 ? can_debug_skb(skb) : 0)
77 #else
78 #define DBG(args...)
79 #define DBG_SKB(skb)
80 #endif
81
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,
85                        int *len, int peer);
86 static unsigned int raw_poll(struct file *file, struct socket *sock,
87                              poll_table *wait);
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);
98
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);
101
102
103 static struct proto_ops raw_ops = {
104         .family        = PF_CAN,
105         .release       = raw_release,
106         .bind          = raw_bind,
107         .connect       = sock_no_connect,
108         .socketpair    = sock_no_socketpair,
109         .accept        = sock_no_accept,
110         .getname       = raw_getname,
111         .poll          = raw_poll,
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,
121 };
122
123
124 struct raw_opt {
125         int bound;
126         int ifindex;
127         int count;
128         struct can_filter *filter;
129         can_err_mask_t err_mask;
130 };
131
132 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
133
134 struct raw_sock {
135         struct sock    sk;
136         struct raw_opt opt;
137 };
138
139 #define canraw_sk(sk) (&((struct raw_sock *)(sk))->opt)
140
141 static struct proto raw_proto = {
142         .name     = "CAN_RAW",
143         .owner    = THIS_MODULE,
144         .obj_size = sizeof(struct raw_sock),
145 };
146
147 static struct can_proto raw_can_proto = {
148         .ops  = &raw_ops,
149         .prot = &raw_proto,
150 };
151
152 #else
153
154 #define canraw_sk(sk) ((struct raw_opt *)(sk)->sk_protinfo)
155
156 static struct can_proto raw_can_proto = {
157         .ops      = &raw_ops,
158         .owner    = THIS_MODULE,
159         .obj_size = sizeof(struct raw_opt),
160 };
161
162 #endif
163
164 #define MASK_ALL 0
165
166 static __init int raw_init(void)
167 {
168         printk(banner);
169
170         can_proto_register(CAN_RAW, &raw_can_proto);
171         return 0;
172 }
173
174 static __exit void raw_exit(void)
175 {
176         can_proto_unregister(CAN_RAW);
177 }
178
179 static int raw_release(struct socket *sock)
180 {
181         struct sock *sk = sock->sk;
182         struct net_device *dev = NULL;
183
184         DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
185             atomic_read(&sk->sk_refcnt));
186
187         if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
188                 dev = dev_get_by_index(canraw_sk(sk)->ifindex);
189
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);
197
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);
201
202         if (dev) {
203                 can_dev_unregister(dev, raw_notifier, sk);
204                 dev_put(dev);
205         }
206
207         sock_put(sk);
208
209         return 0;
210 }
211
212 static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
213 {
214         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
215         struct sock *sk = sock->sk;
216         struct net_device *dev;
217
218         DBG("socket %p to device %d\n", sock, addr->can_ifindex);
219
220         if (len < sizeof(*addr))
221                 return -EINVAL;
222
223         if (canraw_sk(sk)->bound) {
224 #if 1
225                 return -EOPNOTSUPP;
226 #else
227                 /* remove current bindings */
228                 if (canraw_sk(sk)->ifindex) {
229                         dev = dev_get_by_index(canraw_sk(sk)->ifindex);
230                         ;  /* remove notifier */
231                 } else
232                         dev = NULL;
233                 if (canraw_sk(sk)->count > 0) {
234                         raw_remove_filters(sk);
235                 } else {
236                         can_rx_unregister(dev, 0, MASK_ALL, raw_rcv, sk);
237                 }
238                 if (dev)
239                         dev_put(dev);
240                 canraw_sk(sk)->bound = 0;
241 #endif
242         }
243
244         if (addr->can_ifindex) {
245                 dev = dev_get_by_index(addr->can_ifindex);
246                 if (!dev) {
247                         DBG("could not find device %d\n", addr->can_ifindex);
248                         return -ENODEV;
249                 }
250                 if (!(dev->flags & IFF_UP)) {
251                         sk->sk_err = ENETDOWN;
252                         sk->sk_error_report(sk);
253                         goto out;
254                 }
255                 can_dev_register(dev, raw_notifier, sk);
256         } else
257                 dev = NULL;
258
259         canraw_sk(sk)->ifindex = addr->can_ifindex;
260
261         if (canraw_sk(sk)->count > 0)   /* filters set by setsockopt */
262                 raw_add_filters(dev, sk);
263         else
264                 can_rx_register(dev, 0, MASK_ALL, raw_rcv, sk, IDENT);
265
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);
268
269         canraw_sk(sk)->bound = 1;
270
271  out:
272         if (dev)
273                 dev_put(dev);
274
275         return 0;
276 }
277
278 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
279                        int *len, int peer)
280 {
281         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
282         struct sock *sk = sock->sk;
283
284         if (peer)
285                 return -EOPNOTSUPP;
286
287         addr->can_family  = AF_CAN;
288         addr->can_ifindex = canraw_sk(sk)->ifindex;
289         *len = sizeof(*addr);
290
291         return 0;
292 }
293
294 static unsigned int raw_poll(struct file *file, struct socket *sock,
295                              poll_table *wait)
296 {
297         unsigned int mask = 0;
298
299         DBG("socket %p\n", sock);
300
301         mask = datagram_poll(file, sock, wait);
302         return mask;
303 }
304
305 static int raw_setsockopt(struct socket *sock, int level, int optname,
306                           char __user *optval, int optlen)
307 {
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;
312         int count = 0;
313         int err;
314
315         if (level != SOL_CAN_RAW)
316                 return -EINVAL;
317
318         switch (optname) {
319         case CAN_RAW_FILTER:
320                 if (optlen) {
321                         if (optlen % sizeof(struct can_filter) != 0)
322                                 return -EINVAL;
323                         if (!(filter = kmalloc(optlen, GFP_KERNEL)))
324                                 return -ENOMEM;
325                         if ((err = copy_from_user(filter, optval, optlen))) {
326                                 kfree(filter);
327                                 return err;
328                         }
329                         count = optlen / sizeof(struct can_filter);
330                 }
331
332                 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
333                         dev = dev_get_by_index(canraw_sk(sk)->ifindex);
334
335                 /* remove current filters & unregister */
336                 if (canraw_sk(sk)->count > 0) {
337
338                         if (canraw_sk(sk)->bound)
339                                 raw_remove_filters(dev, sk);
340
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);
346
347                 /* add new filters & register */
348                 if (optlen) {
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);
355
356                 if (dev)
357                         dev_put(dev);
358
359                 break;
360
361         case CAN_RAW_ERR_FILTER:
362                 if (optlen) {
363                         if (optlen != sizeof(err_mask))
364                                 return -EINVAL;
365                         if ((err = copy_from_user(&err_mask, optval, optlen))) {
366                                 return err;
367                         }
368                 }
369
370                 err_mask &= CAN_ERR_MASK;
371
372                 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
373                         dev = dev_get_by_index(canraw_sk(sk)->ifindex);
374
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);
378
379                 /* add new error mask */
380                 if (optlen) {
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);
384                 }
385
386                 if (dev)
387                         dev_put(dev);
388
389                 break;
390
391         default:
392                 return -ENOPROTOOPT;
393         }
394         return 0;
395 }
396
397 static int raw_getsockopt(struct socket *sock, int level, int optname,
398                           char __user *optval, int __user *optlen)
399 {
400         struct sock *sk = sock->sk;
401         struct can_filter *filter = canraw_sk(sk)->filter;
402         int len;
403
404         if (level != SOL_CAN_RAW)
405                 return -EINVAL;
406
407         switch (optname) {
408         case CAN_RAW_FILTER:
409                 if (get_user(len, optlen))
410                         return -EFAULT;
411
412                 if (filter) {
413                         int filter_size = canraw_sk(sk)->count * sizeof(struct can_filter);
414                         if (len < filter_size)
415                                 return -EINVAL;
416                         if (len > filter_size)
417                                 len = filter_size;
418                         if (copy_to_user(optval, filter, len))
419                                 return -EFAULT;
420                 } else
421                         len = 0;
422                 if (put_user(len, optlen))
423                         return -EFAULT;
424                 break;
425
426         case CAN_RAW_ERR_FILTER:
427                 if (get_user(len, optlen))
428                         return -EFAULT;
429
430                 if (len < sizeof(can_err_mask_t))
431                         return -EINVAL;
432
433                 if (len > sizeof(can_err_mask_t))
434                         len = sizeof(can_err_mask_t);
435
436                 if (copy_to_user(optval, &canraw_sk(sk)->err_mask, len))
437                         return -EFAULT;
438
439                 if (put_user(len, optlen))
440                         return -EFAULT;
441                 break;
442
443         default:
444                 return -ENOPROTOOPT;
445         }
446         return 0;
447 }
448
449 static void raw_add_filters(struct net_device *dev, struct sock *sk)
450 {
451         struct can_filter *filter = canraw_sk(sk)->filter;
452         int i;
453
454         for (i = 0; i < canraw_sk(sk)->count; i++) {
455                 can_rx_register(dev, filter[i].can_id, filter[i].can_mask,
456                                 raw_rcv, sk, IDENT);
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);
460         }
461 }
462
463 static void raw_remove_filters(struct net_device *dev, struct sock *sk)
464 {
465         struct can_filter *filter = canraw_sk(sk)->filter;
466         int i;
467
468         for (i = 0; i < canraw_sk(sk)->count; i++) {
469                 can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
470                                   raw_rcv, sk);
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);
474         }
475 }
476
477 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
478                        struct msghdr *msg, size_t size)
479 {
480         struct sock *sk = sock->sk;
481         struct sk_buff *skb;
482         struct net_device *dev;
483         int ifindex;
484         int err;
485
486         DBG("socket %p, sk %p\n", sock, sk);
487
488         if (msg->msg_name) {
489                 struct sockaddr_can *addr = (struct sockaddr_can *)msg->msg_name;
490                 if (addr->can_family != AF_CAN)
491                         return -EINVAL;
492                 ifindex = addr->can_ifindex;
493         } else
494                 ifindex = canraw_sk(sk)->ifindex;
495
496         if (!(dev = dev_get_by_index(ifindex))) {
497                 DBG("device %d not found\n", ifindex);
498                 return -ENXIO;
499         }
500
501         skb = alloc_skb(size, GFP_KERNEL);
502         if ((err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size)) < 0) {
503                 kfree_skb(skb);
504                 dev_put(dev);
505                 return err;
506         }
507         skb->dev = dev;
508
509         DBG("sending skbuff to interface %d\n", ifindex);
510         DBG_SKB(skb);
511
512         err = can_send(skb);
513
514         dev_put(dev);
515
516         if (err)
517                 return err;
518
519         return size;
520 }
521
522 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
523                        struct msghdr *msg, size_t size, int flags)
524 {
525         struct sock *sk = sock->sk;
526         struct sk_buff *skb;
527         int error = 0;
528         int noblock;
529
530         DBG("socket %p, sk %p\n", sock, sk);
531
532         noblock =  flags & MSG_DONTWAIT;
533         flags   &= ~MSG_DONTWAIT;
534         if (!(skb = skb_recv_datagram(sk, flags, noblock, &error))) {
535                 return error;
536         }
537
538         DBG("delivering skbuff %p\n", skb);
539         DBG_SKB(skb);
540
541         if (size < skb->len)
542                 msg->msg_flags |= MSG_TRUNC;
543         else
544                 size = skb->len;
545         if ((error = memcpy_toiovec(msg->msg_iov, skb->data, size)) < 0) {
546                 skb_free_datagram(sk, skb);
547                 return error;
548         }
549
550         sock_recv_timestamp(msg, sk, skb);
551
552         if (msg->msg_name) {
553                 msg->msg_namelen = sizeof(struct sockaddr_can);
554                 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
555         }
556
557         DBG("freeing sock %p, skbuff %p\n", sk, skb);
558         skb_free_datagram(sk, skb);
559
560         return size;
561 }
562
563 static void raw_rcv(struct sk_buff *skb, void *data)
564 {
565         struct sock *sk = (struct sock*)data;
566         struct sockaddr_can *addr;
567         int error;
568
569         DBG("received skbuff %p, sk %p\n", skb, sk);
570         DBG_SKB(skb);
571
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;
576
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);
580                 kfree_skb(skb);
581         }
582 }
583
584 static void raw_notifier(unsigned long msg, void *data)
585 {
586         struct sock *sk = (struct sock *)data;
587
588         DBG("called for sock %p\n", sk);
589
590         switch (msg) {
591         case NETDEV_UNREGISTER:
592                 canraw_sk(sk)->ifindex = 0;
593                 /* fallthrough */
594         case NETDEV_DOWN:
595                 sk->sk_err = ENETDOWN;
596                 sk->sk_error_report(sk);
597                 break;
598         }
599 }
600
601
602 module_init(raw_init);
603 module_exit(raw_exit);