免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4622 | 回复: 9
打印 上一主题 下一主题

[驱动] linux千兆网网卡驱动调试,速率很不稳定 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-09 14:52 |只看该作者 |倒序浏览
本帖最后由 精益技术 于 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对接,速率就很不稳定,求指导!

论坛徽章:
0
2 [报告]
发表于 2016-08-09 16:56 |只看该作者
大哥们,不要只看不讲话有啊,随便谈谈自己的感受嘛,讨论讨论

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
3 [报告]
发表于 2016-08-09 21:26 |只看该作者
  是什么型号,把手册认真的看看。 再从linux里找出相应的驱动源码看看。

论坛徽章:
0
4 [报告]
发表于 2016-08-10 09:31 |只看该作者
回复 3# karma303
没有硬件,只是一个虚拟的网卡驱动,然后通过其它途径接收或者发送数据

   

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
5 [报告]
发表于 2016-08-10 10:55 |只看该作者
回复 4# 精益技术


    那俺就不知道了。 我也在虚拟机的网卡上写过驱动,都是有型号的。

论坛徽章:
0
6 [报告]
发表于 2016-08-10 11:00 |只看该作者
回复 5# karma303
那帮忙看看就我的那两个收发函数有问题吗?

   

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
7 [报告]
发表于 2016-08-10 11:04 |只看该作者
朋友,我没在linux底下写过驱动。

论坛徽章:
0
8 [报告]
发表于 2016-08-10 14:42 |只看该作者
回复 1# 精益技术


    SendMsg贴出来看看?

论坛徽章:
0
9 [报告]
发表于 2016-08-11 10:45 |只看该作者
回复 8# daniel_kohler
那个代码就多了,不过我保证是没有问题的。
只不过这个sendmsg中间可能会睡眠,所以我搞了一个链表,把要发送的sk_buff都挂在链表里,然后在另外一个任务里取链表的sk_buff节点,然后再发送。
我们除了linux系统,还做了一个windows系统版本的驱动,windows系统版本比较稳定,然后我linux和windows对接测速度,发现速率很稳定。

请指教

   

论坛徽章:
0
10 [报告]
发表于 2016-08-18 09:05 |只看该作者
回复 9# 精益技术


    很可能是task调度的问题,enqueue或者dequeue的task空转了,没有真正的发出数据?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP