]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - kernel/2.6/net/can/raw.c
Introduced error handling in the case of can_rx_register() failure.
[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 int raw_enable_filters(struct net_device *dev, struct sock *sk,
166                               struct can_filter *filter,
167                               int count)
168 {
169         int err = 0;
170         int i;
171
172         for (i = 0; i < count; i++) {
173                 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
174                     filter[i].can_id, filter[i].can_mask,
175                     filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
176
177                 err = can_rx_register(dev, filter[i].can_id,
178                                       filter[i].can_mask,
179                                       raw_rcv, sk, IDENT);
180
181                 if (err) {
182                         /* clean up successfully registered filters */
183                         while (--i >= 0)
184                                 can_rx_unregister(dev, filter[i].can_id,
185                                                   filter[i].can_mask,
186                                                   raw_rcv, sk);
187                         break;
188                 }
189         }
190
191         return err;
192 }
193
194 static int raw_enable_errfilter(struct net_device *dev, struct sock *sk,
195                                 can_err_mask_t err_mask)
196 {
197         int err = 0;
198
199         if (err_mask)
200                 err = can_rx_register(dev, 0, err_mask | CAN_ERR_FLAG,
201                                       raw_rcv, sk, IDENT);
202
203         return err;
204 }
205
206 static void raw_disable_filters(struct net_device *dev, struct sock *sk,
207                               struct can_filter *filter,
208                               int count)
209 {
210         int i;
211
212         for (i = 0; i < count; i++) {
213                 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
214                     filter[i].can_id, filter[i].can_mask,
215                     filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
216
217                 can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
218                                   raw_rcv, sk);
219         }
220 }
221
222 static inline void raw_disable_errfilter(struct net_device *dev,
223                                          struct sock *sk,
224                                          can_err_mask_t err_mask)
225
226 {
227         if (err_mask)
228                 can_rx_unregister(dev, 0, err_mask | CAN_ERR_FLAG,
229                                   raw_rcv, sk);
230 }
231
232 static inline void raw_disable_allfilters(struct net_device *dev,
233                                           struct sock *sk)
234 {
235         struct raw_sock *ro = raw_sk(sk);
236
237         raw_disable_filters(dev, sk, ro->filter, ro->count);
238         raw_disable_errfilter(dev, sk, ro->err_mask);
239 }
240
241 static int raw_enable_allfilters(struct net_device *dev, struct sock *sk)
242 {
243         struct raw_sock *ro = raw_sk(sk);
244         int err;
245
246         err = raw_enable_filters(dev, sk, ro->filter, ro->count);
247         if (!err) {
248                 err = raw_enable_errfilter(dev, sk, ro->err_mask);
249                 if (err)
250                         raw_disable_filters(dev, sk, ro->filter, ro->count);
251         }
252
253         return err;
254 }
255
256 static int raw_notifier(struct notifier_block *nb,
257                         unsigned long msg, void *data)
258 {
259         struct net_device *dev = (struct net_device *)data;
260         struct raw_sock *ro = container_of(nb, struct raw_sock, notifier);
261 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
262         struct sock *sk = &ro->sk;
263 #else
264         struct sock *sk = ro->sk;
265 #endif
266
267         DBG("msg %ld for dev %p (%s idx %d) sk %p ro->ifindex %d\n",
268             msg, dev, dev->name, dev->ifindex, sk, ro->ifindex);
269
270 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
271         if (dev->nd_net != &init_net)
272                 return NOTIFY_DONE;
273 #endif
274
275         if (dev->type != ARPHRD_CAN)
276                 return NOTIFY_DONE;
277
278         if (ro->ifindex != dev->ifindex)
279                 return NOTIFY_DONE;
280
281         switch (msg) {
282
283         case NETDEV_UNREGISTER:
284                 lock_sock(sk);
285                 /* remove current filters & unregister */
286                 if (ro->bound)
287                         raw_disable_allfilters(dev, sk);
288
289                 if (ro->count > 1)
290                         kfree(ro->filter);
291
292                 ro->ifindex = 0;
293                 ro->bound   = 0;
294                 ro->count   = 0;
295                 release_sock(sk);
296
297                 sk->sk_err = ENODEV;
298                 if (!sock_flag(sk, SOCK_DEAD))
299                         sk->sk_error_report(sk);
300                 break;
301
302         case NETDEV_DOWN:
303                 sk->sk_err = ENETDOWN;
304                 if (!sock_flag(sk, SOCK_DEAD))
305                         sk->sk_error_report(sk);
306                 break;
307         }
308
309         return NOTIFY_DONE;
310 }
311
312 static int raw_init(struct sock *sk)
313 {
314         struct raw_sock *ro = raw_sk(sk);
315
316 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12)
317         ro->sk               = sk;
318 #endif
319         ro->bound            = 0;
320         ro->ifindex          = 0;
321
322         /* set default filter to single entry dfilter */
323         ro->dfilter.can_id   = 0;
324         ro->dfilter.can_mask = MASK_ALL;
325         ro->filter           = &ro->dfilter;
326         ro->count            = 1;
327
328         /* set default loopback behaviour */
329         ro->loopback         = 1;
330         ro->recv_own_msgs    = 0;
331
332         /* set notifier */
333         ro->notifier.notifier_call = raw_notifier;
334
335         register_netdevice_notifier(&ro->notifier);
336
337         return 0;
338 }
339
340 static int raw_release(struct socket *sock)
341 {
342         struct sock *sk = sock->sk;
343         struct raw_sock *ro = raw_sk(sk);
344
345         DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
346             atomic_read(&sk->sk_refcnt));
347
348         unregister_netdevice_notifier(&ro->notifier);
349
350         lock_sock(sk);
351
352         /* remove current filters & unregister */
353         if (ro->bound) {
354                 if (ro->ifindex) {
355                         struct net_device *dev;
356
357 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
358                         dev = dev_get_by_index(&init_net, ro->ifindex);
359 #else
360                         dev = dev_get_by_index(ro->ifindex);
361 #endif
362                         if (dev) {
363                                 raw_disable_allfilters(dev, sk);
364                                 dev_put(dev);
365                         }
366                 } else
367                         raw_disable_allfilters(NULL, sk);
368         }
369
370         if (ro->count > 1)
371                 kfree(ro->filter);
372
373         ro->ifindex = 0;
374         ro->bound   = 0;
375         ro->count   = 0;
376
377         release_sock(sk);
378         sock_put(sk);
379
380         return 0;
381 }
382
383 static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
384 {
385         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
386         struct sock *sk = sock->sk;
387         struct raw_sock *ro = raw_sk(sk);
388         int ifindex;
389         int err = 0;
390         int notify_enetdown = 0;
391
392         DBG("socket %p to device %d\n", sock, addr->can_ifindex);
393
394         if (len < sizeof(*addr))
395                 return -EINVAL;
396
397         lock_sock(sk);
398
399         if (ro->bound && addr->can_ifindex == ro->ifindex)
400                 goto out;
401
402         if (addr->can_ifindex) {
403                 struct net_device *dev;
404
405 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
406                 dev = dev_get_by_index(&init_net, addr->can_ifindex);
407 #else
408                 dev = dev_get_by_index(addr->can_ifindex);
409 #endif
410                 if (!dev) {
411                         DBG("could not find device %d\n", addr->can_ifindex);
412                         err = -ENODEV;
413                         goto out;
414                 }
415                 if (dev->type != ARPHRD_CAN) {
416                         DBG("device %d no CAN device\n", addr->can_ifindex);
417                         dev_put(dev);
418                         err = -ENODEV;
419                         goto out;
420                 }
421                 if (!(dev->flags & IFF_UP))
422                         notify_enetdown = 1;
423
424                 ifindex = dev->ifindex;
425
426                 /* filters set by default/setsockopt */
427                 err = raw_enable_allfilters(dev, sk);
428                 dev_put(dev);
429
430         } else {
431                 ifindex = 0;
432
433                 /* filters set by default/setsockopt */
434                 err = raw_enable_allfilters(NULL, sk);
435         }
436
437         if (!err) {
438                 if (ro->bound) {
439                         /* unregister old filters */
440                         if (ro->ifindex) {
441                                 struct net_device *dev;
442
443 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
444                                 dev = dev_get_by_index(&init_net, ro->ifindex);
445 #else
446                                 dev = dev_get_by_index(ro->ifindex);
447 #endif
448                                 if (dev) {
449                                         raw_disable_allfilters(dev, sk);
450                                         dev_put(dev);
451                                 }
452                         } else
453                                 raw_disable_allfilters(NULL, sk);
454                 }
455                 ro->ifindex = ifindex;
456                 ro->bound = 1;
457         }
458
459  out:
460         release_sock(sk);
461
462         if (notify_enetdown) {
463                 sk->sk_err = ENETDOWN;
464                 if (!sock_flag(sk, SOCK_DEAD))
465                         sk->sk_error_report(sk);
466         }
467
468         return err;
469 }
470
471 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
472                        int *len, int peer)
473 {
474         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
475         struct sock *sk = sock->sk;
476         struct raw_sock *ro = raw_sk(sk);
477
478         if (peer)
479                 return -EOPNOTSUPP;
480
481         addr->can_family  = AF_CAN;
482         addr->can_ifindex = ro->ifindex;
483
484         *len = sizeof(*addr);
485
486         return 0;
487 }
488
489 static unsigned int raw_poll(struct file *file, struct socket *sock,
490                              poll_table *wait)
491 {
492         unsigned int mask = 0;
493
494         DBG("socket %p\n", sock);
495
496         mask = datagram_poll(file, sock, wait);
497         return mask;
498 }
499
500 static int raw_setsockopt(struct socket *sock, int level, int optname,
501                           char __user *optval, int optlen)
502 {
503         struct sock *sk = sock->sk;
504         struct raw_sock *ro = raw_sk(sk);
505         struct can_filter *filter = NULL;  /* dyn. alloc'ed filters */
506         struct can_filter sfilter;         /* single filter */
507         struct net_device *dev = NULL;
508         can_err_mask_t err_mask = 0;
509         int count = 0;
510         int err = 0;
511
512         if (level != SOL_CAN_RAW)
513                 return -EINVAL;
514         if (optlen < 0)
515                 return -EINVAL;
516
517         switch (optname) {
518
519         case CAN_RAW_FILTER:
520                 if (optlen % sizeof(struct can_filter) != 0)
521                         return -EINVAL;
522
523                 count = optlen / sizeof(struct can_filter);
524
525                 if (count > 1) {
526                         /* filter does not fit into dfilter => alloc space */
527                         filter = kmalloc(optlen, GFP_KERNEL);
528                         if (!filter)
529                                 return -ENOMEM;
530
531                         err = copy_from_user(filter, optval, optlen);
532                         if (err) {
533                                 kfree(filter);
534                                 return err;
535                         }
536                 } else if (count == 1) {
537                         err = copy_from_user(&sfilter, optval, optlen);
538                         if (err)
539                                 return err;
540                 }
541
542                 lock_sock(sk);
543
544                 if (ro->bound && ro->ifindex)
545 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
546                         dev = dev_get_by_index(&init_net, ro->ifindex);
547 #else
548                         dev = dev_get_by_index(ro->ifindex);
549 #endif
550
551                 if (ro->bound) {
552                         /* (try to) register the new filters */
553                         if (count == 1)
554                                 err = raw_enable_filters(dev, sk, &sfilter, 1);
555                         else
556                                 err = raw_enable_filters(dev, sk, filter,
557                                                          count);
558                         if (err) {
559                                 if (count > 1)
560                                         kfree(filter);
561
562                                 goto out_fil;
563                         }
564
565                         /* remove old filter registrations */
566                         raw_disable_filters(dev, sk, ro->filter, ro->count);
567                 }
568
569                 /* remove old filter space */
570                 if (ro->count > 1)
571                         kfree(ro->filter);
572
573                 /* link new filters to the socket */
574                 if (count == 1) {
575                         /* copy filter data for single filter */
576                         ro->dfilter = sfilter;
577                         filter = &ro->dfilter;
578                 }
579                 ro->filter = filter;
580                 ro->count  = count;
581
582  out_fil:
583                 if (dev)
584                         dev_put(dev);
585
586                 release_sock(sk);
587
588                 break;
589
590         case CAN_RAW_ERR_FILTER:
591                 if (optlen != sizeof(err_mask))
592                         return -EINVAL;
593
594                 err = copy_from_user(&err_mask, optval, optlen);
595                 if (err)
596                         return err;
597
598                 err_mask &= CAN_ERR_MASK;
599
600                 lock_sock(sk);
601
602                 if (ro->bound && ro->ifindex)
603 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
604                         dev = dev_get_by_index(&init_net, ro->ifindex);
605 #else
606                         dev = dev_get_by_index(ro->ifindex);
607 #endif
608
609                 /* remove current error mask */
610                 if (ro->bound) {
611                         /* (try to) register the new err_mask */
612                         err = raw_enable_errfilter(dev, sk, err_mask);
613
614                         if (err)
615                                 goto out_err;
616
617                         /* remove old err_mask registration */
618                         raw_disable_errfilter(dev, sk, ro->err_mask);
619                 }
620
621                 /* link new err_mask to the socket */
622                 ro->err_mask = err_mask;
623
624  out_err:
625                 if (dev)
626                         dev_put(dev);
627
628                 release_sock(sk);
629
630                 break;
631
632         case CAN_RAW_LOOPBACK:
633                 if (optlen != sizeof(ro->loopback))
634                         return -EINVAL;
635
636                 err = copy_from_user(&ro->loopback, optval, optlen);
637
638                 break;
639
640         case CAN_RAW_RECV_OWN_MSGS:
641                 if (optlen != sizeof(ro->recv_own_msgs))
642                         return -EINVAL;
643
644                 err = copy_from_user(&ro->recv_own_msgs, optval, optlen);
645
646                 break;
647
648         default:
649                 return -ENOPROTOOPT;
650         }
651         return err;
652 }
653
654 static int raw_getsockopt(struct socket *sock, int level, int optname,
655                           char __user *optval, int __user *optlen)
656 {
657         struct sock *sk = sock->sk;
658         struct raw_sock *ro = raw_sk(sk);
659         int len;
660         void *val;
661         int err = 0;
662
663         if (level != SOL_CAN_RAW)
664                 return -EINVAL;
665         if (get_user(len, optlen))
666                 return -EFAULT;
667         if (len < 0)
668                 return -EINVAL;
669
670         switch (optname) {
671
672         case CAN_RAW_FILTER:
673                 lock_sock(sk);
674                 if (ro->count > 0) {
675                         int fsize = ro->count * sizeof(struct can_filter);
676                         if (len > fsize)
677                                 len = fsize;
678                         err = copy_to_user(optval, ro->filter, len);
679                 } else
680                         len = 0;
681                 release_sock(sk);
682
683                 if (!err)
684                         err = put_user(len, optlen);
685                 return err;
686
687         case CAN_RAW_ERR_FILTER:
688                 if (len > sizeof(can_err_mask_t))
689                         len = sizeof(can_err_mask_t);
690                 val = &ro->err_mask;
691                 break;
692
693         case CAN_RAW_LOOPBACK:
694                 if (len > sizeof(int))
695                         len = sizeof(int);
696                 val = &ro->loopback;
697                 break;
698
699         case CAN_RAW_RECV_OWN_MSGS:
700                 if (len > sizeof(int))
701                         len = sizeof(int);
702                 val = &ro->recv_own_msgs;
703                 break;
704
705         default:
706                 return -ENOPROTOOPT;
707         }
708
709         if (put_user(len, optlen))
710                 return -EFAULT;
711         if (copy_to_user(optval, val, len))
712                 return -EFAULT;
713         return 0;
714 }
715
716 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
717                        struct msghdr *msg, size_t size)
718 {
719         struct sock *sk = sock->sk;
720         struct raw_sock *ro = raw_sk(sk);
721         struct sk_buff *skb;
722         struct net_device *dev;
723         int ifindex;
724         int err;
725
726         DBG("socket %p, sk %p\n", sock, sk);
727
728         if (msg->msg_name) {
729                 struct sockaddr_can *addr =
730                         (struct sockaddr_can *)msg->msg_name;
731
732                 if (addr->can_family != AF_CAN)
733                         return -EINVAL;
734
735                 ifindex = addr->can_ifindex;
736         } else
737                 ifindex = ro->ifindex;
738
739 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
740         dev = dev_get_by_index(&init_net, ifindex);
741 #else
742         dev = dev_get_by_index(ifindex);
743 #endif
744         if (!dev) {
745                 DBG("device %d not found\n", ifindex);
746                 return -ENXIO;
747         }
748
749         skb = alloc_skb(size, GFP_KERNEL);
750         if (!skb) {
751                 dev_put(dev);
752                 return -ENOMEM;
753         }
754
755         err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
756         if (err < 0) {
757                 kfree_skb(skb);
758                 dev_put(dev);
759                 return err;
760         }
761         skb->dev = dev;
762         skb->sk  = sk;
763
764         DBG("sending skbuff to interface %d\n", ifindex);
765         DBG_SKB(skb);
766
767         err = can_send(skb, ro->loopback);
768
769         dev_put(dev);
770
771         if (err)
772                 return err;
773
774         return size;
775 }
776
777 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
778                        struct msghdr *msg, size_t size, int flags)
779 {
780         struct sock *sk = sock->sk;
781         struct sk_buff *skb;
782         int error = 0;
783         int noblock;
784
785         DBG("socket %p, sk %p\n", sock, sk);
786
787         noblock =  flags & MSG_DONTWAIT;
788         flags   &= ~MSG_DONTWAIT;
789
790         skb = skb_recv_datagram(sk, flags, noblock, &error);
791         if (!skb)
792                 return error;
793
794         DBG("delivering skbuff %p\n", skb);
795         DBG_SKB(skb);
796
797         if (size < skb->len)
798                 msg->msg_flags |= MSG_TRUNC;
799         else
800                 size = skb->len;
801
802         error = memcpy_toiovec(msg->msg_iov, skb->data, size);
803         if (error < 0) {
804                 skb_free_datagram(sk, skb);
805                 return error;
806         }
807
808         sock_recv_timestamp(msg, sk, skb);
809
810         if (msg->msg_name) {
811                 msg->msg_namelen = sizeof(struct sockaddr_can);
812                 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
813         }
814
815         DBG("freeing sock %p, skbuff %p\n", sk, skb);
816         skb_free_datagram(sk, skb);
817
818         return size;
819 }
820
821 static struct proto_ops raw_ops __read_mostly = {
822         .family        = PF_CAN,
823         .release       = raw_release,
824         .bind          = raw_bind,
825         .connect       = sock_no_connect,
826         .socketpair    = sock_no_socketpair,
827         .accept        = sock_no_accept,
828         .getname       = raw_getname,
829         .poll          = raw_poll,
830         .ioctl         = NULL,          /* use can_ioctl() from af_can.c */
831         .listen        = sock_no_listen,
832         .shutdown      = sock_no_shutdown,
833         .setsockopt    = raw_setsockopt,
834         .getsockopt    = raw_getsockopt,
835         .sendmsg       = raw_sendmsg,
836         .recvmsg       = raw_recvmsg,
837         .mmap          = sock_no_mmap,
838         .sendpage      = sock_no_sendpage,
839 };
840
841 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
842 static struct proto raw_proto __read_mostly = {
843         .name       = "CAN_RAW",
844         .owner      = THIS_MODULE,
845         .obj_size   = sizeof(struct raw_sock),
846         .init       = raw_init,
847 };
848
849 static struct can_proto raw_can_proto __read_mostly = {
850         .type       = SOCK_RAW,
851         .protocol   = CAN_RAW,
852         .capability = RAW_CAP,
853         .ops        = &raw_ops,
854         .prot       = &raw_proto,
855 };
856 #else
857 static struct can_proto raw_can_proto __read_mostly = {
858         .type       = SOCK_RAW,
859         .protocol   = CAN_RAW,
860         .capability = RAW_CAP,
861         .ops        = &raw_ops,
862         .owner      = THIS_MODULE,
863         .obj_size   = sizeof(struct raw_sock),
864         .init       = raw_init,
865 };
866 #endif
867
868 static __init int raw_module_init(void)
869 {
870         int err;
871
872         printk(banner);
873
874         err = can_proto_register(&raw_can_proto);
875         if (err < 0)
876                 printk(KERN_ERR "can: registration of raw protocol failed\n");
877
878         return err;
879 }
880
881 static __exit void raw_module_exit(void)
882 {
883         can_proto_unregister(&raw_can_proto);
884 }
885
886 module_init(raw_module_init);
887 module_exit(raw_module_exit);