On 05/18/11 23:31, Stuart Henderson wrote:
> "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.

I think the prefix match test is a common behaviour so I think you
should keep that. Example granti (note that there is no "sis" group).

$ ifconfig sis | egrep '^sis|^  group'      
sis0: flags=28843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,NOINET6> mtu 1500
        groups: a_group
sis1: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        groups: another_group
sis2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        groups: yet_another

However it seems not entirely consistant since if I create a "sis"
group, it will only list the interfaces within that group.

Hmmm, looking further, it seems ordinary rules only match on the
interface name or group as well (in pfi_kif_match()), so maybe
you're just plain right after all. :-)

Note that the default ruleset does include a 'set skip on lo' but
that's fine since lo* interfaces are by default added to the "lo"
group. If people get bitten by this change, they could either add
an interface-name-matching group to each interface or we do that
automatically, as is done for vlan's, lo's etc.

So in the end this looks right, so ok halex@, but bear in mind I'm
not by far authoritative in this part of the tree.

/Alexander

> 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