Linux version 4.4.0-142-generic
ovs_version: “2.5.0”
作为一个初学者,从ovs基础命令入手学习源码。本文主要关注ovs-vsctl命令下发配置到ovsdb生效的代码流程。以ovs-vsctl add-port s1 vxlan 为例。
1. 处理命令行并更新transaction
ovs-vsctl的主体代码在utilities/ovs-vsctl.c文件中。
do_vsctl是ovs-vsctl模块的循环主函数,解析处理命令行,并将需要更新的信息同步到ovsdb。
static void
do_vsctl(const char *args, struct ctl_command *commands, size_t n_commands,
struct ovsdb_idl *idl)
{
....
if (c->syntax->run) {
(c->syntax->run)(&vsctl_ctx.base);
}
....
status = ovsdb_idl_txn_commit_block(txn);
....
}
static void vsctl_cmd_init(void)注册了vsctl的命令参数选项如show、add-port等。vsctl_commands存储了各命令及回调函数(ctl_command_syntax结构体的run函数指针)等相关信息。因此add-port命令会调用到cmd_add_port函数。
以写端口名为例,ovsrec_port_set_name是ovs在编译后由python生成的代码,这些生成的代码是各个配置动作下发后对对应更新数据库Transaction代码的封装。
txn应该是Transaction的缩写,也就是数据库动作。
这一过程是将datum的n、key、val信息存到row结构体需要更改的数据中
ovsrec_port_columns_init注册了column的parse和unparse函数,
c->parse = ovsrec_port_parse_name;
c->unparse = ovsrec_port_unparse_name;
name字符串由ovsdb_datum_clone调用parse 函数解析到row->new中
ovsdb_idl_txn_commit_block将更新后的txn同步到ovsdb
2. 与ovsdb通信
ovs-vsctl默认使用unix sock与ovsdb通信。
--db=server
Sets server as the database server that ovs-vsctl contacts to query or modify
configuration. server may be an OVSDB active or passive connection method, as
described in ovsdb(7).
The default is unix:/var/run/openvswitch/db.sock.
Open vSwitch Database Interface Definition Language (OVSDB IDL).
-
session初始化
-
stream初始化过程
其中stream_lookup_class检查到stream的name是unix。stream先挂接了unix_stream_class然后又挂接了stream_fd_class
- transaction发送过程
菜鸟一枚,才疏学浅,做些笔记仅供参考,不当之处欢迎大家指正。