"set skip" in PF has a slightly unexpected behaviour; rather
than skipping by interface group, it matches on the non-numeric
part of an interface name.

for example:

ifconfig carp5 group foo -group carp
set skip on carp

-> carp5 is still skipped.

no manpage change included as "set skip" is already documented
as taking an ifspec, which is later defined as accepting an
interface-group. but it is a change of behaviour, so it will
need mentioning in current.html.

any comments, suggestions, ok's?

Index: pf_if.c
===================================================================
RCS file: /cvs/src/sys/net/pf_if.c,v
retrieving revision 1.61
diff -u -p -r1.61 pf_if.c
--- pf_if.c     28 Jun 2010 23:21:41 -0000      1.61
+++ pf_if.c     18 May 2011 21:22:35 -0000
@@ -714,7 +714,8 @@ pfi_get_ifaces(const char *name, struct 
 int
 pfi_skip_if(const char *filter, struct pfi_kif *p)
 {
-       int     n;
+       struct ifg_list *i;
+       int              n;
 
        if (filter == NULL || !*filter)
                return (0);
@@ -724,10 +725,12 @@ pfi_skip_if(const char *filter, struct p
        if (n < 1 || n >= IFNAMSIZ)
                return (1);     /* sanity check */
        if (filter[n-1] >= '0' && filter[n-1] <= '9')
-               return (1);     /* only do exact match in that case */
-       if (strncmp(p->pfik_name, filter, n))
-               return (1);     /* prefix doesn't match */
-       return (p->pfik_name[n] < '0' || p->pfik_name[n] > '9');
+               return (1);     /* group names may not end in a digit */
+       if (p->pfik_ifp != NULL)
+               TAILQ_FOREACH(i, &p->pfik_ifp->if_groups, ifgl_next)
+                       if (!strncmp(i->ifgl_group->ifg_group, filter, n))
+                               return (0);     /* iface is in group "filter" */
+       return (1);
 }
 
 int

Reply via email to