- 論壇徽章:
- 0
|
大神們好,小弟最近做了一個(gè)LINUX網(wǎng)卡驅(qū)動(dòng),用iperf來測試時(shí)候,發(fā)現(xiàn)UDP有丟包。
用iperf測試UDP,一共測試兩次,一次一個(gè)小時(shí),速率為1000M,丟包率大概在0.0001%左右
再繼續(xù)測試時(shí),發(fā)現(xiàn)會(huì)大量丟包,已經(jīng)慘不忍睹了,不知道什么問題,現(xiàn)在把收發(fā)代碼貼出來,請(qǐng)大家指正一下:
/*發(fā)送回調(diào)函數(shù)*/
```
netdev_tx_t net_tx (struct sk_buff *skb, struct net_device *dev)
{
NET_PRIV *net_priv = netdev_priv(dev);
unsigned long flags;
PNET_SKB_DATA pskb ;
spin_lock_irqsave(&net_priv->send_lock, flags);
/*list_skbPool pool中取一個(gè)pskb*/
pskb = (PNET_SKB_DATA)listGetFirstNodeFromList(&net_priv->dev->list_skbPool);
/*如果沒取到,則返回*/
if(pskb == NULL)
{
spin_unlock_irqrestore(&net_priv->send_lock, flags);
return NETDEV_TX_BUSY;
}
/*取到一個(gè)pskb后,把這個(gè)pskb從隊(duì)列l(wèi)ist_skbPool移除*/
pskb = listRemoveNodeFromListHead(&net_priv->dev->list_skbPool);
/*把skb掛在pskb中*/
pskb->skb = skb;
/*把pskb插入隊(duì)列l(wèi)ist_skbSend尾部,等待另外一個(gè)線程來取數(shù)據(jù),繼而發(fā)送出去*/
listAddNodeToListTail(pskb, &net_priv->dev->list_skbSend);
dev->trans_start = jiffies;
up(net_priv->dev->semElsSend);
spin_unlock_irqrestore(&net_priv->send_lock, flags);
return NETDEV_TX_OK;
}
```
此時(shí)另外有一個(gè)線程,在不斷取數(shù)據(jù),取到后就發(fā)送出去。
接收時(shí),是一個(gè)線程一直從鏈路上收數(shù)據(jù),收到數(shù)據(jù)就調(diào)用下面這個(gè)接收函數(shù)
/*接收函數(shù)*/
```
int net_rx(unsigned char *data, unsigned int len, struct net_device *dev)
{
struct sk_buff *skb = NULL;
NET_PRIV *net_priv = netdev_priv(dev);
unsigned long flags;
/*分配套接字緩沖區(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);
if(NET_RX_SUCCESS != netif_receive_skb(skb))
{
dev->stats.tx_errors ++;
dev->stats.tx_dropped ++;
return -2;
}
/*接收包統(tǒng)計(jì)*/
dev->stats.rx_packets ++;
dev->stats.rx_bytes += len;
return 0;
}
```
之前加了一些統(tǒng)計(jì)打印,發(fā)現(xiàn)從鏈路及驅(qū)動(dòng)里面沒有丟包。
丟包發(fā)生在送給協(xié)議棧后,在協(xié)議棧丟掉了
通過命令netstat -su發(fā)現(xiàn)打印如下:
Udp:
30681696 packets received
71 packets to unknown port received.
436 packet receive errors
266 packets sent
436 receive buffer errors
0 send buffer errors
IgnoredMulti: 393
其中436 packet receive errors 這個(gè)統(tǒng)計(jì)值436,正好就是iperf統(tǒng)計(jì)的丟包數(shù)量。
在網(wǎng)上搜了很多,說是當(dāng)出現(xiàn)packet receive errors 的時(shí)候,說明是應(yīng)用層來不及接收導(dǎo)致的。但是我用兩臺(tái)PC機(jī)(linux系統(tǒng))進(jìn)行測試,沒有丟包。
這個(gè)問題困惑了很久,希望得到大神指點(diǎn),謝謝!
|
|