]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - kernel/2.6/net/can/af_can.c
can: convert protocol handling to RCU
[socketcan-devel.git] / kernel / 2.6 / net / can / af_can.c
1 /*
2  * af_can.c - Protocol family CAN core module
3  *            (used by different CAN protocol modules)
4  *
5  * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
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, in which case the provisions of the
23  * GPL apply INSTEAD OF those given above.
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/kmod.h>
49 #include <linux/slab.h>
50 #include <linux/list.h>
51 #include <linux/spinlock.h>
52 #include <linux/rcupdate.h>
53 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
54 #include <linux/uaccess.h>
55 #else
56 #include <asm/uaccess.h>
57 #endif
58 #include <linux/net.h>
59 #include <linux/netdevice.h>
60 #include <linux/socket.h>
61 #include <linux/if_ether.h>
62 #include <linux/if_arp.h>
63 #include <linux/skbuff.h>
64 #include <socketcan/can.h>
65 #include <socketcan/can/core.h>
66 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
67 #include <net/net_namespace.h>
68 #endif
69 #include <net/sock.h>
70
71 #include "af_can.h"
72 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
73 #include "compat.h"
74 #endif
75
76 #include <socketcan/can/version.h> /* for RCSID. Removed by mkpatch script */
77 RCSID("$Id$");
78
79 static __initdata const char banner[] = KERN_INFO
80         "can: controller area network core (" CAN_VERSION_STRING ")\n";
81
82 MODULE_DESCRIPTION("Controller Area Network PF_CAN core");
83 MODULE_LICENSE("Dual BSD/GPL");
84 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>, "
85               "Oliver Hartkopp <oliver.hartkopp@volkswagen.de>");
86
87 MODULE_ALIAS_NETPROTO(PF_CAN);
88
89 static int stats_timer __read_mostly = 1;
90 module_param(stats_timer, int, S_IRUGO);
91 MODULE_PARM_DESC(stats_timer, "enable timer for statistics (default:on)");
92
93 HLIST_HEAD(can_rx_dev_list);
94 static struct dev_rcv_lists can_rx_alldev_list;
95 static DEFINE_SPINLOCK(can_rcvlists_lock);
96
97 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
98 static struct kmem_cache *rcv_cache __read_mostly;
99 #else
100 static kmem_cache_t *rcv_cache;
101 #endif
102
103 /* table of registered CAN protocols */
104 static struct can_proto *proto_tab[CAN_NPROTO] __read_mostly;
105 static DEFINE_MUTEX(proto_tab_lock);
106
107 struct timer_list can_stattimer;   /* timer for statistics update */
108 struct s_stats    can_stats;       /* packet statistics */
109 struct s_pstats   can_pstats;      /* receive list statistics */
110
111 /*
112  * af_can socket functions
113  */
114
115 int can_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
116 {
117         struct sock *sk = sock->sk;
118
119         switch (cmd) {
120
121         case SIOCGSTAMP:
122                 return sock_get_timestamp(sk, (struct timeval __user *)arg);
123
124         default:
125 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
126                 return -ENOIOCTLCMD;
127 #else
128                 return dev_ioctl(cmd, (void __user *)arg);
129 #endif
130         }
131 }
132 EXPORT_SYMBOL(can_ioctl);
133
134 static void can_sock_destruct(struct sock *sk)
135 {
136         skb_queue_purge(&sk->sk_receive_queue);
137 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12)
138         if (sk->sk_protinfo)
139                 kfree(sk->sk_protinfo);
140 #endif
141 }
142
143 static struct can_proto *can_try_module_get(int protocol)
144 {
145         struct can_proto *cp;
146
147         rcu_read_lock();
148         cp = rcu_dereference(proto_tab[protocol]);
149 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
150         if (cp && !try_module_get(cp->prot->owner))
151                 cp = NULL;
152 #else
153         if (cp && !try_module_get(cp->owner))
154                 cp = NULL;
155 #endif
156         rcu_read_unlock();
157
158         return cp;
159 }
160
161 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33)
162 static int can_create(struct net *net, struct socket *sock, int protocol, int kern)
163 #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
164 static int can_create(struct net *net, struct socket *sock, int protocol)
165 #else
166 static int can_create(struct socket *sock, int protocol)
167 #endif
168 {
169         struct sock *sk;
170         struct can_proto *cp;
171         int err = 0;
172
173         sock->state = SS_UNCONNECTED;
174
175         if (protocol < 0 || protocol >= CAN_NPROTO)
176                 return -EINVAL;
177
178 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
179         if (net != &init_net)
180                 return -EAFNOSUPPORT;
181 #endif
182
183         cp = can_try_module_get(protocol);
184
185 #ifdef CONFIG_MODULES
186         if (!cp) {
187                 /* try to load protocol module if kernel is modular */
188
189                 err = request_module("can-proto-%d", protocol);
190
191                 /*
192                  * In case of error we only print a message but don't
193                  * return the error code immediately.  Below we will
194                  * return -EPROTONOSUPPORT
195                  */
196                 if (err && printk_ratelimit())
197                         printk(KERN_ERR "can: request_module "
198                                "(can-proto-%d) failed.\n", protocol);
199
200                 cp = can_try_module_get(protocol);
201         }
202 #endif
203
204         /* check for available protocol and correct usage */
205
206         if (!cp)
207                 return -EPROTONOSUPPORT;
208
209         if (cp->type != sock->type) {
210                 err = -EPROTOTYPE;
211                 goto errout;
212         }
213
214 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
215         if (cp->capability >= 0 && !capable(cp->capability)) {
216                 err = -EPERM;
217                 goto errout;
218         }
219 #endif
220         sock->ops = cp->ops;
221
222 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
223         sk = sk_alloc(net, PF_CAN, GFP_KERNEL, cp->prot);
224 #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
225         sk = sk_alloc(PF_CAN, GFP_KERNEL, cp->prot, 1);
226 #else
227         sk = sk_alloc(PF_CAN, GFP_KERNEL, 1, 0);
228 #endif
229         if (!sk) {
230                 err = -ENOMEM;
231                 goto errout;
232         }
233
234 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12)
235         if (cp->obj_size) {
236                 sk->sk_protinfo = kmalloc(cp->obj_size, GFP_KERNEL);
237                 if (!sk->sk_protinfo) {
238                         sk_free(sk);
239                         err = -ENOMEM;
240                         goto errout;
241                 }
242         }
243         sk_set_owner(sk, proto_tab[protocol]->owner);
244 #endif
245
246         sock_init_data(sock, sk);
247         sk->sk_destruct = can_sock_destruct;
248
249 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
250         if (sk->sk_prot->init)
251                 err = sk->sk_prot->init(sk);
252 #else
253         if (cp->init)
254                 err = cp->init(sk);
255 #endif
256
257         if (err) {
258                 /* release sk on errors */
259                 sock_orphan(sk);
260                 sock_put(sk);
261         }
262
263  errout:
264 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
265         module_put(cp->prot->owner);
266 #else
267         module_put(cp->owner);
268 #endif
269         return err;
270 }
271
272 /*
273  * af_can tx path
274  */
275
276 /**
277  * can_send - transmit a CAN frame (optional with local loopback)
278  * @skb: pointer to socket buffer with CAN frame in data section
279  * @loop: loopback for listeners on local CAN sockets (recommended default!)
280  *
281  * Due to the loopback this routine must not be called from hardirq context.
282  *
283  * Return:
284  *  0 on success
285  *  -ENETDOWN when the selected interface is down
286  *  -ENOBUFS on full driver queue (see net_xmit_errno())
287  *  -ENOMEM when local loopback failed at calling skb_clone()
288  *  -EPERM when trying to send on a non-CAN interface
289  *  -EINVAL when the skb->data does not contain a valid CAN frame
290  */
291 int can_send(struct sk_buff *skb, int loop)
292 {
293         struct sk_buff *newskb = NULL;
294         struct can_frame *cf = (struct can_frame *)skb->data;
295         int err;
296
297         if (skb->len != sizeof(struct can_frame) || cf->can_dlc > 8) {
298                 kfree_skb(skb);
299                 return -EINVAL;
300         }
301
302         if (skb->dev->type != ARPHRD_CAN) {
303                 kfree_skb(skb);
304                 return -EPERM;
305         }
306
307         if (!(skb->dev->flags & IFF_UP)) {
308                 kfree_skb(skb);
309                 return -ENETDOWN;
310         }
311
312         skb->protocol = htons(ETH_P_CAN);
313 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
314         skb_reset_network_header(skb);
315         skb_reset_transport_header(skb);
316 #else
317         skb->nh.raw = skb->data;
318         skb->h.raw  = skb->data;
319 #endif
320
321         if (loop) {
322                 /* local loopback of sent CAN frames */
323
324                 /* indication for the CAN driver: do loopback */
325                 skb->pkt_type = PACKET_LOOPBACK;
326
327                 /*
328                  * The reference to the originating sock may be required
329                  * by the receiving socket to check whether the frame is
330                  * its own. Example: can_raw sockopt CAN_RAW_RECV_OWN_MSGS
331                  * Therefore we have to ensure that skb->sk remains the
332                  * reference to the originating sock by restoring skb->sk
333                  * after each skb_clone() or skb_orphan() usage.
334                  */
335
336 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
337 #define IFF_ECHO IFF_LOOPBACK
338 #endif
339                 if (!(skb->dev->flags & IFF_ECHO)) {
340                         /*
341                          * If the interface is not capable to do loopback
342                          * itself, we do it here.
343                          */
344                         newskb = skb_clone(skb, GFP_ATOMIC);
345                         if (!newskb) {
346                                 kfree_skb(skb);
347                                 return -ENOMEM;
348                         }
349
350                         newskb->sk = skb->sk;
351                         newskb->ip_summed = CHECKSUM_UNNECESSARY;
352                         newskb->pkt_type = PACKET_BROADCAST;
353                 }
354         } else {
355                 /* indication for the CAN driver: no loopback required */
356                 skb->pkt_type = PACKET_HOST;
357         }
358
359         /* send to netdevice */
360         err = dev_queue_xmit(skb);
361         if (err > 0)
362                 err = net_xmit_errno(err);
363
364         if (err) {
365 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17)
366                 /* kfree_skb() does not check for !NULL on older kernels */
367                 if (newskb)
368                         kfree_skb(newskb);
369 #else
370                 kfree_skb(newskb);
371 #endif
372                 return err;
373         }
374
375         if (newskb)
376                 netif_rx_ni(newskb);
377
378         /* update statistics */
379         can_stats.tx_frames++;
380         can_stats.tx_frames_delta++;
381
382         return 0;
383 }
384 EXPORT_SYMBOL(can_send);
385
386 /*
387  * af_can rx path
388  */
389
390 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
391 static struct dev_rcv_lists *find_dev_rcv_lists(struct net_device *dev)
392 {
393         /*
394          * find receive list for this device
395          *
396          * Since 2.6.26 a new "midlevel private" ml_priv pointer has been
397          * introduced in struct net_device. We use this pointer to omit the
398          * linear walk through the can_rx_dev_list. A similar speedup has been
399          * queued for 2.6.34 mainline but using the new netdev_rcu lists.
400          * Therefore the can_rx_dev_list is still needed (e.g. in proc.c)
401          */
402
403         /* dev == NULL is the indicator for the 'all' filterlist */
404         if (!dev)
405                 return &can_rx_alldev_list;
406         else
407                 return (struct dev_rcv_lists *)dev->ml_priv;
408 }
409 #else
410 static struct dev_rcv_lists *find_dev_rcv_lists(struct net_device *dev)
411 {
412         struct dev_rcv_lists *d = NULL;
413         struct hlist_node *n;
414
415         /*
416          * find receive list for this device
417          *
418          * The hlist_for_each_entry*() macros curse through the list
419          * using the pointer variable n and set d to the containing
420          * struct in each list iteration.  Therefore, after list
421          * iteration, d is unmodified when the list is empty, and it
422          * points to last list element, when the list is non-empty
423          * but no match in the loop body is found.  I.e. d is *not*
424          * NULL when no match is found.  We can, however, use the
425          * cursor variable n to decide if a match was found.
426          */
427
428         hlist_for_each_entry_rcu(d, n, &can_rx_dev_list, list) {
429                 if (d->dev == dev)
430                         break;
431         }
432
433         return n ? d : NULL;
434 }
435 #endif
436
437 /**
438  * find_rcv_list - determine optimal filterlist inside device filter struct
439  * @can_id: pointer to CAN identifier of a given can_filter
440  * @mask: pointer to CAN mask of a given can_filter
441  * @d: pointer to the device filter struct
442  *
443  * Description:
444  *  Returns the optimal filterlist to reduce the filter handling in the
445  *  receive path. This function is called by service functions that need
446  *  to register or unregister a can_filter in the filter lists.
447  *
448  *  A filter matches in general, when
449  *
450  *          <received_can_id> & mask == can_id & mask
451  *
452  *  so every bit set in the mask (even CAN_EFF_FLAG, CAN_RTR_FLAG) describe
453  *  relevant bits for the filter.
454  *
455  *  The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can
456  *  filter for error frames (CAN_ERR_FLAG bit set in mask). For error frames
457  *  there is a special filterlist and a special rx path filter handling.
458  *
459  * Return:
460  *  Pointer to optimal filterlist for the given can_id/mask pair.
461  *  Constistency checked mask.
462  *  Reduced can_id to have a preprocessed filter compare value.
463  */
464 static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask,
465                                         struct dev_rcv_lists *d)
466 {
467         canid_t inv = *can_id & CAN_INV_FILTER; /* save flag before masking */
468
469         /* filter for error frames in extra filterlist */
470         if (*mask & CAN_ERR_FLAG) {
471                 /* clear CAN_ERR_FLAG in filter entry */
472                 *mask &= CAN_ERR_MASK;
473                 return &d->rx[RX_ERR];
474         }
475
476         /* with cleared CAN_ERR_FLAG we have a simple mask/value filterpair */
477
478 #define CAN_EFF_RTR_FLAGS (CAN_EFF_FLAG | CAN_RTR_FLAG)
479
480         /* ensure valid values in can_mask for 'SFF only' frame filtering */
481         if ((*mask & CAN_EFF_FLAG) && !(*can_id & CAN_EFF_FLAG))
482                 *mask &= (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS);
483
484         /* reduce condition testing at receive time */
485         *can_id &= *mask;
486
487         /* inverse can_id/can_mask filter */
488         if (inv)
489                 return &d->rx[RX_INV];
490
491         /* mask == 0 => no condition testing at receive time */
492         if (!(*mask))
493                 return &d->rx[RX_ALL];
494
495         /* extra filterlists for the subscription of a single non-RTR can_id */
496         if (((*mask & CAN_EFF_RTR_FLAGS) == CAN_EFF_RTR_FLAGS)
497             && !(*can_id & CAN_RTR_FLAG)) {
498
499                 if (*can_id & CAN_EFF_FLAG) {
500                         if (*mask == (CAN_EFF_MASK | CAN_EFF_RTR_FLAGS)) {
501                                 /* RFC: a future use-case for hash-tables? */
502                                 return &d->rx[RX_EFF];
503                         }
504                 } else {
505                         if (*mask == (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS))
506                                 return &d->rx_sff[*can_id];
507                 }
508         }
509
510         /* default: filter via can_id/can_mask */
511         return &d->rx[RX_FIL];
512 }
513
514 /**
515  * can_rx_register - subscribe CAN frames from a specific interface
516  * @dev: pointer to netdevice (NULL => subcribe from 'all' CAN devices list)
517  * @can_id: CAN identifier (see description)
518  * @mask: CAN mask (see description)
519  * @func: callback function on filter match
520  * @data: returned parameter for callback function
521  * @ident: string for calling module indentification
522  *
523  * Description:
524  *  Invokes the callback function with the received sk_buff and the given
525  *  parameter 'data' on a matching receive filter. A filter matches, when
526  *
527  *          <received_can_id> & mask == can_id & mask
528  *
529  *  The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can
530  *  filter for error frames (CAN_ERR_FLAG bit set in mask).
531  *
532  *  The provided pointer to the sk_buff is guaranteed to be valid as long as
533  *  the callback function is running. The callback function must *not* free
534  *  the given sk_buff while processing it's task. When the given sk_buff is
535  *  needed after the end of the callback function it must be cloned inside
536  *  the callback function with skb_clone().
537  *
538  * Return:
539  *  0 on success
540  *  -ENOMEM on missing cache mem to create subscription entry
541  *  -ENODEV unknown device
542  */
543 int can_rx_register(struct net_device *dev, canid_t can_id, canid_t mask,
544                     void (*func)(struct sk_buff *, void *), void *data,
545                     char *ident)
546 {
547         struct receiver *r;
548         struct hlist_head *rl;
549         struct dev_rcv_lists *d;
550         int err = 0;
551
552         /* insert new receiver  (dev,canid,mask) -> (func,data) */
553
554 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
555         if (dev && dev->type != ARPHRD_CAN)
556                 return -ENODEV;
557 #endif
558
559         r = kmem_cache_alloc(rcv_cache, GFP_KERNEL);
560         if (!r)
561                 return -ENOMEM;
562
563         spin_lock(&can_rcvlists_lock);
564
565         d = find_dev_rcv_lists(dev);
566         if (d) {
567                 rl = find_rcv_list(&can_id, &mask, d);
568
569                 r->can_id  = can_id;
570                 r->mask    = mask;
571                 r->matches = 0;
572                 r->func    = func;
573                 r->data    = data;
574                 r->ident   = ident;
575
576                 hlist_add_head_rcu(&r->list, rl);
577                 d->entries++;
578
579                 can_pstats.rcv_entries++;
580                 if (can_pstats.rcv_entries_max < can_pstats.rcv_entries)
581                         can_pstats.rcv_entries_max = can_pstats.rcv_entries;
582         } else {
583                 kmem_cache_free(rcv_cache, r);
584                 err = -ENODEV;
585         }
586
587         spin_unlock(&can_rcvlists_lock);
588
589         return err;
590 }
591 EXPORT_SYMBOL(can_rx_register);
592
593 /*
594  * can_rx_delete_device - rcu callback for dev_rcv_lists structure removal
595  */
596 static void can_rx_delete_device(struct rcu_head *rp)
597 {
598         struct dev_rcv_lists *d = container_of(rp, struct dev_rcv_lists, rcu);
599
600         kfree(d);
601 }
602
603 /*
604  * can_rx_delete_receiver - rcu callback for single receiver entry removal
605  */
606 static void can_rx_delete_receiver(struct rcu_head *rp)
607 {
608         struct receiver *r = container_of(rp, struct receiver, rcu);
609
610         kmem_cache_free(rcv_cache, r);
611 }
612
613 /**
614  * can_rx_unregister - unsubscribe CAN frames from a specific interface
615  * @dev: pointer to netdevice (NULL => unsubcribe from 'all' CAN devices list)
616  * @can_id: CAN identifier
617  * @mask: CAN mask
618  * @func: callback function on filter match
619  * @data: returned parameter for callback function
620  *
621  * Description:
622  *  Removes subscription entry depending on given (subscription) values.
623  */
624 void can_rx_unregister(struct net_device *dev, canid_t can_id, canid_t mask,
625                        void (*func)(struct sk_buff *, void *), void *data)
626 {
627         struct receiver *r = NULL;
628         struct hlist_head *rl;
629         struct hlist_node *next;
630         struct dev_rcv_lists *d;
631
632 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
633         if (dev && dev->type != ARPHRD_CAN)
634                 return;
635 #endif
636
637         spin_lock(&can_rcvlists_lock);
638
639         d = find_dev_rcv_lists(dev);
640         if (!d) {
641                 printk(KERN_ERR "BUG: receive list not found for "
642                        "dev %s, id %03X, mask %03X\n",
643                        DNAME(dev), can_id, mask);
644                 goto out;
645         }
646
647         rl = find_rcv_list(&can_id, &mask, d);
648
649         /*
650          * Search the receiver list for the item to delete.  This should
651          * exist, since no receiver may be unregistered that hasn't
652          * been registered before.
653          */
654
655         hlist_for_each_entry_rcu(r, next, rl, list) {
656                 if (r->can_id == can_id && r->mask == mask
657                     && r->func == func && r->data == data)
658                         break;
659         }
660
661         /*
662          * Check for bugs in CAN protocol implementations:
663          * If no matching list item was found, the list cursor variable next
664          * will be NULL, while r will point to the last item of the list.
665          */
666
667         if (!next) {
668                 printk(KERN_ERR "BUG: receive list entry not found for "
669                        "dev %s, id %03X, mask %03X\n",
670                        DNAME(dev), can_id, mask);
671                 r = NULL;
672                 d = NULL;
673                 goto out;
674         }
675
676         hlist_del_rcu(&r->list);
677         d->entries--;
678
679         if (can_pstats.rcv_entries > 0)
680                 can_pstats.rcv_entries--;
681
682         /* remove device structure requested by NETDEV_UNREGISTER */
683         if (d->remove_on_zero_entries && !d->entries) {
684 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
685                 dev->ml_priv = NULL;
686 #endif
687                 hlist_del_rcu(&d->list);
688         } else
689                 d = NULL;
690
691  out:
692         spin_unlock(&can_rcvlists_lock);
693
694         /* schedule the receiver item for deletion */
695         if (r)
696                 call_rcu(&r->rcu, can_rx_delete_receiver);
697
698         /* schedule the device structure for deletion */
699         if (d)
700                 call_rcu(&d->rcu, can_rx_delete_device);
701 }
702 EXPORT_SYMBOL(can_rx_unregister);
703
704 static inline void deliver(struct sk_buff *skb, struct receiver *r)
705 {
706         r->func(skb, r->data);
707         r->matches++;
708 }
709
710 static int can_rcv_filter(struct dev_rcv_lists *d, struct sk_buff *skb)
711 {
712         struct receiver *r;
713         struct hlist_node *n;
714         int matches = 0;
715         struct can_frame *cf = (struct can_frame *)skb->data;
716         canid_t can_id = cf->can_id;
717
718         if (d->entries == 0)
719                 return 0;
720
721         if (can_id & CAN_ERR_FLAG) {
722                 /* check for error frame entries only */
723                 hlist_for_each_entry_rcu(r, n, &d->rx[RX_ERR], list) {
724                         if (can_id & r->mask) {
725                                 deliver(skb, r);
726                                 matches++;
727                         }
728                 }
729                 return matches;
730         }
731
732         /* check for unfiltered entries */
733         hlist_for_each_entry_rcu(r, n, &d->rx[RX_ALL], list) {
734                 deliver(skb, r);
735                 matches++;
736         }
737
738         /* check for can_id/mask entries */
739         hlist_for_each_entry_rcu(r, n, &d->rx[RX_FIL], list) {
740                 if ((can_id & r->mask) == r->can_id) {
741                         deliver(skb, r);
742                         matches++;
743                 }
744         }
745
746         /* check for inverted can_id/mask entries */
747         hlist_for_each_entry_rcu(r, n, &d->rx[RX_INV], list) {
748                 if ((can_id & r->mask) != r->can_id) {
749                         deliver(skb, r);
750                         matches++;
751                 }
752         }
753
754         /* check filterlists for single non-RTR can_ids */
755         if (can_id & CAN_RTR_FLAG)
756                 return matches;
757
758         if (can_id & CAN_EFF_FLAG) {
759                 hlist_for_each_entry_rcu(r, n, &d->rx[RX_EFF], list) {
760                         if (r->can_id == can_id) {
761                                 deliver(skb, r);
762                                 matches++;
763                         }
764                 }
765         } else {
766                 can_id &= CAN_SFF_MASK;
767                 hlist_for_each_entry_rcu(r, n, &d->rx_sff[can_id], list) {
768                         deliver(skb, r);
769                         matches++;
770                 }
771         }
772
773         return matches;
774 }
775
776 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14)
777 static int can_rcv(struct sk_buff *skb, struct net_device *dev,
778                    struct packet_type *pt, struct net_device *orig_dev)
779 #else
780 static int can_rcv(struct sk_buff *skb, struct net_device *dev,
781                    struct packet_type *pt)
782 #endif
783 {
784         struct dev_rcv_lists *d;
785         struct can_frame *cf = (struct can_frame *)skb->data;
786         int matches;
787
788 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
789         if (!net_eq(dev_net(dev), &init_net))
790                 goto drop;
791 #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
792         if (dev->nd_net != &init_net)
793                 goto drop;
794 #endif
795
796 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
797         if (WARN_ONCE(dev->type != ARPHRD_CAN ||
798                       skb->len != sizeof(struct can_frame) ||
799                       cf->can_dlc > 8,
800                       "PF_CAN: dropped non conform skbuf: "
801                       "dev type %d, len %d, can_dlc %d\n",
802                       dev->type, skb->len, cf->can_dlc))
803                 goto drop;
804 #else
805         BUG_ON(dev->type != ARPHRD_CAN ||
806                skb->len != sizeof(struct can_frame) ||
807                cf->can_dlc > 8);
808 #endif
809
810         /* update statistics */
811         can_stats.rx_frames++;
812         can_stats.rx_frames_delta++;
813
814         rcu_read_lock();
815
816         /* deliver the packet to sockets listening on all devices */
817         matches = can_rcv_filter(&can_rx_alldev_list, skb);
818
819         /* find receive list for this device */
820         d = find_dev_rcv_lists(dev);
821         if (d)
822                 matches += can_rcv_filter(d, skb);
823
824         rcu_read_unlock();
825
826         /* consume the skbuff allocated by the netdevice driver */
827 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)
828         consume_skb(skb);
829 #else
830         kfree_skb(skb);
831 #endif
832
833         if (matches > 0) {
834                 can_stats.matches++;
835                 can_stats.matches_delta++;
836         }
837
838         return NET_RX_SUCCESS;
839
840 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
841 drop:
842         kfree_skb(skb);
843         return NET_RX_DROP;
844 #endif
845 }
846
847 /*
848  * af_can protocol functions
849  */
850
851 /**
852  * can_proto_register - register CAN transport protocol
853  * @cp: pointer to CAN protocol structure
854  *
855  * Return:
856  *  0 on success
857  *  -EINVAL invalid (out of range) protocol number
858  *  -EBUSY  protocol already in use
859  *  -ENOBUF if proto_register() fails
860  */
861 int can_proto_register(struct can_proto *cp)
862 {
863         int proto = cp->protocol;
864         int err = 0;
865
866         if (proto < 0 || proto >= CAN_NPROTO) {
867                 printk(KERN_ERR "can: protocol number %d out of range\n",
868                        proto);
869                 return -EINVAL;
870         }
871
872 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
873         err = proto_register(cp->prot, 0);
874         if (err < 0)
875                 return err;
876 #endif
877
878         mutex_lock(&proto_tab_lock);
879
880         if (proto_tab[proto]) {
881                 printk(KERN_ERR "can: protocol %d already registered\n",
882                        proto);
883                 err = -EBUSY;
884         } else
885                 rcu_assign_pointer(proto_tab[proto], cp);
886
887         mutex_unlock(&proto_tab_lock);
888
889 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
890         if (err < 0)
891                 proto_unregister(cp->prot);
892 #endif
893
894         return err;
895 }
896 EXPORT_SYMBOL(can_proto_register);
897
898 /**
899  * can_proto_unregister - unregister CAN transport protocol
900  * @cp: pointer to CAN protocol structure
901  */
902 void can_proto_unregister(struct can_proto *cp)
903 {
904         int proto = cp->protocol;
905
906         mutex_lock(&proto_tab_lock);
907         BUG_ON(proto_tab[proto] != cp);
908         rcu_assign_pointer(proto_tab[proto], NULL);
909         mutex_unlock(&proto_tab_lock);
910
911         synchronize_rcu();
912
913 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
914         proto_unregister(cp->prot);
915 #endif
916 }
917 EXPORT_SYMBOL(can_proto_unregister);
918
919 /*
920  * af_can notifier to create/remove CAN netdevice specific structs
921  */
922 static int can_notifier(struct notifier_block *nb, unsigned long msg,
923                         void *data)
924 {
925         struct net_device *dev = (struct net_device *)data;
926         struct dev_rcv_lists *d;
927
928 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
929         if (!net_eq(dev_net(dev), &init_net))
930                 return NOTIFY_DONE;
931 #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
932         if (dev->nd_net != &init_net)
933                 return NOTIFY_DONE;
934 #endif
935
936         if (dev->type != ARPHRD_CAN)
937                 return NOTIFY_DONE;
938
939         switch (msg) {
940
941         case NETDEV_REGISTER:
942
943                 /*
944                  * create new dev_rcv_lists for this device
945                  *
946                  * N.B. zeroing the struct is the correct initialization
947                  * for the embedded hlist_head structs.
948                  * Another list type, e.g. list_head, would require
949                  * explicit initialization.
950                  */
951
952                 d = kzalloc(sizeof(*d), GFP_KERNEL);
953                 if (!d) {
954                         printk(KERN_ERR
955                                "can: allocation of receive list failed\n");
956                         return NOTIFY_DONE;
957                 }
958                 d->dev = dev;
959
960                 spin_lock(&can_rcvlists_lock);
961 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
962                 BUG_ON(dev->ml_priv);
963                 dev->ml_priv = d;
964 #endif
965                 hlist_add_head_rcu(&d->list, &can_rx_dev_list);
966                 spin_unlock(&can_rcvlists_lock);
967
968                 break;
969
970         case NETDEV_UNREGISTER:
971                 spin_lock(&can_rcvlists_lock);
972
973                 d = find_dev_rcv_lists(dev);
974                 if (d) {
975                         if (d->entries) {
976                                 d->remove_on_zero_entries = 1;
977                                 d = NULL;
978                         } else {
979 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
980                                 dev->ml_priv = NULL;
981 #endif
982                                 hlist_del_rcu(&d->list);
983                         }
984                 } else
985                         printk(KERN_ERR "can: notifier: receive list not "
986                                "found for dev %s\n", dev->name);
987
988                 spin_unlock(&can_rcvlists_lock);
989
990                 if (d)
991                         call_rcu(&d->rcu, can_rx_delete_device);
992
993                 break;
994         }
995
996         return NOTIFY_DONE;
997 }
998
999 /*
1000  * af_can module init/exit functions
1001  */
1002
1003 static struct packet_type can_packet __read_mostly = {
1004 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)
1005         .type = cpu_to_be16(ETH_P_CAN),
1006 #else
1007         .type = __constant_htons(ETH_P_CAN),
1008 #endif
1009         .dev  = NULL,
1010         .func = can_rcv,
1011 };
1012
1013 static struct net_proto_family can_family_ops __read_mostly = {
1014         .family = PF_CAN,
1015         .create = can_create,
1016         .owner  = THIS_MODULE,
1017 };
1018
1019 /* notifier block for netdevice event */
1020 static struct notifier_block can_netdev_notifier __read_mostly = {
1021         .notifier_call = can_notifier,
1022 };
1023
1024 static __init int can_init(void)
1025 {
1026         printk(banner);
1027
1028 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
1029         rcv_cache = kmem_cache_create("can_receiver", sizeof(struct receiver),
1030                                       0, 0, NULL);
1031 #else
1032         rcv_cache = kmem_cache_create("can_receiver", sizeof(struct receiver),
1033                                       0, 0, NULL, NULL);
1034 #endif
1035         if (!rcv_cache)
1036                 return -ENOMEM;
1037
1038         /*
1039          * Insert can_rx_alldev_list for reception on all devices.
1040          * This struct is zero initialized which is correct for the
1041          * embedded hlist heads, the dev pointer, and the entries counter.
1042          */
1043
1044         spin_lock(&can_rcvlists_lock);
1045         hlist_add_head_rcu(&can_rx_alldev_list.list, &can_rx_dev_list);
1046         spin_unlock(&can_rcvlists_lock);
1047
1048         if (stats_timer) {
1049                 /* the statistics are updated every second (timer triggered) */
1050                 setup_timer(&can_stattimer, can_stat_update, 0);
1051                 mod_timer(&can_stattimer, round_jiffies(jiffies + HZ));
1052         } else
1053                 can_stattimer.function = NULL;
1054
1055         can_init_proc();
1056
1057         /* protocol register */
1058         sock_register(&can_family_ops);
1059         register_netdevice_notifier(&can_netdev_notifier);
1060         dev_add_pack(&can_packet);
1061
1062         return 0;
1063 }
1064
1065 static __exit void can_exit(void)
1066 {
1067         struct dev_rcv_lists *d;
1068         struct hlist_node *n, *next;
1069
1070         if (stats_timer)
1071                 del_timer(&can_stattimer);
1072
1073         can_remove_proc();
1074
1075         /* protocol unregister */
1076         dev_remove_pack(&can_packet);
1077         unregister_netdevice_notifier(&can_netdev_notifier);
1078         sock_unregister(PF_CAN);
1079
1080         /* remove can_rx_dev_list */
1081         spin_lock(&can_rcvlists_lock);
1082         hlist_del(&can_rx_alldev_list.list);
1083         hlist_for_each_entry_safe(d, n, next, &can_rx_dev_list, list) {
1084                 hlist_del(&d->list);
1085                 BUG_ON(d->entries);
1086 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
1087                 d->dev->ml_priv = NULL;
1088 #endif
1089                 kfree(d);
1090         }
1091         spin_unlock(&can_rcvlists_lock);
1092
1093 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)
1094         rcu_barrier(); /* Wait for completion of call_rcu()'s */
1095 #endif
1096
1097         kmem_cache_destroy(rcv_cache);
1098 }
1099
1100 module_init(can_init);
1101 module_exit(can_exit);