Branch data 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 : 300 : int inet6_add_protocol(const struct inet6_protocol *prot, unsigned char protocol) 29 : : { 30 : 300 : return !cmpxchg((const struct inet6_protocol **)&inet6_protos[protocol], 31 [ - + ]: 300 : NULL, prot) ? 0 : -1; 32 : : } 33 : : EXPORT_SYMBOL(inet6_add_protocol); 34 : : 35 : 0 : int inet6_del_protocol(const struct inet6_protocol *prot, unsigned char protocol) 36 : : { 37 : 0 : int ret; 38 : : 39 : 0 : ret = (cmpxchg((const struct inet6_protocol **)&inet6_protos[protocol], 40 [ # # ]: 0 : prot, NULL) == prot) ? 0 : -1; 41 : : 42 : 0 : synchronize_net(); 43 : : 44 : 0 : 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 : 210 : int inet6_add_offload(const struct net_offload *prot, unsigned char protocol) 53 : : { 54 : 210 : return !cmpxchg((const struct net_offload **)&inet6_offloads[protocol], 55 [ - + ]: 210 : 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);