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 */
>
--