目的:利用f-stack实现tcp/udp代理功能的一种思路(比如采用snat/dnat方法改写ip头和tcp/udp头信息)。
实现tcp/udp代理思路:
FreeBSD提供了IPFW机制,即提供了hook函数来对数据包做改写操作; hook函数中利用数据包匹配代理规则,对数据包做改写操作。
dpdk收到包后,首先由hook函数处理(可能改写ip/tcp头部信息),再交由FreeBSD协议栈处理(交给上层应用处理,或者路由转发处理)。
nginx上层发包,经过FreeBSD协议栈后,最终调用dpdk接口将数据包从网卡发送前需调用hook函数(可能改写ip/tcp头部信息),完事交由dpdk将数据包从网卡发出去。
FreeBSD提供的hook函数:
- hook函数注册:
int
ipfw_attach_hooks(int arg)
{
int error = 0;
if (arg == 0)
ipfw_hook(0, AF_INET);
else if (V_fw_enable && ipfw_hook(1, AF_INET) != 0) {
error = ENOENT;