Linux TUN/TAP 使用心得
- 最近开发AutoSAR项目,有关于TcpIp模块的开发与测试,由于硬件原因没有足够的硬件可供调试,故选择了Linux下 TUN/TAP 模块进行调试。其优点是可以让我放心的调试驱动层以上的代码,而不用区关心驱动是否会有问题。(题外话,据说Linux可以模拟虚拟的Can设备,有时间会试一试)
- 该设备的原理等说明不会在这里详细的介绍了,毕竟网上一搜一大堆。只介绍一下使用过程中应该注意的点:
a. 在使用时可以选择使用select函数进行数据的获取也可以选择read函数进行数据获取。具体情况具体分析,但是基于这样一个原则进行,如果所有的代码都是使用不同的线程运行则建议使用select函数进行数据获取。如果单线程则使用read函数获取数据即可。
b. 在设置TapIP地址时,需要设置是网关地址(IPv4),TcpIp内核使用的IP地址与Tap使用的IP地址不是一样的,但是要求在一个网段,这样可以实现报文的收发。 - 示例代码:
打开并设置使用的是TAP还是TUN。
EthIf_Fd[ethifIdx] = open(DEVTAP, O_RDWR);
TCPIP_DEBUG_LOG("EthIf_Fd[%d] = %d\r\n", ethifIdx, EthIf_Fd[ethifIdx]);
if (EthIf_Fd[ethifIdx] == -1)
{
perror("EthIf_Init: Try running \"modprobe tun\" or rebuilding your kernel with CONFIG_TUN; cannot open " DEVTAP);
exit(1);
}
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, devTapName, sizeof(ifr.ifr_name));
memcpy(&commond[0], ETHIF_SET_NET_UP, sizeof(ETHIF_SET_NET_UP));
offset += sizeof(ETHIF_SET_NET_UP) - 1;
memcpy(&commond[offset], devTapName, sizeof(devTapName));
offset += sizeof(devTapName) - 1;