diff options
author | bms <bms@FreeBSD.org> | 2007-02-28 22:05:30 +0000 |
---|---|---|
committer | bms <bms@FreeBSD.org> | 2007-02-28 22:05:30 +0000 |
commit | f9e43f8ad0f60454cfdd74c10b902876be9d24c8 (patch) | |
tree | c7ddb60e2566f2f455abca573e24e10611728e45 /sys/net | |
parent | cbe2d2bcd1c7c247c552eb3856d6f592e550bb65 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/net/if_vlan_var.h | 37 |
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 |