在linux中vxlan有两种实现,一种是 linux 内核实现 一种是 ovs kernel datapath中的实现, ovs kernel datapath的实现是基于 linux 内核实现,二次封装。
vxlan 协议是外层用udp封装以太数据包。
vxlan在发送和接收数据的时候需要解决一下几个问题
1.发送时,如何知道特定vni 的内层数据包的目的ip的mac地址
看内核代码发现,内核不处理这个问题,内核只是保存一个缓存区,记录vni inner-ip mac out-ip四元组
2.外层udp是点对点单播,如何通过内层数据包的目的ip获取外层udp的目的ip
看内核代码发现,内核也不处理这个问题,内核只是保存一个缓冲器,记录 vni inner-ip mac out-ip四元组
在解决上面说的问题后,vxlan网卡在发包时。根据上面的信息封装数据包,并通过udp发包函数将数据包发送出去。
3.收包时,如何将数据包传递给对应的vxlan网卡。
再打开vxlan网卡时,vxlan网卡会根据配置,在内核创建udp sock。然后将udp sock的类型设置为隧道类型。当对应的udp sock 收到 数据包时,会调用 vxlan模块中对应的接收函数,整个过程都在中断中进行。直至将数据包挂在vxlan设备的收包队列中。
4.如何区分是哪个vxlan网卡。
接收到数据包以后,根据内层数据包的vni 获取对应的vxlan网卡
代码 就不贴了, 感觉代码挺简单的。 关键是知道数据流程