ipfw3: insert the new rule in the beginning
authorYour Name <you@example.com>
Mon, 7 Jan 2019 08:03:12 +0000 (08:03 +0000)
committerYour Name <you@example.com>
Mon, 7 Jan 2019 08:03:12 +0000 (08:03 +0000)
"ipfw3 add" is still the same, while the "ipfw3 insert" is the new method
which will insert the new rule in the beginning of the rule list.

sbin/ipfw3/ipfw3.8
sbin/ipfw3/ipfw3.c
sbin/ipfw3/ipfw3.h
sys/net/ipfw3/ip_fw3.c
sys/net/ipfw3/ip_fw3.h

index db8c8ca..3ff2feb 100644 (file)
@@ -1,7 +1,7 @@
 .\"
 .\" $FreeBSD: src/sbin/ipfw/ipfw.8,v 1.63.2.33 2003/02/04 01:36:02 brueffer Exp $
 .\"
-.Dd April 17, 2018
+.Dd January 7, 2019
 .Dt IPFW3 8
 .Os
 .Sh NAME
@@ -10,7 +10,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl cq
-.Cm add
+.Brq Cm add | insert
 .Ar rule
 .Nm
 .Op Fl acdDefNStTv
index d1e10e1..072e571 100644 (file)
@@ -351,7 +351,7 @@ next_cmd(ipfw_insn *cmd)
  *
  */
 void
-rule_add(int ac, char *av[])
+rule_add(int ac, char *av[], uint8_t insert)
 {
        /*
         * rules are added into the 'rulebuf' and then copied in
@@ -384,6 +384,8 @@ rule_add(int ac, char *av[])
        action = (ipfw_insn *)actbuf;
        other = (ipfw_insn *)othbuf;
 
+       rule->insert = insert;
+
        NEED2("need more parameters");
        NEXT_ARG;
 
@@ -1028,7 +1030,10 @@ ipfw3_main(int ac, char **av)
 
        if (!strncmp(*av, "add", strlen(*av))) {
                module_load();
-               rule_add(ac, av);
+               rule_add(ac, av, 0);
+       } else if (!strncmp(*av, "insert", strlen(*av))) {
+               module_load();
+               rule_add(ac, av, 1);
        } else if (!strncmp(*av, "delete", strlen(*av))) {
                rule_delete(ac, av);
        } else if (!strncmp(*av, "flush", strlen(*av))) {
index 5e8021b..ef6f5a5 100644 (file)
@@ -161,7 +161,7 @@ int show_filter(ipfw_insn *cmd, char *word, int type);
 void   help(void);
 void   rule_delete(int ac, char **av);
 void   rule_list(int ac, char **av);
-void   rule_add(int ac, char **av);
+void   rule_add(int ac, char **av, uint8_t insert);
 void   rule_zero(int ac, char **av);
 void   rule_flush(void);
 void   rule_show(struct ipfw_ioc_rule *rule, int pcwidth, int bcwidth);
index e53964c..24e20c7 100644 (file)
@@ -663,8 +663,14 @@ add_rule_dispatch(netmsg_t nmsg)
 
        for (prev = NULL, next = ctx->rules;
                next; prev = next, next = next->next) {
-               if (next->rulenum > ioc_rule->rulenum) {
-                       break;
+               if (ioc_rule->insert) {
+                       if (next->rulenum >= ioc_rule->rulenum) {
+                               break;
+                       }
+               } else {
+                       if (next->rulenum > ioc_rule->rulenum) {
+                               break;
+                       }
                }
        }
        KASSERT(next != NULL, ("no default rule?!"));
index 54ea7e3..5785b1c 100644 (file)
@@ -345,6 +345,7 @@ struct ipfw_ioc_rule {
        uint16_t        cmd_len;        /* # of 32-bit words in cmd     */
        uint16_t        rulenum;        /* rule number                  */
        uint8_t         set;            /* rule set (0..31)             */
+       uint8_t         insert;         /* insert or append             */
 
        /* Rule set information */
        uint32_t        sets;   /* disabled rule sets           */