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