该记录基于RDA8910平台,主要记录NAT技术的使用。
net_thread
中的CFW_NwSetFTA(0, 0); CFW_NwSetAutoAttachFlag(1, 0);
就是开启自动注册,成功注册上网后,底层会上报EV_TCPIP_CFW_GPRS_ACT
的消息。TCPIP_nat_wan_netif_create
中主要做的是建立nat_wan的netif。获取PDP的主要信息用来绑定L2的接口。设置下行数据的回调函数lwip_nat_wan_pspathDataInput
prvNdevLanSessionCreate
ndev_nat_entry
,主要用于IP层的nat转换。在发送和接收的时候有大作用。prvEthLanUploadDataCB
设置的设备端上行数据的回调函数。这里为什么要先介绍上行数据(也就是模块收到网卡的数据将数据发送给网络端)
因为所有的链接都是由客户端先发起链接。
usb收到数据后会通过其注册的event_cb
回调函数调用相应event的处理函数,当收到数据的时候就会调用_usbeRxWork
(注意该函数的处理是放在task里面处理的),_usbeRxWork又会调用创建网卡时设置的回调prvEthLanUploadDataCB
函数。
因为模块采用的是固定的IP分配,所以ARP还有DHCP都是固定的回复。这里注意一般设备都会先发DHCP包(动态主机配置协议)获取到IP地址,网关地址,再发ARP包(地址解析协议)获取网关和MAC地址的映射关系。
如果不是这两个包,就会进入prvNdevLanDataToPs
prvNdevLanDataToPs
从名字就可以看出主要作用就是将数据传到L2层。这里会申请一个pbuf
,并判断包的类型,如果是PIV6就直接发出去,如果是IP包就需要进行NAT转换。
ip4_nat_out
的主要作用就是进行NAT转换。
ndev_nat_entry
)添加到表中的。ip4_nat_entries_tcp_t
结构体,如果不存在就创建相应的映射关系。并添加到ip4_nat_tcp_table
表中。NAT表需要定时刷新,所以有个TTL字段(见名词解释),将IPIP包和TCP报头重新计算校验后,在通过绑定的WAN口发送到L2层。
gprs_data_ipc_to_lwip_nat_wan
传入协议栈。参数是与PS绑定的netif。新建pbuf,将pbuf传给ip4_nat_input
。ip4_nat_input
就是进行IP地址转换,转为LAN的IP地址。判断相应的IP协议,将端口和IP地址进行转换,重新校验。再传入NAT_LAN的netif绑定的input
函数。wan_to_netdev_lan_datainput
发送给网卡设备代码中表示网卡的结构体就是
netif
,每个设备要上网都需要一个或者多个网卡。多个网卡就会组成一个局域网,通常一个局域网都需要一个WAN,其它的设备可以称为LAN。WAN口连接着外部网络,连接LAN口的设备与外部网络通信都需要经过WAN口传输。
协议栈中L2层以上所有的数据交替都使用同一个结构体就是pbuf,pbuf是个链表,该链表的大小是根据
pbuf_alloc
时传入的长度计算的。该结构体主要是:
/** Main packet buffer struct */
struct pbuf {
struct pbuf *next; /*指向下一个pbuf*/
/*该段pbuf的数据部分*/
void *payload;
/*该链表所有pbuf数据部分的总长度*/
u16_t tot_len;
/*改段pbuf的数据大小*/
u16_t len;
/** a bit field indicating pbuf type and allocation sources
(see PBUF_TYPE_FLAG_*, PBUF_ALLOC_FLAG_* and PBUF_TYPE_ALLOC_SRC_MASK)
*/
u8_t type_internal;
/** misc flags */
u8_t flags;
/**
该pbuf被引用次数,如果引用次数大于1,pbuf_free的时候就会出错
*/
LWIP_PBUF_REF_T ref;
/** For incoming packets, this contains the input netif's index */
u8_t if_idx;
};
初始化nat的时候会创建一个循环定时器
nat_timer
,每隔LWIP_NAT_TMR_INTERVAL_SEC
秒处理一下NAT表项,即将TTL减去30秒,如果TTL小于30秒就清除映射关系。默认TTL的值LWIP_NAT_DEFAULT_TCP_SOURCE_PORT
为10分钟。每次发送的时候都会进行重置。
NAT最大的优点就是节省了大量的IP资源