exthdrs_offload.c 954 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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. static const struct net_offload rthdr_offload = {
  11. .flags = INET6_PROTO_GSO_EXTHDR,
  12. };
  13. static const struct net_offload dstopt_offload = {
  14. .flags = INET6_PROTO_GSO_EXTHDR,
  15. };
  16. static const struct net_offload hbh_offload = {
  17. .flags = INET6_PROTO_GSO_EXTHDR,
  18. };
  19. int __init ipv6_exthdrs_offload_init(void)
  20. {
  21. int ret;
  22. ret = inet6_add_offload(&rthdr_offload, IPPROTO_ROUTING);
  23. if (ret)
  24. goto out;
  25. ret = inet6_add_offload(&dstopt_offload, IPPROTO_DSTOPTS);
  26. if (ret)
  27. goto out_rt;
  28. ret = inet6_add_offload(&hbh_offload, IPPROTO_HOPOPTS);
  29. if (ret)
  30. goto out_dstopts;
  31. out:
  32. return ret;
  33. out_dstopts:
  34. inet6_del_offload(&dstopt_offload, IPPROTO_DSTOPTS);
  35. out_rt:
  36. inet6_del_offload(&rthdr_offload, IPPROTO_ROUTING);
  37. goto out;
  38. }