svn commit: r208084 - head/sys/dev/fxp

Pyun YongHyeon yongari at FreeBSD.org
Fri May 14 17:39:28 UTC 2010


Author: yongari
Date: Fri May 14 17:39:28 2010
New Revision: 208084
URL: http://svn.freebsd.org/changeset/base/208084

Log:
  If controller received bad frames make sure to update newly added
  RFA. Also drop frames that have either CRC error or alignment
  error. Normally bad frames are not received at all. But controllers
  running in promiscuous mode will receive bad frames. 82557 will
  also receive bad frames to receive VLAN oversized frames.
  
  While I'm here mark RNR condition if driver happen to see RNR in
  RFA status and restart RU to receive frames again. Because driver
  checks all received frames in RX loop, RNR condition could be set
  in the middle of RX processing. Just relying on RNR interrupt was
  not enough.
  
  This change fixes "Memory modified after free" issue when fxp(4)
  is running as a member of if_bridge(4).
  
  Tested by:	Larry Baird <lab <> gta dot com>
  MFC after:	5 days

Modified:
  head/sys/dev/fxp/if_fxp.c

Modified: head/sys/dev/fxp/if_fxp.c
==============================================================================
--- head/sys/dev/fxp/if_fxp.c	Fri May 14 16:58:37 2010	(r208083)
+++ head/sys/dev/fxp/if_fxp.c	Fri May 14 17:39:28 2010	(r208084)
@@ -1916,6 +1916,8 @@ fxp_intr_body(struct fxp_softc *sc, stru
 		if ((status & FXP_RFA_STATUS_C) == 0)
 			break;
 
+		if ((status & FXP_RFA_STATUS_RNR) != 0)
+			rnr++;
 		/*
 		 * Advance head forward.
 		 */
@@ -1942,9 +1944,12 @@ fxp_intr_body(struct fxp_softc *sc, stru
 				total_len -= 2;
 			}
 			if (total_len < sizeof(struct ether_header) ||
-			    total_len > MCLBYTES - RFA_ALIGNMENT_FUDGE -
-				sc->rfa_size || status & FXP_RFA_STATUS_CRC) {
+			    total_len > (MCLBYTES - RFA_ALIGNMENT_FUDGE -
+			    sc->rfa_size) ||
+			    status & (FXP_RFA_STATUS_CRC |
+			    FXP_RFA_STATUS_ALIGN)) {
 				m_freem(m);
+				fxp_add_rfabuf(sc, rxp);
 				continue;
 			}
 


More information about the svn-src-head mailing list