Branch data Line data Source code
1 : : /*
2 : : * INET An implementation of the TCP/IP protocol suite for the LINUX
3 : : * operating system. INET is implemented using the BSD Socket
4 : : * interface as the means of communication with the user level.
5 : : *
6 : : * PF_INET6 protocol dispatch tables.
7 : : *
8 : : * Authors: Pedro Roque <roque@di.fc.ul.pt>
9 : : *
10 : : * This program is free software; you can redistribute it and/or
11 : : * modify it under the terms of the GNU General Public License
12 : : * as published by the Free Software Foundation; either version
13 : : * 2 of the License, or (at your option) any later version.
14 : : */
15 : :
16 : : /*
17 : : * Changes:
18 : : *
19 : : * Vince Laviano (vince@cs.stanford.edu) 16 May 2001
20 : : * - Removed unused variable 'inet6_protocol_base'
21 : : * - Modified inet6_del_protocol() to correctly maintain copy bit.
22 : : */
23 : : #include <linux/module.h>
24 : : #include <linux/netdevice.h>
25 : : #include <linux/spinlock.h>
26 : : #include <net/protocol.h>
27 : :
28 : : #if IS_ENABLED(CONFIG_IPV6)
29 : : const struct inet6_protocol __rcu *inet6_protos[MAX_INET_PROTOS] __read_mostly;
30 : : EXPORT_SYMBOL(inet6_protos);
31 : :
32 : 0 : int inet6_add_protocol(const struct inet6_protocol *prot, unsigned char protocol)
33 : : {
34 : 0 : return !cmpxchg((const struct inet6_protocol **)&inet6_protos[protocol],
35 [ # # ]: 0 : NULL, prot) ? 0 : -1;
36 : : }
37 : : EXPORT_SYMBOL(inet6_add_protocol);
38 : :
39 : 0 : int inet6_del_protocol(const struct inet6_protocol *prot, unsigned char protocol)
40 : : {
41 : : int ret;
42 : :
43 : 0 : ret = (cmpxchg((const struct inet6_protocol **)&inet6_protos[protocol],
44 [ # # ]: 0 : prot, NULL) == prot) ? 0 : -1;
45 : :
46 : 0 : synchronize_net();
47 : :
48 : 0 : return ret;
49 : : }
50 : : EXPORT_SYMBOL(inet6_del_protocol);
51 : : #endif
52 : :
53 : : const struct net_offload __rcu *inet6_offloads[MAX_INET_PROTOS] __read_mostly;
54 : :
55 : 0 : int inet6_add_offload(const struct net_offload *prot, unsigned char protocol)
56 : : {
57 : 0 : return !cmpxchg((const struct net_offload **)&inet6_offloads[protocol],
58 [ # # ]: 0 : NULL, prot) ? 0 : -1;
59 : : }
60 : : EXPORT_SYMBOL(inet6_add_offload);
61 : :
62 : 0 : int inet6_del_offload(const struct net_offload *prot, unsigned char protocol)
63 : : {
64 : : int ret;
65 : :
66 : 0 : ret = (cmpxchg((const struct net_offload **)&inet6_offloads[protocol],
67 [ # # ]: 0 : prot, NULL) == prot) ? 0 : -1;
68 : :
69 : 0 : synchronize_net();
70 : :
71 : 0 : return ret;
72 : : }
73 : : EXPORT_SYMBOL(inet6_del_offload);
|