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 (2020B)


      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 *		INET protocol dispatch tables.
      8 *
      9 * Authors:	Ross Biro
     10 *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
     11 *
     12 * Fixes:
     13 *		Alan Cox	: Ahah! udp icmp errors don't work because
     14 *				  udp_err is never called!
     15 *		Alan Cox	: Added new fields for init and ready for
     16 *				  proper fragmentation (_NO_ 4K limits!)
     17 *		Richard Colella	: Hang on hash collision
     18 *		Vince Laviano	: Modified inet_del_protocol() to correctly
     19 *				  maintain copy bit.
     20 */
     21#include <linux/cache.h>
     22#include <linux/module.h>
     23#include <linux/netdevice.h>
     24#include <linux/spinlock.h>
     25#include <net/protocol.h>
     26
     27struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS] __read_mostly;
     28EXPORT_SYMBOL(inet_protos);
     29const struct net_offload __rcu *inet_offloads[MAX_INET_PROTOS] __read_mostly;
     30EXPORT_SYMBOL(inet_offloads);
     31
     32int inet_add_protocol(const struct net_protocol *prot, unsigned char protocol)
     33{
     34	return !cmpxchg((const struct net_protocol **)&inet_protos[protocol],
     35			NULL, prot) ? 0 : -1;
     36}
     37EXPORT_SYMBOL(inet_add_protocol);
     38
     39int inet_add_offload(const struct net_offload *prot, unsigned char protocol)
     40{
     41	return !cmpxchg((const struct net_offload **)&inet_offloads[protocol],
     42			NULL, prot) ? 0 : -1;
     43}
     44EXPORT_SYMBOL(inet_add_offload);
     45
     46int inet_del_protocol(const struct net_protocol *prot, unsigned char protocol)
     47{
     48	int ret;
     49
     50	ret = (cmpxchg((const struct net_protocol **)&inet_protos[protocol],
     51		       prot, NULL) == prot) ? 0 : -1;
     52
     53	synchronize_net();
     54
     55	return ret;
     56}
     57EXPORT_SYMBOL(inet_del_protocol);
     58
     59int inet_del_offload(const struct net_offload *prot, unsigned char protocol)
     60{
     61	int ret;
     62
     63	ret = (cmpxchg((const struct net_offload **)&inet_offloads[protocol],
     64		       prot, NULL) == prot) ? 0 : -1;
     65
     66	synchronize_net();
     67
     68	return ret;
     69}
     70EXPORT_SYMBOL(inet_del_offload);