logo

记录一次 QEMU 网卡的调试


QEMU 是一个行为级模拟器,公司在使用 QEMU 作为模拟器进行软件开发、模拟测试等工作。最近在 QEMU 上使用 ftp 时发现了一个问题,当传输 1k 文件时工作正常,传输 2k 文件时无法正常工作。

通过在内核中加 Log 信息,确认了几点问题:

  • 1k 文件进行传输时,包没有被拆分
  • 2k 文件传输时,包被拆分了
  • 2k 文件板级传输正常,抓包抓到的是一个包
  • 2k 文件板级传输时,包被拆分了
  • 2k 文件模拟器传输时,抓包抓到了两个包

通过 Log 信息,可以判断出一个结论,模拟器传输时,数据包没有被正确合并。通过网上资料查找 gso 相关信息时,确认了一个信息:

GSO不只针对TCP,而是对任意协议,尽可能把segmentation推后到交给网卡那一刻,此时会判断下网卡是否支持SG和GSO,如果不支持则在协议栈里做segmentation;如果支持则把payload直接发给网卡

由此确认,模拟器的网卡没有正确实现对 GSO 的支持。进入模拟器,在数据包发送函数中进行修改,支持 GSO。完成后,ftp 操作能够正常执行成功了。

参考文献:
linux内核网络协议栈学习笔记:关于GRO/GSO/LRO/TSO等patch的分析和测试


欢迎转载,转载请保留:
转自Elta 的博客:https://elta.github.io//2017/04/05/qemunetdebug.html

扫描或长按二维码进行打赏:
WechatPayInPost




分类:  qemu ,
标签:  linux ,
上篇: 通过反汇编文件生成函数调用关系图 下篇: Git Repo 的创建