]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - kernel/2.6/net/can/raw.c
Added / corrected some error handlings in the case of failing mallocs and
[socketcan-devel.git] / kernel / 2.6 / net / can / raw.c
1 /*
2  * raw.c
3  *
4  * Copyright (c) 2002-2005 Volkswagen Group Electronic Research
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions, the following disclaimer and
12  *    the referenced file 'COPYING'.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of Volkswagen nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * Alternatively, provided that this notice is retained in full, this
21  * software may be distributed under the terms of the GNU General
22  * Public License ("GPL") version 2 as distributed in the 'COPYING'
23  * file from the main directory of the linux kernel source.
24  *
25  * The provided data structures and external interfaces from this code
26  * are not restricted to be used by modules with a GPL compatible license.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
39  * DAMAGE.
40  *
41  * Send feedback to <socketcan-users@lists.berlios.de>
42  *
43  */
44
45 #include <linux/config.h>
46 #include <linux/module.h>
47 #include <linux/version.h>
48 #include <linux/init.h>
49 #include <linux/net.h>
50 #include <linux/netdevice.h>
51 #include <linux/uio.h>
52 #include <linux/poll.h>
53 #include <net/sock.h>
54
55 #include <linux/can.h>
56 #include <linux/can/error.h>
57 #include <linux/can/raw.h>
58 #include <linux/can/version.h>
59
60 #include "af_can.h"
61
62
63 RCSID("$Id$");
64
65 #define NAME "RAW sockets for LLCF"
66 #define IDENT "raw"
67 static __initdata const char banner[] = BANNER(NAME);
68
69 MODULE_DESCRIPTION(NAME);
70 MODULE_LICENSE("Dual BSD/GPL");
71 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
72
73 #ifdef CONFIG_CAN_DEBUG_CORE
74 static int debug = 0;
75 module_param(debug, int, S_IRUGO);
76 #define DBG(args...)       (debug & 1 ? \
77                                (printk(KERN_DEBUG "RAW %s: ", __func__), \
78                                 printk(args)) : 0)
79 #define DBG_SKB(skb)       (debug & 4 ? can_debug_skb(skb) : 0)
80 #else
81 #define DBG(args...)
82 #define DBG_SKB(skb)
83 #endif
84
85 static int raw_init(struct sock *sk);
86 static int raw_release(struct socket *sock);
87 static int raw_bind   (struct socket *sock, struct sockaddr *uaddr, int len);
88 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
89                        int *len, int peer);
90 static unsigned int raw_poll(struct file *file, struct socket *sock,
91                              poll_table *wait);
92 static int raw_setsockopt(struct socket *sock, int level, int optname,
93                           char __user *optval, int optlen);
94 static int raw_getsockopt(struct socket *sock, int level, int optname,
95                           char __user *optval, int __user *optlen);
96 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
97                        struct msghdr *msg, size_t size);
98 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
99                        struct msghdr *msg, size_t size, int flags);
100 static void raw_rcv(struct sk_buff *skb, void *data);
101 static void raw_notifier(unsigned long msg, void *data);
102
103 static void raw_add_filters(struct net_device *dev, struct sock *sk);
104 static void raw_remove_filters(struct net_device *dev, struct sock *sk);
105
106
107 static struct proto_ops raw_ops = {
108         .family        = PF_CAN,
109         .release       = raw_release,
110         .bind          = raw_bind,
111         .connect       = sock_no_connect,
112         .socketpair    = sock_no_socketpair,
113         .accept        = sock_no_accept,
114         .getname       = raw_getname,
115         .poll          = raw_poll,
116         .ioctl         = NULL,          /* use can_ioctl() from af_can.c */
117         .listen        = sock_no_listen,
118         .shutdown      = sock_no_shutdown,
119         .setsockopt    = raw_setsockopt,
120         .getsockopt    = raw_getsockopt,
121         .sendmsg       = raw_sendmsg,
122         .recvmsg       = raw_recvmsg,
123         .mmap          = sock_no_mmap,
124         .sendpage      = sock_no_sendpage,
125 };
126
127
128 struct raw_opt {
129         int bound;
130         int ifindex;
131         int loopback;
132         int recv_own_msgs;
133         int count;                 /* number of active filters */
134         struct can_filter dfilter; /* default/single filter space */
135         struct can_filter *filter; /* pointer to filter(s) */
136         can_err_mask_t err_mask;
137 };
138
139 #ifdef CONFIG_CAN_RAW_USER
140 #define RAW_CAP CAP_NET_RAW
141 #else
142 #define RAW_CAP (-1)
143 #endif
144
145 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
146
147 struct raw_sock {
148         struct sock    sk;
149         struct raw_opt opt;
150 };
151
152 #define canraw_sk(sk) (&((struct raw_sock *)(sk))->opt)
153
154 static struct proto raw_proto = {
155         .name       = "CAN_RAW",
156         .owner      = THIS_MODULE,
157         .obj_size   = sizeof(struct raw_sock),
158         .init       = raw_init,
159 };
160
161 static struct can_proto raw_can_proto = {
162         .type       = SOCK_RAW,
163         .protocol   = CAN_RAW,
164         .capability = RAW_CAP,
165         .ops        = &raw_ops,
166         .prot       = &raw_proto,
167 };
168
169 #else
170
171 #define canraw_sk(sk) ((struct raw_opt *)(sk)->sk_protinfo)
172
173 static struct can_proto raw_can_proto = {
174         .type       = SOCK_RAW,
175         .protocol   = CAN_RAW,
176         .capability = RAW_CAP,
177         .ops        = &raw_ops,
178         .owner      = THIS_MODULE,
179         .obj_size   = sizeof(struct raw_opt),
180         .init       = raw_init,
181 };
182
183 #endif
184
185 #define MASK_ALL 0
186
187 static __init int raw_module_init(void)
188 {
189         printk(banner);
190
191         can_proto_register(&raw_can_proto);
192         return 0;
193 }
194
195 static __exit void raw_module_exit(void)
196 {
197         can_proto_unregister(&raw_can_proto);
198 }
199
200 static int raw_init(struct sock *sk)
201 {
202         canraw_sk(sk)->bound            = 0;
203
204         /* set default filter to single entry dfilter */
205         canraw_sk(sk)->dfilter.can_id   = 0;
206         canraw_sk(sk)->dfilter.can_mask = MASK_ALL;
207         canraw_sk(sk)->filter           = &canraw_sk(sk)->dfilter;
208         canraw_sk(sk)->count            = 1;
209
210         /* set default message behaviour */
211         canraw_sk(sk)->loopback         = 1;
212         canraw_sk(sk)->recv_own_msgs    = 0;
213
214         return 0;
215 }
216
217 static int raw_release(struct socket *sock)
218 {
219         struct sock *sk = sock->sk;
220         struct net_device *dev = NULL;
221
222         DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
223             atomic_read(&sk->sk_refcnt));
224
225         if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
226                 dev = dev_get_by_index(canraw_sk(sk)->ifindex);
227
228         /* remove current filters & unregister */
229         if (canraw_sk(sk)->bound)
230                 raw_remove_filters(dev, sk);
231         if (canraw_sk(sk)->count > 1)
232                 kfree(canraw_sk(sk)->filter);
233
234         /* remove current error mask */
235         if (canraw_sk(sk)->err_mask && canraw_sk(sk)->bound)
236                 can_rx_unregister(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk);
237
238         if (dev) {
239                 can_dev_unregister(dev, raw_notifier, sk);
240                 dev_put(dev);
241         }
242
243         sock_put(sk);
244
245         return 0;
246 }
247
248 static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
249 {
250         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
251         struct sock *sk = sock->sk;
252         struct net_device *dev;
253
254         DBG("socket %p to device %d\n", sock, addr->can_ifindex);
255
256         if (len < sizeof(*addr))
257                 return -EINVAL;
258
259         if (canraw_sk(sk)->bound) {
260 #if 1
261                 return -EINVAL;
262 #else
263                 /* remove current bindings / notifier */
264                 if (canraw_sk(sk)->ifindex) {
265                         dev = dev_get_by_index(canraw_sk(sk)->ifindex);
266                         if (!dev) {
267                                 DBG("could not find device %d\n",
268                                     addr->can_ifindex);
269                                 return -ENODEV;
270                         }
271                         if (!(dev->flags & IFF_UP)) {
272                                 sk->sk_err = ENETDOWN;
273                                 sk->sk_error_report(sk);
274                                 goto out;
275                         }
276                         can_dev_unregister(dev, raw_notifier, sk);
277                 } else
278                         dev = NULL;
279
280                 /* unregister current filters for this device */
281                 raw_remove_filters(dev, sk);
282
283                 /* the filter(s) content is just available here */
284
285                 if (dev)
286                         dev_put(dev);
287
288                 canraw_sk(sk)->bound = 0;
289 #endif
290         }
291
292         if (addr->can_ifindex) {
293                 dev = dev_get_by_index(addr->can_ifindex);
294                 if (!dev) {
295                         DBG("could not find device %d\n", addr->can_ifindex);
296                         return -ENODEV;
297                 }
298                 if (!(dev->flags & IFF_UP)) {
299                         sk->sk_err = ENETDOWN;
300                         sk->sk_error_report(sk);
301                         goto out;
302                 }
303                 can_dev_register(dev, raw_notifier, sk);
304         } else
305                 dev = NULL;
306
307         canraw_sk(sk)->ifindex = addr->can_ifindex;
308
309         raw_add_filters(dev, sk); /* filters set by default/setsockopt */
310
311         if (canraw_sk(sk)->err_mask) /* error frame filter set by setsockopt */
312                 can_rx_register(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk, IDENT);
313
314         canraw_sk(sk)->bound = 1;
315
316  out:
317         if (dev)
318                 dev_put(dev);
319
320         return 0;
321 }
322
323 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
324                        int *len, int peer)
325 {
326         struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
327         struct sock *sk = sock->sk;
328
329         if (peer)
330                 return -EOPNOTSUPP;
331
332         addr->can_family  = AF_CAN;
333         addr->can_ifindex = canraw_sk(sk)->ifindex;
334         *len = sizeof(*addr);
335
336         return 0;
337 }
338
339 static unsigned int raw_poll(struct file *file, struct socket *sock,
340                              poll_table *wait)
341 {
342         unsigned int mask = 0;
343
344         DBG("socket %p\n", sock);
345
346         mask = datagram_poll(file, sock, wait);
347         return mask;
348 }
349
350 static int raw_setsockopt(struct socket *sock, int level, int optname,
351                           char __user *optval, int optlen)
352 {
353         struct sock *sk = sock->sk;
354         struct can_filter *filter = NULL;
355         struct net_device *dev = NULL;
356         can_err_mask_t err_mask = 0;
357         int count = 0;
358         int err;
359
360         if (level != SOL_CAN_RAW)
361                 return -EINVAL;
362
363         switch (optname) {
364         case CAN_RAW_FILTER:
365                 if (optlen % sizeof(struct can_filter) != 0)
366                         return -EINVAL;
367
368                 count = optlen / sizeof(struct can_filter);
369
370                 if (count > 1) { /* does not fit into dfilter */
371                         if (!(filter = kmalloc(optlen, GFP_KERNEL)))
372                                 return -ENOMEM;
373                         if ((err = copy_from_user(filter, optval, optlen))) {
374                                 kfree(filter);
375                                 return err;
376                         }
377                 }
378
379                 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
380                         dev = dev_get_by_index(canraw_sk(sk)->ifindex);
381
382                 /* remove current filters & unregister */
383                 if (canraw_sk(sk)->bound)
384                         raw_remove_filters(dev, sk);
385                 if (canraw_sk(sk)->count > 1)
386                         kfree(canraw_sk(sk)->filter);
387
388                 if (count == 1) { /* copy data for single filter */
389                         filter = &canraw_sk(sk)->dfilter;
390                         if ((err = copy_from_user(filter, optval, optlen))) {
391                                 /* zero filters to prevent double kfree */
392                                 canraw_sk(sk)->count = 0;
393                                 if (dev)
394                                         dev_put(dev);
395                                 return err;
396                         }
397                 }
398
399                 /* add new filters & register */
400                 canraw_sk(sk)->filter = filter;
401                 canraw_sk(sk)->count  = count;
402                 if (canraw_sk(sk)->bound)
403                         raw_add_filters(dev, sk);
404
405                 if (dev)
406                         dev_put(dev);
407
408                 break;
409
410         case CAN_RAW_ERR_FILTER:
411                 if (optlen) {
412                         if (optlen != sizeof(err_mask))
413                                 return -EINVAL;
414                         if ((err = copy_from_user(&err_mask, optval, optlen)))
415                                 return err;
416                 }
417
418                 err_mask &= CAN_ERR_MASK;
419
420                 if (canraw_sk(sk)->bound && canraw_sk(sk)->ifindex)
421                         dev = dev_get_by_index(canraw_sk(sk)->ifindex);
422
423                 /* remove current error mask */
424                 if (canraw_sk(sk)->err_mask && canraw_sk(sk)->bound)
425                         can_rx_unregister(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk);
426
427                 /* add new error mask */
428                 if (optlen) {
429                         canraw_sk(sk)->err_mask = err_mask;
430                         if (canraw_sk(sk)->err_mask & canraw_sk(sk)->bound)
431                                 can_rx_register(dev, 0, (canid_t)(canraw_sk(sk)->err_mask | CAN_ERR_FLAG), raw_rcv, sk, IDENT);
432                 }
433
434                 if (dev)
435                         dev_put(dev);
436
437                 break;
438
439         case CAN_RAW_LOOPBACK:
440                 if (optlen) {
441                         if (optlen != sizeof(canraw_sk(sk)->loopback))
442                                 return -EINVAL;
443                         if ((err = copy_from_user(&canraw_sk(sk)->loopback, optval, optlen)))
444                                 return err;
445                 }
446                 break;
447
448         case CAN_RAW_RECV_OWN_MSGS:
449                 if (optlen) {
450                         if (optlen != sizeof(canraw_sk(sk)->recv_own_msgs))
451                                 return -EINVAL;
452                         if ((err = copy_from_user(&canraw_sk(sk)->recv_own_msgs, optval, optlen)))
453                                 return err;
454                 }
455                 break;
456
457         default:
458                 return -ENOPROTOOPT;
459         }
460         return 0;
461 }
462
463 static int raw_getsockopt(struct socket *sock, int level, int optname,
464                           char __user *optval, int __user *optlen)
465 {
466         struct sock *sk = sock->sk;
467         struct can_filter *filter = canraw_sk(sk)->filter;
468         int count = canraw_sk(sk)->count;
469         int len;
470
471         if (level != SOL_CAN_RAW)
472                 return -EINVAL;
473
474         switch (optname) {
475         case CAN_RAW_FILTER:
476                 if (get_user(len, optlen))
477                         return -EFAULT;
478
479                 if (count && filter) {
480                         int filter_size = count * sizeof(struct can_filter);
481                         if (len < filter_size)
482                                 return -EINVAL;
483                         if (len > filter_size)
484                                 len = filter_size;
485                         if (copy_to_user(optval, filter, len))
486                                 return -EFAULT;
487                 } else
488                         len = 0;
489
490                 if (put_user(len, optlen))
491                         return -EFAULT;
492
493                 break;
494
495         case CAN_RAW_ERR_FILTER:
496                 if (get_user(len, optlen))
497                         return -EFAULT;
498
499                 if (len < sizeof(can_err_mask_t))
500                         return -EINVAL;
501
502                 if (len > sizeof(can_err_mask_t))
503                         len = sizeof(can_err_mask_t);
504
505                 if (copy_to_user(optval, &canraw_sk(sk)->err_mask, len))
506                         return -EFAULT;
507
508                 if (put_user(len, optlen))
509                         return -EFAULT;
510
511                 break;
512
513         case CAN_RAW_LOOPBACK:
514                 if (get_user(len, optlen))
515                         return -EFAULT;
516
517                 if (len < sizeof(int))
518                         return -EINVAL;
519
520                 if (len > sizeof(int))
521                         len = sizeof(int);
522
523                 if (copy_to_user(optval, &canraw_sk(sk)->loopback, len))
524                         return -EFAULT;
525
526                 if (put_user(len, optlen))
527                         return -EFAULT;
528
529                 break;
530
531         case CAN_RAW_RECV_OWN_MSGS:
532                 if (get_user(len, optlen))
533                         return -EFAULT;
534
535                 if (len < sizeof(int))
536                         return -EINVAL;
537
538                 if (len > sizeof(int))
539                         len = sizeof(int);
540
541                 if (copy_to_user(optval, &canraw_sk(sk)->recv_own_msgs, len))
542                         return -EFAULT;
543
544                 if (put_user(len, optlen))
545                         return -EFAULT;
546
547                 break;
548
549         default:
550                 return -ENOPROTOOPT;
551         }
552         return 0;
553 }
554
555 static void raw_add_filters(struct net_device *dev, struct sock *sk)
556 {
557         struct can_filter *filter = canraw_sk(sk)->filter;
558         int i;
559
560         for (i = 0; i < canraw_sk(sk)->count; i++) {
561                 can_rx_register(dev, filter[i].can_id, filter[i].can_mask,
562                                 raw_rcv, sk, IDENT);
563                 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
564                     filter[i].can_id, filter[i].can_mask,
565                     filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
566         }
567 }
568
569 static void raw_remove_filters(struct net_device *dev, struct sock *sk)
570 {
571         struct can_filter *filter = canraw_sk(sk)->filter;
572         int i;
573
574         for (i = 0; i < canraw_sk(sk)->count; i++) {
575                 can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
576                                   raw_rcv, sk);
577                 DBG("filter can_id %08X, can_mask %08X%s, sk %p\n",
578                     filter[i].can_id, filter[i].can_mask,
579                     filter[i].can_id & CAN_INV_FILTER ? " (inv)" : "", sk);
580         }
581 }
582
583 static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
584                        struct msghdr *msg, size_t size)
585 {
586         struct sock *sk = sock->sk;
587         struct sk_buff *skb;
588         struct net_device *dev;
589         int ifindex;
590         int err;
591
592         DBG("socket %p, sk %p\n", sock, sk);
593
594         if (msg->msg_name) {
595                 struct sockaddr_can *addr = (struct sockaddr_can *)msg->msg_name;
596                 if (addr->can_family != AF_CAN)
597                         return -EINVAL;
598                 ifindex = addr->can_ifindex;
599         } else
600                 ifindex = canraw_sk(sk)->ifindex;
601
602         if (!(dev = dev_get_by_index(ifindex))) {
603                 DBG("device %d not found\n", ifindex);
604                 return -ENXIO;
605         }
606
607         if (!(skb = alloc_skb(size, GFP_KERNEL))) {
608                 dev_put(dev);
609                 return -ENOMEM;
610         }
611
612         if ((err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size)) < 0) {
613                 kfree_skb(skb);
614                 dev_put(dev);
615                 return err;
616         }
617         skb->dev = dev;
618         skb->sk  = sk;
619
620         DBG("sending skbuff to interface %d\n", ifindex);
621         DBG_SKB(skb);
622
623         err = can_send(skb, canraw_sk(sk)->loopback);
624
625         dev_put(dev);
626
627         if (err)
628                 return err;
629
630         return size;
631 }
632
633 static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
634                        struct msghdr *msg, size_t size, int flags)
635 {
636         struct sock *sk = sock->sk;
637         struct sk_buff *skb;
638         int error = 0;
639         int noblock;
640
641         DBG("socket %p, sk %p\n", sock, sk);
642
643         noblock =  flags & MSG_DONTWAIT;
644         flags   &= ~MSG_DONTWAIT;
645
646         if (!(skb = skb_recv_datagram(sk, flags, noblock, &error)))
647                 return error;
648
649         DBG("delivering skbuff %p\n", skb);
650         DBG_SKB(skb);
651
652         if (size < skb->len)
653                 msg->msg_flags |= MSG_TRUNC;
654         else
655                 size = skb->len;
656
657         if ((error = memcpy_toiovec(msg->msg_iov, skb->data, size)) < 0) {
658                 skb_free_datagram(sk, skb);
659                 return error;
660         }
661
662         sock_recv_timestamp(msg, sk, skb);
663
664         if (msg->msg_name) {
665                 msg->msg_namelen = sizeof(struct sockaddr_can);
666                 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
667         }
668
669         DBG("freeing sock %p, skbuff %p\n", sk, skb);
670         skb_free_datagram(sk, skb);
671
672         return size;
673 }
674
675 static void raw_rcv(struct sk_buff *skb, void *data)
676 {
677         struct sock *sk = (struct sock*)data;
678         struct sockaddr_can *addr;
679         int error;
680
681         DBG("received skbuff %p, sk %p\n", skb, sk);
682         DBG_SKB(skb);
683
684         if (!canraw_sk(sk)->recv_own_msgs) {
685                 if (*(struct sock **)skb->cb == sk) { /* tx sock reference */
686                         DBG("trashed own tx msg\n");
687                         kfree_skb(skb);
688                         return;
689                 }
690         }
691
692         addr = (struct sockaddr_can *)skb->cb;
693         memset(addr, 0, sizeof(*addr));
694         addr->can_family  = AF_CAN;
695         addr->can_ifindex = skb->dev->ifindex;
696
697         if ((error = sock_queue_rcv_skb(sk, skb)) < 0) {
698                 DBG("sock_queue_rcv_skb failed: %d\n", error);
699                 DBG("freeing skbuff %p\n", skb);
700                 kfree_skb(skb);
701         }
702 }
703
704 static void raw_notifier(unsigned long msg, void *data)
705 {
706         struct sock *sk = (struct sock *)data;
707
708         DBG("called for sock %p\n", sk);
709
710         switch (msg) {
711         case NETDEV_UNREGISTER:
712                 canraw_sk(sk)->ifindex = 0;
713                 canraw_sk(sk)->bound   = 0;
714                 /* fallthrough */
715         case NETDEV_DOWN:
716                 sk->sk_err = ENETDOWN;
717                 sk->sk_error_report(sk);
718                 break;
719         }
720 }
721
722
723 module_init(raw_module_init);
724 module_exit(raw_module_exit);