OpenvSwitch中的分片與重組


最近遇到了分片導致的一系列問題,所以在這里盤點一下OVS中都有哪些已經做了分片和重組的地方,以及還有哪些地方需要做。版本還是基於2.7.0。並且datapath的時候會分別分析OVS和OVS-DPDK兩塊的處理。

 

 

up到userspace的時候

OVS部分

netdev_frame_hook-->netdev_port_receive-->ovs_vport_receive-->ovs_dp_process_packet-->ovs_dp_upcall主要是判定是否是帶了GSO標志,如果帶了,則需要將報文進行分片上報。

OVS-DPDK部分

pmd_thread_main-->dp_netdev_process_rxq_port-->dp_netdev_input-->dp_netdev_input__-->fast_path_processing這里不會對報文進行判定,因為目前OVS-DPDK還不支持GSO。其實個人覺得這里也沒必要進行分片,因為此處報文不涉及到從kernel上報到userspace的流程。

出端口之前

OVS部分

此處的分片分為兩種,一種是之前因為過conntrack的時候進行了重組,那么在出口之前就要進行分片。

netdev_frame_hook-->netdev_port_receive-->ovs_vport_receive-->ovs_dp_process_packet-->ovs_execute_actions-->do_execute_actions-->do_output這里會根據dev的mtu和報文的mru比較需要不需要分片,通常情況下報文的mru是0,不需要分片,但是因為重組函數handle_fragments重組時設置了報文的mru,所以分片時也根據此項來判定。調用ovs_fragment分片完成之后會調用ovs_vport_send-->dev_queue_xmit-->dev_hard_start_xmit-->ops->ndo_start_xmit-->bond_start_xmit進行報文發送。

另一種的報文分片是VM中設置了TSO、GSO、UFO等features,導致報文比較大,這個時候需要根據標志判定是否需要分片。

netdev_frame_hook-->netdev_port_receive-->ovs_vport_receive-->ovs_dp_process_packet-->ovs_execute_actions-->do_execute_actions-->do_output-->ovs_vport_send-->dev_queue_xmit-->dev_hard_start_xmit這里會根據gso進行分片,分片完成后繼續調用ops->ndo_start_xmit-->bond_start_xmit進行報文發送。其實此處也會根據其他的一些特性來判定,一般比如帶了TSO之類的需要網卡去分片。

OVS-DPDK部分

pmd_thread_main-->dp_netdev_process_rxq_port-->dp_netdev_input-->dp_netdev_input__-->packet_batch_per_flow_execute-->dp_netdev_execute_actions-->dp_execute_cb-->netdev_send-->netdev_dpdk_eth_send一般會根據網卡的特性來判定是不是分片。

封裝之前

OVS部分

此處的分片也分為兩種,一種是之前因為過conntrack的時候進行了重組,那么在出口之前就要進行分片。

netdev_frame_hook-->netdev_port_receive-->ovs_vport_receive-->ovs_dp_process_packet-->ovs_execute_actions-->do_execute_actions-->do_output這里會根據dev的mtu和報文的mru比較需要不需要分片,通常情況下報文的mru是0,不需要分片,但是因為重組函數handle_fragments重組時設置了報文的mru,所以分片時也根據此項來判定。調用ovs_fragment分片完成之后調用ovs_vport_send-->vxlan_xmit-->dev_queue_xmit-->dev_hard_start_xmit-->ops->ndo_start_xmit-->vxlan_xmit進行報文封裝。

另一種的報文分片是VM中設置了TSO、GSO、UFO等features,導致報文比較大,這個時候需要根據標志判定是否需要分片。

netdev_frame_hook-->netdev_port_receive-->ovs_vport_receive-->ovs_dp_process_packet-->ovs_execute_actions-->do_execute_actions-->do_output-->ovs_vport_send-->vxlan_xmit-->dev_queue_xmit-->dev_hard_start_xmit這里會根據gso進行分片,分片完成后繼續調用ops->ndo_start_xmit-->vxlan_xmit進行封裝。

OVS-DPDK部分

pmd_thread_main-->dp_netdev_process_rxq_port-->dp_netdev_input-->dp_netdev_input__-->packet_batch_per_flow_execute-->dp_netdev_execute_actions-->dp_execute_cb

  • OVS_ACTION_ATTR_TUNNEL_PUSH的情況下會進行報文封裝,調用接口push_tnl_action-->netdev_push_header-->netdev_tnl_push_udp_header進行封裝,需要分片的話需要在該接口之前。
  • 調用dp_netdev_recirculate重新查表。

重組的處理


conntrack的時候

OVS部分

netdev_frame_hook-->netdev_port_receive-->ovs_vport_receive-->ovs_dp_process_packet-->ovs_execute_actions-->do_execute_actions-->ovs_ct_execute中會判定報文是否分片報文,是的話調用函數handle_fragments進行重組,如果沒有分片直接進行conntrack處理。

OVS-DPDK部分

pmd_thread_main-->dp_netdev_process_rxq_port-->dp_netdev_input-->dp_netdev_input__-->packet_batch_per_flow_execute-->dp_netdev_execute_actions-->odp_execute_actions-->conntrack_execute沒有對報文分片的判定,直接進行conntrack的處理。

解封裝之后

OVS部分

首先是Linux Kernel接收報文,然后最終調用udp_rcv-->__udp4_lib_rcv-->udp_queue_rcv_skb-->encap_rcv會調用vxlan_rcv進行報文解封裝,最終調用netdev_port_receive-->ovs_vport_receive-->ovs_dp_process_packet進行查表和轉發,需要注意的是這塊根本沒有分片和重組。

OVS-DPDK部分

pmd_thread_main-->dp_netdev_process_rxq_port-->dp_netdev_input-->dp_netdev_input__-->packet_batch_per_flow_execute-->dp_netdev_execute_actions-->dp_execute_cb

  • OVS_ACTION_ATTR_TUNNEL_POP的情況下會進行報文解封裝,調用接口netdev_pop_header-->netdev_vxlan_pop_header進行解封裝,需要重組的話需要在該接口之后進行。
  • 調用dp_netdev_recirculate重新查表。

匹配流表的之前

bridge_run-->bridge_reconfigure-->ofproto_create會設置默認的分片配置。一般是normal,表示分片的源、目的端口為0。
bridge_run-->bridge_run__-->ofproto_run-->handle_openflow-->handle_openflow__-->handle_set_config-->set_frag_handling主要是設置分片相關的配置,目前有normal、drop、reassemable、nx_match等,但是目前reassemable功能還不支持,需要我們來完成。
rule_dpif_lookup_from_table根據不同的模式下發不同的流表。
由以上信息可以得知,支持reassemable的話首先是不是所有的報文都進行重組,但是我們並不是所有的報文都需要重組,只有需要匹配L4的匹配項時才需要,都進行重組的話相當消耗性能,第二就是查找流表的時候還要保證分片的首包先進行流表下拉,如果不是首個分片先到,那這個報文要先緩存等待重組才行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM