ovsd作为ovs的用户态管理主进程,负责处理ovs-vsctl命令接口、ovs-ofctl命令接口、与controller交互等等。 本篇分析它的整个处理机制。
1、main函数
bridge_init(remote);
free(remote);
exiting = false;
while (!exiting) { //while循环,直到退出
memory_run();
if (memory_should_report()) {
struct simap usage;
simap_init(&usage);
bridge_get_memory_usage(&usage);
memory_report(&usage);
simap_destroy(&usage);
}
bridge_run(); //处理controller交互,ovs-ofctl命令
unixctl_server_run(unixctl); //处理ovs-vsctl命令
netdev_run();
memory_wait();
bridge_wait();
unixctl_server_wait(unixctl);
netdev_wait();
if (exiting) {
poll_immediate_wake();
}
poll_block(); //阻塞,当没有请求处理的时候,阻塞在此处
if (should_service_stop()) {
exiting = true;
}
}
bridge_exit();
unixctl_server_destroy(unixctl);
service_stop();
2、poll_block函数
void
poll_block(void)
{
struct poll_loop *loop = poll_loop(); //ovsd进程携带的poll信息,其中最重要的就是fd信息
struct poll_node *node;
struct pollfd *pollfds;
HANDLE *wevents = NULL;
int elapsed;
int retval;
int i;
/* Register fatal signal events before actually doing any real work for
* poll_block. */
fatal_signal_wait();
if (loop->timeout_when == LLONG_MIN) {
COVERAGE_INC(poll_zero_timeout);
}
timewarp_run();
pollfds = xmalloc(hmap_count(&loop->poll_nodes) * sizeof *pollfds);
#ifdef _WIN32
wevents = xmalloc(hmap_count(&loop->poll_nodes) * sizeof *wevents);
#endif
/* Populate with all the fds and events. */
i = 0;
HMAP_FOR_EACH (node, hmap_node, &loop->poll_nodes) {
pollfds[i] = node->pollfd;
#ifdef _WIN32
wevents[i] = node->wevent;
if (node->pollfd.fd && node->wevent) {
short int wsa_events = 0;
if (node->pollfd.events & POLLIN) {
wsa_events |=