svn commit: r366917 - in head: sbin/ifconfig sys/net tests/sys/net

Hans Petter Selasky hps at selasky.org
Mon Nov 30 18:41:08 UTC 2020


On 10/21/20 11:28 PM, Alexander V. Chernikov wrote:
> Author: melifaro
> Date: Wed Oct 21 21:28:20 2020
> New Revision: 366917
> URL: https://svnweb.freebsd.org/changeset/base/366917
> 
> Log:
>    Add support for stacked VLANs (IEEE 802.1ad, AKA Q-in-Q).
>    
>    802.1ad interfaces are created with ifconfig using the "vlanproto" parameter.
>    Eg., the following creates a 802.1Q VLAN (id #42) over a 802.1ad S-VLAN
>    (id #5) over a physical Ethernet interface (em0).
>    
>    ifconfig vlan5 create vlandev em0 vlan 5 vlanproto 802.1ad up
>    ifconfig vlan42 create vlandev vlan5 vlan 42 inet 10.5.42.1/24
>    
>    VLAN_MTU, VLAN_HWCSUM and VLAN_TSO capabilities should be properly
>    supported. VLAN_HWTAGGING is only partially supported, as there is
>    currently no IFCAP_VLAN_* denoting the possibility to set the VLAN
>    EtherType to anything else than 0x8100 (802.1ad uses 0x88A8).
>    
>    Submitted by:	Olivier Piras
>    Sponsored by:	RG Nets
>    Differential Revision:	https://reviews.freebsd.org/D26436
> 

Hi Alexander,

Any vlan ending in .<N> is now treated the same regardless of network 
device:

Try this sequence of commands starting in any order
ifconfig vlan<N> create
ifconfig igb0.<N> create
ifconfig igb1.<N> create

You'll quickly see that only the first command you pick succeeds. The 
subsequent ones will fail. <N> must be the same number, for example 5.

I'm not sure exactly where the problem is yet, but investigation shows 
that ifc_name2unit would return EINVAL on igb0.<N> . Now it returns 0 
(success) and puts <N> into the *unit argument.

> diff --git a/sys/net/if_clone.c b/sys/net/if_clone.c
> index a55ce9c3005..7f96757e12c 100644
> --- a/sys/net/if_clone.c
> +++ b/sys/net/if_clone.c
> @@ -582,9 +582,8 @@ ifc_name2unit(const char *name, int *unit)
>         int             cutoff = INT_MAX / 10;
>         int             cutlim = INT_MAX % 10;
>  
> -       if ((cp = strrchr(name, '.')) == NULL)
> -               cp = name;
> -       for (; *cp != '\0' && (*cp < '0' || *cp > '9'); cp++);
> +       for (cp = name; *cp != '\0' && (*cp < '0' || *cp > '9'); cp++)
> +               ;
>         if (*cp == '\0') {
>                 *unit = -1;
>         } else if (cp[0] == '0' && cp[1] != '\0') {

The chunk above is not a fix. Can you have a look at this. Should be 
easy to reproduce!

Rolling back the kernel only to r366916 gives me:

ifconfig igb1.11 create
ifconfig: SIOCIFCREATE2: Invalid argument

Rolling back ifconfig to r366916 aswell, gives me the expected result again:

/usr/obj/usr/img/freebsd/amd64.amd64/sbin/ifconfig/ifconfig igb1.11 create
/usr/obj/usr/img/freebsd/amd64.amd64/sbin/ifconfig/ifconfig vlan11 create

--HPS


More information about the svn-src-head mailing list