cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

protocol.c (1912B)


      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)
     25struct inet6_protocol __rcu *inet6_protos[MAX_INET_PROTOS] __read_mostly;
     26EXPORT_SYMBOL(inet6_protos);
     27
     28int 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}
     33EXPORT_SYMBOL(inet6_add_protocol);
     34
     35int 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}
     46EXPORT_SYMBOL(inet6_del_protocol);
     47#endif
     48
     49const struct net_offload __rcu *inet6_offloads[MAX_INET_PROTOS] __read_mostly;
     50EXPORT_SYMBOL(inet6_offloads);
     51
     52int 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}
     57EXPORT_SYMBOL(inet6_add_offload);
     58
     59int 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}
     70EXPORT_SYMBOL(inet6_del_offload);