1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)
29const struct inet6_protocol __rcu *inet6_protos[MAX_INET_PROTOS] __read_mostly;
30EXPORT_SYMBOL(inet6_protos);
31
32int inet6_add_protocol(const struct inet6_protocol *prot, unsigned char protocol)
33{
34 return !cmpxchg((const struct inet6_protocol **)&inet6_protos[protocol],
35 NULL, prot) ? 0 : -1;
36}
37EXPORT_SYMBOL(inet6_add_protocol);
38
39int inet6_del_protocol(const struct inet6_protocol *prot, unsigned char protocol)
40{
41 int ret;
42
43 ret = (cmpxchg((const struct inet6_protocol **)&inet6_protos[protocol],
44 prot, NULL) == prot) ? 0 : -1;
45
46 synchronize_net();
47
48 return ret;
49}
50EXPORT_SYMBOL(inet6_del_protocol);
51#endif
52
53const struct net_offload __rcu *inet6_offloads[MAX_INET_PROTOS] __read_mostly;
54EXPORT_SYMBOL(inet6_offloads);
55
56int inet6_add_offload(const struct net_offload *prot, unsigned char protocol)
57{
58 return !cmpxchg((const struct net_offload **)&inet6_offloads[protocol],
59 NULL, prot) ? 0 : -1;
60}
61EXPORT_SYMBOL(inet6_add_offload);
62
63int inet6_del_offload(const struct net_offload *prot, unsigned char protocol)
64{
65 int ret;
66
67 ret = (cmpxchg((const struct net_offload **)&inet6_offloads[protocol],
68 prot, NULL) == prot) ? 0 : -1;
69
70 synchronize_net();
71
72 return ret;
73}
74EXPORT_SYMBOL(inet6_del_offload);
75