- 通过读取/usr/local/var/run/openvswitch/ovs-vswitchd.pid文件,获取最新启动的进程号。调用接口get_already_running_pid
- 当读取去到进程id时代表有新的ovs进程启动。调用ndu_connect_and_stage1。
1) 与老ovs进程创建连接。
2)创建新ovs进程与老ovs进程数据同步的通道ndu_flow,ndu_sync ,ndu_cmd通道
3)给老ovs进程发送新进程的new_pid rpc消息,通知新进程进入stage1阶段,等待新进程应答。当新进程执行完毕后,返回消息。
4)将新进程的client.state状态置为NDU_STATE_SYNC
5)等待接收老进程发过来的同步消息。
a.向老进程同步老进程的port信息。插入到client.ndu_sync.portno_list列表中。将NDU_STATE_SYNC-->NDU_STATE_FLOW_SYNC
b.从老进程获取megaflow插入到client.ndu_flow.megaflows中。(疑问:ukey表未看到同步)
c. 回收资源,并将client->state状态置为NDU_CLIENT_STATE_SYNC_DB

3.当未读取到进程id时代表ovs第一次启动。调用daemonize_make_pidfile这个接口时monitor进程监控ovs进程时调用。
4.bridge_init(remote)创建与数据库database的idl。创建server的unix域套接字(路径为/usr/local/var/run/openvswitch/ovs-ndu/mypid)以便后续进程启动时连接。client全局变量获取ovsdb的seqno
5.进入ovs循环。
- ovs进程在每次loop时都会监听是否有新进程与ovs进程创建连接。当存在时进入loop1.创建连接。
- Loop2:接收stage1请求,注册ndu_fsm_run_stage1事件,fsm->state =NDU_STATE_IDLE。
- 状态LOOP3:执行ndu_fsm_run_stage1 点
a.fsm->state=NDU_STATE_IDLE -> NDU_STATE_HWOFFLOAD_OFF
b.调用ndu_hwol_off_run
- 创建hwol_off_thread线程
- 检测hw_off是否结束,未检测到线程结束返回EAGAIN;结束释放ctx->latch资源。
c.NDU_STATE_HWOFFLOAD_OFF->NDU_STATE_REVALIDATOR_PAUSE
4.状态LOOP4:ndu_rv_pause_run
a.ndu_rv_pause_run->udpif_pause_revalidators
b.将revalidators线程pause住。为后续的流表迁移做准备。
c.NDU_STATE_REVALIDATOR_PAUSE-->NDU_STATE_OVSDB_UNLOCK
5.状态LOOP5:
a.ndu_ovsdb_unlock_run释放ovsdb的锁
b.NDU_STATE_OVSDB_UNLOCK->NDU_STATE_BR_RM_SRV_AND_SNOOP
6.状态LOOP6:
a.ndu_ctx.br_remove_services_and_snoop();
1)遍历所有bridge,获取punix:/usr/local/var/run/openvswitch/br-int.mgmt,并删除
2)bridge_remove_services_and_snoop ???不清楚作用。
b.NDU_STATE_BR_RM_SRV_AND_SNOOP->NDU_STATE_PID_FILE
7.状态LOOP7:
a.ndu_pid_file_run(&fsm->ctx.pid_ctx); ????(不清楚,从代码理解是为了在exit时,触发删除文件)
b.NDU_STATE_PID_FILE -> NDU_STATE_SYNC
c.ndu_sync_trans_connect_and_run(&fsm->ctx.sync_ctx)
-
- NDU_STATE_SYNC-->NDU_STATE_FLOW_SYNC
8.状态LOOP8:同步流表配置,同步成功后,
a. ndu_flow_sync_connect_and_run(&fsm->ctx.flow_ctx)
b. DNU_STATE_FLOW_SYNC->NDU_STATE_PMD_PAUSE
c. ndu_set_pmd_pause
1)设置other_config状态pmd-pause为true
d. NDU_STATE_PMD_PAUSE->NDU_STATE_VHOST_CONNECT_FORBID
e. ndu_forbid_vhostuser_connect
f. NDU_STATE_VHOST_CONNECT_FORBID->NDU_STATE_STAGE1_FINISH
g. ndu_flow_trans_destroy(&fsm->ctx.flow_ctx.trans);
h . ndu_sync_trans_destroy(&fsm->ctx.sync_ctx.trans);
