先说一下应用环境:
采用Tilera的平台(一种众核平台,),三张网卡,两个10G的xgbe网卡,用来进行数据的发送和接受;一个1G的普通网卡,用来做管理接口.
10G的xgbe工作在Tilera的特定sdk下,其中的数据包不经过内核协议栈,直接交付给用户。这样的好处是数据处理效率很高(普通的linux协议栈中需要两次内存的拷贝,效率低),但是也因此带来了一些问题,有些包需要交给标准的协议栈 ,比如ospf报文,zebra工作在用户态,需要从标准的协议栈内获取网络数据包,而xgbe是不会直接把数据交付给标准协议栈的。
TAP虚拟网卡是Linux标准的虚拟网络设备,在Tilera平台上其编程也是一样的。
拥有这样的虚拟网卡后可以利用其通用linux协议栈的特性,并可以将数据包交付应用层的socket程序处理。ospfd程序就可以利用TAP进程收到ospf报文,并发布默认路由出去。
上图是TAP网卡的收发包流程图
左侧红色箭头标示的为从协议栈经TAP网卡发包标示,对从tap读进来的包进行一下netio封装,然后经过xbge发送出去
右侧绿色箭头标示的为数据包经TAP网卡收至协议栈的流程,调用netio(tilera 特定的网络编程api)从xgbe中收到发送给tap的报后,经过包处理进程将数据包交付给TAP进程,其实就是将收到的包写进tap网卡中,这样用户进程就可以再内核协议栈中接受到通过xgbe发送来的包。