netmap
作用
netmap是个IO框架(并不是一个驱动),可以高效的收发报文;官方数据是10 GigE(千兆网,传输速度高达120 MB/s)测试,发包数据可以达到14.88 Mpps(million packet per second – 百万数据包转发); 一旦netmap开起来,对应网卡的所有数据都被映射到用户内存,不会再经过内核的协议栈,因此ARP的自动响应也就需要手动实现; netmap接收的数据包属于数据链路层的帧一层,即每次获取数据包获取的都是数据帧,以帧为单位进行协议解析。
驱动信息查看
- ethtool -i eth0 就可以得到相应网卡的驱动
- modinfo modName 就可以得到驱动的具体信息
- sudo apt install linux-source – 安装内核源码
安装
按照文件夹中的readme.md进行安装,安装的时候按照要求看不同的驱动看需不需要内核源码
-
./configure
- 编译问题:
ice_netmap_linux.h会编译出错:是有关NM_ICE_TX_RING(vsi, 0)宏的,直接使用类型强制转换转换一下就可以了(struct ice_ring *)NM_ICE_TX_RING(vsi, 0) – na.num_tx_desc = ((struct ice_ring *)NM_ICE_TX_RING(vsi, 0))->count; -
make -
sudo make install
- 模块安装,模块安装的时候会出现无法找到ice.7.zip的问题,通过查看打印信息发现是gzip生成的,不知道为什么没生成,因此到./ice-1.7.16/src 目录下手动执行如下步骤:
- sudo apt install gzip
- gzip -c …/ice.7 > ice.7.gz
注意点
- 安装的话使用netmap-master,使用netmap-13.0的话无法进行编译
- 不要在ssh测试,因为netmap接管数据后,ssh会失效,直接在虚拟机上测试
编程
- sudo modprobe netmap.ko
- 要留意在编程时,在引入头文件 #include “net/netmap_user.h”,而且在引入头文件之前要进行宏定义 #define NETMAP_WITH_LIBS
- 在进行编程的时候,使用nm_nextpkt提取出来的就是数据链路层的一个帧,如果不够一个帧,netmap会在内核中进行处理;
编程测试发现问题
- 一段时间后就无法进行udp接收:
这是因为在进行网络发送的时候,如果发送端在自己的arp表中未找到目标的arp项,那么他就会发送一个arp请求,接收端收到之后进行arp响应,发送端接收到响应之后再进行数据包发送,没接收到arp请求他就是不会进行数据包发送的。 win10 查看arp表: win + R --> arp -a 查看每个网络适配器的arp表 会发现这个arp表是没有对应arp项的(如果存在就查看MAC是否对得上,不同的IP但是目标MAC是一样的也可以正常接收 – 局域网的数据收发基于MAC(通过arp将IP转换为MAC))
- arp -a – 显示所有网卡的arp表
- arp -d IP – 删除arp表中的某个项目
- arp -d – 删除所有的arp项
- 应对方案:
对ARP请求进行处理:
- mac地址直接按照顺序写入;
|