2018-02-20 14:58:42 +00:00
|
|
|
--- /dev/null
|
|
|
|
+++ b/extensions/libxt_FLOWOFFLOAD.c
|
2018-03-23 11:53:44 +00:00
|
|
|
@@ -0,0 +1,72 @@
|
|
|
|
+#include <stdio.h>
|
2018-02-20 14:58:42 +00:00
|
|
|
+#include <xtables.h>
|
2018-03-23 11:53:44 +00:00
|
|
|
+#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");
|
|
|
|
+}
|
2018-02-20 14:58:42 +00:00
|
|
|
+
|
|
|
|
+static struct xtables_target offload_tg_reg[] = {
|
|
|
|
+ {
|
2018-03-23 11:53:44 +00:00
|
|
|
+ .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,
|
2018-02-20 14:58:42 +00:00
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+void _init(void)
|
|
|
|
+{
|
|
|
|
+ xtables_register_targets(offload_tg_reg, ARRAY_SIZE(offload_tg_reg));
|
|
|
|
+}
|
2018-03-23 11:53:44 +00:00
|
|
|
--- /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 */
|