summaryrefslogtreecommitdiffstats
path: root/sys/net/if_vlan_var.h
diff options
context:
space:
mode:
authorbms <bms@FreeBSD.org>2007-02-28 22:05:30 +0000
committerbms <bms@FreeBSD.org>2007-02-28 22:05:30 +0000
commitf9e43f8ad0f60454cfdd74c10b902876be9d24c8 (patch)
treec7ddb60e2566f2f455abca573e24e10611728e45 /sys/net/if_vlan_var.h
parentcbe2d2bcd1c7c247c552eb3856d6f592e550bb65 (diff)
downloadFreeBSD-src-f9e43f8ad0f60454cfdd74c10b902876be9d24c8.zip
FreeBSD-src-f9e43f8ad0f60454cfdd74c10b902876be9d24c8.tar.gz
Prepare for 802.1p:
Add macro EVL_APPLY_VLID() which may be used to apply an 802.1q VLAN ID to the M_VLANTAG field in an mbuf packet header non-destructively. This will be used by net80211 to begin with. Add macro EVL_APPLY_PRI() which may be used to apply an 802.1p priority class to the M_VLANTAG field in an mbuf packet header non-destructively. Add other macros for manipulating tags and the CFI bit. Submitted by: Boris Kovalenko (EVL_CFIOFTAG(), EVL_MAKETAG())
Diffstat (limited to 'sys/net/if_vlan_var.h')
-rw-r--r--sys/net/if_vlan_var.h37
1 files changed, 34 insertions, 3 deletions
diff --git a/sys/net/if_vlan_var.h b/sys/net/if_vlan_var.h
index 79bc461..ec71df1 100644
--- a/sys/net/if_vlan_var.h
+++ b/sys/net/if_vlan_var.h
@@ -40,9 +40,40 @@ struct ether_vlan_header {
u_int16_t evl_proto;
};
-#define EVL_VLID_MASK 0x0FFF
-#define EVL_VLANOFTAG(tag) ((tag) & EVL_VLID_MASK)
-#define EVL_PRIOFTAG(tag) (((tag) >> 13) & 7)
+#define EVL_VLID_MASK 0x0FFF
+#define EVL_PRI_MASK 0xE000
+#define EVL_VLANOFTAG(tag) ((tag) & EVL_VLID_MASK)
+#define EVL_PRIOFTAG(tag) (((tag) >> 13) & 7)
+#define EVL_CFIOFTAG(tag) (((tag) >> 12) & 1)
+#define EVL_MAKETAG(vlid, pri, cfi) \
+ ((((((pri) & 7) << 1) | ((cfi) & 1)) << 12) | ((vlid) & EVL_VLID_MASK))
+
+/* Set the VLAN ID in an mbuf packet header non-destructively. */
+#define EVL_APPLY_VLID(m, vlid) \
+ do { \
+ if ((m)->m_flags & M_VLANTAG) { \
+ (m)->m_pkthdr.ether_vtag &= EVL_VLID_MASK; \
+ (m)->m_pkthdr.ether_vtag |= (vlid); \
+ } else { \
+ (m)->m_pkthdr.ether_vtag = (vlid); \
+ (m)->m_flags |= M_VLANTAG; \
+ } \
+ } while (0)
+
+/* Set the priority ID in an mbuf packet header non-destructively. */
+#define EVL_APPLY_PRI(m, pri) \
+ do { \
+ if ((m)->m_flags & M_VLANTAG) { \
+ uint16_t __vlantag = (m)->m_pkthdr.ether_vtag; \
+ (m)->m_pkthdr.ether_vtag |= EVL_MAKETAG( \
+ EVL_VLANOFTAG(__vlantag), (pri), \
+ EVL_CFIOFTAG(__vlantag)); \
+ } else { \
+ (m)->m_pkthdr.ether_vtag = \
+ EVL_MAKETAG(0, (pri), 0); \
+ (m)->m_flags |= M_VLANTAG; \
+ } \
+ } while (0)
/* sysctl(3) tags, for compatibility purposes */
#define VLANCTL_PROTO 1
OpenPOWER on IntegriCloud