ovs版本是2.11.0,linux版本是linux-3.10.0-693.21.1.el7。
只拿ovs实现的group hash和dp_hash举例分析代码,通过一个点一个功能切入代码,漫无目的看代码是很难看懂的,必须带着一个疑问看代码,点多了全面开花,从点到面,慢慢就搞定代码了。
代码分析的场景就是一个虚拟机中curl一个vip。
ovs都说首包从datapath上送到vswitchd那就找找vswitchd从哪开始处理首包的。
- main
- └─bridge_run
- └─bridge_reconfigure
- └─ofproto_create
- └─construct
- └─open_dpif_backer
- ├─udpif_create
- | └─dpif_register_upcall_cb//kernel为NULL,用于DPDK
- ├─udpif_set_threads
- | └─dpif_handlers_set
- └─udpif_start_threads
- └─udpif_upcall_handler
- ├─dpif_recv
- | └─dpif_netlink_recv
- | └─dpif_netlink_recv__
- | └─parse_odp_packet
- └─recv_upcalls
vswitchd启动时创建了udpif_start_threads几个thread,这几个thread循环调用recv_upcalls处理上送的首包。
再找datapath首包是在什么地方上送的。
- #linux kernel datapath
- ovs_vport_receive
- ├─ovs_flow_key_extract
- | └─key_extract
- └─ovs_dp_process_packet
- ├─if ovs_flow_tbl_lookup_stats
- | └─ovs_dp_upcall
- | └─queue_userspace_packet
- | └─ovs_nla_put_key
- | └─__ovs_nla_put_key
- └─else ovs_execute_actions
- ├─case OVS_ACTION_ATTR_OUTPUT
- └─do_output
- └─ovs_vport_send
首包来了先从skb上ovs_flow_key_extract生成flow key,再根据key查找 表ovs_flow_tbl_lookup_stats,查找不到ÿ