Use VLAN_TAG_VALUE() not only to read a dot1q tag
value from an m_tag, but also to set it. This reduces complex code duplication and improves its readability. Alas, we shouldn't rename the macro to VLAN_TAG_LVALUE() globally because that would cause pain for kernel module port maintainers and vendors using FreeBSD as their codebase. Added a clarifying comment instead. Discussed with: ru, glebius X-MFC-After: 6.0-RELEASE (MFC is good just to reduce the diff)
This commit is contained in:
parent
a3a90a725c
commit
eefbcf0e62
@ -502,7 +502,7 @@ vlan_start(struct ifnet *ifp)
|
||||
m_freem(m);
|
||||
continue;
|
||||
}
|
||||
*(u_int*)(mtag + 1) = ifv->ifv_tag;
|
||||
VLAN_TAG_VALUE(mtag) = ifv->ifv_tag;
|
||||
m_tag_prepend(m, mtag);
|
||||
m->m_flags |= M_VLANTAG;
|
||||
} else {
|
||||
|
@ -96,6 +96,12 @@ struct vlanreq {
|
||||
#define MTAG_VLAN 1035328035
|
||||
#define MTAG_VLAN_TAG 0 /* tag of VLAN interface */
|
||||
|
||||
/*
|
||||
* This macro must expand to a lvalue so that it can be used
|
||||
* to set a tag with a simple assignment.
|
||||
*/
|
||||
#define VLAN_TAG_VALUE(_mt) (*(u_int *)((_mt) + 1))
|
||||
|
||||
#define VLAN_INPUT_TAG(_ifp, _m, _t, _errcase) do { \
|
||||
struct m_tag *mtag; \
|
||||
mtag = m_tag_alloc(MTAG_VLAN, MTAG_VLAN_TAG, \
|
||||
@ -105,7 +111,7 @@ struct vlanreq {
|
||||
m_freem(_m); \
|
||||
_errcase; \
|
||||
} \
|
||||
*(u_int *)(mtag+1) = (_t); \
|
||||
VLAN_TAG_VALUE(mtag) = (_t); \
|
||||
m_tag_prepend((_m), mtag); \
|
||||
(_m)->m_flags |= M_VLANTAG; \
|
||||
} while (0)
|
||||
@ -113,7 +119,6 @@ struct vlanreq {
|
||||
#define VLAN_OUTPUT_TAG(_ifp, _m) \
|
||||
((_m)->m_flags & M_VLANTAG ? \
|
||||
m_tag_locate((_m), MTAG_VLAN, MTAG_VLAN_TAG, NULL) : NULL)
|
||||
#define VLAN_TAG_VALUE(_mt) (*(u_int *)((_mt)+1))
|
||||
#endif /* _KERNEL */
|
||||
|
||||
#endif /* _NET_IF_VLAN_VAR_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user