接前面这个写起,比较过linux kernel vxlan device和ovs vxlan的性能,很好奇ovs vxlan是怎么实现的,linux kernel vxlan device是用如下命令创建的。
ip link add vxlan0 type vxlan id 1111 dstport 5799 remote 10.145.69.49 local 10.145.69.26 dev eth4
[root@openstack607 huiwei]# ip -d link show vxlan0
375: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1000
link/ether ba:6f:38:6f:bf:9a brd ff:ff:ff:ff:ff:ff promiscuity 0
vxlan id 1111 remote 10.145.69.49 local 10.145.69.26 dev eth4 srcport 0 0 dstport 5799 ageing 300
复制
发现ovs也创建了一个vxlan device
[root@openstack607 huiwei]# ip -d link show vxlan_sys_4789
241: vxlan_sys_4789: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65000 qdisc noqueue master ovs-system state UNKNOWN mode DEFAULT qlen 1000
link/ether 56:bc:a6:9b:c2:fd brd ff:ff:ff:ff:ff:ff promiscuity 1
vxlan id 0 srcport 0 0 dstport 4789 nolearning ageing 300 udp6zerocsumrx
openvswitch_slave
复制
ovsdb-server存储数据,ovs-vsctl通过ovsdb协议读写ovsdb-server,ovs-vswitchd进行报文转发,ovs-ofctl通过openflow信息给ovs-vswitchd添加/删除flow,那ovs-vsctl添加一个vxlan port,ovs-vswitchd怎么知道的,答案就是ovs-vswitch和ovsdb-server之间也有连接,ovs-vswitch通过IDL感知ovsdb-server的变化。
ovs-vswitchd main线程一直while处理ovsdb-server变化和ovs-appctl命令,ovs-vsctl创建一个ovs vxlan port,最终调用到了dpif_netlink_port_add。
main
├─unixctl_server_create
├─bridge_init
└─while//特别注意这个while循环
├─bridge_run
| ├─ovsdb_idl_run
| └─bridge_reconfigure
| └─bridge_add_ports
| └─iface_create
| └─ofproto_port_add
| └─(ofproto_class->port_add)port_add
| └─dpif_port_add
| └─(dpif_class->port_add)dpif_netlink_port_add
├─unixctl_server_run
| └─run_connection
| └─process_command
| └─(command->cb)
├─netdev_run
├─memory_wait