vxlan 端口是ovs 的OVS_VPORT_TYPE_VXLAN 类型的隧道端口,用户态netdev 库通过netdev_vport_tunnel_register() 注册vport_class 结构,它包含如vxlan、gre 等各种类型隧道的相关处理函数。
一、添加vxlan 端口
添加命令为ovs-vsctl add-port br0 vxlan – set interface vxlan type=vxlan,用户态处理流程和上节的添加端口相同,不同时的是对vxlan 端口的参数配置,发往内核dp 的消息类型为OVS_VPORT_TYPE_VXLAN,流程如下:
二、内核vxlan 创建
内核ovs_vport_cmd_new ()函数中ovs_vport_add()调用ovs_vxlan_vport_ops 对应的操作函数,其中创建函数vxlan_tnl_create()流程如下:
三、vport 数据结构
根据上述流程分析,vxlan 类型的vport 数据结构如下:
四、vxlan 报文格式
五、vxlan 收包处理
vxlan 隧道报文的处理的入口函数是udp sock 监听函数vxlan_udp_encap_recv(),处理流程如下:
六、vxlan 发包处理
vlan 在执行action 时,判断需要发送数据的时候调用发送函数,函数调用do_execute_actions()->do_output()->ovs_vport_send()->vxlan_tnl_send(),这里vxlan_tnl_send()函数即为创建vport 端口是注册ovs_vxlan_vport_ops的send 函数,主要处理流程如下: