代码分析
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,查找不到ÿ