summaryrefslogtreecommitdiffstats
path: root/net/ipv6/exthdrs.c
diff options
context:
space:
mode:
authorVlad Yasevich <vyasevic@redhat.com>2012-11-15 08:49:15 +0000
committerDavid S. Miller <davem@davemloft.net>2012-11-15 17:36:17 -0500
commit3336288a9feaa809839adbaf05778dc2f16665dc (patch)
treef536f807902ea4268cc211054a1b234776f5f858 /net/ipv6/exthdrs.c
parentbca49f843eac59cbb1ddd1f4a5d65fcc23b62efd (diff)
downloadlinux-3336288a9feaa809839adbaf05778dc2f16665dc.tar.gz
linux-3336288a9feaa809839adbaf05778dc2f16665dc.tar.bz2
linux-3336288a9feaa809839adbaf05778dc2f16665dc.zip
ipv6: Switch to using new offload infrastructure.
Switch IPv6 protocol to using the new GRO/GSO calls and data. Signed-off-by: Vlad Yasevich <vyasevic@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/exthdrs.c')
-rw-r--r--net/ipv6/exthdrs.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
index cb6f0828ca44..de6559e3aa0a 100644
--- a/net/ipv6/exthdrs.c
+++ b/net/ipv6/exthdrs.c
@@ -549,14 +549,44 @@ static const struct inet6_protocol nodata_protocol = {
.flags = INET6_PROTO_NOPOLICY,
};
+static int ipv6_exthdrs_offload_init(void)
+{
+ int ret;
+
+ ret = inet6_add_offload(&rthdr_offload, IPPROTO_ROUTING);
+ if (!ret)
+ goto out;
+
+ ret = inet6_add_offload(&dstopt_offload, IPPROTO_DSTOPTS);
+ if (!ret)
+ goto out_rt;
+
+out:
+ return ret;
+
+out_rt:
+ inet_del_offload(&rthdr_offload, IPPROTO_ROUTING);
+ goto out;
+}
+
+static void ipv6_exthdrs_offload_exit(void)
+{
+ inet_del_offload(&rthdr_offload, IPPROTO_ROUTING);
+ inet_del_offload(&rthdr_offload, IPPROTO_DSTOPTS);
+}
+
int __init ipv6_exthdrs_init(void)
{
int ret;
- ret = inet6_add_protocol(&rthdr_protocol, IPPROTO_ROUTING);
+ ret = ipv6_exthdrs_offload_init();
if (ret)
goto out;
+ ret = inet6_add_protocol(&rthdr_protocol, IPPROTO_ROUTING);
+ if (ret)
+ goto out_offload;
+
ret = inet6_add_protocol(&destopt_protocol, IPPROTO_DSTOPTS);
if (ret)
goto out_rthdr;
@@ -567,10 +597,12 @@ int __init ipv6_exthdrs_init(void)
out:
return ret;
-out_rthdr:
- inet6_del_protocol(&rthdr_protocol, IPPROTO_ROUTING);
out_destopt:
inet6_del_protocol(&destopt_protocol, IPPROTO_DSTOPTS);
+out_rthdr:
+ inet6_del_protocol(&rthdr_protocol, IPPROTO_ROUTING);
+out_offload:
+ ipv6_exthdrs_offload_exit();
goto out;
};