Vswitchd是ovs中运行在用户空间的守护进程, 实现ovs主要的功能逻辑, 本文将着重分析其启动过程。

数据结构

bridge/port/iface/ofproto/ofport

在数通领域, 交换机和桥很多时候可以是在说一个东西, 它工作在二层, 可以添加多个端口, 从一个端口上收到的报文会根据MAC表从其他某个端口转发出去. 在ovs中, 它也还是一个东西, 不过ovs用两个数据结构描述它们: 交换机(ofproto)与桥(bridge). 它们在ovs中是一一对应的, 也就是说一个bridge就有一个对应的ofproto. 相比而言, bridge更贴近用户, ofproto跟底层联系更多. 想想添加一个桥的命令是 ovs-vsctl add-br 就可见一斑了.
交换机需要添加端口才能具有实际作用, ovs用port和ofprot描述端口, 前者对应bridge, 更贴近用户配置, 而后者对应ofproto,更贴近底层. ovs还有一个结构叫iface, 一般而言, 一个port包含一个iface, 但存在一种聚合(bond)的情况, 我们可以把多个iface捆在一起, 将它们一并归纳到一个port.此时port和iface就是一对多的关系了.

以下为前面提到的几个数据结构之间的联系

vswitchd启动

入口

vswitchd 进程的入口在ovs-vswitchd.c ,下面我们将主要关注主干流程的分析,而忽略其中的一些旁枝末节

int main(int argc, char *argv[])
{remote = parse_options(argc, argv, &unixctl_path)bridge_init(remote);while (!existing){bridge_run();     bridge_wait();poll_block();}.....exit();return 0;
}

初始化 bridge 模块

bridge 模块的初始化在 bridge_init 中完成, bridge_init主要的动作是连接数据库ovsdb, 并从中读取配置信息.

void bridge_init(const char *remote)
{idl = ovsdb_idl_create(remote, &ovsrec_idl_class, true, true);ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_cur_cfg);......
}

注意, 像ovsrec_open_vswitch_col_cur_cfg这样的全局变量的定义是编译时自动生成的, 从官方下载的代码中最初是没有它的定义的.

运行 bridge 模块

bridge 模块的初始化在 bridge_run 中进行

void bridge_run(void)
{cfg = ovsrec_open_vswitch_first(idl);bridge_init_ofproto(cfg);bridge_run__();if (ovsdb_idl_get_seqno(idl) != idl_seqno || if_notifier_changed(ifnotifier)){bridge_reconfigure(cfg ? cfg : &null_cfg)}...
}

首先读取数据库ovsdb中的配置到cfg, 此时, cfg中就有了诸如用户创建了多少个bridge, 每个bridge中有多少个port, iface等信息.

在bridge_init_ofproto中, 会进行ofproto library初始化, 之前提到了, bridge更靠近用户配置, ofproto更靠近底层, 这里就是进行底层库的初始化

void ofproto_init(const struct shash *iface_hints)
{ofproto_class_register(&ofproto_dpif_class);.....for (i = 0; i < n_ofproto_classes; i++) {ofproto_classes[i]->init(&init_ofp_ports);}
}

ofproto library首先进行ofproto class类的注册, ovs当前仅支持一种类, 即ofproto_dpif_class, 所以后面调用init, 实际上也只会调用ofproto_dpif_class->init().
观察ofproto的数据结构中 的前几项

struct ofproto{const struct ofproto_class *ofproto_class;char *type;             /* Datapath type */ char *name;             /* Datapath name */...
}

其中, ofproto_class即为生产者的class, 在当前ovs中, 只会指向ofproto_dpif_class, type为ofproto的类型, 也可称为provider, 当前的ofproto_dpif_class有两种provider , 记录在dpif_classes中, 它的来源是base_dpif_classes[]

static const struct dpif_class *base_dpif_classes[] = {&dpif_netlink_class,&dpif_netdev_class,
}

可以把dpif_classes看成一张注册表, 里面有两个条目

ofproto_dpif_class实现的enumerate_types方法可以列举当前支持的datapath的类型, 在当前的ovs实现中,是"system"和"netdev"

再来看 bridge_run__(void)

static void bridge_run__(void)
{ofproto_enumerate_types(&types);SSET_FOR_EACH(type, &types){ofproto_type_run(type);}HMAP_FOR_EACH(br, node, &all_bridges){ofproto_run(br->ofproto);}
}

首先bridge_run__将当前支持的type列举出来, 再逐个调用ofproto_type_run ,最终调用到ofproto_dpif_class->type_run(),这里在第一次运行时, 由于all_dpif_backers为空,所以就直接返回了.
然后, bridge_run__对all_bridges上记录的每个bridge调用ofproto_run, 同样在第一次运行在这里时all_bridges为空, 所以也不会有实际的动作.

原文链接:https://blog.csdn.net/chenmo187J3X1/article/details/83242809

OVS vswitchd启动(三十七)相关推荐

  1. OVS vswitchd启动(三十九)

    ovs vswitchd的启动 vswitchd启动代码可参考ovs-vswitchd.c的main函数,其中最重要的两个函数是bridge_run以及netdev_run bridge_run vo ...

  2. OVS vswitchd启动(三十八)

    bridge 重配置 bridge 平滑 vswitchd启动时, bridge模块需要经过reconfigure使实际生效的配置与数据库中保持一致 static void bridge_reconf ...

  3. OVS vswitchd启动(三十六)

    ovs-vswitchd.c的main函数最终会进入一个while循环,在这个无限循环中,里面最重要的两个函数是bridge_run()和netdev_run(). bridge_init(remot ...

  4. OVS vswitchd启动(三十五)

    一.主要函数 vswitchd 作为守护进程和ovsdb 通信以及和controller 进行openflow 通信,并完成和底层内核的交互. set_program_name(argv) 设置程序名 ...

  5. Android系统10 RK3399 init进程启动(三十八) 属性Selinux实战编程

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 上一节 ...

  6. 【正点原子Linux连载】第三十七章 Linux内核移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  7. 科沃斯机器人拆解_周末清洁大会战 篇三十七:科沃斯扫地机器人朵朵S四年后的配件选购及终极清洁与拆解,以后不坏不拆,至死不渝!...

    周末清洁大会战 篇三十七:科沃斯扫地机器人朵朵S四年后的配件选购及终极清洁与拆解,以后不坏不拆,至死不渝! 2020-05-25 14:24:35 3点赞 6收藏 0评论 前言 科沃斯扫地机器人朵朵S ...

  8. 实践数据湖iceberg 第三十七课 kakfa写入iceberg的 icberg表的 enfource ,not enfource测试

    系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql ...

  9. Python编程基础:第三十七节 石头剪刀布游戏Rock, Paper, Scissors Game

    第三十七节 石头剪刀布游戏Rock, Paper, Scissors Game 前言 实践 前言 我们这一节的内容主要是对前边学习内容的一个综合应用,以石头,剪刀,布游戏为例讲解列表.随机数.用户输入 ...

最新文章

  1. MetaPhlAn2-增强版宏基因组分类谱工具-一条命令获得宏基因组物种组成
  2. 我的第一个网页制作:Hello World!
  3. 想学python有什么用-python学来有什么用
  4. ubuntu12.04LTS 安装eclipse和cdt
  5. 如何做好应急响应工作?常见应急响应流程
  6. js原生代码编写一个鼠标在页面移动坐标的检测功能,兼容各大浏览器
  7. PyTorch框架学习十六——正则化与Dropout
  8. python函数调用键盘热键_如何使用Python控制键盘和鼠标
  9. linux下使用yum安装Apache+php+Mysql+phpMyAdmin
  10. 将自己的dcm数据制作成LUNA16数据集提供数据样式之代码整理
  11. LeetCode35. 搜索插入位置(二分查找)
  12. ajax方法参数详解
  13. 003 Nginx虚拟主机配置
  14. Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块
  15. ecshop修改模板可输出php代码,修改ecshop模板体会
  16. Android基础知识点学习总结
  17. Unity 打包图集
  18. 基于cesium的地形开挖地形剖切
  19. 参会指南!POW'ER 2020上海峰会完整议程周边活动
  20. cs131 第二讲 颜色与线性代数

热门文章

  1. python零基础怎么学-python 零基础该怎么学?
  2. python运行错误-Python在运行中发生错误怎么正确处理方法,案例详解!
  3. python写web难受-pythonweb为什么不火-问答-阿里云开发者社区-阿里云
  4. python实现文件下载-Python 实现文件下载
  5. python3下载文件-python3 下载文件方法汇总
  6. 北京理工大学 python专题课程-Python语言程序设计
  7. php和python区别-Python与PHP的一些区别
  8. python免费试听-哪家培训可以免费试听Python课程?专注16年IT培训
  9. LeetCode Guess Number Higher or Lower II(动态规划)
  10. MyBatis架构设计及源代码分析系列(一):MyBatis架构