anybody using pf's DIOCCHANGERULE ioctl?

if so, stop doing so :)
seriously, we wanna remove it. we're not aware of anything using it,
and changing a rule doesn't really fit pf's concept either.
ans since it is a largely unused ioctl we kinda expect it to be broken
anyway...

Index: pf_ioctl.c
===================================================================
RCS file: /cvs/src/sys/net/pf_ioctl.c,v
retrieving revision 1.242
diff -u -p -r1.242 pf_ioctl.c
--- pf_ioctl.c  30 Aug 2011 00:40:47 -0000      1.242
+++ pf_ioctl.c  7 Oct 2011 10:36:55 -0000
@@ -1169,134 +1169,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                break;
        }
 
-       case DIOCCHANGERULE: {
-               struct pfioc_rule       *pcr = (struct pfioc_rule *)addr;
-               struct pf_ruleset       *ruleset;
-               struct pf_rule          *oldrule = NULL, *newrule = NULL;
-               u_int32_t                nr = 0;
-
-               if (pcr->action < PF_CHANGE_ADD_HEAD ||
-                   pcr->action > PF_CHANGE_GET_TICKET) {
-                       error = EINVAL;
-                       break;
-               }
-               ruleset = pf_find_ruleset(pcr->anchor);
-               if (ruleset == NULL) {
-                       error = EINVAL;
-                       break;
-               }
-
-               if (pcr->action == PF_CHANGE_GET_TICKET) {
-                       pcr->ticket = ++ruleset->rules.active.ticket;
-                       break;
-               } else {
-                       if (pcr->ticket !=
-                           ruleset->rules.active.ticket) {
-                               error = EINVAL;
-                               break;
-                       }
-                       if (pcr->rule.return_icmp >> 8 > ICMP_MAXTYPE) {
-                               error = EINVAL;
-                               break;
-                       }
-               }
-
-               if (pcr->action != PF_CHANGE_REMOVE) {
-                       newrule = pool_get(&pf_rule_pl,
-                           PR_WAITOK|PR_LIMITFAIL|PR_ZERO);
-                       if (newrule == NULL) {
-                               error = ENOMEM;
-                               break;
-                       }
-                       pf_rule_copyin(&pcr->rule, newrule, ruleset);
-                       newrule->cuid = p->p_cred->p_ruid;
-                       newrule->cpid = p->p_pid;
-
-                       switch (newrule->af) {
-                       case 0:
-                               break;
-#ifdef INET
-                       case AF_INET:
-                               break;
-#endif /* INET */
-#ifdef INET6
-                       case AF_INET6:
-                               break;
-#endif /* INET6 */
-                       default:
-                               pool_put(&pf_rule_pl, newrule);
-                               error = EAFNOSUPPORT;
-                               goto fail;
-                       }
-
-                       if (newrule->rt && !newrule->direction)
-                               error = EINVAL;
-                       if (pf_addr_setup(ruleset, &newrule->src.addr, 
newrule->af))
-                               error = EINVAL;
-                       if (pf_addr_setup(ruleset, &newrule->dst.addr, 
newrule->af))
-                               error = EINVAL;
-                       if (pf_addr_setup(ruleset, &newrule->rdr.addr, 
newrule->af))
-                               error = EINVAL;
-                       if (pf_addr_setup(ruleset, &newrule->nat.addr, 
newrule->af))
-                               error = EINVAL;
-                       if (pf_addr_setup(ruleset, &newrule->route.addr, 
newrule->af))
-                               error = EINVAL;
-                       if (pf_anchor_setup(newrule, ruleset, pcr->anchor_call))
-                               error = EINVAL;
-
-                       if (error) {
-                               pf_rm_rule(NULL, newrule);
-                               break;
-                       }
-               }
-
-               if (pcr->action == PF_CHANGE_ADD_HEAD)
-                       oldrule = TAILQ_FIRST(ruleset->rules.active.ptr);
-               else if (pcr->action == PF_CHANGE_ADD_TAIL)
-                       oldrule = TAILQ_LAST(ruleset->rules.active.ptr,
-                           pf_rulequeue);
-               else {
-                       oldrule = TAILQ_FIRST(ruleset->rules.active.ptr);
-                       while ((oldrule != NULL) && (oldrule->nr != pcr->nr))
-                               oldrule = TAILQ_NEXT(oldrule, entries);
-                       if (oldrule == NULL) {
-                               if (newrule != NULL)
-                                       pf_rm_rule(NULL, newrule);
-                               error = EINVAL;
-                               break;
-                       }
-               }
-
-               if (pcr->action == PF_CHANGE_REMOVE) {
-                       pf_rm_rule(ruleset->rules.active.ptr, oldrule);
-                       ruleset->rules.active.rcount--;
-               } else {
-                       if (oldrule == NULL)
-                               TAILQ_INSERT_TAIL(
-                                   ruleset->rules.active.ptr,
-                                   newrule, entries);
-                       else if (pcr->action == PF_CHANGE_ADD_HEAD ||
-                           pcr->action == PF_CHANGE_ADD_BEFORE)
-                               TAILQ_INSERT_BEFORE(oldrule, newrule, entries);
-                       else
-                               TAILQ_INSERT_AFTER(
-                                   ruleset->rules.active.ptr,
-                                   oldrule, newrule, entries);
-                       ruleset->rules.active.rcount++;
-               }
-
-               nr = 0;
-               TAILQ_FOREACH(oldrule, ruleset->rules.active.ptr, entries)
-                       oldrule->nr = nr++;
-
-               ruleset->rules.active.ticket++;
-
-               pf_calc_skip_steps(ruleset->rules.active.ptr);
-               pf_remove_if_empty_ruleset(ruleset);
-
-               break;
-       }
-
        case DIOCCLRSTATES: {
                struct pf_state         *s, *nexts;
                struct pfioc_state_kill *psk = (struct pfioc_state_kill *)addr;
Index: pfvar.h
===================================================================
RCS file: /cvs/src/sys/net/pfvar.h,v
retrieving revision 1.350
diff -u -p -r1.350 pfvar.h
--- pfvar.h     22 Sep 2011 14:57:12 -0000      1.350
+++ pfvar.h     7 Oct 2011 10:36:53 -0000
@@ -65,9 +65,6 @@ enum  { PF_PASS, PF_DROP, PF_SCRUB, PF_NO
 enum   { PF_TRANS_RULESET, PF_TRANS_ALTQ, PF_TRANS_TABLE };
 enum   { PF_OP_NONE, PF_OP_IRG, PF_OP_EQ, PF_OP_NE, PF_OP_LT,
          PF_OP_LE, PF_OP_GT, PF_OP_GE, PF_OP_XRG, PF_OP_RRG };
-enum   { PF_CHANGE_NONE, PF_CHANGE_ADD_HEAD, PF_CHANGE_ADD_TAIL,
-         PF_CHANGE_ADD_BEFORE, PF_CHANGE_ADD_AFTER,
-         PF_CHANGE_REMOVE, PF_CHANGE_GET_TICKET };
 enum   { PF_GET_NONE, PF_GET_CLR_CNTR };
 enum   { PF_SK_WIRE, PF_SK_STACK, PF_SK_BOTH };
 
@@ -1653,7 +1650,6 @@ struct pfioc_iface {
 #define DIOCNATLOOK    _IOWR('D', 23, struct pfioc_natlook)
 #define DIOCSETDEBUG   _IOWR('D', 24, u_int32_t)
 #define DIOCGETSTATES  _IOWR('D', 25, struct pfioc_states)
-#define DIOCCHANGERULE _IOWR('D', 26, struct pfioc_rule)
 /* XXX cut 26 - 28 */
 #define DIOCSETTIMEOUT _IOWR('D', 29, struct pfioc_tm)
 #define DIOCGETTIMEOUT _IOWR('D', 30, struct pfioc_tm)

-- 
Henning Brauer, [email protected], [email protected]
BS Web Services, http://bsws.de, Full-Service ISP
Secure Hosting, Mail and DNS Services. Dedicated Servers, Root to Fully Managed
Henning Brauer Consulting, http://henningbrauer.com/

Reply via email to