supcent
驱动牛犊
驱动牛犊
  • 注册日期2003-12-18
  • 最后登录2005-11-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1704回复:5

8139驱动修改疑问

楼主#
更多 发布于:2004-05-13 11:31
我想在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;
}
yftty
驱动牛犊
驱动牛犊
  • 注册日期2002-11-06
  • 最后登录2010-12-07
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分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]$
/yftty http://www.unix-driver.org
supcent
驱动牛犊
驱动牛犊
  • 注册日期2003-12-18
  • 最后登录2005-11-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-14 14:19
谢谢回复,但是能不能解释一下?
yftty
驱动牛犊
驱动牛犊
  • 注册日期2002-11-06
  • 最后登录2010-12-07
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-15 02:13
what do you want to know ?
/yftty http://www.unix-driver.org
sindo_bird
驱动牛犊
驱动牛犊
  • 注册日期2004-04-11
  • 最后登录2004-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-15 22:43
不知道你的驱动是从那里来的,是不是有人在哪个程序里故意捣乱捣乱,怎么会多了两句!!!!!!
/----------------------------------------------/
if(len < ETH_ZLEN)
memset(tp->tx_buf[entry], 0, ETH_ZLEN);
/----------------------------------------------/
如果发送包的长度小于60个字节,就把发送缓冲区清空60个字节????不明白是什么意思。很明显这样做损坏已在发送缓冲区的好的报文。

按照ethernet规定,60个字节的包不是合法包,应该丢弃!!!
当然你也可以发出去,不过一般对方都接收不到。

解决办法,把这两行去掉,试试看。

仅代表个人看法,欢迎讨论,谢谢。
supcent
驱动牛犊
驱动牛犊
  • 注册日期2003-12-18
  • 最后登录2005-11-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-18 11:13
谢谢回复。我前几天已搞定了。
              
游客

返回顶部