]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - kernel/2.6/net/can/raw.c
changed indentation to 8, other white space changes.
[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 <llcf@volkswagen.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
58 #include "version.h"
59
60 RCSID("$Id$");
61
62
63 #define NAME "RAW sockets for LLCF"
64 #define IDENT "raw"
65 static __initdata const char banner[] = BANNER(NAME);
66
67 MODULE_DESCRIPTION(NAME);
68 MODULE_LICENSE("Dual BSD/GPL");
69 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
70
71 #ifdef DEBUG
72 static int debug = 0;
73 module_param(debug, int, S_IRUGO);
74 #define DBG(args...)       (debug & 1 ? \
75                                (printk(KERN_DEBUG "RAW %s: ", __func__), \
76                                 printk(args)) : 0)
77 #define DBG_SKB(skb)       (debug & 4 ? can_debug_skb(skb) : 0)
78 #else
79 #define DBG(args...)
80 #define DBG_SKB(skb)
81 #endif
82
83 static int raw_release(struct socket *sock);
84 static int raw_bind   (struct socket *sock, struct sockaddr *uaddr, int len);
85 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
86                        int *len, int peer);
87 static unsigned int raw_poll(struct file *file, struct socket *sock,
88                              poll_table *wait);
89 static int raw_setsockopt(struct socket *sock, int level, int optname,
90                           char *optval, int optlen);
91 static int raw_getsockopt(struct socket *sock, int level, int optname,
92                           char *optval, int *optlen);
93 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
94                        struct msghdr *msg, size_t size);
95 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
96                        struct msghdr *msg, size_t size, int flags);
97 static void raw_rcv(struct sk_buff *skb, void *data);
98 static void raw_notifier(unsigned long msg, void *data);
99
100 static void raw_add_filters(struct net_device *dev, struct sock *sk);
101 static void raw_remove_filters(struct net_device *dev, struct sock *sk);
102
103
104 static struct proto_ops raw_ops = {
105         .family        = PF_CAN,
106         .release       = raw_release,
107         .bind          = raw_bind,
108         .connect       = sock_no_connect,
109         .socketpair    = sock_no_socketpair,
110         .accept        = sock_no_accept,
111         .getname       = raw_getname,
112         .poll          = raw_poll,
113         .ioctl         = 0,
114         .listen        = sock_no_listen,
115         .shutdown      = sock_no_shutdown,
116         .setsockopt    = raw_setsockopt,
117         .getsockopt    = raw_getsockopt,
118         .sendmsg       = raw_sendmsg,
119         .recvmsg       = raw_recvmsg,
120         .mmap          = sock_no_mmap,
121         .sendpage      = sock_no_sendpage,
122 };
123
124
125 struct raw_opt {
126         int bound;
127         int ifindex;
128         int count;
129         struct can_filter *filter;
130         can_err_mask_t err_mask;
131 };
132
133 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
134
135 struct raw_sock {
136         struct sock    sk;
137         struct raw_opt opt;
138 };
139
140 #define canraw_sk(sk) (&((struct raw_sock *)(sk))->opt)
141
142 static struct proto raw_proto = {
143         .name     = "CAN_RAW",
144         .owner    = THIS_MODULE,
145         .obj_size = sizeof(struct raw_sock),
146 };
147
148 static struct can_proto raw_can_proto = {
149         .ops  = &raw_ops,
150         .prot = &raw_proto,
151 };
152
153 #else
154
155 #define canraw_sk(sk) ((struct raw_opt *)(sk)->sk_protinfo)
156
157 static struct can_proto raw_can_proto = {
158         .ops      = &raw_ops,
159         .owner    = THIS_MODULE,
160         .obj_size = sizeof(struct raw_opt),
161 };
162
163 #endif
164
165 #define MASK_ALL 0
166
167 static __init int raw_init(void)
168 {
169         printk(banner);
170
171         can_proto_register(CAN_RAW, &raw_can_proto);
172         return 0;
173 }
174
175 static __exit void raw_exit(void)
176 {
177         can_proto_unregister(CAN_RAW);
178 }
179
180 static int raw_release(struct socket *sock)
181 {
182         struct sock *sk = sock->sk;
183         struct net_device *dev = NULL;
184
185         DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
186             atomic_read(&sk->sk_refcnt));
187
188         if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
189                 dev = dev_get_by_index(canraw_sk(sk)->ifindex);
190
191         /* remove current filters & unregister */
192         if (canraw_sk(sk)->count > 0) {
193                 if (canraw_sk(sk)->bound)
194                         raw_remove_filters(dev, sk);
195                 kfree(canraw_sk(sk)->filter);
196         } else if (canraw_sk(sk)->bound)
197                 can_rx_unregister(dev, 0, MASK_ALL, raw_rcv, sk);
198
199         /* remove current error mask */
200         if (canraw_sk(sk)->err_mask && canraw_sk(sk)->bound)
201                 can_rx_unregister(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk);
202
203         if (dev) {
204                 can_dev_unregister(dev, raw_notifier, sk);
205                 dev_put(dev);
206         }
207
208         sock_put(sk);
209
210         return 0;
211 }
212
213 static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
214 {
215         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
216         struct sock *sk = sock->sk;
217         struct net_device *dev;
218
219         DBG("socket %p to device %d\n", sock, addr->can_ifindex);
220
221         if (len < sizeof(*addr))
222                 return -EINVAL;
223
224         if (canraw_sk(sk)->bound) {
225 #if 1
226                 return -EOPNOTSUPP;
227 #else
228                 /* remove current bindings */
229                 if (canraw_sk(sk)->ifindex) {
230                         dev = dev_get_by_index(canraw_sk(sk)->ifindex);
231                         ;  /* remove notifier */
232                 } else
233                         dev = NULL;
234                 if (canraw_sk(sk)->count > 0) {
235                         raw_remove_filters(sk);
236                 } else {
237                         can_rx_unregister(dev, 0, MASK_ALL, raw_rcv, sk);
238                 }
239                 if (dev)
240                         dev_put(dev);
241                 canraw_sk(sk)->bound = 0;
242 #endif
243         }
244
245         if (addr->can_ifindex) {
246                 dev = dev_get_by_index(addr->can_ifindex);
247                 if (!dev) {
248                         DBG("could not find device %d\n", addr->can_ifindex);
249                         return -ENODEV;
250                 }
251                 if (!(dev->flags & IFF_UP)) {
252                         sk->sk_err = ENETDOWN;
253                         sk->sk_error_report(sk);
254                         goto out;
255                 }
256                 can_dev_register(dev, raw_notifier, sk);
257         } else
258                 dev = NULL;
259
260         canraw_sk(sk)->ifindex = addr->can_ifindex;
261
262         if (canraw_sk(sk)->count > 0)   /* filters set by setsockopt */
263                 raw_add_filters(dev, sk);
264         else
265                 can_rx_register(dev, 0, MASK_ALL, raw_rcv, sk, IDENT);
266
267         if (canraw_sk(sk)->err_mask) /* error frame filter set by setsockopt */
268                 can_rx_register(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk, IDENT);
269
270         canraw_sk(sk)->bound = 1;
271
272  out:
273         if (dev)
274                 dev_put(dev);
275
276         return 0;
277 }
278
279 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
280                        int *len, int peer)
281 {
282         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
283         struct sock *sk = sock->sk;
284
285         if (peer)
286                 return -EOPNOTSUPP;
287         
288         addr->can_family  = AF_CAN;
289         addr->can_ifindex = canraw_sk(sk)->ifindex;
290         *len = sizeof(*addr);
291
292         return 0;
293 }
294
295 static unsigned int raw_poll(struct file *file, struct socket *sock,
296                              poll_table *wait)
297 {
298         unsigned int mask = 0;
299
300         DBG("socket %p\n", sock);
301
302         mask = datagram_poll(file, sock, wait);
303         return mask;
304 }
305
306 static int raw_setsockopt(struct socket *sock, int level, int optname,
307                           char *optval, int optlen)
308 {
309         struct sock *sk = sock->sk;
310         struct can_filter *filter = NULL;
311         struct net_device *dev = NULL;
312         can_err_mask_t err_mask = 0;
313         int count = 0;
314         int err;
315
316         if (level != SOL_CAN_RAW)
317                 return -EINVAL;
318
319         switch (optname) {
320         case CAN_RAW_FILTER:
321                 if (optlen) {
322                         if (optlen % sizeof(struct can_filter) != 0)
323                                 return -EINVAL;
324                         if (!(filter = kmalloc(optlen, GFP_KERNEL)))
325                                 return -ENOMEM;
326                         if (err = copy_from_user(filter, optval, optlen)) {
327                                 kfree(filter);
328                                 return err;
329                         }
330                         count = optlen / sizeof(struct can_filter);
331                 }
332
333                 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
334                         dev = dev_get_by_index(canraw_sk(sk)->ifindex);
335
336                 /* remove current filters & unregister */
337                 if (canraw_sk(sk)->count > 0) {
338
339                         if (canraw_sk(sk)->bound)
340                                 raw_remove_filters(dev, sk);
341             
342                         kfree(canraw_sk(sk)->filter);
343                         canraw_sk(sk)->count = 0;
344                         canraw_sk(sk)->filter = NULL;
345                 } else if (canraw_sk(sk)->bound)
346                         can_rx_unregister(dev, 0, MASK_ALL, raw_rcv, sk);
347
348                 /* add new filters & register */
349                 if (optlen) {
350                         canraw_sk(sk)->filter = filter;
351                         canraw_sk(sk)->count  = count;
352                         if (canraw_sk(sk)->bound)
353                                 raw_add_filters(dev, sk);
354                 } else if (canraw_sk(sk)->bound)
355                         can_rx_register(dev, 0, MASK_ALL, raw_rcv, sk, IDENT);
356
357                 if (dev)
358                         dev_put(dev);
359
360                 break;
361
362         case CAN_RAW_ERR_FILTER:
363                 if (optlen) {
364                         if (optlen != sizeof(err_mask))
365                                 return -EINVAL;
366                         if (err = copy_from_user(&err_mask, optval, optlen)) {
367                                 return err;
368                         }
369                 }
370
371                 err_mask &= CAN_ERR_MASK;
372
373                 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
374                         dev = dev_get_by_index(canraw_sk(sk)->ifindex);
375
376                 /* remove current error mask */
377                 if (canraw_sk(sk)->err_mask && canraw_sk(sk)->bound)
378                         can_rx_unregister(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk);
379
380                 /* add new error mask */
381                 if (optlen) {
382                         canraw_sk(sk)->err_mask = err_mask;
383                         if (canraw_sk(sk)->err_mask & canraw_sk(sk)->bound)
384                                 can_rx_register(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk, IDENT);
385                 }
386
387                 if (dev)
388                         dev_put(dev);
389
390                 break;
391
392         default:
393                 return -ENOPROTOOPT;
394         }
395         return 0;
396 }
397
398 static int raw_getsockopt(struct socket *sock, int level, int optname,
399                           char *optval, int *optlen)
400 {
401         struct sock *sk = sock->sk;
402         struct can_filter *filter = canraw_sk(sk)->filter;
403         int len;
404
405         if (level != SOL_CAN_RAW)
406                 return -EINVAL;
407
408         switch (optname) {
409         case CAN_RAW_FILTER:
410                 if (get_user(len, optlen))
411                         return -EFAULT;
412
413                 if (filter) {
414                         int filter_size = canraw_sk(sk)->count * sizeof(struct can_filter);
415                         if (len < filter_size)
416                                 return -EINVAL;
417                         if (len > filter_size)
418                                 len = filter_size;
419                         if (copy_to_user(optval, filter, len))
420                                 return -EFAULT;
421                 } else
422                         len = 0;
423                 if (put_user(len, optlen))
424                         return -EFAULT;
425                 break;
426
427         case CAN_RAW_ERR_FILTER:
428                 if (get_user(len, optlen))
429                         return -EFAULT;
430
431                 if (len < sizeof(can_err_mask_t))
432                         return -EINVAL;
433
434                 if (len > sizeof(can_err_mask_t))
435                         len = sizeof(can_err_mask_t);
436
437                 if (copy_to_user(optval, &canraw_sk(sk)->err_mask, len))
438                         return -EFAULT;
439
440                 if (put_user(len, optlen))
441                         return -EFAULT;
442                 break;
443
444         default:
445                 return -ENOPROTOOPT;
446         }
447         return 0;
448 }
449
450 static void raw_add_filters(struct net_device *dev, struct sock *sk)
451 {
452         struct can_filter *filter = canraw_sk(sk)->filter;
453         int i;
454
455         for (i = 0; i < canraw_sk(sk)->count; i++) {
456                 can_rx_register(dev, filter[i].can_id, filter[i].can_mask,
457                                 raw_rcv, sk, IDENT);
458                 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
459                     filter[i].can_id, filter[i].can_mask,
460                     filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
461         }
462 }
463
464 static void raw_remove_filters(struct net_device *dev, struct sock *sk)
465 {
466         struct can_filter *filter = canraw_sk(sk)->filter;
467         int i;
468
469         for (i = 0; i < canraw_sk(sk)->count; i++) {
470                 can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
471                                   raw_rcv, sk);
472                 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
473                     filter[i].can_id, filter[i].can_mask,
474                     filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
475         }
476 }
477
478 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
479                        struct msghdr *msg, size_t size)
480 {
481         struct sock *sk = sock->sk;
482         struct sk_buff *skb;
483         struct net_device *dev;
484         int ifindex;
485         int err;
486
487         DBG("socket %p, sk %p\n", sock, sk);
488
489         if (msg->msg_name) {
490                 struct sockaddr_can *addr = (struct sockaddr_can *)msg->msg_name;
491                 if (addr->can_family != AF_CAN)
492                         return -EINVAL;
493                 ifindex = addr->can_ifindex;
494         } else
495                 ifindex = canraw_sk(sk)->ifindex;
496
497         if (!(dev = dev_get_by_index(ifindex))) {
498                 DBG("device %d not found\n", ifindex);
499                 return -ENXIO;
500         }
501
502         skb = alloc_skb(size, GFP_KERNEL);
503         if ((err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size)) < 0) {
504                 kfree_skb(skb);
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);