]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
nft-shared: Introduce init_cs family ops callback
authorPhil Sutter <phil@nwl.cc>
Mon, 27 Sep 2021 14:59:49 +0000 (16:59 +0200)
committerPhil Sutter <phil@nwl.cc>
Wed, 20 Oct 2021 09:32:54 +0000 (11:32 +0200)
Arptables sets a few defaults in struct iptables_command_state upon
initialization. Introduce a callback to do that.

Signed-off-by: Phil Sutter <phil@nwl.cc>
iptables/nft-arp.c
iptables/nft-shared.h
iptables/xtables.c

index 2a9387a18dffeaec06e3713f3fe30f694c49ccb7..fbaf1a6d5218489bd84a15963d5537d85015ee72 100644 (file)
@@ -546,6 +546,14 @@ static void nft_arp_save_chain(const struct nftnl_chain *c, const char *policy)
        printf(":%s %s\n", chain, policy ?: "-");
 }
 
+static void nft_arp_init_cs(struct iptables_command_state *cs)
+{
+       cs->arp.arp.arhln = 6;
+       cs->arp.arp.arhln_mask = 255;
+       cs->arp.arp.arhrd = htons(ARPHRD_ETHER);
+       cs->arp.arp.arhrd_mask = 65535;
+}
+
 struct nft_family_ops nft_family_ops_arp = {
        .add                    = nft_arp_add,
        .is_same                = nft_arp_is_same,
@@ -559,6 +567,7 @@ struct nft_family_ops nft_family_ops_arp = {
        .save_chain             = nft_arp_save_chain,
        .post_parse             = NULL,
        .rule_to_cs             = nft_rule_to_iptables_command_state,
+       .init_cs                = nft_arp_init_cs,
        .clear_cs               = nft_clear_iptables_command_state,
        .parse_target           = nft_ipv46_parse_target,
 };
index cc8f3a79b369ef1feb3f4b459c804e100742b921..71094a28e73de7e9ac63a4f09a8e1df708aa4a48 100644 (file)
@@ -106,6 +106,7 @@ struct nft_family_ops {
                           struct xtables_args *args);
        void (*parse_match)(struct xtables_match *m, void *data);
        void (*parse_target)(struct xtables_target *t, void *data);
+       void (*init_cs)(struct iptables_command_state *cs);
        void (*rule_to_cs)(struct nft_handle *h, const struct nftnl_rule *r,
                           struct iptables_command_state *cs);
        void (*clear_cs)(struct iptables_command_state *cs);
index c17cf7aec617802d2ff3e056b58c5bb31791fc83..092edaaf89224e8208987ae034d2776099295f29 100644 (file)
@@ -433,10 +433,6 @@ void do_parse(struct nft_handle *h, int argc, char *argv[],
        bool invert = false;
        int wait = 0;
 
-       memset(cs, 0, sizeof(*cs));
-       cs->jumpto = "";
-       cs->argv = argv;
-
        /* re-set optind to 0 in case do_command4 gets called
         * a second time */
        optind = 0;
@@ -912,11 +908,17 @@ int do_commandx(struct nft_handle *h, int argc, char *argv[], char **table,
                .table          = *table,
                .restore        = restore,
        };
-       struct iptables_command_state cs;
+       struct iptables_command_state cs = {
+               .jumpto = "",
+               .argv = argv,
+       };
        struct xtables_args args = {
                .family = h->family,
        };
 
+       if (h->ops->init_cs)
+               h->ops->init_cs(&cs);
+
        do_parse(h, argc, argv, &p, &cs, &args);
 
        switch (p.command) {