此处主要记录OpenvSwitch 功能实现的调用过程:
注册用户态接收包时回调函数: construct | | open_dpif_backer / \ (dpif-netdev) / \(dpif-net-link) / \ udpif_create udpif_set_threads | | dpif_register_upcall_cb udpif_start_threads | | dpif_netdev_register_upcall_cb ovs_thread_create | udpif_upcall_handler (* 接收到内核态的请求) | recv_upcalls / \ (2) / \ (1) / \ upcall_receive dpif_recv | | flow_extract dpif_netlink_recv | process_upcall | upcall_xlate | xlate_actions
处理controller发送的packetout数据包: ofconn_run | handle_openflow | handle_packet_out / \ (2) / \(1) / \ ofproto_packet_out_finish ofproto_packet_out_start | | packet_execute packet_xlate | | dpif_execute xlate_actions | | dpif_operate rule_dpif_lookup_from_table (dpif-netdev) / \(dpif-netlink) | / \ rule_dpif_lookup_in_table dpif_netdev_operate dpif_netlink_operate / \ | | (2) / \(1) dpif_netdev_execute dpif_netlink_encode_execute / \ | | do_xlate_actions classifier_lookup dp_netdev_execute_actions nl_msg_put_genlmsghdr | | | xlate_output_action find_match_wc odp_execute_actions | | compose_output_action dp_execute_cb | | nl_msg_put_odp_port netdev_send
内核态Datapath处理packet流程: netdev_frame_hook | netdev_port_receive | ovs_vport_receive | ovs_dp_process_packet / \ (Normal Match)/ \ (Non-normal Match) / \ ovs_execute_actions ovs_dp_upcall | queue_userspace_packet | genlmsg_unicast
用户态Datapath处理packet流程: pmd_thread_main dpif_netdev_run \ / \ / dp_netdev_process_rxq_port | dp_netdev_input | fast_path_processing | handle_packet_upcall / \ (2) / \(1) / \ dp_netdev_execute_actions dp_netdev_upcall | | odp_execute_actions upcall_cb(调用注册的回调函数) | dp_execute_cb | netdev_send