* [PATCH] emac: filter illegal frame sizes
@ 2005-02-18 17:12 Matt Porter
2005-02-19 8:48 ` Jeff Garzik
0 siblings, 1 reply; 3+ messages in thread
From: Matt Porter @ 2005-02-18 17:12 UTC (permalink / raw)
To: jgarzik; +Cc: netdev, linuxppc-embedded
Fix to drop frames that are too large for the current MTU.
Signed-off-by: Matt Porter <mporter@kernel.crashing.org>
===== drivers/net/ibm_emac/ibm_emac_core.c 1.9 vs edited =====
--- 1.9/drivers/net/ibm_emac/ibm_emac_core.c 2005-01-20 13:25:10 -07:00
+++ edited/drivers/net/ibm_emac/ibm_emac_core.c 2005-02-18 09:23:08 -07:00
@@ -665,14 +665,21 @@
fep->rx_skb[i]->dev = dev;
fep->rx_skb[i]->protocol =
eth_type_trans(fep->rx_skb[i], dev);
- error = netif_rx(fep->rx_skb[i]);
- if ((error == NET_RX_DROP) ||
- (error == NET_RX_BAD)) {
- fep->stats.rx_dropped++;
+ /* Filter frame sizes > our MTU */
+ if (fep->rx_skb[i]->len <= (dev->mtu + ENET_HEADER_SIZE + ENET_FCS_SIZE)) {
+ error = netif_rx(fep->rx_skb[i]);
+ if ((error == NET_RX_DROP) ||
+ (error == NET_RX_BAD)) {
+ fep->stats.rx_dropped++;
+ } else {
+ fep->stats.rx_packets++;
+ fep->stats.rx_bytes += frame_length;
+ }
} else {
- fep->stats.rx_packets++;
- fep->stats.rx_bytes += frame_length;
+ dev_kfree_skb(fep->rx_skb[i]);
+ fep->stats.rx_length_errors++;
+ fep->stats.rx_errors++;
}
fep->rx_skb[i] = NULL;
} else {
@@ -752,15 +759,23 @@
fep->rx_skb[buf[0]]->protocol =
eth_type_trans(fep->rx_skb[buf[0]],
dev);
- error = netif_rx(fep->rx_skb[buf[0]]);
- if ((error == NET_RX_DROP)
- || (error == NET_RX_BAD)) {
- fep->stats.rx_dropped++;
+ /* Filter frame sizes > our MTU */
+ if (fep->rx_skb[buf[0]]->len <= (dev->mtu + ENET_HEADER_SIZE + ENET_FCS_SIZE)) {
+ error = netif_rx(fep->rx_skb[buf[0]]);
+
+ if ((error == NET_RX_DROP)
+ || (error == NET_RX_BAD)) {
+ fep->stats.rx_dropped++;
+ } else {
+ fep->stats.rx_packets++;
+ fep->stats.rx_bytes +=
+ fep->rx_skb[buf[0]]->len;
+ }
} else {
- fep->stats.rx_packets++;
- fep->stats.rx_bytes +=
- fep->rx_skb[buf[0]]->len;
+ fep->stats.rx_length_errors++;
+ fep->stats.rx_errors++;
+ dev_kfree_skb(fep->rx_skb[buf[0]]);
}
for (b = 0; b < bnum; b++)
fep->rx_skb[buf[b]] = NULL;
@@ -1041,7 +1056,7 @@
/* set speed (default is 10Mb) */
switch (speed) {
case SPEED_1000:
- mode_reg |= EMAC_M1_JUMBO_ENABLE | EMAC_M1_RFS_16K;
+ mode_reg |= EMAC_M1_RFS_16K;
if (fep->rgmii_dev) {
struct ibm_ocp_rgmii *rgmii = RGMII_PRIV(fep->rgmii_dev);
@@ -1118,6 +1133,7 @@
{
struct ocp_enet_private *fep = dev->priv;
int old_mtu = dev->mtu;
+ unsigned long mode_reg;
emac_t *emacp = fep->emacp;
u32 em0mr0;
int i, full;
@@ -1160,10 +1176,17 @@
fep->rx_skb[i] = NULL;
}
- /* Set new rx_buffer_size and advertise new mtu */
- fep->rx_buffer_size =
- new_mtu + ENET_HEADER_SIZE + ENET_FCS_SIZE;
+ /* Set new rx_buffer_size, jumbo cap, and advertise new mtu */
+ mode_reg = in_be32(&emacp->em0mr1);
+ if (new_mtu > ENET_DEF_MTU_SIZE) {
+ mode_reg |= EMAC_M1_JUMBO_ENABLE;
+ fep->rx_buffer_size = EMAC_MAX_FRAME;
+ } else {
+ mode_reg &= ~EMAC_M1_JUMBO_ENABLE;
+ fep->rx_buffer_size = ENET_DEF_BUF_SIZE;
+ }
dev->mtu = new_mtu;
+ out_be32(&emacp->em0mr1, mode_reg);
/* Re-init rx skbs */
fep->rx_slot = 0;
===== drivers/net/ibm_emac/ibm_emac_core.h 1.3 vs edited =====
--- 1.3/drivers/net/ibm_emac/ibm_emac_core.h 2005-02-08 22:24:52 -07:00
+++ edited/drivers/net/ibm_emac/ibm_emac_core.h 2005-02-18 09:30:07 -07:00
@@ -77,6 +77,8 @@
#define ENET_HEADER_SIZE 14
#define ENET_FCS_SIZE 4
+#define ENET_DEF_MTU_SIZE 1500
+#define ENET_DEF_BUF_SIZE (ENET_DEF_MTU_SIZE + ENET_HEADER_SIZE + ENET_FCS_SIZE)
#define EMAC_MIN_FRAME 64
#define EMAC_MAX_FRAME 9018
#define EMAC_MIN_MTU (EMAC_MIN_FRAME - ENET_HEADER_SIZE - ENET_FCS_SIZE)
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] emac: filter illegal frame sizes
2005-02-18 17:12 [PATCH] emac: filter illegal frame sizes Matt Porter
@ 2005-02-19 8:48 ` Jeff Garzik
2005-03-02 16:29 ` Matt Porter
0 siblings, 1 reply; 3+ messages in thread
From: Jeff Garzik @ 2005-02-19 8:48 UTC (permalink / raw)
To: Matt Porter; +Cc: netdev, linuxppc-embedded
Matt Porter wrote:
> Fix to drop frames that are too large for the current MTU.
What is this fixing?
You should be passing all frames up to the software stack.
Jeff
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] emac: filter illegal frame sizes
2005-02-19 8:48 ` Jeff Garzik
@ 2005-03-02 16:29 ` Matt Porter
0 siblings, 0 replies; 3+ messages in thread
From: Matt Porter @ 2005-03-02 16:29 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev, linuxppc-embedded
On Sat, Feb 19, 2005 at 03:48:36AM -0500, Jeff Garzik wrote:
> Matt Porter wrote:
> > Fix to drop frames that are too large for the current MTU.
>
> What is this fixing?
>
> You should be passing all frames up to the software stack.
I was originally fixing the issue where the driver was only allocating
rx buffers big enough for the configured MTU and got a bit
overzealous. I pulled out the filtering hunks so we always allocate
skbs large enough to handle a full size jumbo frame and pass everything
up to the stack...new patch to follow.
-Matt
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2005-03-02 16:29 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-02-18 17:12 [PATCH] emac: filter illegal frame sizes Matt Porter
2005-02-19 8:48 ` Jeff Garzik
2005-03-02 16:29 ` Matt Porter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).