MFC:
- 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. - Fix VLAN_INPUT_TAG() macro, so that it doesn't touch mtag in case if memory allocation failed. - Remove fourth argument from VLAN_INPUT_TAG(), that was used incorrectly in almost all drivers. Indicate failure with mbuf value of NULL.
This commit is contained in:
parent
2776f9ec11
commit
ed67dec936
@ -2861,8 +2861,11 @@ bge_rxeof(sc)
|
||||
* If we received a packet with a vlan tag,
|
||||
* attach that information to the packet.
|
||||
*/
|
||||
if (have_tag)
|
||||
VLAN_INPUT_TAG(ifp, m, vlan_tag, continue);
|
||||
if (have_tag) {
|
||||
VLAN_INPUT_TAG(ifp, m, vlan_tag);
|
||||
if (m == NULL)
|
||||
continue;
|
||||
}
|
||||
|
||||
BGE_UNLOCK(sc);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
|
@ -3017,9 +3017,7 @@ em_process_receive_interrupts(struct adapter * adapter, int count)
|
||||
if (current_desc->status & E1000_RXD_STAT_VP)
|
||||
VLAN_INPUT_TAG(ifp, adapter->fmp,
|
||||
(le16toh(current_desc->special) &
|
||||
E1000_RXD_SPC_VLAN_MASK),
|
||||
adapter->fmp = NULL);
|
||||
|
||||
E1000_RXD_SPC_VLAN_MASK));
|
||||
m = adapter->fmp;
|
||||
adapter->fmp = NULL;
|
||||
adapter->lmp = NULL;
|
||||
|
@ -2152,8 +2152,7 @@ ixgb_process_receive_interrupts(struct adapter * adapter, int count)
|
||||
adapter->fmp);
|
||||
if (current_desc->status & IXGB_RX_DESC_STATUS_VP)
|
||||
VLAN_INPUT_TAG(ifp, adapter->fmp,
|
||||
current_desc->special,
|
||||
adapter->fmp = NULL);
|
||||
current_desc->special);
|
||||
|
||||
if (adapter->fmp != NULL) {
|
||||
IXGB_UNLOCK(adapter);
|
||||
|
@ -1229,7 +1229,9 @@ nge_rxeof(sc)
|
||||
*/
|
||||
if (extsts & NGE_RXEXTSTS_VLANPKT) {
|
||||
VLAN_INPUT_TAG(ifp, m,
|
||||
ntohs(extsts & NGE_RXEXTSTS_VTCI), continue);
|
||||
ntohs(extsts & NGE_RXEXTSTS_VTCI));
|
||||
if (m == NULL)
|
||||
continue;
|
||||
}
|
||||
NGE_UNLOCK(sc);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
|
@ -1670,9 +1670,12 @@ re_rxeof(sc)
|
||||
}
|
||||
}
|
||||
|
||||
if (rxvlan & RL_RDESC_VLANCTL_TAG)
|
||||
if (rxvlan & RL_RDESC_VLANCTL_TAG) {
|
||||
VLAN_INPUT_TAG(ifp, m,
|
||||
ntohs((rxvlan & RL_RDESC_VLANCTL_DATA)), continue);
|
||||
ntohs((rxvlan & RL_RDESC_VLANCTL_DATA)));
|
||||
if (m == NULL)
|
||||
continue;
|
||||
}
|
||||
RL_UNLOCK(sc);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
RL_LOCK(sc);
|
||||
|
@ -766,8 +766,9 @@ txp_rx_reclaim(sc, r)
|
||||
}
|
||||
|
||||
if (rxd->rx_stat & RX_STAT_VLAN) {
|
||||
VLAN_INPUT_TAG(ifp,
|
||||
m, htons(rxd->rx_vlan >> 16), goto next);
|
||||
VLAN_INPUT_TAG(ifp, m, htons(rxd->rx_vlan >> 16));
|
||||
if (m == NULL)
|
||||
goto next;
|
||||
}
|
||||
|
||||
TXP_UNLOCK(sc);
|
||||
|
@ -1490,9 +1490,12 @@ vge_rxeof(sc)
|
||||
}
|
||||
}
|
||||
|
||||
if (rxstat & VGE_RDSTS_VTAG)
|
||||
if (rxstat & VGE_RDSTS_VTAG) {
|
||||
VLAN_INPUT_TAG(ifp, m,
|
||||
ntohs((rxctl & VGE_RDCTL_VLANID)), continue);
|
||||
ntohs((rxctl & VGE_RDCTL_VLANID)));
|
||||
if (m == NULL)
|
||||
continue;
|
||||
}
|
||||
|
||||
VGE_UNLOCK(sc);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
|
@ -509,7 +509,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,24 +96,30 @@ struct vlanreq {
|
||||
#define MTAG_VLAN 1035328035
|
||||
#define MTAG_VLAN_TAG 0 /* tag of VLAN interface */
|
||||
|
||||
#define VLAN_INPUT_TAG(_ifp, _m, _t, _errcase) do { \
|
||||
/*
|
||||
* 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) do { \
|
||||
struct m_tag *mtag; \
|
||||
mtag = m_tag_alloc(MTAG_VLAN, MTAG_VLAN_TAG, \
|
||||
sizeof (u_int), M_NOWAIT); \
|
||||
if (mtag == NULL) { \
|
||||
if (mtag != NULL) { \
|
||||
VLAN_TAG_VALUE(mtag) = (_t); \
|
||||
m_tag_prepend((_m), mtag); \
|
||||
(_m)->m_flags |= M_VLANTAG; \
|
||||
} else { \
|
||||
(_ifp)->if_ierrors++; \
|
||||
m_freem(_m); \
|
||||
_errcase; \
|
||||
_m = NULL; \
|
||||
} \
|
||||
*(u_int *)(mtag+1) = (_t); \
|
||||
m_tag_prepend((_m), mtag); \
|
||||
(_m)->m_flags |= M_VLANTAG; \
|
||||
} while (0)
|
||||
|
||||
#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_ */
|
||||
|
@ -710,8 +710,9 @@ ieee80211_deliver_data(struct ieee80211com *ic,
|
||||
if (m != NULL) {
|
||||
if (ni->ni_vlan != 0) {
|
||||
/* attach vlan tag */
|
||||
/* XXX goto err? */
|
||||
VLAN_INPUT_TAG(ifp, m, ni->ni_vlan, goto out);
|
||||
VLAN_INPUT_TAG(ifp, m, ni->ni_vlan);
|
||||
if (m == NULL)
|
||||
goto out; /* XXX goto err? */
|
||||
}
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
|
@ -2532,8 +2532,11 @@ ti_rxeof(sc)
|
||||
* If we received a packet with a vlan tag,
|
||||
* tag it before passing the packet upward.
|
||||
*/
|
||||
if (have_tag)
|
||||
VLAN_INPUT_TAG(ifp, m, vlan_tag, continue);
|
||||
if (have_tag) {
|
||||
VLAN_INPUT_TAG(ifp, m, vlan_tag);
|
||||
if (m == NULL)
|
||||
continue;
|
||||
}
|
||||
TI_UNLOCK(sc);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
TI_LOCK(sc);
|
||||
|
Loading…
x
Reference in New Issue
Block a user