阅读:1704回复:5
8139驱动修改疑问
我想在8139驱动的发送函数中判断目的地址的MAC地址,但好象一修改就会当机,请高手帮忙看看。谢谢!
static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev) { struct rtl8139_private *tp = dev->priv; void *ioaddr = tp->mmio_addr; unsigned int entry; unsigned int len = skb->len; /* Calculate the next Tx descriptor entry. */ entry = tp->cur_tx % NUM_TX_DESC; if (likely(len < TX_BUF_SIZE)) { if(len < ETH_ZLEN) memset(tp->tx_buf[entry], 0, ETH_ZLEN); /*------------修改部分-------------------------------*/ if(skb->mac.ethethet->h_dest[0]==0x88&&skb->mac.ethethet->h_dest[1]==0x88){ dev_kfree_skb(skb); tp->stats.tx_dropped++; return 0; } /*-------------修改部分------------------------------*/ skb_copy_and_csum_dev(skb, tp->tx_buf[entry]); dev_kfree_skb(skb); } else { dev_kfree_skb(skb); tp->stats.tx_dropped++; return 0; } /* Note: the chip doesn\'t have auto-pad! */ spin_lock_irq(&tp->lock); RTL_W32_F (TxStatus0 + (entry * sizeof (u32)), tp->tx_flag | max(len, (unsigned int)ETH_ZLEN)); dev->trans_start = jiffies; tp->cur_tx++; wmb(); if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx) netif_stop_queue (dev); spin_unlock_irq(&tp->lock); DPRINTK (\"%s: Queued Tx packet size %u to slot %d.\\n\", dev->name, len, entry); return 0; } |
|
沙发#
发布于:2004-05-13 12:40
[yf@cospar net]$ diff -up 8139too_old.c 8139too.c
--- 8139too_old.c 2004-05-13 13:27:40.000000000 +0800 +++ 8139too.c 2004-05-13 13:29:57.000000000 +0800 @@ -1709,7 +1709,9 @@ static int rtl8139_start_xmit (struct sk /* Calculate the next Tx descriptor entry. */ entry = tp->cur_tx % NUM_TX_DESC; - if (likely(len < TX_BUF_SIZE)) { + if (likely(len < TX_BUF_SIZE) + && (skb->mac.ethethet->h_dest[0]!=0x88 + && skb->mac.ethethet->h_dest[1]!=0x88)) { if (len < ETH_ZLEN) memset(tp->tx_buf[entry], 0, ETH_ZLEN); skb_copy_and_csum_dev(skb, tp->tx_buf[entry]); [yf@cospar net]$ |
|
|
板凳#
发布于:2004-05-14 14:19
谢谢回复,但是能不能解释一下?
|
|
地板#
发布于:2004-05-15 02:13
what do you want to know ?
|
|
|
地下室#
发布于:2004-05-15 22:43
不知道你的驱动是从那里来的,是不是有人在哪个程序里故意捣乱捣乱,怎么会多了两句!!!!!!
/----------------------------------------------/ if(len < ETH_ZLEN) memset(tp->tx_buf[entry], 0, ETH_ZLEN); /----------------------------------------------/ 如果发送包的长度小于60个字节,就把发送缓冲区清空60个字节????不明白是什么意思。很明显这样做损坏已在发送缓冲区的好的报文。 按照ethernet规定,60个字节的包不是合法包,应该丢弃!!! 当然你也可以发出去,不过一般对方都接收不到。 解决办法,把这两行去掉,试试看。 仅代表个人看法,欢迎讨论,谢谢。 |
|
5楼#
发布于:2004-05-18 11:13
谢谢回复。我前几天已搞定了。
|
|