Thread (5 messages) 5 messages, 2 authors, 2008-03-26
STALE6763d

[PATCH v2.6.26] Only process completed frames

From: Andy Fleming <hidden>
Date: 2008-03-24 15:54:06
Subsystem: networking drivers, the rest · Maintainers: Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds

If the LAST bit is not set in the RxBD, it's possible we're processing an
incomplete frame, which is bad.  While we're at it, add a constant for
the error bitmask, so the whole if-clause fits on one line, and is more
legible.

Signed-off-by: Dai Haruki <redacted>
Signed-off-by: Andy Fleming <redacted>
---
 drivers/net/gianfar.c |    4 +---
 drivers/net/gianfar.h |    3 +++
 2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c
index 0ab4b26..a59edf7 100644
--- a/drivers/net/gianfar.c
+++ b/drivers/net/gianfar.c
@@ -1526,9 +1526,7 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
 		rmb();
 		skb = priv->rx_skbuff[priv->skb_currx];
 
-		if (!(bdp->status &
-		      (RXBD_LARGE | RXBD_SHORT | RXBD_NONOCTET
-		       | RXBD_CRCERR | RXBD_OVERRUN | RXBD_TRUNCATED))) {
+		if ((bdp->status & RXBD_LAST) && !(bdp->status & RXBD_ERR)) {
 			/* Increment the number of packets */
 			dev->stats.rx_packets++;
 			howmany++;
diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h
index 46cd773..26eb6ab 100644
--- a/drivers/net/gianfar.h
+++ b/drivers/net/gianfar.h
@@ -340,6 +340,9 @@ extern const char gfar_driver_version[];
 #define RXBD_OVERRUN		0x0002
 #define RXBD_TRUNCATED		0x0001
 #define RXBD_STATS		0x01ff
+#define RXBD_ERR		(RXBD_LARGE | RXBD_SHORT | RXBD_NONOCTET 	\
+				| RXBD_CRCERR | RXBD_OVERRUN			\
+				| RXBD_TRUNCATED)
 
 /* Rx FCB status field bits */
 #define RXFCB_VLN		0x8000
-- 
1.5.4.23.gef5b9
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help