this factors out the vlan shim header injection as vlan_inject() i intend to use this code in mpw in an upcoming diff.
ok? Index: if_vlan.c =================================================================== RCS file: /cvs/src/sys/net/if_vlan.c,v retrieving revision 1.151 diff -u -p -r1.151 if_vlan.c --- if_vlan.c 13 Jan 2016 03:18:26 -0000 1.151 +++ if_vlan.c 2 Mar 2016 01:16:26 -0000 @@ -274,21 +274,12 @@ vlan_start(struct ifnet *ifp) (prio << EVL_PRIO_BITS); m->m_flags |= M_VLANTAG; } else { - struct ether_vlan_header evh; - - 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); - evh.evl_tag = htons(ifv->ifv_tag + - (prio << EVL_PRIO_BITS)); - m_adj(m, ETHER_HDR_LEN); - M_PREPEND(m, sizeof(evh), M_DONTWAIT); + m = vlan_inject(m, ifv->ifv_type, ifv->ifv_tag | + (prio << EVL_PRIO_BITS)); if (m == NULL) { ifp->if_oerrors++; continue; } - m_copyback(m, 0, sizeof(evh), &evh, M_NOWAIT); - m->m_flags &= ~M_VLANTAG; } if (if_enqueue(p, m)) { @@ -298,6 +289,26 @@ vlan_start(struct ifnet *ifp) ifp->if_opackets++; } } + +struct mbuf * +vlan_inject(struct mbuf *m, uint16_t type, uint16_t tag) +{ + struct ether_vlan_header evh; + + m_copydata(m, 0, ETHER_HDR_LEN, (caddr_t)&evh); + evh.evl_proto = evh.evl_encap_proto; + evh.evl_encap_proto = htons(type); + evh.evl_tag = htons(tag); + m_adj(m, ETHER_HDR_LEN); + M_PREPEND(m, sizeof(evh), M_DONTWAIT); + if (m == NULL) + return (NULL); + + m_copyback(m, 0, sizeof(evh), &evh, M_NOWAIT); + CLR(m->m_flags, M_VLANTAG); + + return (m); + } /* * vlan_input() returns 1 if it has consumed the packet, 0 otherwise. 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 2 Mar 2016 01:16:26 -0000 @@ -98,6 +98,8 @@ struct ifvlan { #define ifv_prio ifv_mib.ifvm_prio #define ifv_type ifv_mib.ifvm_type #define IFVF_PROMISC 0x01 + +struct mbuf *vlan_inject(struct mbuf *, uint16_t, uint16_t); #endif /* _KERNEL */ #endif /* _NET_IF_VLAN_VAR_H_ */