模块和数据节点的树结构
sysrepo对yang文件节点数据及模块的解析是一个有层次的关系结构:

- 顶级节点没有parent=NULL, 兄弟节点的parent是相同的。
- 兄弟节点间是一个特殊的双向链表。第一个节点的
prev指向最后一个节点,next指向下一个节点。如图所示,最后一个兄弟节点的next为NULL。如果只有一个节点,那么prev指向自身, next=NULL - 父节点的
child指向第一个子节点。 - 每个节点有对应的节点类型,根据节点类型有对应的
value。
模块管理
所有安装的模块由一个名为sysrepo的模块管理。这个模块的定义在https://github.com/sysrepo/sysrepo/blob/master/modules/sysrepo.yang文件中。

里面会记录哪些模块已经安装了,哪些模块待安装。module列表表示已经安装过的模块,存放模块的名称、版本、特性列表。每个安装的模块的依赖和反向依赖的模块列表,还可以存放这个模块是否将被移动或者被更新, 使能的特性列表等。新安装的模块在installed-module里面, 等待sysrepo没有连接的时候进行安装,从yang文件中解析出各种属性,添加为module列表的一个项。 已安装的yang文件默认会被存放到/etc/sysrepo/yang目录下,这个目录可以在编译的之前在CMakeList.txt文件中设置。
数据内容存储
所有相关的数据结构被存放在两个共享内存文件中, 分别是 sr_main和 sr_ext。
sr_main
sr_main文件里面前面是sr_main_shm_t, 后面保存的是所有模块的信息sr_mod_t.
1 | typedef struct { |
在sr_mod_t里面保存的都是各个数据在sr_ext里面对应的偏移, 具体的数据存在sr_ext里面。
sr_ext
sr_ext的头部是sr_ext_shm_t, 后面存的是一个个结构sr_ext_hole_t, 指向了各个模块的内存偏移。
1 |
|
还有具体的数据也是存放在共享内存文件中, 不同模块的数据存放在不同的文件中, sr_modulename.datatype。
订阅的信息存放在sr_sub_xxxx等文件里。
后面再详细描述。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。