From 175e16aa4df4f5510a7a395b24bd5ac9a00145f9 Mon Sep 17 00:00:00 2001 From: glebius Date: Sun, 18 Dec 2005 18:24:27 +0000 Subject: - 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. In collaboration with: yongari, ru, sam --- sys/dev/bge/if_bge.c | 7 +++++-- sys/dev/em/if_em.c | 3 +-- sys/dev/ixgb/if_ixgb.c | 3 +-- sys/dev/nge/if_nge.c | 4 +++- sys/dev/re/if_re.c | 7 +++++-- sys/dev/ti/if_ti.c | 7 +++++-- sys/dev/txp/if_txp.c | 5 +++-- sys/dev/vge/if_vge.c | 7 +++++-- sys/net/if_vlan_var.h | 13 +++++++------ sys/net80211/ieee80211_input.c | 5 +++-- 10 files changed, 38 insertions(+), 23 deletions(-) (limited to 'sys') diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c index f76309b..16fc559 100644 --- a/sys/dev/bge/if_bge.c +++ b/sys/dev/bge/if_bge.c @@ -2623,8 +2623,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); diff --git a/sys/dev/em/if_em.c b/sys/dev/em/if_em.c index 192777d..8f8f465 100644 --- a/sys/dev/em/if_em.c +++ b/sys/dev/em/if_em.c @@ -2970,8 +2970,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)); #ifndef __NO_STRICT_ALIGNMENT skip: #endif diff --git a/sys/dev/ixgb/if_ixgb.c b/sys/dev/ixgb/if_ixgb.c index 710ebec..788b398 100644 --- a/sys/dev/ixgb/if_ixgb.c +++ b/sys/dev/ixgb/if_ixgb.c @@ -2153,8 +2153,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); diff --git a/sys/dev/nge/if_nge.c b/sys/dev/nge/if_nge.c index 70d99bd..74f8f9a 100644 --- a/sys/dev/nge/if_nge.c +++ b/sys/dev/nge/if_nge.c @@ -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); diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c index 28f9c2a..6143ba2 100644 --- a/sys/dev/re/if_re.c +++ b/sys/dev/re/if_re.c @@ -1671,9 +1671,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); diff --git a/sys/dev/ti/if_ti.c b/sys/dev/ti/if_ti.c index a21191b..5b26e63 100644 --- a/sys/dev/ti/if_ti.c +++ b/sys/dev/ti/if_ti.c @@ -2727,8 +2727,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); diff --git a/sys/dev/txp/if_txp.c b/sys/dev/txp/if_txp.c index 6f3429e..ae22015 100644 --- a/sys/dev/txp/if_txp.c +++ b/sys/dev/txp/if_txp.c @@ -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); diff --git a/sys/dev/vge/if_vge.c b/sys/dev/vge/if_vge.c index 915deb8..b433a01 100644 --- a/sys/dev/vge/if_vge.c +++ b/sys/dev/vge/if_vge.c @@ -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); diff --git a/sys/net/if_vlan_var.h b/sys/net/if_vlan_var.h index c55d5d1..b1fecf6 100644 --- a/sys/net/if_vlan_var.h +++ b/sys/net/if_vlan_var.h @@ -102,18 +102,19 @@ struct vlanreq { */ #define VLAN_TAG_VALUE(_mt) (*(u_int *)((_mt) + 1)) -#define VLAN_INPUT_TAG(_ifp, _m, _t, _errcase) do { \ +#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; \ } \ - VLAN_TAG_VALUE(mtag) = (_t); \ - m_tag_prepend((_m), mtag); \ - (_m)->m_flags |= M_VLANTAG; \ } while (0) #define VLAN_OUTPUT_TAG(_ifp, _m) \ diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c index 80a64d7..5e3b2f7 100644 --- a/sys/net80211/ieee80211_input.c +++ b/sys/net80211/ieee80211_input.c @@ -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); } -- cgit v1.1