dpvs(类 ipvs)数据面流程
ipv4_rcv_fin 是路由转发逻辑, INET_HOOKPRE_ROUTING 中走完 hook 逻辑后,根据 dpvs 返回值走 ipv4_rcv_fin
路由表结构体
1 | struct route_entry { |
路由类型
1 | /* dpvs defined. */ |
路由表类型
1 |
- Local 类型路由
local 类型路由的作用和 Linux 下的 local 路由表的功能基本一样,主要是记录本地的 IP 地址。
我们知道进入的数据包,过了 prerouting 后是需要经过路由查找,如果确定是本地路由(本地 IP)就会进入 LocalIn 位置,否则丢弃或进入 Forward。
Local 类型路由就是用来判定接收数据包是否是本机 IP,在 DPVS 调用的就是 route4_input 函数
- Net 类型路由
数据包经过应用程序处理完毕后,要执行 output 时也需要根据目的 IP 来查找路由,确定从哪个网卡出去,下一跳等信息,然后执行后续操作。
在 DPVS 调用的就是 route4_output 函数。
使用 dpip 工具添加 ip 地址时,同时也会添加一条 local 路由和 net 路由
- gfw table
是新特性,可以理解成是另外一张路由表,用来做策略路由用的。如果 conn 的 flag 有 outwall,则走这个表转发。一般不用这个表。
What is ipset and outwall route in DPVS? · Issue #564 · iqiyi/dpvs (github.com)
路由的添加
dpip route add
1 | static int route4_do_cmd(struct dpip_obj *obj, dpip_cmd_t cmd, |
命令行添加时,是根据 scope 来确定路由的类型的
ROUTE_CF_SCOPE_HOST – >RTF_LOCALIN
ROUTE_CF_SCOPE_KNI –> RTF_KNI
Cf->utwalltb –> RTF_OUTWALL
其他 – > RTF_FORWARD
转发逻辑
ipv4_rcv_fin 是路由转发逻辑
如果找到的 route 有 forward 的 flag:
rt->flag & RTF_FORWARD
则走转发逻辑 ipv4_forward –> ipv4_output_fin2
这个时候,路由表项 rt 已经带在 mbuf 的 userdata 里面了,后面的处理函数都能拿到这个包的路由
Rt->gw 表示网关地址,如果没有网关,这个值是 0,说明是直连路由,直接往报文的目的 ip (ip4_hdr(mbuf)->dst_addr)发送 ;
否则,往这个网关发送