summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2006-09-18 22:18:21 +0000
committerjkim <jkim@FreeBSD.org>2006-09-18 22:18:21 +0000
commitc77f49028df44e7d45f1dc280dc848de1ace9270 (patch)
treed7f38c9f0fb1daaf1307bc862e3888370150814a
parent3478f8adb5a10f180dc52b593d9d9217dde531f8 (diff)
downloadFreeBSD-src-c77f49028df44e7d45f1dc280dc848de1ace9270.zip
FreeBSD-src-c77f49028df44e7d45f1dc280dc848de1ace9270.tar.gz
Do not strip VLAN tag in promiscuous mode.
-rw-r--r--sys/dev/bge/if_bge.c43
1 files changed, 28 insertions, 15 deletions
diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c
index ec97f81..06b1565 100644
--- a/sys/dev/bge/if_bge.c
+++ b/sys/dev/bge/if_bge.c
@@ -349,6 +349,7 @@ static void bge_ifmedia_sts(struct ifnet *, struct ifmediareq *);
static uint8_t bge_eeprom_getbyte(struct bge_softc *, int, uint8_t *);
static int bge_read_eeprom(struct bge_softc *, caddr_t, int, int);
+static void bge_setpromisc(struct bge_softc *);
static void bge_setmulti(struct bge_softc *);
static int bge_newbuf_std(struct bge_softc *, int, struct mbuf *);
@@ -937,6 +938,27 @@ bge_init_tx_ring(struct bge_softc *sc)
}
static void
+bge_setpromisc(struct bge_softc *sc)
+{
+ struct ifnet *ifp;
+
+ BGE_LOCK_ASSERT(sc);
+
+ ifp = sc->bge_ifp;
+
+ /*
+ * Enable or disable promiscuous mode as needed.
+ * Do not strip VLAN tag when promiscuous mode is enabled.
+ */
+ if (ifp->if_flags & IFF_PROMISC)
+ BGE_SETBIT(sc, BGE_RX_MODE, BGE_RXMODE_RX_PROMISC |
+ BGE_RXMODE_RX_KEEP_VLAN_DIAG);
+ else
+ BGE_CLRBIT(sc, BGE_RX_MODE, BGE_RXMODE_RX_PROMISC |
+ BGE_RXMODE_RX_KEEP_VLAN_DIAG);
+}
+
+static void
bge_setmulti(struct bge_softc *sc)
{
struct ifnet *ifp;
@@ -2632,7 +2654,8 @@ bge_rxeof(struct bge_softc *sc)
rxidx = cur_rx->bge_idx;
BGE_INC(sc->bge_rx_saved_considx, sc->bge_return_ring_cnt);
- if (cur_rx->bge_flags & BGE_RXBDFLAG_VLAN_TAG) {
+ if (!(ifp->if_flags & IFF_PROMISC) &&
+ (cur_rx->bge_flags & BGE_RXBDFLAG_VLAN_TAG)) {
have_tag = 1;
vlan_tag = cur_rx->bge_vlan_tag;
}
@@ -3315,12 +3338,8 @@ bge_init_locked(struct bge_softc *sc)
CSR_WRITE_4(sc, BGE_MAC_ADDR1_LO, htons(m[0]));
CSR_WRITE_4(sc, BGE_MAC_ADDR1_HI, (htons(m[1]) << 16) | htons(m[2]));
- /* Enable or disable promiscuous mode as needed. */
- if (ifp->if_flags & IFF_PROMISC) {
- BGE_SETBIT(sc, BGE_RX_MODE, BGE_RXMODE_RX_PROMISC);
- } else {
- BGE_CLRBIT(sc, BGE_RX_MODE, BGE_RXMODE_RX_PROMISC);
- }
+ /* Program promiscuous mode. */
+ bge_setpromisc(sc);
/* Program multicast filter. */
bge_setmulti(sc);
@@ -3555,14 +3574,8 @@ bge_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
*/
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
flags = ifp->if_flags ^ sc->bge_if_flags;
- if (flags & IFF_PROMISC) {
- if (ifp->if_flags & IFF_PROMISC)
- BGE_SETBIT(sc, BGE_RX_MODE,
- BGE_RXMODE_RX_PROMISC);
- else
- BGE_CLRBIT(sc, BGE_RX_MODE,
- BGE_RXMODE_RX_PROMISC);
- }
+ if (flags & IFF_PROMISC)
+ bge_setpromisc(sc);
if (flags & IFF_ALLMULTI)
bge_setmulti(sc);
} else
OpenPOWER on IntegriCloud