root/net/ipv6/exthdrs_offload.c
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 *      IPV6 GSO/GRO offload support
 *      Linux INET6 implementation
 *
 *      IPV6 Extension Header GSO/GRO support
 */
#include <net/protocol.h>
#include "ip6_offload.h"

static const struct net_offload rthdr_offload = {
        .flags          =       INET6_PROTO_GSO_EXTHDR,
};

static const struct net_offload dstopt_offload = {
        .flags          =       INET6_PROTO_GSO_EXTHDR,
};

static const struct net_offload hbh_offload = {
        .flags          =       INET6_PROTO_GSO_EXTHDR,
};

int __init 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;

        ret = inet6_add_offload(&hbh_offload, IPPROTO_HOPOPTS);
        if (ret)
                goto out_dstopts;

out:
        return ret;

out_dstopts:
        inet6_del_offload(&dstopt_offload, IPPROTO_DSTOPTS);

out_rt:
        inet6_del_offload(&rthdr_offload, IPPROTO_ROUTING);
        goto out;
}