summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authormatt <matt@NetBSD.org>1998-04-07 13:32:06 +0000
committermatt <matt@NetBSD.org>1998-04-07 13:32:06 +0000
commitb80f703f77b2b9fc759df49a5fd9d3bda71dbac0 (patch)
tree5b2a9751e99a61b6b5e9525a1cd777111d25e1dc /sys/dev
parent61b9cc76cfb26d6c65f0e51d4aae07878b222036 (diff)
Fix problem with promicuously received packets. (ie. give them to bpf
but not fddi_input).
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/pdq.c12
-rw-r--r--sys/dev/ic/pdq_ifsubr.c16
-rw-r--r--sys/dev/ic/pdqreg.h43
-rw-r--r--sys/dev/ic/pdqvar.h4
4 files changed, 47 insertions, 28 deletions
diff --git a/sys/dev/ic/pdq.c b/sys/dev/ic/pdq.c
index f0e522cf85a..7252f5669dc 100644
--- a/sys/dev/ic/pdq.c
+++ b/sys/dev/ic/pdq.c
@@ -1,4 +1,4 @@
-/* $NetBSD: pdq.c,v 1.11 1997/06/08 19:47:13 thorpej Exp $ */
+/* $NetBSD: pdq.c,v 1.12 1998/04/07 13:32:07 matt Exp $ */
/*-
* Copyright (c) 1995,1996 Matt Thomas <matt@3am-software.com>
@@ -716,8 +716,8 @@ pdq_process_received_data(
dataptr = PDQ_OS_DATABUF_PTR(fpdu);
status = *(pdq_rxstatus_t *) dataptr;
- if ((status.rxs_status & 0x200000) == 0) {
- datalen = status.rxs_status & 0x1FFF;
+ if (status.rxs_rcc_badpdu == 0) {
+ datalen = status.rxs_len;
fc = dataptr[PDQ_RX_FC_OFFSET];
switch (fc & (PDQ_FDDIFC_C|PDQ_FDDIFC_L|PDQ_FDDIFC_F)) {
case PDQ_FDDI_LLC_ASYNC:
@@ -775,7 +775,11 @@ pdq_process_received_data(
} else {
PDQ_OS_DATABUF_LEN_SET(lpdu, pdulen + PDQ_RX_FC_OFFSET - (segcnt - 1) * PDQ_OS_DATABUF_SIZE);
}
- pdq_os_receive_pdu(pdq, fpdu, pdulen);
+ /*
+ * Do not pass to protocol if packet was received promiscuously
+ */
+ pdq_os_receive_pdu(pdq, fpdu, pdulen,
+ status.rxs_rcc_dd < PDQ_RXS_RCC_DD_CAM_MATCH);
rx->rx_free += PDQ_RX_SEGCNT;
PDQ_ADVANCE(producer, PDQ_RX_SEGCNT, ring_mask);
PDQ_ADVANCE(completion, PDQ_RX_SEGCNT, ring_mask);
diff --git a/sys/dev/ic/pdq_ifsubr.c b/sys/dev/ic/pdq_ifsubr.c
index 1bf106e5c2d..6d11c0d761d 100644
--- a/sys/dev/ic/pdq_ifsubr.c
+++ b/sys/dev/ic/pdq_ifsubr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: pdq_ifsubr.c,v 1.11 1997/06/08 19:47:16 thorpej Exp $ */
+/* $NetBSD: pdq_ifsubr.c,v 1.12 1998/04/07 13:32:07 matt Exp $ */
/*-
* Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com>
@@ -124,16 +124,13 @@ pdq_ifinit(
{
if (sc->sc_if.if_flags & IFF_UP) {
sc->sc_if.if_flags |= IFF_RUNNING;
+#if NBPFILTER > 0
if (sc->sc_if.if_flags & IFF_PROMISC) {
sc->sc_pdq->pdq_flags |= PDQ_PROMISC;
} else {
sc->sc_pdq->pdq_flags &= ~PDQ_PROMISC;
}
- if (sc->sc_if.if_flags & IFF_ALLMULTI) {
- sc->sc_pdq->pdq_flags |= PDQ_ALLMULTI;
- } else {
- sc->sc_pdq->pdq_flags &= ~PDQ_ALLMULTI;
- }
+#endif
if (sc->sc_if.if_flags & IFF_LINK1) {
sc->sc_pdq->pdq_flags |= PDQ_PASS_SMT;
} else {
@@ -206,7 +203,8 @@ void
pdq_os_receive_pdu(
pdq_t *pdq,
struct mbuf *m,
- size_t pktlen)
+ size_t pktlen,
+ int drop)
{
pdq_softc_t *sc = (pdq_softc_t *) pdq->pdq_os_ctx;
struct fddi_header *fh = mtod(m, struct fddi_header *);
@@ -215,11 +213,11 @@ pdq_os_receive_pdu(
#if NBPFILTER > 0
if (sc->sc_bpf != NULL)
PDQ_BPF_MTAP(sc, m);
- if ((fh->fddi_fc & (FDDIFC_L|FDDIFC_F)) != FDDIFC_LLC_ASYNC) {
+#endif
+ if (drop || (fh->fddi_fc & (FDDIFC_L|FDDIFC_F)) != FDDIFC_LLC_ASYNC) {
m_freem(m);
return;
}
-#endif
m->m_data += sizeof(struct fddi_header);
m->m_len -= sizeof(struct fddi_header);
diff --git a/sys/dev/ic/pdqreg.h b/sys/dev/ic/pdqreg.h
index 7efc2f68143..078405318c3 100644
--- a/sys/dev/ic/pdqreg.h
+++ b/sys/dev/ic/pdqreg.h
@@ -1,4 +1,4 @@
-/* $NetBSD: pdqreg.h,v 1.7 1997/03/24 00:35:15 thorpej Exp $ */
+/* $NetBSD: pdqreg.h,v 1.8 1998/04/07 13:32:06 matt Exp $ */
/*-
* Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com>
@@ -310,19 +310,36 @@ typedef struct {
typedef union {
pdq_uint32_t rxs_status;
- pdq_uint32_t PDQ_BITFIELD12(rxs_len : 13,
- rxs_rcc_ss : 2,
- rxs_rcc_dd : 2,
- rxs_rcc_reason : 3,
- rxs_rcc_badcrc : 1,
- rxs_rcc_badpdu : 1,
- rxs_fsb__reserved : 2,
- rxs_fsb_c : 1,
- rxs_fsb_a : 1,
- rxs_fsb_e : 1,
- rxs_fsc : 3,
- rxs__reserved : 2);
+ struct {
+ pdq_uint32_t PDQ_BITFIELD12(st_len : 13,
+ st_rcc_ss : 2,
+ st_rcc_dd : 2,
+ st_rcc_reason : 3,
+ st_rcc_badcrc : 1,
+ st_rcc_badpdu : 1,
+ st_fsb__reserved : 2,
+ st_fsb_c : 1,
+ st_fsb_a : 1,
+ st_fsb_e : 1,
+ st_fsc : 3,
+ st__reserved : 2);
+ } rxs_st;
} pdq_rxstatus_t;
+#define rxs_len rxs_st.st_len
+#define rxs_rcc_ss rxs_st.st_rcc_ss
+#define rxs_rcc_dd rxs_st.st_rcc_dd
+#define rxs_rcc_reason rxs_st.st_rcc_reason
+#define rxs_rcc_badcrc rxs_st.st_rcc_badcrc
+#define rxs_rcc_badpdu rxs_st.st_rcc_badpdu
+#define rxs_fsb_c rxs_st.st_fsb_c
+#define rxs_fsb_a rxs_st.st_fsb_a
+#define rxs_fsb_e rxs_st.st_fsb_e
+#define rxs_fsc rxs_st.st_fsc
+
+#define PDQ_RXS_RCC_DD_NO_MATCH 0x00
+#define PDQ_RXS_RCC_DD_PROMISC_MATCH 0x01
+#define PDQ_RXS_RCC_DD_CAM_MATCH 0x02
+#define PDQ_RXS_RCC_DD_MLA_MATCH 0x03
typedef struct {
pdq_uint32_t PDQ_BITFIELD5(txd_pa_hi : 16,
diff --git a/sys/dev/ic/pdqvar.h b/sys/dev/ic/pdqvar.h
index 71fc75c856e..7770f62dcd6 100644
--- a/sys/dev/ic/pdqvar.h
+++ b/sys/dev/ic/pdqvar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: pdqvar.h,v 1.15 1998/02/10 14:09:14 mrg Exp $ */
+/* $NetBSD: pdqvar.h,v 1.16 1998/04/07 13:32:07 matt Exp $ */
/*-
* Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com>
@@ -386,7 +386,7 @@ typedef mblk_t PDQ_OS_DATABUF_T;
#endif
extern void pdq_os_addr_fill(pdq_t *pdq, pdq_lanaddr_t *addrs, size_t numaddrs);
-extern void pdq_os_receive_pdu(pdq_t *, PDQ_OS_DATABUF_T *pdu, size_t pdulen);
+extern void pdq_os_receive_pdu(pdq_t *, PDQ_OS_DATABUF_T *pdu, size_t pdulen, int drop);
extern void pdq_os_restart_transmitter(pdq_t *pdq);
extern void pdq_os_transmit_done(pdq_t *pdq, PDQ_OS_DATABUF_T *pdu);
#if !defined(pdq_os_update_status)