OVS源碼--ovs-vswitchd(二)

一、主要函數

vswitchd 作爲守護進程和ovsdb 通信以及和controller 進行openflow 通信,並完成和底層內核的交互。
在這裏插入圖片描述

  • set_program_name(argv)

    設置程序名稱、版本、編譯日期等信息

  • proctitle_int(argh,argv)

    複製出輸入的參數列表到新的存儲中,讓argv指向這塊內存【主要是爲了後面的proctitle_set()函數準備】

  • service_start(&argc,&argv)
    註冊回調和服務管理器出現故障錯誤時操作的配置

  • remote=parse_options(argh,argv,&unixctl_path)

    解析參數,其中unixctl_path存儲unixctrl域的sock名,作爲接受外部控制命令的渠道;而remote存儲連接到ovsdb的信息,即連接到配置數據庫的sock名

  • ovsrec_init()

    數據表結構初始化,包括13張數據表

  • daemonize_start()

    如果系統守護進程被配置了,啓動系統守護進程,通過派生和在返回的子進程。父進程徘徊,直到讓子進程知道它完成啓動成功(通過調daemon_complete()),或者它沒有啓動(用非零退出退出代碼。

  • unixctl_server_create(unixctl_path,&unixctl)

    創建一個unixctl_server(存放在unixctl),並監聽在unixctl_path指定的punix路徑,該路徑作爲ovs-appctl發送命令給ovsd的通道

  • unixctl_command_register

    註冊unixctl命令

  • bridge_init

    從remote數據庫獲取配置信息,並初始化bridge

1、主循環

  • memory_run()

    運行內存監視器,客戶端調用memory_should_report()。此函數以及該模塊的接口的剩餘部分,僅被一個線程調用。

  • bridge_run

    主要對網包進行完整處理過程。包括完成必要的配置更新【在配置更新中會從數據庫中讀取配置信息,生成必要的bridge和dp等數據結構】

    • ovsdb_idl_run(idl);

      處理了一批從’IDL’數據庫服務器的消息。這可能會導致IDL的內容發生變化。客戶端可以檢查與ovsdb_idl_get_seqno()。

    • system_stats_enable(false);

      因爲我們不運行system_stats的run()在這個進程中有多個OVS-vswitchd守護進程的現狀,關閉系統自動統計信息收集。

    • bridge_init_ofproto(cfg)

      初始化ofproto庫。這僅需要執行一次,但配置設置之後它必須要做的。如果已經出現了初始化,bridge_init_ofproto()立即返回。

    • bridge_run__(void)

      • ofproto_run中的p->ofproto_class->run( p) 上的run函數依次調用函數

        • 必選調用dpif_run()處理所有註冊的netlink notifier的彙報事件
        • 必選調用run_fast()處理常見的週期事件,包括對upcalls的處理等
        • 可選調用netflow_run()和sflow_run(),進行對netflow和sflow的支持
        • 可選調用較多,自行查看
      • connmr_run函數處理與控制器的週期性交互

        • 首先檢查是否存在in_band的控制器
        • 調用ofconn_run()處理對ofproto的協議解析和行動
        • rconn_run(ofconn->rconn)負責連接到controller
        • rconn_recv(ofconn->rconn)負責從controller收取消息
        • handle_openflow()最終調用handle_openflow__()(ofproto/ofproto.c)來完成對各個Of消息的處理

    以 PACKET_OUT消息爲例,調用的是handle_packout 函數

    首先調用ofputil_decode_packet_out()對of消息進行解析
    調用ofconn_pktbuf_retrieve()獲取payload信息
    利用ofproto_class->packet_out()將網包發出
    
    packet_out()
    {   
        ofproto_dpif_execute_actions()
            {
            dpif_flow_stats_extract() 流狀態提取
            xlate_actions()將ofpacts轉化爲dp的行動格式odp_actions
            調用dpif_execute()函數讓dpif執行給定的action構建OVS_PACKET_CMD_EXECUTE netlink消息併發給datapath
            datapath中將對應調用ovs_packet_cmd_execute函數處理收到的nlmsg
            ovs_packet_cmd_execute的調用過程
            ovs_packet_cmd_execute()->ovs_execute_actions()->do_execute_actions()
            }
    }
    
    • 重新配置SSL

      通過主循環每一次遍歷,而不是隻當數據庫的變化,因爲密鑰和證書文件的內容可以更改在數據庫不更改中。我們完成這些在bridge_reconfigure()之前,因爲該功能可能會啓動SSL連接之前做到這一點,因此需要SSL進行配置。

    • 對all_bidge上的每個bridge的ofproto執行ofproto_run()

  • netdev_run()

    如果打開了一些netted,則執行對應在netdev_classes上定義的每個netdev_class實體,調用它們的run()包括處理網卡註冊的各個通知事件,獲取網卡的最新的信息等

  • unixctl_server_run(unixctl)

    從unixctl指定的server中獲取來自ovs-appctl發出的命令數據,並執行對應的命令

  • 循環等待事件處理

    包括memory、bridge、unixctl_server、netted等事件,被poll_fd_wait()註冊的最短時間

  • poll_block(void)

    阻塞知道之前被poll_fd_wait()註冊過的事件發生,或者等待時間超過poll_timer_wait()註冊的最短時間

  • 清理工作

    退出bridge,關閉unixctl連接

二、處理流程

代碼在vswitchd/目錄下面,可以從main 函數入口分析,整體處理流程如下:
在這裏插入圖片描述

原文鏈接:https://www.sdnlab.com/my_sdnlab/wp-content/uploads/2017/02/cntctfrm_1a5b490b5708a374ad0d207df48ec29e_Openvswitch%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0.pdf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章