Heya, So here is a crude diff, the shiffting can be improved and if we wan't this in the future we'll need a knob to enable "don't touch the vlanprio thingy".
Please it would be great if you can give this a spin Peter. I did some basic tests with a re(4) (hw tagging) and a rl(4) (no hw tagging). Index: sys/net/if_vlan.c =================================================================== RCS file: /cvs/src/sys/net/if_vlan.c,v retrieving revision 1.88 diff -d -u -p -w -r1.88 if_vlan.c --- sys/net/if_vlan.c 20 Aug 2011 06:21:32 -0000 1.88 +++ sys/net/if_vlan.c 28 Aug 2011 05:15:37 -0000 @@ -225,6 +225,11 @@ vlan_start(struct ifnet *ifp) */ if ((p->if_capabilities & IFCAP_VLAN_HWTAGGING) && (ifv->ifv_type == ETHERTYPE_VLAN)) { + /* Don't touch the priority */ + if (m->m_flags & M_VLANPRIO) { + m->m_pkthdr.ether_vtag &= ~EVL_VLID_MASK; + m->m_pkthdr.ether_vtag |= ifv->ifv_tag; + } else m->m_pkthdr.ether_vtag = ifv->ifv_tag + (ifv->ifv_prio << EVL_PRIO_BITS); m->m_flags |= M_VLANTAG; @@ -234,6 +239,12 @@ vlan_start(struct ifnet *ifp) m_copydata(m, 0, ETHER_HDR_LEN, (caddr_t)&evh); evh.evl_proto = evh.evl_encap_proto; evh.evl_encap_proto = htons(ifv->ifv_type); + if (m->m_flags & M_VLANPRIO) + /* XXX can be simpler */ + evh.evl_tag = htons(ifv->ifv_tag + + (EVL_PRIOFTAG(m->m_pkthdr.ether_vtag) + << EVL_PRIO_BITS)); + else evh.evl_tag = htons(ifv->ifv_tag + (ifv->ifv_prio << EVL_PRIO_BITS)); @@ -319,9 +330,13 @@ vlan_input(struct ether_header *eh, stru * reentrant!). */ m->m_pkthdr.rcvif = &ifv->ifv_if; + m->m_flags |= M_VLANPRIO; /* XXX test only remove me */ if (m->m_flags & M_VLANTAG) { m->m_flags &= ~M_VLANTAG; } else { + if (m->m_flags & M_VLANPRIO) + m->m_pkthdr.ether_vtag = + ntohs(*mtod(m, u_int16_t *)); eh->ether_type = mtod(m, u_int16_t *)[1]; m->m_len -= EVL_ENCAPLEN; m->m_data += EVL_ENCAPLEN; Index: sys/sys/mbuf.h =================================================================== RCS file: /cvs/src/sys/sys/mbuf.h,v retrieving revision 1.155 diff -d -u -p -w -r1.155 mbuf.h --- sys/sys/mbuf.h 8 Jul 2011 18:48:51 -0000 1.155 +++ sys/sys/mbuf.h 28 Aug 2011 03:58:05 -0000 @@ -71,7 +71,7 @@ struct m_hdr { caddr_t mh_data; /* location of data */ u_int mh_len; /* amount of data in this mbuf */ short mh_type; /* type of data in this mbuf */ - u_short mh_flags; /* flags; see below */ + u_int32_t mh_flags; /* flags; see below */ }; /* pf stuff */ @@ -171,10 +171,12 @@ struct mbuf { #define M_AUTH_AH 0x2000 /* header was authenticated (AH) */ #define M_COMP 0x4000 /* header was decompressed */ #define M_LINK0 0x8000 /* link layer specific flag */ +#define M_VLANPRIO 0x10000 /* vlanprio bits are valid */ /* flags copied when copying m_pkthdr */ #define M_COPYFLAGS (M_PKTHDR|M_EOR|M_PROTO1|M_BCAST|M_MCAST|M_CONF|M_COMP|\ - M_AUTH|M_LOOP|M_TUNNEL|M_LINK0|M_VLANTAG|M_FILDROP) + M_AUTH|M_LOOP|M_TUNNEL|M_LINK0|M_VLANTAG|M_FILDROP|\ + M_VLANPRIO) /* Checksumming flags */ #define M_IPV4_CSUM_OUT 0x0001 /* IPv4 checksum needed */