hujianhuihappy_126 2016-08-08 10:07 采纳率: 0%
浏览 1496

linux千兆网网卡驱动调试,速率很不稳定

菜鸟一门,刚开始学习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的速率,
所以我觉得主要问题在网卡驱动这一块,但是这块确实没什么代码的,求大神指导。
因为第一次开发网卡驱动,没有什么调试经验,我想单向调试,就是测速,不知道有没有什么办法。
第二,我想请教一下dev_alloc_skb的时候为什么长度要多加2?我看kernel里的驱动有的加4,有的加了32,不知道是什么意思,还有就是skb_reserve(skb, 2)这个是干嘛的,不是很明白

没有金币了,不好意思,求大神指导,急急急!

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2017-03-03 21:43
    关注
    评论

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?