Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/net/ipv6/protocol.c
26285 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
* INET An implementation of the TCP/IP protocol suite for the LINUX
4
* operating system. INET is implemented using the BSD Socket
5
* interface as the means of communication with the user level.
6
*
7
* PF_INET6 protocol dispatch tables.
8
*
9
* Authors: Pedro Roque <[email protected]>
10
*/
11
12
/*
13
* Changes:
14
*
15
* Vince Laviano ([email protected]) 16 May 2001
16
* - Removed unused variable 'inet6_protocol_base'
17
* - Modified inet6_del_protocol() to correctly maintain copy bit.
18
*/
19
#include <linux/module.h>
20
#include <linux/netdevice.h>
21
#include <linux/spinlock.h>
22
#include <net/protocol.h>
23
24
#if IS_ENABLED(CONFIG_IPV6)
25
struct inet6_protocol __rcu *inet6_protos[MAX_INET_PROTOS] __read_mostly;
26
EXPORT_SYMBOL(inet6_protos);
27
28
int inet6_add_protocol(const struct inet6_protocol *prot, unsigned char protocol)
29
{
30
return !cmpxchg((const struct inet6_protocol **)&inet6_protos[protocol],
31
NULL, prot) ? 0 : -1;
32
}
33
EXPORT_SYMBOL(inet6_add_protocol);
34
35
int inet6_del_protocol(const struct inet6_protocol *prot, unsigned char protocol)
36
{
37
int ret;
38
39
ret = (cmpxchg((const struct inet6_protocol **)&inet6_protos[protocol],
40
prot, NULL) == prot) ? 0 : -1;
41
42
synchronize_net();
43
44
return ret;
45
}
46
EXPORT_SYMBOL(inet6_del_protocol);
47
#endif
48
49
const struct net_offload __rcu *inet6_offloads[MAX_INET_PROTOS] __read_mostly;
50
EXPORT_SYMBOL(inet6_offloads);
51
52
int inet6_add_offload(const struct net_offload *prot, unsigned char protocol)
53
{
54
return !cmpxchg((const struct net_offload **)&inet6_offloads[protocol],
55
NULL, prot) ? 0 : -1;
56
}
57
EXPORT_SYMBOL(inet6_add_offload);
58
59
int inet6_del_offload(const struct net_offload *prot, unsigned char protocol)
60
{
61
int ret;
62
63
ret = (cmpxchg((const struct net_offload **)&inet6_offloads[protocol],
64
prot, NULL) == prot) ? 0 : -1;
65
66
synchronize_net();
67
68
return ret;
69
}
70
EXPORT_SYMBOL(inet6_del_offload);
71
72