linux上不了网是因为千兆网卡,linux千兆网网卡驱动调试,速率很不稳定

本帖最后由 精益技术 于 2016-08-11 11:17 编辑

菜鸟一枚,刚开始学习linux驱动编写,最近因工作需要,写了一个虚拟的网卡驱动,要求能够达到千兆网卡的速度。

驱动编写好调试时,发现在运行一段时间后,速度就会变慢,最快时可达120M字节,最低时

只有几十K字节,波动特别大,研究了很久,没发现问题,哪位大神遇到过同样的问题,请不吝指教。

现在贴出部分代码:

从协议栈取到数据,通过我们自己的途径发送出去:

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;

/*如果帧长小于以太网帧最小长度,补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;

//通过我们的途径发送到目的地(不是硬件)

ret = SendMsg( data, len);

/*发送包统计*/

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;

}

从对端经过我们的途径收到数据后,递交给协议栈:

int hba_net_rx(unsigned char *data, unsigned int len, struct net_device *dev)

{

struct sk_buff *skb = NULL;

/*分配套接字缓冲区*/

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);

/*接收包统计*/

dev->stats.rx_packets ++;

dev->stats.rx_bytes += len;

netif_rx(skb);

return 0;

}

经过测试,我们的收发途径都是没有什么问题的,最高可以达到150M Byte的速率。

加上这个驱动后,发现即便我应用层只发10M byte的速度,但是依旧不稳定,不知道什么原因。

所以我觉得主要问题在网卡驱动这一块,但是这块确实没什么代码的,求大神指导。

因为第一次开发网卡驱动,没有什么调试经验,我想单向调试,就是测速,不知道有没有什么办法。

求大神指导,急急急!

我们除了linux系统,还做了一个windows系统版本的驱动,windows系统版本比较稳定,然后我linux和windows对接测速度,发现速率很稳定,但是linux和linux对接,速率就很不稳定,求指导!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值