diff options
author | Vlad Yasevich <vyasevic@redhat.com> | 2012-11-15 03:49:12 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-11-15 17:36:17 -0500 |
commit | de27d001d187721de775ed9e0c485aa6f517c745 (patch) | |
tree | 08947ffb402922f7384e61563d201761171fdbb1 /net/ipv4/protocol.c | |
parent | 22061d8014455b01eb018bd6c35a1b3040ccc230 (diff) |
net: Add net protocol offload registration infrustructure
Create a new data structure for IPv4 protocols that holds GRO/GSO
callbacks and a new array to track the protocols that register GRO/GSO.
Signed-off-by: Vlad Yasevich <vyasevic@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/protocol.c')
-rw-r--r-- | net/ipv4/protocol.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/net/ipv4/protocol.c b/net/ipv4/protocol.c index 8918eff1426d..0f9d09f54bd9 100644 --- a/net/ipv4/protocol.c +++ b/net/ipv4/protocol.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <net/protocol.h> | 29 | #include <net/protocol.h> |
30 | 30 | ||
31 | const struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS] __read_mostly; | 31 | const struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS] __read_mostly; |
32 | const struct net_offload __rcu *inet_offloads[MAX_INET_PROTOS] __read_mostly; | ||
32 | 33 | ||
33 | /* | 34 | /* |
34 | * Add a protocol handler to the hash tables | 35 | * Add a protocol handler to the hash tables |
@@ -41,6 +42,13 @@ int inet_add_protocol(const struct net_protocol *prot, unsigned char protocol) | |||
41 | } | 42 | } |
42 | EXPORT_SYMBOL(inet_add_protocol); | 43 | EXPORT_SYMBOL(inet_add_protocol); |
43 | 44 | ||
45 | int inet_add_offload(const struct net_offload *prot, unsigned char protocol) | ||
46 | { | ||
47 | return !cmpxchg((const struct net_offload **)&inet_offloads[protocol], | ||
48 | NULL, prot) ? 0 : -1; | ||
49 | } | ||
50 | EXPORT_SYMBOL(inet_add_offload); | ||
51 | |||
44 | /* | 52 | /* |
45 | * Remove a protocol from the hash tables. | 53 | * Remove a protocol from the hash tables. |
46 | */ | 54 | */ |
@@ -57,3 +65,16 @@ int inet_del_protocol(const struct net_protocol *prot, unsigned char protocol) | |||
57 | return ret; | 65 | return ret; |
58 | } | 66 | } |
59 | EXPORT_SYMBOL(inet_del_protocol); | 67 | EXPORT_SYMBOL(inet_del_protocol); |
68 | |||
69 | int inet_del_offload(const struct net_offload *prot, unsigned char protocol) | ||
70 | { | ||
71 | int ret; | ||
72 | |||
73 | ret = (cmpxchg((const struct net_offload **)&inet_offloads[protocol], | ||
74 | prot, NULL) == prot) ? 0 : -1; | ||
75 | |||
76 | synchronize_net(); | ||
77 | |||
78 | return ret; | ||
79 | } | ||
80 | EXPORT_SYMBOL(inet_del_offload); | ||