Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/ipv4/protocol.c
15109 views
1
/*
2
* INET An implementation of the TCP/IP protocol suite for the LINUX
3
* operating system. INET is implemented using the BSD Socket
4
* interface as the means of communication with the user level.
5
*
6
* INET protocol dispatch tables.
7
*
8
* Authors: Ross Biro
9
* Fred N. van Kempen, <[email protected]>
10
*
11
* Fixes:
12
* Alan Cox : Ahah! udp icmp errors don't work because
13
* udp_err is never called!
14
* Alan Cox : Added new fields for init and ready for
15
* proper fragmentation (_NO_ 4K limits!)
16
* Richard Colella : Hang on hash collision
17
* Vince Laviano : Modified inet_del_protocol() to correctly
18
* maintain copy bit.
19
*
20
* This program is free software; you can redistribute it and/or
21
* modify it under the terms of the GNU General Public License
22
* as published by the Free Software Foundation; either version
23
* 2 of the License, or (at your option) any later version.
24
*/
25
#include <linux/cache.h>
26
#include <linux/module.h>
27
#include <linux/netdevice.h>
28
#include <linux/spinlock.h>
29
#include <net/protocol.h>
30
31
const struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS] __read_mostly;
32
33
/*
34
* Add a protocol handler to the hash tables
35
*/
36
37
int inet_add_protocol(const struct net_protocol *prot, unsigned char protocol)
38
{
39
int hash = protocol & (MAX_INET_PROTOS - 1);
40
41
return !cmpxchg((const struct net_protocol **)&inet_protos[hash],
42
NULL, prot) ? 0 : -1;
43
}
44
EXPORT_SYMBOL(inet_add_protocol);
45
46
/*
47
* Remove a protocol from the hash tables.
48
*/
49
50
int inet_del_protocol(const struct net_protocol *prot, unsigned char protocol)
51
{
52
int ret, hash = protocol & (MAX_INET_PROTOS - 1);
53
54
ret = (cmpxchg((const struct net_protocol **)&inet_protos[hash],
55
prot, NULL) == prot) ? 0 : -1;
56
57
synchronize_net();
58
59
return ret;
60
}
61
EXPORT_SYMBOL(inet_del_protocol);
62
63