I found a bug which was manifest when linux boots and lots of ethernet
packets are coming in. I think the problem is because the fcc_enet.c
adds the network device in very early during the boot, and the driver is
happily calling netif_rx() on the received packets even though the interface
isn't officially "up". Linux appears not to like this, and would crash
sporadically, or predictibly if I have a program on another computer running
just blasting packets at the first one.

The fix is to just put an if around this section in fcc_enet_rx:
                skb = dev_alloc_skb(pkt_len-4);

                if (skb == NULL) {
                        printk("%s: Memory squeeze, dropping packet.\n", 
dev->name);
                        cep->stats.rx_dropped++;
                }
                else {
                        skb->dev = dev;
                        skb_put(skb,pkt_len-4); /* Make room */
                        eth_copy_and_sum(skb,
                                (unsigned char *)__va(bdp->cbd_bufaddr),
                                pkt_len-4, 0);
                        skb->protocol=eth_type_trans(skb,dev);
                        netif_rx(skb);
                }

So it becomes:
                if(dev->flags & IFF_UP) { /* only do if iface is up */
                        skb = dev_alloc_skb(pkt_len-4);

                        if (skb == NULL) {
                                printk("%s: Memory squeeze, dropping 
packet.\n", dev->name);
                                cep->stats.rx_dropped++;
                        }
                        else {
                                skb->dev = dev;
                                skb_put(skb,pkt_len-4); /* Make room */
                                eth_copy_and_sum(skb,
                                        (unsigned char *)__va(bdp->cbd_bufaddr),
                                        pkt_len-4, 0);
                                skb->protocol=eth_type_trans(skb,dev);
                                netif_rx(skb);
                        }
                }

This fixes the crash bug.

-Dave


** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/



Reply via email to