]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - kernel/2.6/net/can/raw.c
Change can_proto_unregister() and can_rx_unregister() to return void.
[socketcan-devel.git] / kernel / 2.6 / net / can / raw.c
1 /*
2  * raw.c - Raw sockets for protocol family CAN
3  *
4  * Copyright (c) 2002-2007 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/uio.h>
49 #include <linux/poll.h>
50 #include <linux/net.h>
51 #include <linux/netdevice.h>
52 #include <linux/socket.h>
53 #include <linux/if_arp.h>
54 #include <linux/skbuff.h>
55 #include <linux/can.h>
56 #include <linux/can/core.h>
57 #include <linux/can/raw.h>
58 #include <net/sock.h>
59 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
60 #include <net/net_namespace.h>
61 #endif
62
63 #include <linux/can/version.h> /* for RCSID. Removed by mkpatch script */
64 RCSID("$Id$");
65
66 #define IDENT "raw"
67 #define CAN_RAW_VERSION CAN_VERSION
68 static __initdata const char banner[] =
69         KERN_INFO "can: raw protocol (rev " CAN_RAW_VERSION ")\n";
70
71 MODULE_DESCRIPTION("PF_CAN raw protocol");
72 MODULE_LICENSE("Dual BSD/GPL");
73 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
74
75 #ifdef CONFIG_CAN_DEBUG_CORE
76 static int debug;
77 module_param(debug, int, S_IRUGO);
78 MODULE_PARM_DESC(debug, "debug print mask: 1:debug, 2:frames, 4:skbs");
79 #endif
80
81 #ifdef CONFIG_CAN_RAW_USER
82 #define RAW_CAP (-1)
83 #else
84 #define RAW_CAP CAP_NET_RAW
85 #endif
86
87 #define MASK_ALL 0
88
89 /*
90  * A raw socket has a list of can_filters attached to it, each receiving
91  * the CAN frames matching that filter.  If the filter list is empty,
92  * no CAN frames will be received by the socket.  The default after
93  * opening the socket, is to have one filter which receives all frames.
94  * The filter list is allocated dynamically with the exception of the
95  * list containing only one item.  This common case is optimized by
96  * storing the single filter in dfilter, to avoid using dynamic memory.
97  */
98
99 struct raw_sock {
100 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
101         struct sock sk;
102 #else
103         struct sock *sk;
104 #endif
105         int bound;
106         int ifindex;
107         struct notifier_block notifier;
108         int loopback;
109         int recv_own_msgs;
110         int count;                 /* number of active filters */
111         struct can_filter dfilter; /* default/single filter */
112         struct can_filter *filter; /* pointer to filter(s) */
113         can_err_mask_t err_mask;
114 };
115
116 static inline struct raw_sock *raw_sk(const struct sock *sk)
117 {
118 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
119         return (struct raw_sock *)sk;
120 #else
121         return (struct raw_sock *)sk->sk_protinfo;
122 #endif
123 }
124
125 static void raw_rcv(struct sk_buff *skb, void *data)
126 {
127         struct sock *sk = (struct sock *)data;
128         struct raw_sock *ro = raw_sk(sk);
129         struct sockaddr_can *addr;
130         int error;
131
132         DBG("received skbuff %p, sk %p\n", skb, sk);
133         DBG_SKB(skb);
134
135         if (!ro->recv_own_msgs) {
136                 /* check the received tx sock reference */
137                 if (skb->sk == sk) {
138                         DBG("trashed own tx msg\n");
139                         kfree_skb(skb);
140                         return;
141                 }
142         }
143
144         /*
145          *  Put the datagram to the queue so that raw_recvmsg() can
146          *  get it from there.  We need to pass the interface index to
147          *  raw_recvmsg().  We pass a whole struct sockaddr_can in skb->cb
148          *  containing the interface index.
149          */
150
151         BUILD_BUG_ON(sizeof(skb->cb) < sizeof(struct sockaddr_can));
152         addr = (struct sockaddr_can *)skb->cb;
153         memset(addr, 0, sizeof(*addr));
154         addr->can_family  = AF_CAN;
155         addr->can_ifindex = skb->dev->ifindex;
156
157         error = sock_queue_rcv_skb(sk, skb);
158         if (error < 0) {
159                 DBG("sock_queue_rcv_skb failed: %d\n", error);
160                 DBG("freeing skbuff %p\n", skb);
161                 kfree_skb(skb);
162         }
163 }
164
165 static void raw_enable_filters(struct net_device *dev, struct sock *sk)
166 {
167         struct raw_sock *ro = raw_sk(sk);
168         struct can_filter *filter = ro->filter;
169         int i;
170
171         for (i = 0; i < ro->count; i++) {
172                 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
173                     filter[i].can_id, filter[i].can_mask,
174                     filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
175
176                 can_rx_register(dev, filter[i].can_id, filter[i].can_mask,
177                                 raw_rcv, sk, IDENT);
178         }
179 }
180
181 static void raw_enable_errfilter(struct net_device *dev, struct sock *sk)
182 {
183         struct raw_sock *ro = raw_sk(sk);
184
185         if (ro->err_mask)
186                 can_rx_register(dev, 0, ro->err_mask | CAN_ERR_FLAG,
187                                 raw_rcv, sk, IDENT);
188 }
189
190 static void raw_disable_filters(struct net_device *dev, struct sock *sk)
191 {
192         struct raw_sock *ro = raw_sk(sk);
193         struct can_filter *filter = ro->filter;
194         int i;
195
196         for (i = 0; i < ro->count; i++) {
197                 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
198                     filter[i].can_id, filter[i].can_mask,
199                     filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
200
201                 can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
202                                   raw_rcv, sk);
203         }
204 }
205
206 static void raw_disable_errfilter(struct net_device *dev, struct sock *sk)
207 {
208         struct raw_sock *ro = raw_sk(sk);
209
210         if (ro->err_mask)
211                 can_rx_unregister(dev, 0, ro->err_mask | CAN_ERR_FLAG,
212                                   raw_rcv, sk);
213 }
214
215 static int raw_notifier(struct notifier_block *nb,
216                         unsigned long msg, void *data)
217 {
218         struct net_device *dev = (struct net_device *)data;
219         struct raw_sock *ro = container_of(nb, struct raw_sock, notifier);
220 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
221         struct sock *sk = &ro->sk;
222 #else
223         struct sock *sk = ro->sk;
224 #endif
225
226         DBG("msg %ld for dev %p (%s idx %d) sk %p ro->ifindex %d\n",
227             msg, dev, dev->name, dev->ifindex, sk, ro->ifindex);
228
229 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
230         if (dev->nd_net != &init_net)
231                 return NOTIFY_DONE;
232 #endif
233
234         if (dev->type != ARPHRD_CAN)
235                 return NOTIFY_DONE;
236
237         if (ro->ifindex != dev->ifindex)
238                 return NOTIFY_DONE;
239
240         switch (msg) {
241
242         case NETDEV_UNREGISTER:
243                 lock_sock(sk);
244                 /* remove current filters & unregister */
245                 if (ro->bound) {
246                         raw_disable_filters(dev, sk);
247                         raw_disable_errfilter(dev, sk);
248                 }
249
250                 if (ro->count > 1)
251                         kfree(ro->filter);
252
253                 ro->ifindex = 0;
254                 ro->bound   = 0;
255                 ro->count   = 0;
256                 release_sock(sk);
257
258                 sk->sk_err = ENODEV;
259                 if (!sock_flag(sk, SOCK_DEAD))
260                         sk->sk_error_report(sk);
261                 break;
262
263         case NETDEV_DOWN:
264                 sk->sk_err = ENETDOWN;
265                 if (!sock_flag(sk, SOCK_DEAD))
266                         sk->sk_error_report(sk);
267                 break;
268         }
269
270         return NOTIFY_DONE;
271 }
272
273 static int raw_init(struct sock *sk)
274 {
275         struct raw_sock *ro = raw_sk(sk);
276
277 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12)
278         ro->sk               = sk;
279 #endif
280         ro->bound            = 0;
281         ro->ifindex          = 0;
282
283         /* set default filter to single entry dfilter */
284         ro->dfilter.can_id   = 0;
285         ro->dfilter.can_mask = MASK_ALL;
286         ro->filter           = &ro->dfilter;
287         ro->count            = 1;
288
289         /* set default loopback behaviour */
290         ro->loopback         = 1;
291         ro->recv_own_msgs    = 0;
292
293         /* set notifier */
294         ro->notifier.notifier_call = raw_notifier;
295
296         register_netdevice_notifier(&ro->notifier);
297
298         return 0;
299 }
300
301 static int raw_release(struct socket *sock)
302 {
303         struct sock *sk = sock->sk;
304         struct raw_sock *ro = raw_sk(sk);
305
306         DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
307             atomic_read(&sk->sk_refcnt));
308
309         unregister_netdevice_notifier(&ro->notifier);
310
311         lock_sock(sk);
312
313         /* remove current filters & unregister */
314         if (ro->bound) {
315                 if (ro->ifindex) {
316                         struct net_device *dev;
317
318 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
319                         dev = dev_get_by_index(&init_net, ro->ifindex);
320 #else
321                         dev = dev_get_by_index(ro->ifindex);
322 #endif
323                         if (dev) {
324                                 raw_disable_filters(dev, sk);
325                                 raw_disable_errfilter(dev, sk);
326                                 dev_put(dev);
327                         }
328                 } else {
329                         raw_disable_filters(NULL, sk);
330                         raw_disable_errfilter(NULL, sk);
331                 }
332         }
333
334         if (ro->count > 1)
335                 kfree(ro->filter);
336
337         ro->ifindex = 0;
338         ro->bound   = 0;
339         ro->count   = 0;
340
341         release_sock(sk);
342         sock_put(sk);
343
344         return 0;
345 }
346
347 static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
348 {
349         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
350         struct sock *sk = sock->sk;
351         struct raw_sock *ro = raw_sk(sk);
352         int err = 0;
353         int notify_enetdown = 0;
354
355         DBG("socket %p to device %d\n", sock, addr->can_ifindex);
356
357         if (len < sizeof(*addr))
358                 return -EINVAL;
359
360         lock_sock(sk);
361
362         if (ro->bound) {
363                 /* unregister current filters for this device */
364                 if (ro->ifindex) {
365                         struct net_device *dev;
366
367 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
368                         dev = dev_get_by_index(&init_net, ro->ifindex);
369 #else
370                         dev = dev_get_by_index(ro->ifindex);
371 #endif
372                         if (dev) {
373                                 raw_disable_filters(dev, sk);
374                                 raw_disable_errfilter(dev, sk);
375                                 dev_put(dev);
376                         }
377                         ro->ifindex = 0;
378
379                 } else {
380                         raw_disable_filters(NULL, sk);
381                         raw_disable_errfilter(NULL, sk);
382                 }
383
384                 ro->bound = 0;
385         }
386
387         if (addr->can_ifindex) {
388                 struct net_device *dev;
389
390 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
391                 dev = dev_get_by_index(&init_net, addr->can_ifindex);
392 #else
393                 dev = dev_get_by_index(addr->can_ifindex);
394 #endif
395                 if (!dev) {
396                         DBG("could not find device %d\n", addr->can_ifindex);
397                         err = -ENODEV;
398                         goto out;
399                 }
400                 if (dev->type != ARPHRD_CAN) {
401                         DBG("device %d no CAN device\n", addr->can_ifindex);
402                         dev_put(dev);
403                         err = -ENODEV;
404                         goto out;
405                 }
406                 if (!(dev->flags & IFF_UP))
407                         notify_enetdown = 1;
408
409                 ro->ifindex = dev->ifindex;
410
411                 /* filters set by default/setsockopt */
412                 raw_enable_filters(dev, sk);
413                 raw_enable_errfilter(dev, sk);
414                 dev_put(dev);
415
416         } else {
417                 ro->ifindex = 0;
418
419                 /* filters set by default/setsockopt */
420                 raw_enable_filters(NULL, sk);
421                 raw_enable_errfilter(NULL, sk);
422         }
423
424         ro->bound = 1;
425
426  out:
427         release_sock(sk);
428
429         if (notify_enetdown) {
430                 sk->sk_err = ENETDOWN;
431                 if (!sock_flag(sk, SOCK_DEAD))
432                         sk->sk_error_report(sk);
433         }
434
435         return err;
436 }
437
438 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
439                        int *len, int peer)
440 {
441         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
442         struct sock *sk = sock->sk;
443         struct raw_sock *ro = raw_sk(sk);
444
445         if (peer)
446                 return -EOPNOTSUPP;
447
448         addr->can_family  = AF_CAN;
449         addr->can_ifindex = ro->ifindex;
450
451         *len = sizeof(*addr);
452
453         return 0;
454 }
455
456 static unsigned int raw_poll(struct file *file, struct socket *sock,
457                              poll_table *wait)
458 {
459         unsigned int mask = 0;
460
461         DBG("socket %p\n", sock);
462
463         mask = datagram_poll(file, sock, wait);
464         return mask;
465 }
466
467 static int raw_setsockopt(struct socket *sock, int level, int optname,
468                           char __user *optval, int optlen)
469 {
470         struct sock *sk = sock->sk;
471         struct raw_sock *ro = raw_sk(sk);
472         struct can_filter *filter = NULL;  /* dyn. alloc'ed filters */
473         struct can_filter sfilter;         /* single filter */
474         struct net_device *dev = NULL;
475         can_err_mask_t err_mask = 0;
476         int count = 0;
477         int err;
478
479         if (level != SOL_CAN_RAW)
480                 return -EINVAL;
481         if (optlen < 0)
482                 return -EINVAL;
483
484         switch (optname) {
485
486         case CAN_RAW_FILTER:
487                 if (optlen % sizeof(struct can_filter) != 0)
488                         return -EINVAL;
489
490                 count = optlen / sizeof(struct can_filter);
491
492                 if (count > 1) {
493                         /* filter does not fit into dfilter => alloc space */
494                         filter = kmalloc(optlen, GFP_KERNEL);
495                         if (!filter)
496                                 return -ENOMEM;
497
498                         err = copy_from_user(filter, optval, optlen);
499                         if (err) {
500                                 kfree(filter);
501                                 return err;
502                         }
503                 } else if (count == 1) {
504                         err = copy_from_user(&sfilter, optval, optlen);
505                         if (err)
506                                 return err;
507                 }
508
509                 lock_sock(sk);
510
511                 if (ro->bound && ro->ifindex)
512 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
513                         dev = dev_get_by_index(&init_net, ro->ifindex);
514 #else
515                         dev = dev_get_by_index(ro->ifindex);
516 #endif
517
518                 /* remove current filters & unregister */
519                 if (ro->bound)
520                         raw_disable_filters(dev, sk);
521
522                 if (ro->count > 1)
523                         kfree(ro->filter);
524
525                 if (count == 1) {
526                         /* copy filter data for single filter */
527                         ro->dfilter = sfilter;
528                         filter = &ro->dfilter;
529                 }
530
531                 /* add new filters & register */
532                 ro->filter = filter;
533                 ro->count  = count;
534                 if (ro->bound)
535                         raw_enable_filters(dev, sk);
536
537                 if (dev)
538                         dev_put(dev);
539
540                 release_sock(sk);
541
542                 break;
543
544         case CAN_RAW_ERR_FILTER:
545                 if (optlen != sizeof(err_mask))
546                         return -EINVAL;
547
548                 err = copy_from_user(&err_mask, optval, optlen);
549                 if (err)
550                         return err;
551
552                 err_mask &= CAN_ERR_MASK;
553
554                 lock_sock(sk);
555
556                 if (ro->bound && ro->ifindex)
557 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
558                         dev = dev_get_by_index(&init_net, ro->ifindex);
559 #else
560                         dev = dev_get_by_index(ro->ifindex);
561 #endif
562
563                 /* remove current error mask */
564                 if (ro->bound)
565                         raw_disable_errfilter(dev, sk);
566
567                 ro->err_mask = err_mask;
568
569                 /* add new error mask */
570                 if (ro->bound)
571                         raw_enable_errfilter(dev, sk);
572
573                 if (dev)
574                         dev_put(dev);
575
576                 release_sock(sk);
577
578                 break;
579
580         case CAN_RAW_LOOPBACK:
581                 if (optlen != sizeof(ro->loopback))
582                         return -EINVAL;
583
584                 err = copy_from_user(&ro->loopback, optval, optlen);
585                 if (err)
586                         return err;
587
588                 break;
589
590         case CAN_RAW_RECV_OWN_MSGS:
591                 if (optlen != sizeof(ro->recv_own_msgs))
592                         return -EINVAL;
593
594                 err = copy_from_user(&ro->recv_own_msgs, optval, optlen);
595                 if (err)
596                         return err;
597
598                 break;
599
600         default:
601                 return -ENOPROTOOPT;
602         }
603         return 0;
604 }
605
606 static int raw_getsockopt(struct socket *sock, int level, int optname,
607                           char __user *optval, int __user *optlen)
608 {
609         struct sock *sk = sock->sk;
610         struct raw_sock *ro = raw_sk(sk);
611         int len;
612         void *val;
613         int err = 0;
614
615         if (level != SOL_CAN_RAW)
616                 return -EINVAL;
617         if (get_user(len, optlen))
618                 return -EFAULT;
619         if (len < 0)
620                 return -EINVAL;
621
622         switch (optname) {
623
624         case CAN_RAW_FILTER:
625                 lock_sock(sk);
626                 if (ro->count > 0) {
627                         int fsize = ro->count * sizeof(struct can_filter);
628                         if (len > fsize)
629                                 len = fsize;
630                         err = copy_to_user(optval, ro->filter, len);
631                 } else
632                         len = 0;
633                 release_sock(sk);
634
635                 if (!err)
636                         err = put_user(len, optlen);
637                 return err;
638
639         case CAN_RAW_ERR_FILTER:
640                 if (len > sizeof(can_err_mask_t))
641                         len = sizeof(can_err_mask_t);
642                 val = &ro->err_mask;
643                 break;
644
645         case CAN_RAW_LOOPBACK:
646                 if (len > sizeof(int))
647                         len = sizeof(int);
648                 val = &ro->loopback;
649                 break;
650
651         case CAN_RAW_RECV_OWN_MSGS:
652                 if (len > sizeof(int))
653                         len = sizeof(int);
654                 val = &ro->recv_own_msgs;
655                 break;
656
657         default:
658                 return -ENOPROTOOPT;
659         }
660
661         if (put_user(len, optlen))
662                 return -EFAULT;
663         if (copy_to_user(optval, val, len))
664                 return -EFAULT;
665         return 0;
666 }
667
668 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
669                        struct msghdr *msg, size_t size)
670 {
671         struct sock *sk = sock->sk;
672         struct raw_sock *ro = raw_sk(sk);
673         struct sk_buff *skb;
674         struct net_device *dev;
675         int ifindex;
676         int err;
677
678         DBG("socket %p, sk %p\n", sock, sk);
679
680         if (msg->msg_name) {
681                 struct sockaddr_can *addr =
682                         (struct sockaddr_can *)msg->msg_name;
683
684                 if (addr->can_family != AF_CAN)
685                         return -EINVAL;
686
687                 ifindex = addr->can_ifindex;
688         } else
689                 ifindex = ro->ifindex;
690
691 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
692         dev = dev_get_by_index(&init_net, ifindex);
693 #else
694         dev = dev_get_by_index(ifindex);
695 #endif
696         if (!dev) {
697                 DBG("device %d not found\n", ifindex);
698                 return -ENXIO;
699         }
700
701         skb = alloc_skb(size, GFP_KERNEL);
702         if (!skb) {
703                 dev_put(dev);
704                 return -ENOMEM;
705         }
706
707         err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
708         if (err < 0) {
709                 kfree_skb(skb);
710                 dev_put(dev);
711                 return err;
712         }
713         skb->dev = dev;
714         skb->sk  = sk;
715
716         DBG("sending skbuff to interface %d\n", ifindex);
717         DBG_SKB(skb);
718
719         err = can_send(skb, ro->loopback);
720
721         dev_put(dev);
722
723         if (err)
724                 return err;
725
726         return size;
727 }
728
729 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
730                        struct msghdr *msg, size_t size, int flags)
731 {
732         struct sock *sk = sock->sk;
733         struct sk_buff *skb;
734         int error = 0;
735         int noblock;
736
737         DBG("socket %p, sk %p\n", sock, sk);
738
739         noblock =  flags & MSG_DONTWAIT;
740         flags   &= ~MSG_DONTWAIT;
741
742         skb = skb_recv_datagram(sk, flags, noblock, &error);
743         if (!skb)
744                 return error;
745
746         DBG("delivering skbuff %p\n", skb);
747         DBG_SKB(skb);
748
749         if (size < skb->len)
750                 msg->msg_flags |= MSG_TRUNC;
751         else
752                 size = skb->len;
753
754         error = memcpy_toiovec(msg->msg_iov, skb->data, size);
755         if (error < 0) {
756                 skb_free_datagram(sk, skb);
757                 return error;
758         }
759
760         sock_recv_timestamp(msg, sk, skb);
761
762         if (msg->msg_name) {
763                 msg->msg_namelen = sizeof(struct sockaddr_can);
764                 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
765         }
766
767         DBG("freeing sock %p, skbuff %p\n", sk, skb);
768         skb_free_datagram(sk, skb);
769
770         return size;
771 }
772
773 static struct proto_ops raw_ops __read_mostly = {
774         .family        = PF_CAN,
775         .release       = raw_release,
776         .bind          = raw_bind,
777         .connect       = sock_no_connect,
778         .socketpair    = sock_no_socketpair,
779         .accept        = sock_no_accept,
780         .getname       = raw_getname,
781         .poll          = raw_poll,
782         .ioctl         = NULL,          /* use can_ioctl() from af_can.c */
783         .listen        = sock_no_listen,
784         .shutdown      = sock_no_shutdown,
785         .setsockopt    = raw_setsockopt,
786         .getsockopt    = raw_getsockopt,
787         .sendmsg       = raw_sendmsg,
788         .recvmsg       = raw_recvmsg,
789         .mmap          = sock_no_mmap,
790         .sendpage      = sock_no_sendpage,
791 };
792
793 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
794 static struct proto raw_proto __read_mostly = {
795         .name       = "CAN_RAW",
796         .owner      = THIS_MODULE,
797         .obj_size   = sizeof(struct raw_sock),
798         .init       = raw_init,
799 };
800
801 static struct can_proto raw_can_proto __read_mostly = {
802         .type       = SOCK_RAW,
803         .protocol   = CAN_RAW,
804         .capability = RAW_CAP,
805         .ops        = &raw_ops,
806         .prot       = &raw_proto,
807 };
808 #else
809 static struct can_proto raw_can_proto __read_mostly = {
810         .type       = SOCK_RAW,
811         .protocol   = CAN_RAW,
812         .capability = RAW_CAP,
813         .ops        = &raw_ops,
814         .owner      = THIS_MODULE,
815         .obj_size   = sizeof(struct raw_sock),
816         .init       = raw_init,
817 };
818 #endif
819
820 static __init int raw_module_init(void)
821 {
822         int err;
823
824         printk(banner);
825
826         err = can_proto_register(&raw_can_proto);
827         if (err < 0)
828                 printk(KERN_ERR "can: registration of raw protocol failed\n");
829
830         return err;
831 }
832
833 static __exit void raw_module_exit(void)
834 {
835         can_proto_unregister(&raw_can_proto);
836 }
837
838 module_init(raw_module_init);
839 module_exit(raw_module_exit);