模块和数据节点的树结构
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,沟通交流。