Line data Source code
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 <roque@di.fc.ul.pt> 10 : */ 11 : 12 : /* 13 : * Changes: 14 : * 15 : * Vince Laviano (vince@cs.stanford.edu) 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 5 : int inet6_add_offload(const struct net_offload *prot, unsigned char protocol) 53 : { 54 5 : return !cmpxchg((const struct net_offload **)&inet6_offloads[protocol], 55 5 : NULL, prot) ? 0 : -1; 56 : } 57 : EXPORT_SYMBOL(inet6_add_offload); 58 : 59 0 : int inet6_del_offload(const struct net_offload *prot, unsigned char protocol) 60 : { 61 0 : int ret; 62 : 63 0 : ret = (cmpxchg((const struct net_offload **)&inet6_offloads[protocol], 64 0 : prot, NULL) == prot) ? 0 : -1; 65 : 66 0 : synchronize_net(); 67 : 68 0 : return ret; 69 : } 70 : EXPORT_SYMBOL(inet6_del_offload);