diff options
| author | matt <matt@NetBSD.org> | 1998-04-07 13:32:06 +0000 |
|---|---|---|
| committer | matt <matt@NetBSD.org> | 1998-04-07 13:32:06 +0000 |
| commit | b80f703f77b2b9fc759df49a5fd9d3bda71dbac0 (patch) | |
| tree | 5b2a9751e99a61b6b5e9525a1cd777111d25e1dc /sys/dev | |
| parent | 61b9cc76cfb26d6c65f0e51d4aae07878b222036 (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.c | 12 | ||||
| -rw-r--r-- | sys/dev/ic/pdq_ifsubr.c | 16 | ||||
| -rw-r--r-- | sys/dev/ic/pdqreg.h | 43 | ||||
| -rw-r--r-- | sys/dev/ic/pdqvar.h | 4 |
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) |
