David Gwynne([email protected]) on 2015.12.22 11:06:21 +1000:
> the spec says vlan 0 and vlan 4095 are reserved, so we probably
> shouldnt use them.
> 
> this tweaks the vlan tag check only allow valid ids per the spec.
> 
> ok?

code reads ok

however, this could be tweaked in ifconfig too:
3589:   __tag = tag = strtonum(val, 0, 4095, &errmsg);

i can do that if you commit this (or you do it).

> 
> Index: if_vlan.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_vlan.c,v
> retrieving revision 1.150
> diff -u -p -r1.150 if_vlan.c
> --- if_vlan.c 8 Dec 2015 11:35:42 -0000       1.150
> +++ if_vlan.c 22 Dec 2015 01:04:24 -0000
> @@ -156,6 +156,8 @@ vlan_clone_create(struct if_clone *ifc, 
>       else
>               ifv->ifv_type = ETHERTYPE_VLAN;
>  
> +     ifv->ifv_tag = EVL_VLID_MIN;
> +
>       refcnt_init(&ifv->ifv_refcnt);
>  
>       ifp->if_start = vlan_start;
> @@ -586,6 +588,7 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd
>       struct ifvlan   *ifv;
>       struct vlanreq   vlr;
>       int              error = 0, s;
> +     uint16_t         tag;
>  
>       ifr = (struct ifreq *)data;
>       ifa = (struct ifaddr *)data;
> @@ -630,15 +633,18 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd
>                       error = ENOENT;
>                       break;
>               }
> +
>               /*
>                * Don't let the caller set up a VLAN tag with
>                * anything except VLID bits.
>                */
> -             if (vlr.vlr_tag & ~EVL_VLID_MASK) {
> +             tag = vlr.vlr_tag;
> +             if (tag < EVL_VLID_MIN || tag > EVL_VLID_MAX) {
>                       error = EINVAL;
>                       break;
>               }
> -             error = vlan_config(ifv, pr, vlr.vlr_tag);
> +
> +             error = vlan_config(ifv, pr, tag);
>               if (error)
>                       break;
>               ifp->if_flags |= IFF_RUNNING;
> Index: if_vlan_var.h
> ===================================================================
> RCS file: /cvs/src/sys/net/if_vlan_var.h,v
> retrieving revision 1.31
> diff -u -p -r1.31 if_vlan_var.h
> --- if_vlan_var.h     3 Dec 2015 16:27:32 -0000       1.31
> +++ if_vlan_var.h     22 Dec 2015 01:04:24 -0000
> @@ -42,7 +42,10 @@ struct     ether_vlan_header {
>       u_int16_t evl_proto;
>  };
>  
> -#define      EVL_VLID_MASK   0x0FFF
> +#define      EVL_VLID_MASK   0xFFF
> +/* 0x000 and 0xFFF are reserved */
> +#define      EVL_VLID_MIN    0x001
> +#define      EVL_VLID_MAX    0xFFE
>  #define      EVL_VLANOFTAG(tag) ((tag) & EVL_VLID_MASK)
>  #define      EVL_PRIOFTAG(tag) (((tag) >> EVL_PRIO_BITS) & 7)
>  #define      EVL_ENCAPLEN    4       /* length in octets of encapsulation */
> 

-- 

Reply via email to