kernel: add support for enabling hardware flow offload via iptables
[openwrt/openwrt.git] / package / network / utils / iptables / patches / 800-flowoffload_target.patch
index c6fe65cd3e0475806816044f6af455c88f35d06e..2f79ee835a6fd5e17fa93339ab946030ab100015 100644 (file)
@@ -1,14 +1,71 @@
 --- /dev/null
 +++ b/extensions/libxt_FLOWOFFLOAD.c
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,72 @@
++#include <stdio.h>
 +#include <xtables.h>
++#include <linux/netfilter/xt_FLOWOFFLOAD.h>
++
++enum {
++    O_HW,
++};
++
++static void offload_help(void)
++{
++      printf(
++"FLOWOFFLOAD target options:\n"
++" --hw                                Enable hardware offload\n"
++      );
++}
++
++static const struct xt_option_entry offload_opts[] = {
++      {.name = "hw", .id = O_HW, .type = XTTYPE_NONE},
++      XTOPT_TABLEEND,
++};
++
++static void offload_parse(struct xt_option_call *cb)
++{
++      struct xt_flowoffload_target_info *info = cb->data;
++
++      xtables_option_parse(cb);
++      switch (cb->entry->id) {
++      case O_HW:
++              info->flags |= XT_FLOWOFFLOAD_HW;
++              break;
++      }
++}
++
++static void offload_print(const void *ip, const struct xt_entry_target *target, int numeric)
++{
++      const struct xt_flowoffload_target_info *info =
++              (const struct xt_flowoffload_target_info *)target->data;
++
++      printf(" FLOWOFFLOAD");
++      if (info->flags & XT_FLOWOFFLOAD_HW)
++              printf(" hw");
++}
++
++static void offload_save(const void *ip, const struct xt_entry_target *target)
++{
++      const struct xt_flowoffload_target_info *info =
++              (const struct xt_flowoffload_target_info *)target->data;
++
++      if (info->flags & XT_FLOWOFFLOAD_HW)
++              printf(" --hw");
++}
 +
 +static struct xtables_target offload_tg_reg[] = {
 +      {
-+              .family        = NFPROTO_UNSPEC,
-+              .name          = "FLOWOFFLOAD",
-+              .revision      = 0,
-+              .version       = XTABLES_VERSION,
++              .family         = NFPROTO_UNSPEC,
++              .name           = "FLOWOFFLOAD",
++              .revision       = 0,
++              .version        = XTABLES_VERSION,
++              .size           = XT_ALIGN(sizeof(struct xt_flowoffload_target_info)),
++              .userspacesize  = sizeof(struct xt_flowoffload_target_info),
++              .help           = offload_help,
++              .print          = offload_print,
++              .save           = offload_save,
++              .x6_parse       = offload_parse,
++              .x6_options     = offload_opts,
 +      },
 +};
 +
 +{
 +      xtables_register_targets(offload_tg_reg, ARRAY_SIZE(offload_tg_reg));
 +}
+--- /dev/null
++++ b/include/linux/netfilter/xt_FLOWOFFLOAD.h
+@@ -0,0 +1,17 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
++#ifndef _XT_FLOWOFFLOAD_H
++#define _XT_FLOWOFFLOAD_H
++
++#include <linux/types.h>
++
++enum {
++      XT_FLOWOFFLOAD_HW       = 1 << 0,
++
++      XT_FLOWOFFLOAD_MASK     = XT_FLOWOFFLOAD_HW
++};
++
++struct xt_flowoffload_target_info {
++      __u32 flags;
++};
++
++#endif /* _XT_FLOWOFFLOAD_H */