一、主要函數
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 函數入口分析,整體處理流程如下: