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 | |
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')
-rw-r--r-- | net/ipv4/af_inet.c | 12 | ||||
-rw-r--r-- | net/ipv4/protocol.c | 21 |
2 files changed, 33 insertions, 0 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 4c99c5fdba3f..3918d869d6d4 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -1566,6 +1566,13 @@ static const struct net_protocol tcp_protocol = { | |||
1566 | .netns_ok = 1, | 1566 | .netns_ok = 1, |
1567 | }; | 1567 | }; |
1568 | 1568 | ||
1569 | static const struct net_offload tcp_offload = { | ||
1570 | .gso_send_check = tcp_v4_gso_send_check, | ||
1571 | .gso_segment = tcp_tso_segment, | ||
1572 | .gro_receive = tcp4_gro_receive, | ||
1573 | .gro_complete = tcp4_gro_complete, | ||
1574 | }; | ||
1575 | |||
1569 | static const struct net_protocol udp_protocol = { | 1576 | static const struct net_protocol udp_protocol = { |
1570 | .handler = udp_rcv, | 1577 | .handler = udp_rcv, |
1571 | .err_handler = udp_err, | 1578 | .err_handler = udp_err, |
@@ -1575,6 +1582,11 @@ static const struct net_protocol udp_protocol = { | |||
1575 | .netns_ok = 1, | 1582 | .netns_ok = 1, |
1576 | }; | 1583 | }; |
1577 | 1584 | ||
1585 | static const struct net_offload udp_offload = { | ||
1586 | .gso_send_check = udp4_ufo_send_check, | ||
1587 | .gso_segment = udp4_ufo_fragment, | ||
1588 | }; | ||
1589 | |||
1578 | static const struct net_protocol icmp_protocol = { | 1590 | static const struct net_protocol icmp_protocol = { |
1579 | .handler = icmp_rcv, | 1591 | .handler = icmp_rcv, |
1580 | .err_handler = ping_err, | 1592 | .err_handler = ping_err, |
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); | ||