aboutsummaryrefslogtreecommitdiffstats
path: root/net/can/af_can.c
diff options
context:
space:
mode:
authorOliver Hartkopp <oliver.hartkopp@volkswagen.de>2007-11-16 18:52:17 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 17:54:10 -0500
commit0d66548a10cbbe0ef256852d63d30603f0f73f9b (patch)
tree58c91033f88014c6a25b4d105a721bc58ec35f2c /net/can/af_can.c
parentcd05acfe65ed2cf2db683fa9a6adb8d35635263b (diff)
[CAN]: Add PF_CAN core module
This patch adds the CAN core functionality but no protocols or drivers. No protocol implementations are included here. They come as separate patches. Protocol numbers are already in include/linux/can.h. Signed-off-by: Oliver Hartkopp <oliver.hartkopp@volkswagen.de> Signed-off-by: Urs Thuermann <urs.thuermann@volkswagen.de> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/can/af_can.c')
-rw-r--r--net/can/af_can.c861
1 files changed, 861 insertions, 0 deletions
diff --git a/net/can/af_can.c b/net/can/af_can.c
new file mode 100644
index 000000000000..5158e886630f
--- /dev/null
+++ b/net/can/af_can.c
@@ -0,0 +1,861 @@
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/init.h>
47#include <linux/kmod.h>
48#include <linux/slab.h>
49#include <linux/list.h>
50#include <linux/spinlock.h>
51#include <linux/rcupdate.h>
52#include <linux/uaccess.h>
53#include <linux/net.h>
54#include <linux/netdevice.h>
55#include <linux/socket.h>
56#include <linux/if_ether.h>
57#include <linux/if_arp.h>
58#include <linux/skbuff.h>
59#include <linux/can.h>
60#include <linux/can/core.h>
61#include <net/net_namespace.h>
62#include <net/sock.h>
63
64#include "af_can.h"
65
66static __initdata const char banner[] = KERN_INFO
67 "can: controller area network core (" CAN_VERSION_STRING ")\n";
68
69MODULE_DESCRIPTION("Controller Area Network PF_CAN core");
70MODULE_LICENSE("Dual BSD/GPL");
71MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>, "
72 "Oliver Hartkopp <oliver.hartkopp@volkswagen.de>");
73
74MODULE_ALIAS_NETPROTO(PF_CAN);
75
76static int stats_timer __read_mostly = 1;
77module_param(stats_timer, int, S_IRUGO);
78MODULE_PARM_DESC(stats_timer, "enable timer for statistics (default:on)");
79
80HLIST_HEAD(can_rx_dev_list);
81static struct dev_rcv_lists can_rx_alldev_list;
82static DEFINE_SPINLOCK(can_rcvlists_lock);
83
84static struct kmem_cache *rcv_cache __read_mostly;
85
86/* table of registered CAN protocols */
87static struct can_proto *proto_tab[CAN_NPROTO] __read_mostly;
88static DEFINE_SPINLOCK(proto_tab_lock);
89
90struct timer_list can_stattimer; /* timer for statistics update */
91struct s_stats can_stats; /* packet statistics */
92struct s_pstats can_pstats; /* receive list statistics */
93
94/*
95 * af_can socket functions
96 */
97
98static int can_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
99{
100 struct sock *sk = sock->sk;
101
102 switch (cmd) {
103
104 case SIOCGSTAMP:
105 return sock_get_timestamp(sk, (struct timeval __user *)arg);
106
107 default:
108 return -ENOIOCTLCMD;
109 }
110}
111
112static void can_sock_destruct(struct sock *sk)
113{
114 skb_queue_purge(&sk->sk_receive_queue);
115}
116
117static int can_create(struct net *net, struct socket *sock, int protocol)
118{
119 struct sock *sk;
120 struct can_proto *cp;
121 char module_name[sizeof("can-proto-000")];
122 int err = 0;
123
124 sock->state = SS_UNCONNECTED;
125
126 if (protocol < 0 || protocol >= CAN_NPROTO)
127 return -EINVAL;
128
129 if (net != &init_net)
130 return -EAFNOSUPPORT;
131
132 /* try to load protocol module, when CONFIG_KMOD is defined */
133 if (!proto_tab[protocol]) {
134 sprintf(module_name, "can-proto-%d", protocol);
135 err = request_module(module_name);
136
137 /*
138 * In case of error we only print a message but don't
139 * return the error code immediately. Below we will
140 * return -EPROTONOSUPPORT
141 */
142 if (err == -ENOSYS) {
143 if (printk_ratelimit())
144 printk(KERN_INFO "can: request_module(%s)"
145 " not implemented.\n", module_name);
146 } else if (err) {
147 if (printk_ratelimit())
148 printk(KERN_ERR "can: request_module(%s)"
149 " failed.\n", module_name);
150 }
151 }
152
153 spin_lock(&proto_tab_lock);
154 cp = proto_tab[protocol];
155 if (cp && !try_module_get(cp->prot->owner))
156 cp = NULL;
157 spin_unlock(&proto_tab_lock);
158
159 /* check for available protocol and correct usage */
160
161 if (!cp)
162 return -EPROTONOSUPPORT;
163
164 if (cp->type != sock->type) {
165 err = -EPROTONOSUPPORT;
166 goto errout;
167 }
168
169 if (cp->capability >= 0 && !capable(cp->capability)) {
170 err = -EPERM;
171 goto errout;
172 }
173
174 sock->ops = cp->ops;
175
176 sk = sk_alloc(net, PF_CAN, GFP_KERNEL, cp->prot);
177 if (!sk) {
178 err = -ENOMEM;
179 goto errout;
180 }
181
182 sock_init_data(sock, sk);
183 sk->sk_destruct = can_sock_destruct;
184
185 if (sk->sk_prot->init)
186 err = sk->sk_prot->init(sk);
187
188 if (err) {
189 /* release sk on errors */
190 sock_orphan(sk);
191 sock_put(sk);
192 }
193
194 errout:
195 module_put(cp->prot->owner);
196 return err;
197}
198
199/*
200 * af_can tx path
201 */
202
203/**
204 * can_send - transmit a CAN frame (optional with local loopback)
205 * @skb: pointer to socket buffer with CAN frame in data section
206 * @loop: loopback for listeners on local CAN sockets (recommended default!)
207 *
208 * Return:
209 * 0 on success
210 * -ENETDOWN when the selected interface is down
211 * -ENOBUFS on full driver queue (see net_xmit_errno())
212 * -ENOMEM when local loopback failed at calling skb_clone()
213 * -EPERM when trying to send on a non-CAN interface
214 */
215int can_send(struct sk_buff *skb, int loop)
216{
217 int err;
218
219 if (skb->dev->type != ARPHRD_CAN) {
220 kfree_skb(skb);
221 return -EPERM;
222 }
223
224 if (!(skb->dev->flags & IFF_UP)) {
225 kfree_skb(skb);
226 return -ENETDOWN;
227 }
228
229 skb->protocol = htons(ETH_P_CAN);
230 skb_reset_network_header(skb);
231 skb_reset_transport_header(skb);
232
233 if (loop) {
234 /* local loopback of sent CAN frames */
235
236 /* indication for the CAN driver: do loopback */
237 skb->pkt_type = PACKET_LOOPBACK;
238
239 /*
240 * The reference to the originating sock may be required
241 * by the receiving socket to check whether the frame is
242 * its own. Example: can_raw sockopt CAN_RAW_RECV_OWN_MSGS
243 * Therefore we have to ensure that skb->sk remains the
244 * reference to the originating sock by restoring skb->sk
245 * after each skb_clone() or skb_orphan() usage.
246 */
247
248 if (!(skb->dev->flags & IFF_ECHO)) {
249 /*
250 * If the interface is not capable to do loopback
251 * itself, we do it here.
252 */
253 struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
254
255 if (!newskb) {
256 kfree_skb(skb);
257 return -ENOMEM;
258 }
259
260 newskb->sk = skb->sk;
261 newskb->ip_summed = CHECKSUM_UNNECESSARY;
262 newskb->pkt_type = PACKET_BROADCAST;
263 netif_rx(newskb);
264 }
265 } else {
266 /* indication for the CAN driver: no loopback required */
267 skb->pkt_type = PACKET_HOST;
268 }
269
270 /* send to netdevice */
271 err = dev_queue_xmit(skb);
272 if (err > 0)
273 err = net_xmit_errno(err);
274
275 /* update statistics */
276 can_stats.tx_frames++;
277 can_stats.tx_frames_delta++;
278
279 return err;
280}
281EXPORT_SYMBOL(can_send);
282
283/*
284 * af_can rx path
285 */
286
287static struct dev_rcv_lists *find_dev_rcv_lists(struct net_device *dev)
288{
289 struct dev_rcv_lists *d = NULL;
290 struct hlist_node *n;
291
292 /*
293 * find receive list for this device
294 *
295 * The hlist_for_each_entry*() macros curse through the list
296 * using the pointer variable n and set d to the containing
297 * struct in each list iteration. Therefore, after list
298 * iteration, d is unmodified when the list is empty, and it
299 * points to last list element, when the list is non-empty
300 * but no match in the loop body is found. I.e. d is *not*
301 * NULL when no match is found. We can, however, use the
302 * cursor variable n to decide if a match was found.
303 */
304
305 hlist_for_each_entry_rcu(d, n, &can_rx_dev_list, list) {
306 if (d->dev == dev)
307 break;
308 }
309
310 return n ? d : NULL;
311}
312
313static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask,
314 struct dev_rcv_lists *d)
315{
316 canid_t inv = *can_id & CAN_INV_FILTER; /* save flag before masking */
317
318 /* filter error frames */
319 if (*mask & CAN_ERR_FLAG) {
320 /* clear CAN_ERR_FLAG in list entry */
321 *mask &= CAN_ERR_MASK;
322 return &d->rx[RX_ERR];
323 }
324
325 /* ensure valid values in can_mask */
326 if (*mask & CAN_EFF_FLAG)
327 *mask &= (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG);
328 else
329 *mask &= (CAN_SFF_MASK | CAN_RTR_FLAG);
330
331 /* reduce condition testing at receive time */
332 *can_id &= *mask;
333
334 /* inverse can_id/can_mask filter */
335 if (inv)
336 return &d->rx[RX_INV];
337
338 /* mask == 0 => no condition testing at receive time */
339 if (!(*mask))
340 return &d->rx[RX_ALL];
341
342 /* use extra filterset for the subscription of exactly *ONE* can_id */
343 if (*can_id & CAN_EFF_FLAG) {
344 if (*mask == (CAN_EFF_MASK | CAN_EFF_FLAG)) {
345 /* RFC: a use-case for hash-tables in the future? */
346 return &d->rx[RX_EFF];
347 }
348 } else {
349 if (*mask == CAN_SFF_MASK)
350 return &d->rx_sff[*can_id];
351 }
352
353 /* default: filter via can_id/can_mask */
354 return &d->rx[RX_FIL];
355}
356
357/**
358 * can_rx_register - subscribe CAN frames from a specific interface
359 * @dev: pointer to netdevice (NULL => subcribe from 'all' CAN devices list)
360 * @can_id: CAN identifier (see description)
361 * @mask: CAN mask (see description)
362 * @func: callback function on filter match
363 * @data: returned parameter for callback function
364 * @ident: string for calling module indentification
365 *
366 * Description:
367 * Invokes the callback function with the received sk_buff and the given
368 * parameter 'data' on a matching receive filter. A filter matches, when
369 *
370 * <received_can_id> & mask == can_id & mask
371 *
372 * The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can
373 * filter for error frames (CAN_ERR_FLAG bit set in mask).
374 *
375 * Return:
376 * 0 on success
377 * -ENOMEM on missing cache mem to create subscription entry
378 * -ENODEV unknown device
379 */
380int can_rx_register(struct net_device *dev, canid_t can_id, canid_t mask,
381 void (*func)(struct sk_buff *, void *), void *data,
382 char *ident)
383{
384 struct receiver *r;
385 struct hlist_head *rl;
386 struct dev_rcv_lists *d;
387 int err = 0;
388
389 /* insert new receiver (dev,canid,mask) -> (func,data) */
390
391 r = kmem_cache_alloc(rcv_cache, GFP_KERNEL);
392 if (!r)
393 return -ENOMEM;
394
395 spin_lock(&can_rcvlists_lock);
396
397 d = find_dev_rcv_lists(dev);
398 if (d) {
399 rl = find_rcv_list(&can_id, &mask, d);
400
401 r->can_id = can_id;
402 r->mask = mask;
403 r->matches = 0;
404 r->func = func;
405 r->data = data;
406 r->ident = ident;
407
408 hlist_add_head_rcu(&r->list, rl);
409 d->entries++;
410
411 can_pstats.rcv_entries++;
412 if (can_pstats.rcv_entries_max < can_pstats.rcv_entries)
413 can_pstats.rcv_entries_max = can_pstats.rcv_entries;
414 } else {
415 kmem_cache_free(rcv_cache, r);
416 err = -ENODEV;
417 }
418
419 spin_unlock(&can_rcvlists_lock);
420
421 return err;
422}
423EXPORT_SYMBOL(can_rx_register);
424
425/*
426 * can_rx_delete_device - rcu callback for dev_rcv_lists structure removal
427 */
428static void can_rx_delete_device(struct rcu_head *rp)
429{
430 struct dev_rcv_lists *d = container_of(rp, struct dev_rcv_lists, rcu);
431
432 kfree(d);
433}
434
435/*
436 * can_rx_delete_receiver - rcu callback for single receiver entry removal
437 */
438static void can_rx_delete_receiver(struct rcu_head *rp)
439{
440 struct receiver *r = container_of(rp, struct receiver, rcu);
441
442 kmem_cache_free(rcv_cache, r);
443}
444
445/**
446 * can_rx_unregister - unsubscribe CAN frames from a specific interface
447 * @dev: pointer to netdevice (NULL => unsubcribe from 'all' CAN devices list)
448 * @can_id: CAN identifier
449 * @mask: CAN mask
450 * @func: callback function on filter match
451 * @data: returned parameter for callback function
452 *
453 * Description:
454 * Removes subscription entry depending on given (subscription) values.
455 */
456void can_rx_unregister(struct net_device *dev, canid_t can_id, canid_t mask,
457 void (*func)(struct sk_buff *, void *), void *data)
458{
459 struct receiver *r = NULL;
460 struct hlist_head *rl;
461 struct hlist_node *next;
462 struct dev_rcv_lists *d;
463
464 spin_lock(&can_rcvlists_lock);
465
466 d = find_dev_rcv_lists(dev);
467 if (!d) {
468 printk(KERN_ERR "BUG: receive list not found for "
469 "dev %s, id %03X, mask %03X\n",
470 DNAME(dev), can_id, mask);
471 goto out;
472 }
473
474 rl = find_rcv_list(&can_id, &mask, d);
475
476 /*
477 * Search the receiver list for the item to delete. This should
478 * exist, since no receiver may be unregistered that hasn't
479 * been registered before.
480 */
481
482 hlist_for_each_entry_rcu(r, next, rl, list) {
483 if (r->can_id == can_id && r->mask == mask
484 && r->func == func && r->data == data)
485 break;
486 }
487
488 /*
489 * Check for bugs in CAN protocol implementations:
490 * If no matching list item was found, the list cursor variable next
491 * will be NULL, while r will point to the last item of the list.
492 */
493
494 if (!next) {
495 printk(KERN_ERR "BUG: receive list entry not found for "
496 "dev %s, id %03X, mask %03X\n",
497 DNAME(dev), can_id, mask);
498 r = NULL;
499 d = NULL;
500 goto out;
501 }
502
503 hlist_del_rcu(&r->list);
504 d->entries--;
505
506 if (can_pstats.rcv_entries > 0)
507 can_pstats.rcv_entries--;
508
509 /* remove device structure requested by NETDEV_UNREGISTER */
510 if (d->remove_on_zero_entries && !d->entries)
511 hlist_del_rcu(&d->list);
512 else
513 d = NULL;
514
515 out:
516 spin_unlock(&can_rcvlists_lock);
517
518 /* schedule the receiver item for deletion */
519 if (r)
520 call_rcu(&r->rcu, can_rx_delete_receiver);
521
522 /* schedule the device structure for deletion */
523 if (d)
524 call_rcu(&d->rcu, can_rx_delete_device);
525}
526EXPORT_SYMBOL(can_rx_unregister);
527
528static inline void deliver(struct sk_buff *skb, struct receiver *r)
529{
530 struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC);
531
532 if (clone) {
533 clone->sk = skb->sk;
534 r->func(clone, r->data);
535 r->matches++;
536 }
537}
538
539static int can_rcv_filter(struct dev_rcv_lists *d, struct sk_buff *skb)
540{
541 struct receiver *r;
542 struct hlist_node *n;
543 int matches = 0;
544 struct can_frame *cf = (struct can_frame *)skb->data;
545 canid_t can_id = cf->can_id;
546
547 if (d->entries == 0)
548 return 0;
549
550 if (can_id & CAN_ERR_FLAG) {
551 /* check for error frame entries only */
552 hlist_for_each_entry_rcu(r, n, &d->rx[RX_ERR], list) {
553 if (can_id & r->mask) {
554 deliver(skb, r);
555 matches++;
556 }
557 }
558 return matches;
559 }
560
561 /* check for unfiltered entries */
562 hlist_for_each_entry_rcu(r, n, &d->rx[RX_ALL], list) {
563 deliver(skb, r);
564 matches++;
565 }
566
567 /* check for can_id/mask entries */
568 hlist_for_each_entry_rcu(r, n, &d->rx[RX_FIL], list) {
569 if ((can_id & r->mask) == r->can_id) {
570 deliver(skb, r);
571 matches++;
572 }
573 }
574
575 /* check for inverted can_id/mask entries */
576 hlist_for_each_entry_rcu(r, n, &d->rx[RX_INV], list) {
577 if ((can_id & r->mask) != r->can_id) {
578 deliver(skb, r);
579 matches++;
580 }
581 }
582
583 /* check CAN_ID specific entries */
584 if (can_id & CAN_EFF_FLAG) {
585 hlist_for_each_entry_rcu(r, n, &d->rx[RX_EFF], list) {
586 if (r->can_id == can_id) {
587 deliver(skb, r);
588 matches++;
589 }
590 }
591 } else {
592 can_id &= CAN_SFF_MASK;
593 hlist_for_each_entry_rcu(r, n, &d->rx_sff[can_id], list) {
594 deliver(skb, r);
595 matches++;
596 }
597 }
598
599 return matches;
600}
601
602static int can_rcv(struct sk_buff *skb, struct net_device *dev,
603 struct packet_type *pt, struct net_device *orig_dev)
604{
605 struct dev_rcv_lists *d;
606 int matches;
607
608 if (dev->type != ARPHRD_CAN || dev->nd_net != &init_net) {
609 kfree_skb(skb);
610 return 0;
611 }
612
613 /* update statistics */
614 can_stats.rx_frames++;
615 can_stats.rx_frames_delta++;
616
617 rcu_read_lock();
618
619 /* deliver the packet to sockets listening on all devices */
620 matches = can_rcv_filter(&can_rx_alldev_list, skb);
621
622 /* find receive list for this device */
623 d = find_dev_rcv_lists(dev);
624 if (d)
625 matches += can_rcv_filter(d, skb);
626
627 rcu_read_unlock();
628
629 /* free the skbuff allocated by the netdevice driver */
630 kfree_skb(skb);
631
632 if (matches > 0) {
633 can_stats.matches++;
634 can_stats.matches_delta++;
635 }
636
637 return 0;
638}
639
640/*
641 * af_can protocol functions
642 */
643
644/**
645 * can_proto_register - register CAN transport protocol
646 * @cp: pointer to CAN protocol structure
647 *
648 * Return:
649 * 0 on success
650 * -EINVAL invalid (out of range) protocol number
651 * -EBUSY protocol already in use
652 * -ENOBUF if proto_register() fails
653 */
654int can_proto_register(struct can_proto *cp)
655{
656 int proto = cp->protocol;
657 int err = 0;
658
659 if (proto < 0 || proto >= CAN_NPROTO) {
660 printk(KERN_ERR "can: protocol number %d out of range\n",
661 proto);
662 return -EINVAL;
663 }
664
665 spin_lock(&proto_tab_lock);
666 if (proto_tab[proto]) {
667 printk(KERN_ERR "can: protocol %d already registered\n",
668 proto);
669 err = -EBUSY;
670 goto errout;
671 }
672
673 err = proto_register(cp->prot, 0);
674 if (err < 0)
675 goto errout;
676
677 proto_tab[proto] = cp;
678
679 /* use generic ioctl function if the module doesn't bring its own */
680 if (!cp->ops->ioctl)
681 cp->ops->ioctl = can_ioctl;
682
683 errout:
684 spin_unlock(&proto_tab_lock);
685
686 return err;
687}
688EXPORT_SYMBOL(can_proto_register);
689
690/**
691 * can_proto_unregister - unregister CAN transport protocol
692 * @cp: pointer to CAN protocol structure
693 */
694void can_proto_unregister(struct can_proto *cp)
695{
696 int proto = cp->protocol;
697
698 spin_lock(&proto_tab_lock);
699 if (!proto_tab[proto]) {
700 printk(KERN_ERR "BUG: can: protocol %d is not registered\n",
701 proto);
702 }
703 proto_unregister(cp->prot);
704 proto_tab[proto] = NULL;
705 spin_unlock(&proto_tab_lock);
706}
707EXPORT_SYMBOL(can_proto_unregister);
708
709/*
710 * af_can notifier to create/remove CAN netdevice specific structs
711 */
712static int can_notifier(struct notifier_block *nb, unsigned long msg,
713 void *data)
714{
715 struct net_device *dev = (struct net_device *)data;
716 struct dev_rcv_lists *d;
717
718 if (dev->nd_net != &init_net)
719 return NOTIFY_DONE;
720
721 if (dev->type != ARPHRD_CAN)
722 return NOTIFY_DONE;
723
724 switch (msg) {
725
726 case NETDEV_REGISTER:
727
728 /*
729 * create new dev_rcv_lists for this device
730 *
731 * N.B. zeroing the struct is the correct initialization
732 * for the embedded hlist_head structs.
733 * Another list type, e.g. list_head, would require
734 * explicit initialization.
735 */
736
737 d = kzalloc(sizeof(*d), GFP_KERNEL);
738 if (!d) {
739 printk(KERN_ERR
740 "can: allocation of receive list failed\n");
741 return NOTIFY_DONE;
742 }
743 d->dev = dev;
744
745 spin_lock(&can_rcvlists_lock);
746 hlist_add_head_rcu(&d->list, &can_rx_dev_list);
747 spin_unlock(&can_rcvlists_lock);
748
749 break;
750
751 case NETDEV_UNREGISTER:
752 spin_lock(&can_rcvlists_lock);
753
754 d = find_dev_rcv_lists(dev);
755 if (d) {
756 if (d->entries) {
757 d->remove_on_zero_entries = 1;
758 d = NULL;
759 } else
760 hlist_del_rcu(&d->list);
761 } else
762 printk(KERN_ERR "can: notifier: receive list not "
763 "found for dev %s\n", dev->name);
764
765 spin_unlock(&can_rcvlists_lock);
766
767 if (d)
768 call_rcu(&d->rcu, can_rx_delete_device);
769
770 break;
771 }
772
773 return NOTIFY_DONE;
774}
775
776/*
777 * af_can module init/exit functions
778 */
779
780static struct packet_type can_packet __read_mostly = {
781 .type = __constant_htons(ETH_P_CAN),
782 .dev = NULL,
783 .func = can_rcv,
784};
785
786static struct net_proto_family can_family_ops __read_mostly = {
787 .family = PF_CAN,
788 .create = can_create,
789 .owner = THIS_MODULE,
790};
791
792/* notifier block for netdevice event */
793static struct notifier_block can_netdev_notifier __read_mostly = {
794 .notifier_call = can_notifier,
795};
796
797static __init int can_init(void)
798{
799 printk(banner);
800
801 rcv_cache = kmem_cache_create("can_receiver", sizeof(struct receiver),
802 0, 0, NULL);
803 if (!rcv_cache)
804 return -ENOMEM;
805
806 /*
807 * Insert can_rx_alldev_list for reception on all devices.
808 * This struct is zero initialized which is correct for the
809 * embedded hlist heads, the dev pointer, and the entries counter.
810 */
811
812 spin_lock(&can_rcvlists_lock);
813 hlist_add_head_rcu(&can_rx_alldev_list.list, &can_rx_dev_list);
814 spin_unlock(&can_rcvlists_lock);
815
816 if (stats_timer) {
817 /* the statistics are updated every second (timer triggered) */
818 setup_timer(&can_stattimer, can_stat_update, 0);
819 mod_timer(&can_stattimer, round_jiffies(jiffies + HZ));
820 } else
821 can_stattimer.function = NULL;
822
823 can_init_proc();
824
825 /* protocol register */
826 sock_register(&can_family_ops);
827 register_netdevice_notifier(&can_netdev_notifier);
828 dev_add_pack(&can_packet);
829
830 return 0;
831}
832
833static __exit void can_exit(void)
834{
835 struct dev_rcv_lists *d;
836 struct hlist_node *n, *next;
837
838 if (stats_timer)
839 del_timer(&can_stattimer);
840
841 can_remove_proc();
842
843 /* protocol unregister */
844 dev_remove_pack(&can_packet);
845 unregister_netdevice_notifier(&can_netdev_notifier);
846 sock_unregister(PF_CAN);
847
848 /* remove can_rx_dev_list */
849 spin_lock(&can_rcvlists_lock);
850 hlist_del(&can_rx_alldev_list.list);
851 hlist_for_each_entry_safe(d, n, next, &can_rx_dev_list, list) {
852 hlist_del(&d->list);
853 kfree(d);
854 }
855 spin_unlock(&can_rcvlists_lock);
856
857 kmem_cache_destroy(rcv_cache);
858}
859
860module_init(can_init);
861module_exit(can_exit);