Intro
你在自己的仿真程序里会使用下面这句设置节点缓存容量:
StackHelper::setCsSize()
然后通过 StackHelper::doInstall() 把它设置到对应的节点上。
具体可以参考 src/ndnSIM/examples 路径下的不同示例。
本文来深入分析一下这个过程。(个人理解,如有错误之处,请各位批评指正)
1. 首先来看 StackHelper::doInstall() 都做了什么 ?
1)L3Protocol 构造函数分析
Ptr<L3Protocol> ndn = m_ndnFactory.Create<L3Protocol>();
显然这是要构造一个 L3Protocol 对象,我们去找到 L3Protocol 对应的构造函数:
L3Protocol::L3Protocol(): m_impl(new Impl())
然后转到了 class L3Protocol::Impl::Impl()
这里面设置了一个 string 类型的 initialConfig,构造的时候会初始化所有配置项的默认值。
注意作者说了你不要直接去改这个初始化的文件。可以通过 helper 来设置特定的 NFD 参数。
例如上面的 tables.cs_max_packets 也在这里面设置初值,可以看到它的默认值是 100。
2)缓存容量配置项修改
ndn->getConfig().put("tables.cs_max_packets", m_maxCsSize);
这里应该是完成了上面对应配置项的修改。
这个 m_maxCsSize 就是你 setCsSize() 中指定的那个值。
3)那么你设置的值又是如何生效的呢?
即如何将这些 L3Protocol 的配置和对应节点的缓存(CS)绑定到一起?
StackHelper::doInstall(Ptr<Node> node) 在最下面有这样一句:
node->AggregateObject(ndn);
- 但是有一说一,这个函数里面我看不懂 ~
- 但是作者说了,它后面是转到 L3Protocol::NotifyNewAggregate(),而在这里会调用L3Protocol的初始化函数,即 L3Protocol::initialize()。
2. 下面我们深入分析看 L3Protocol::initialize() 做了什么 ?
我太懒了。
请看注释。
L3Protocol::initialize() { // 节点的 NDN 协议栈初始化
// 初始化管理器,实际上是将该节点的Forwarde和各种管理器绑定上,包括CS、FIB
initializeManagement() {
// 默认构造函数,设置默认缓存容量10,设置默认缓存策略 LRU
Cs::Cs()
// Forwarder构造(上面的的 cs 其实是作为Forwarder的对象成员调用默认构造)
Forwarder::Forwarder()
// 将tables相关的设置绑定一个handler处理,即processConfig, 见下面
TablesConfigSection::setConfigFile()
// 步骤 1 中的操作会生成一个配置文件 ndnSIM.conf,这里就是把它所有配置读出来、并逐个处理
ConfigFile::parse()
// 通过前面绑定的 ConfigSectionHandler 来处理每个设置,缓存Cs和tables相关的配置绑定到下面来处理
ConfigFile::process()
// 最后是在这里实现具体的设置!
TablesConfigSection::processConfig() {
do read CS config
do set CS config
}
}
// ...
}
3. 总结上面的过程
StackHelper::setCsSize()
StackHelper::doInstall() {
// ...
node->AggregateObject(ndn)
}
L3Protocol::NotifyNewAggregate()
L3Protocol::initialize() { // 节点的 NDN 协议栈初始化
// 初始化管理器,实际上是将该节点的Forwarde和各种管理器绑定上,包括CS、FIB
initializeManagement() {
// 默认构造函数,设置默认缓存容量10,设置默认缓存策略 LRU
Cs::Cs()
// Forwarder构造(上面的的 cs 其实是作为Forwarder的对象成员调用默认构造)
Forwarder::Forwarder()
// 将tables相关的设置绑定一个handler处理,即processConfig, 见下面
TablesConfigSection::setConfigFile()
// 步骤 1 中的操作会生成一个配置文件 ndnSIM.conf,这里就是把它所有配置读出来、并逐个处理
ConfigFile::parse()
// 通过前面绑定的 ConfigSectionHandler 来处理每个设置,缓存Cs和tables相关的配置绑定到下面来处理
ConfigFile::process()
// 最后是在这里实现具体的设置!
TablesConfigSection::processConfig() {
do read CS config
do set CS config
}
}
// ...
}