这样就可以得到ethernet 包(eth_packet = (eth*)((int)buf + (int)(meta_data->m_Offset)
)),进入的接口可以通过meta_data->m_InputPort得到。现在就可以按照我们自己想法处理TCP/UDP/ICMP/ARP包了。
对于CC 发送包到TX microblock,首先需要先根据给的IP包来构造一个完整的ethernet包,之后使用ix_rm_hw_ring_put发送到Tx scratch ring中。
对于一个完整ARP包,需要创建buffer,和meta_data,填充meta_data数据结构。构造完整ARP包、ethernet包发送到Tx Scratch ring中。
对于ARP 的请求包和应答包,ICMP包,UDP包不做解释,下面就TCP包CC部分的转换解释一下。
在CC上处理的TCP一般情况是在Mes中没有找到对应转换条目的,所以我们首先得任务是把当前的包加入到NAT Table中(add_nat_entry()),加入到NAT Table中的时候就会填充NAT条目结构中转换字段,从而就可以得到要转换的端口,之后只要重新计算校验和就可以了。Add_nat_entry使用128bit hash,hash的种子从低到高依次是目的IP地址、源IP地址、源端口目的端口(高16bit src port ,低16bit dst port)、协议。如果有当前包对应的条目同时表中valid 有效,则返回转换端口,否则计算一个新的没有使用的转换端口,填充当前的条目。同时填充反转的NAT转换表,更新条目的生存时间。
A. 用户空间程序:
在CC kernel 中注册字符设备,使用系统调用,实现NAT的open、release、ioctl 函数来操作相应的表(例如:ARP_TABLE、NAT_TABLE等等)
【参考】
《Intel IXA Portability Framework Developer’s Manual, August 2005》
《Intel IXA Portability Framework Reference Manual , August 2005》
《Network Systems Design using Network Processors》Douglas E. Comer
《TCP/IP详解协议卷1》Douglas E. Comer