1 // SPDX-License-Identifier: GPL-2.0-or-later << 2 /* 1 /* 3 * INET An implementation of the TCP/I 2 * INET An implementation of the TCP/IP protocol suite for the LINUX 4 * operating system. INET is imp 3 * operating system. INET is implemented using the BSD Socket 5 * interface as the means of comm 4 * interface as the means of communication with the user level. 6 * 5 * 7 * PF_INET6 protocol dispatch tab 6 * PF_INET6 protocol dispatch tables. 8 * 7 * >> 8 * Version: $Id: protocol.c,v 1.10 2001/05/18 02:25:49 davem Exp $ >> 9 * 9 * Authors: Pedro Roque <roque@di.fc.u 10 * Authors: Pedro Roque <roque@di.fc.ul.pt> >> 11 * >> 12 * This program is free software; you can redistribute it and/or >> 13 * modify it under the terms of the GNU General Public License >> 14 * as published by the Free Software Foundation; either version >> 15 * 2 of the License, or (at your option) any later version. 10 */ 16 */ 11 17 12 /* 18 /* 13 * Changes: 19 * Changes: 14 * 20 * 15 * Vince Laviano (vince@cs.stanford.edu) 21 * Vince Laviano (vince@cs.stanford.edu) 16 May 2001 16 * - Removed unused variable 'inet6_proto 22 * - Removed unused variable 'inet6_protocol_base' 17 * - Modified inet6_del_protocol() to cor 23 * - Modified inet6_del_protocol() to correctly maintain copy bit. 18 */ 24 */ 19 #include <linux/module.h> !! 25 >> 26 #include <linux/errno.h> >> 27 #include <linux/types.h> >> 28 #include <linux/socket.h> >> 29 #include <linux/sockios.h> >> 30 #include <linux/sched.h> >> 31 #include <linux/net.h> >> 32 #include <linux/in6.h> 20 #include <linux/netdevice.h> 33 #include <linux/netdevice.h> 21 #include <linux/spinlock.h> !! 34 #include <linux/if_arp.h> >> 35 >> 36 #include <net/sock.h> >> 37 #include <net/snmp.h> >> 38 >> 39 #include <net/ipv6.h> 22 #include <net/protocol.h> 40 #include <net/protocol.h> 23 41 24 #if IS_ENABLED(CONFIG_IPV6) !! 42 struct inet6_protocol *inet6_protos[MAX_INET_PROTOS]; 25 struct inet6_protocol __rcu *inet6_protos[MAX_ !! 43 static spinlock_t inet6_proto_lock = SPIN_LOCK_UNLOCKED; 26 EXPORT_SYMBOL(inet6_protos); << 27 44 28 int inet6_add_protocol(const struct inet6_prot << 29 { << 30 return !cmpxchg((const struct inet6_pr << 31 NULL, prot) ? 0 : -1; << 32 } << 33 EXPORT_SYMBOL(inet6_add_protocol); << 34 45 35 int inet6_del_protocol(const struct inet6_prot !! 46 int inet6_add_protocol(struct inet6_protocol *prot, unsigned char protocol) 36 { 47 { 37 int ret; !! 48 int ret, hash = protocol & (MAX_INET_PROTOS - 1); 38 49 39 ret = (cmpxchg((const struct inet6_pro !! 50 spin_lock_bh(&inet6_proto_lock); 40 prot, NULL) == prot) ? << 41 51 42 synchronize_net(); !! 52 if (inet6_protos[hash]) { >> 53 ret = -1; >> 54 } else { >> 55 inet6_protos[hash] = prot; >> 56 ret = 0; >> 57 } >> 58 >> 59 spin_unlock_bh(&inet6_proto_lock); 43 60 44 return ret; 61 return ret; 45 } 62 } 46 EXPORT_SYMBOL(inet6_del_protocol); << 47 #endif << 48 << 49 const struct net_offload __rcu *inet6_offloads << 50 EXPORT_SYMBOL(inet6_offloads); << 51 63 52 int inet6_add_offload(const struct net_offload !! 64 /* >> 65 * Remove a protocol from the hash tables. >> 66 */ >> 67 >> 68 int inet6_del_protocol(struct inet6_protocol *prot, unsigned char protocol) 53 { 69 { 54 return !cmpxchg((const struct net_offl !! 70 int ret, hash = protocol & (MAX_INET_PROTOS - 1); 55 NULL, prot) ? 0 : -1; << 56 } << 57 EXPORT_SYMBOL(inet6_add_offload); << 58 71 59 int inet6_del_offload(const struct net_offload !! 72 spin_lock_bh(&inet6_proto_lock); 60 { !! 73 61 int ret; !! 74 if (inet6_protos[hash] != prot) { >> 75 ret = -1; >> 76 } else { >> 77 inet6_protos[hash] = NULL; >> 78 ret = 0; >> 79 } 62 80 63 ret = (cmpxchg((const struct net_offlo !! 81 spin_unlock_bh(&inet6_proto_lock); 64 prot, NULL) == prot) ? << 65 82 66 synchronize_net(); 83 synchronize_net(); 67 84 68 return ret; 85 return ret; 69 } 86 } 70 EXPORT_SYMBOL(inet6_del_offload); << 71 87
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.