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