- 論壇徽章:
- 0
|
菜鳥一枚,剛開始學(xué)習(xí)linux驅(qū)動(dòng)編寫,最近因工作需要,寫了一個(gè)虛擬的網(wǎng)卡驅(qū)動(dòng),要求能夠達(dá)到千兆網(wǎng)卡的速度。
驅(qū)動(dòng)編寫好調(diào)試時(shí),發(fā)現(xiàn)在運(yùn)行一段時(shí)間后,速度就會(huì)變慢,最快時(shí)可達(dá)120M字節(jié),最低時(shí)
只有幾十K字節(jié),波動(dòng)特別大,研究了很久,沒發(fā)現(xiàn)問題,哪位大神遇到過同樣的問題,請(qǐng)不吝指教。
現(xiàn)在貼出部分代碼:
從協(xié)議棧取到數(shù)據(jù),通過我們自己的途徑發(fā)送出去:
static netdev_tx_t hba_net_tx (struct sk_buff *skb, struct net_device *dev)
{
int len = 0;
int ret = 0;
char *data , shortpkt[ETH_ZLEN];
HBA_NET_PRIV *net_priv = netdev_priv(dev);
unsigned long flags;
unsigned int did;
data = skb->data;
len = skb->len;
/*如果幀長小于以太網(wǎng)幀最小長度,補(bǔ)0*/
if(len < ETH_ZLEN)
{
memset(shortpkt, 0, ETH_ZLEN);
memcpy(shortpkt, skb->data, skb->len);
len = ETH_ZLEN;
data = shortpkt;
}
dev->trans_start = jiffies;
//通過我們的途徑發(fā)送到目的地(不是硬件)
ret = SendMsg( data, len);
/*發(fā)送包統(tǒng)計(jì)*/
if(ret == 0)
{
dev->stats.tx_packets ++;
dev->stats.tx_bytes += len;
}
else
{
dev->stats.tx_errors ++;
dev->stats.tx_dropped ++;
}
}
dev_kfree_skb_any(skb);
return 0;
}
從對(duì)端經(jīng)過我們的途徑收到數(shù)據(jù)后,遞交給協(xié)議棧:
int hba_net_rx(unsigned char *data, unsigned int len, struct net_device *dev)
{
struct sk_buff *skb = NULL;
/*分配套接字緩沖區(qū)*/
skb = dev_alloc_skb(len + 2);
if(skb == NULL)
{
printk("%s:memory is not sufficient, rcvd packet dropped.\n", dev->name);
dev->stats.rx_dropped++;
return -1;
}
skb_reserve(skb, 2);
skb->dev = dev;
memcpy(skb_put(skb, len), data, len);
skb->protocol = eth_type_trans(skb, dev);
/*接收包統(tǒng)計(jì)*/
dev->stats.rx_packets ++;
dev->stats.rx_bytes += len;
netif_rx(skb);
return 0;
}
經(jīng)過測(cè)試,我們的收發(fā)途徑都是沒有什么問題的,最高可以達(dá)到150M Byte的速率。
加上這個(gè)驅(qū)動(dòng)后,發(fā)現(xiàn)即便我應(yīng)用層只發(fā)10M byte的速度,但是依舊不穩(wěn)定,不知道什么原因。
所以我覺得主要問題在網(wǎng)卡驅(qū)動(dòng)這一塊,但是這塊確實(shí)沒什么代碼的,求大神指導(dǎo)。
因?yàn)榈谝淮伍_發(fā)網(wǎng)卡驅(qū)動(dòng),沒有什么調(diào)試經(jīng)驗(yàn),我想單向調(diào)試,就是測(cè)速,不知道有沒有什么辦法。
求大神指導(dǎo),急急急! |
|