]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
nft: Move proto_parse and post_parse callbacks to xshared
authorPhil Sutter <phil@nwl.cc>
Fri, 24 Dec 2021 13:55:28 +0000 (14:55 +0100)
committerPhil Sutter <phil@nwl.cc>
Wed, 12 Jan 2022 13:08:54 +0000 (14:08 +0100)
They are not nft-variant-specific and may therefore be shared with
legacy.

Signed-off-by: Phil Sutter <phil@nwl.cc>
iptables/nft-ipv4.c
iptables/nft-ipv6.c
iptables/xshared.c
iptables/xshared.h

index 07da0a7edb3ac34eb69da5e2229dd5c5866c3936..f374d468d2ff45e05bb9b795aecbb3c7e62867ef 100644 (file)
@@ -274,61 +274,6 @@ static void nft_ipv4_save_rule(const void *data, unsigned int format)
                                &cs->fw, format);
 }
 
-static void nft_ipv4_proto_parse(struct iptables_command_state *cs,
-                                struct xtables_args *args)
-{
-       cs->fw.ip.proto = args->proto;
-       cs->fw.ip.invflags = args->invflags;
-}
-
-static void nft_ipv4_post_parse(int command,
-                               struct iptables_command_state *cs,
-                               struct xtables_args *args)
-{
-       cs->fw.ip.flags = args->flags;
-       /* We already set invflags in proto_parse, but we need to refresh it
-        * to include new parsed options.
-        */
-       cs->fw.ip.invflags = args->invflags;
-
-       memcpy(cs->fw.ip.iniface, args->iniface, IFNAMSIZ);
-       memcpy(cs->fw.ip.iniface_mask,
-              args->iniface_mask, IFNAMSIZ*sizeof(unsigned char));
-
-       memcpy(cs->fw.ip.outiface, args->outiface, IFNAMSIZ);
-       memcpy(cs->fw.ip.outiface_mask,
-              args->outiface_mask, IFNAMSIZ*sizeof(unsigned char));
-
-       if (args->goto_set)
-               cs->fw.ip.flags |= IPT_F_GOTO;
-
-       cs->counters.pcnt = args->pcnt_cnt;
-       cs->counters.bcnt = args->bcnt_cnt;
-
-       if (command & (CMD_REPLACE | CMD_INSERT |
-                       CMD_DELETE | CMD_APPEND | CMD_CHECK)) {
-               if (!(cs->options & OPT_DESTINATION))
-                       args->dhostnetworkmask = "0.0.0.0/0";
-               if (!(cs->options & OPT_SOURCE))
-                       args->shostnetworkmask = "0.0.0.0/0";
-       }
-
-       if (args->shostnetworkmask)
-               xtables_ipparse_multiple(args->shostnetworkmask,
-                                        &args->s.addr.v4, &args->s.mask.v4,
-                                        &args->s.naddrs);
-       if (args->dhostnetworkmask)
-               xtables_ipparse_multiple(args->dhostnetworkmask,
-                                        &args->d.addr.v4, &args->d.mask.v4,
-                                        &args->d.naddrs);
-
-       if ((args->s.naddrs > 1 || args->d.naddrs > 1) &&
-           (cs->fw.ip.invflags & (IPT_INV_SRCIP | IPT_INV_DSTIP)))
-               xtables_error(PARAMETER_PROBLEM,
-                             "! not allowed with multiple"
-                             " source or destination IP addresses");
-}
-
 static void xlate_ipv4_addr(const char *selector, const struct in_addr *addr,
                            const struct in_addr *mask,
                            bool inv, struct xt_xlate *xl)
@@ -511,8 +456,8 @@ struct nft_family_ops nft_family_ops_ipv4 = {
        .save_rule              = nft_ipv4_save_rule,
        .save_chain             = nft_ipv46_save_chain,
        .cmd_parse              = {
-               .proto_parse    = nft_ipv4_proto_parse,
-               .post_parse     = nft_ipv4_post_parse,
+               .proto_parse    = ipv4_proto_parse,
+               .post_parse     = ipv4_post_parse,
        },
        .parse_target           = nft_ipv46_parse_target,
        .rule_to_cs             = nft_rule_to_iptables_command_state,
index 4f80ed841f95c673e66e0787550958398492654b..9ecc754f37805ecf25aaba70610333be4b7deeeb 100644 (file)
@@ -236,78 +236,6 @@ static void nft_ipv6_save_rule(const void *data, unsigned int format)
                                &cs->fw6, format);
 }
 
-/* These are invalid numbers as upper layer protocol */
-static int is_exthdr(uint16_t proto)
-{
-       return (proto == IPPROTO_ROUTING ||
-               proto == IPPROTO_FRAGMENT ||
-               proto == IPPROTO_AH ||
-               proto == IPPROTO_DSTOPTS);
-}
-
-static void nft_ipv6_proto_parse(struct iptables_command_state *cs,
-                                struct xtables_args *args)
-{
-       cs->fw6.ipv6.proto = args->proto;
-       cs->fw6.ipv6.invflags = args->invflags;
-
-       if (is_exthdr(cs->fw6.ipv6.proto)
-           && (cs->fw6.ipv6.invflags & XT_INV_PROTO) == 0)
-               fprintf(stderr,
-                       "Warning: never matched protocol: %s. "
-                       "use extension match instead.\n",
-                       cs->protocol);
-}
-
-static void nft_ipv6_post_parse(int command, struct iptables_command_state *cs,
-                               struct xtables_args *args)
-{
-       cs->fw6.ipv6.flags = args->flags;
-       /* We already set invflags in proto_parse, but we need to refresh it
-        * to include new parsed options.
-        */
-       cs->fw6.ipv6.invflags = args->invflags;
-
-       memcpy(cs->fw6.ipv6.iniface, args->iniface, IFNAMSIZ);
-       memcpy(cs->fw6.ipv6.iniface_mask,
-              args->iniface_mask, IFNAMSIZ*sizeof(unsigned char));
-
-       memcpy(cs->fw6.ipv6.outiface, args->outiface, IFNAMSIZ);
-       memcpy(cs->fw6.ipv6.outiface_mask,
-              args->outiface_mask, IFNAMSIZ*sizeof(unsigned char));
-
-       if (args->goto_set)
-               cs->fw6.ipv6.flags |= IP6T_F_GOTO;
-
-       cs->fw6.counters.pcnt = args->pcnt_cnt;
-       cs->fw6.counters.bcnt = args->bcnt_cnt;
-
-       if (command & (CMD_REPLACE | CMD_INSERT |
-                       CMD_DELETE | CMD_APPEND | CMD_CHECK)) {
-               if (!(cs->options & OPT_DESTINATION))
-                       args->dhostnetworkmask = "::0/0";
-               if (!(cs->options & OPT_SOURCE))
-                       args->shostnetworkmask = "::0/0";
-       }
-
-       if (args->shostnetworkmask)
-               xtables_ip6parse_multiple(args->shostnetworkmask,
-                                         &args->s.addr.v6,
-                                         &args->s.mask.v6,
-                                         &args->s.naddrs);
-       if (args->dhostnetworkmask)
-               xtables_ip6parse_multiple(args->dhostnetworkmask,
-                                         &args->d.addr.v6,
-                                         &args->d.mask.v6,
-                                         &args->d.naddrs);
-
-       if ((args->s.naddrs > 1 || args->d.naddrs > 1) &&
-           (cs->fw6.ipv6.invflags & (IP6T_INV_SRCIP | IP6T_INV_DSTIP)))
-               xtables_error(PARAMETER_PROBLEM,
-                             "! not allowed with multiple"
-                             " source or destination IP addresses");
-}
-
 static void xlate_ipv6_addr(const char *selector, const struct in6_addr *addr,
                            const struct in6_addr *mask,
                            int invert, struct xt_xlate *xl)
@@ -496,8 +424,8 @@ struct nft_family_ops nft_family_ops_ipv6 = {
        .save_rule              = nft_ipv6_save_rule,
        .save_chain             = nft_ipv46_save_chain,
        .cmd_parse              = {
-               .proto_parse    = nft_ipv6_proto_parse,
-               .post_parse     = nft_ipv6_post_parse,
+               .proto_parse    = ipv6_proto_parse,
+               .post_parse     = ipv6_post_parse,
        },
        .parse_target           = nft_ipv46_parse_target,
        .rule_to_cs             = nft_rule_to_iptables_command_state,
index b7dad707d1d1a81c70f9cda3110ef24bf1363794..a3985d458c5f806318609efbc1a01c2eb2a88141 100644 (file)
@@ -1813,3 +1813,129 @@ void do_parse(int argc, char *argv[],
                }
        }
 }
+
+void ipv4_proto_parse(struct iptables_command_state *cs,
+                     struct xtables_args *args)
+{
+       cs->fw.ip.proto = args->proto;
+       cs->fw.ip.invflags = args->invflags;
+}
+
+/* These are invalid numbers as upper layer protocol */
+static int is_exthdr(uint16_t proto)
+{
+       return (proto == IPPROTO_ROUTING ||
+               proto == IPPROTO_FRAGMENT ||
+               proto == IPPROTO_AH ||
+               proto == IPPROTO_DSTOPTS);
+}
+
+void ipv6_proto_parse(struct iptables_command_state *cs,
+                     struct xtables_args *args)
+{
+       cs->fw6.ipv6.proto = args->proto;
+       cs->fw6.ipv6.invflags = args->invflags;
+
+       if (is_exthdr(cs->fw6.ipv6.proto)
+           && (cs->fw6.ipv6.invflags & XT_INV_PROTO) == 0)
+               fprintf(stderr,
+                       "Warning: never matched protocol: %s. "
+                       "use extension match instead.\n",
+                       cs->protocol);
+}
+
+void ipv4_post_parse(int command, struct iptables_command_state *cs,
+                    struct xtables_args *args)
+{
+       cs->fw.ip.flags = args->flags;
+       /* We already set invflags in proto_parse, but we need to refresh it
+        * to include new parsed options.
+        */
+       cs->fw.ip.invflags = args->invflags;
+
+       memcpy(cs->fw.ip.iniface, args->iniface, IFNAMSIZ);
+       memcpy(cs->fw.ip.iniface_mask,
+              args->iniface_mask, IFNAMSIZ*sizeof(unsigned char));
+
+       memcpy(cs->fw.ip.outiface, args->outiface, IFNAMSIZ);
+       memcpy(cs->fw.ip.outiface_mask,
+              args->outiface_mask, IFNAMSIZ*sizeof(unsigned char));
+
+       if (args->goto_set)
+               cs->fw.ip.flags |= IPT_F_GOTO;
+
+       cs->counters.pcnt = args->pcnt_cnt;
+       cs->counters.bcnt = args->bcnt_cnt;
+
+       if (command & (CMD_REPLACE | CMD_INSERT |
+                       CMD_DELETE | CMD_APPEND | CMD_CHECK)) {
+               if (!(cs->options & OPT_DESTINATION))
+                       args->dhostnetworkmask = "0.0.0.0/0";
+               if (!(cs->options & OPT_SOURCE))
+                       args->shostnetworkmask = "0.0.0.0/0";
+       }
+
+       if (args->shostnetworkmask)
+               xtables_ipparse_multiple(args->shostnetworkmask,
+                                        &args->s.addr.v4, &args->s.mask.v4,
+                                        &args->s.naddrs);
+       if (args->dhostnetworkmask)
+               xtables_ipparse_multiple(args->dhostnetworkmask,
+                                        &args->d.addr.v4, &args->d.mask.v4,
+                                        &args->d.naddrs);
+
+       if ((args->s.naddrs > 1 || args->d.naddrs > 1) &&
+           (cs->fw.ip.invflags & (IPT_INV_SRCIP | IPT_INV_DSTIP)))
+               xtables_error(PARAMETER_PROBLEM,
+                             "! not allowed with multiple"
+                             " source or destination IP addresses");
+}
+
+void ipv6_post_parse(int command, struct iptables_command_state *cs,
+                    struct xtables_args *args)
+{
+       cs->fw6.ipv6.flags = args->flags;
+       /* We already set invflags in proto_parse, but we need to refresh it
+        * to include new parsed options.
+        */
+       cs->fw6.ipv6.invflags = args->invflags;
+
+       memcpy(cs->fw6.ipv6.iniface, args->iniface, IFNAMSIZ);
+       memcpy(cs->fw6.ipv6.iniface_mask,
+              args->iniface_mask, IFNAMSIZ*sizeof(unsigned char));
+
+       memcpy(cs->fw6.ipv6.outiface, args->outiface, IFNAMSIZ);
+       memcpy(cs->fw6.ipv6.outiface_mask,
+              args->outiface_mask, IFNAMSIZ*sizeof(unsigned char));
+
+       if (args->goto_set)
+               cs->fw6.ipv6.flags |= IP6T_F_GOTO;
+
+       cs->fw6.counters.pcnt = args->pcnt_cnt;
+       cs->fw6.counters.bcnt = args->bcnt_cnt;
+
+       if (command & (CMD_REPLACE | CMD_INSERT |
+                       CMD_DELETE | CMD_APPEND | CMD_CHECK)) {
+               if (!(cs->options & OPT_DESTINATION))
+                       args->dhostnetworkmask = "::0/0";
+               if (!(cs->options & OPT_SOURCE))
+                       args->shostnetworkmask = "::0/0";
+       }
+
+       if (args->shostnetworkmask)
+               xtables_ip6parse_multiple(args->shostnetworkmask,
+                                         &args->s.addr.v6,
+                                         &args->s.mask.v6,
+                                         &args->s.naddrs);
+       if (args->dhostnetworkmask)
+               xtables_ip6parse_multiple(args->dhostnetworkmask,
+                                         &args->d.addr.v6,
+                                         &args->d.mask.v6,
+                                         &args->d.naddrs);
+
+       if ((args->s.naddrs > 1 || args->d.naddrs > 1) &&
+           (cs->fw6.ipv6.invflags & (IP6T_INV_SRCIP | IP6T_INV_DSTIP)))
+               xtables_error(PARAMETER_PROBLEM,
+                             "! not allowed with multiple"
+                             " source or destination IP addresses");
+}
index 48bfe911f7a475f01c67cd36e59961c2d61450e9..d13de95e7dff611c870e979545321b8406903f12 100644 (file)
@@ -323,4 +323,13 @@ void do_parse(int argc, char *argv[],
              struct xt_cmd_parse *p, struct iptables_command_state *cs,
              struct xtables_args *args);
 
+void ipv4_proto_parse(struct iptables_command_state *cs,
+                     struct xtables_args *args);
+void ipv6_proto_parse(struct iptables_command_state *cs,
+                     struct xtables_args *args);
+void ipv4_post_parse(int command, struct iptables_command_state *cs,
+                    struct xtables_args *args);
+void ipv6_post_parse(int command, struct iptables_command_state *cs,
+                    struct xtables_args *args);
+
 #endif /* IPTABLES_XSHARED_H */