xref: /linux/net/ipv6/exthdrs_offload.c (revision e6a901a00822659181c93c86d8bbc2a17779fddc)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *	IPV6 GSO/GRO offload support
4  *	Linux INET6 implementation
5  *
6  *      IPV6 Extension Header GSO/GRO support
7  */
8 #include <net/protocol.h>
9 #include "ip6_offload.h"
10 
11 static const struct net_offload rthdr_offload = {
12 	.flags		=	INET6_PROTO_GSO_EXTHDR,
13 };
14 
15 static const struct net_offload dstopt_offload = {
16 	.flags		=	INET6_PROTO_GSO_EXTHDR,
17 };
18 
19 static const struct net_offload hbh_offload = {
20 	.flags		=	INET6_PROTO_GSO_EXTHDR,
21 };
22 
23 int __init ipv6_exthdrs_offload_init(void)
24 {
25 	int ret;
26 
27 	ret = inet6_add_offload(&rthdr_offload, IPPROTO_ROUTING);
28 	if (ret)
29 		goto out;
30 
31 	ret = inet6_add_offload(&dstopt_offload, IPPROTO_DSTOPTS);
32 	if (ret)
33 		goto out_rt;
34 
35 	ret = inet6_add_offload(&hbh_offload, IPPROTO_HOPOPTS);
36 	if (ret)
37 		goto out_dstopts;
38 
39 out:
40 	return ret;
41 
42 out_dstopts:
43 	inet6_del_offload(&dstopt_offload, IPPROTO_DSTOPTS);
44 
45 out_rt:
46 	inet6_del_offload(&rthdr_offload, IPPROTO_ROUTING);
47 	goto out;
48 }
49