1 调试目的
本着学习的态度,对emane tutorial中的示例程序进行重现,以加深对EMANE的理解和掌握。在示例程序0(见https://github.com/adjacentlink/emane-tutorial/wiki/Demonstration-0)中介绍了使用olsrlinkview.py脚本来通过可视化界面观察olsr节点的链路连接信息及GPS信息。初次运行此脚本,发现并不能显示节点及链路信息,遂决定进行深入调试,发现问题所在。
2 OLSRD的安装
按照操作步骤启动LXC container之后,发现其中并不存在olsrd命令,原来这个是需要另行安装。于是从git hub中克隆olsrd最新源码,发现在编译的时候出错:
src/gpsdclient.h:49:10: fatal error: gps.h: 没有那个文件或目录
原来问题的原因是系统未安装gpsd相关开发库。于是使用apt install安装gpsd之后,重新编译olsrd出现如下问题:
gpsdclient field ‘source’ has incomplete type
这个问题的原因则是因为使用apt install安装的gpsd版本过低,其中未有source类型的定义。于是手动下载gpsd-release-3.25编译安装。再尝试编译olsrd顺利通过。
在进行olsrd版本的选择时,也曾选择已发布的olsrd-0.9.8版本,但是在编译此版本时也遇到了奇怪的问题:
src/cfgparser/oparse.c:265:10: fatal error: oparse.h-tmp: No such file or directory
也这是说,这个稳定版本在当前系统编译时也出现错误,在网页上找到了解决的方法 ,也就是修改olsrd的编译系统,编译时已不再需要这个后缀带tmp的文件,具体解释及修改方法见https://github.com/OLSR/olsrd/commit/be461986c6b3180837ad776a852be9ce22da56c0.patch?full_index=1。
3 OLSRD BMF plugin的加载
在示例程序0中,安装完成olsrd后,使用demo_start启动节点,打开olsrlinkview.py工具始终无法观看到链路信息。偶然发现在LXC container节点中olsrd进程其实并未成功启动。于是修改rouring1.conf中的DebugLevel 为9,即开启更详细的日志信息打印。在node-1节点中手动执行olsrd -f routing1.conf后,发现olsrd因无法加载olsrd_bmf.so.1.7.0而终止。通过搜索网络发现,这个bmf作为一个插件存在,其代码在olsrd的源码中已经存在,但在编译的时候没有使用make build_all和make install_all,导致其未能编译和安装。重新编译和安装后,在日志中发现olsrd_bmf.so.1.7.0已经成功加载,但是还是存在另一个so加载错误:
olsrd: undefined symbol: olsrd_plugin_interface_version
通过分析日志信息和routing1.conf文件后发现 ,出错原因是routing1和routing2中的配置文件中都一个空项加载导致olsrd未成功启动,此空项如下所示:
LoadPlugin “”
{
PlParam “accept” “0.0.0.0”
}在两个配置文件中都删除此空项加载,可以看到olsrd进程进行顺利启动。但在olsrlinkview.py的图形化界面中仍然没有相关链路和GPS信息出现。
4 NODE节点的的IP地址映射
现在,只能准备通过调试olsrlinkview.py的代码来分析和定位问题。突然在代码中看到有使用node-这样的名称来访问节点以获取GPS和链路信息。而node-1或node-2这样的名称使用Ping命令在本地并不能ping通。也就是说,olsrlinkview.py通过node-这样的名称并不能访问到节点,也就无法获取信息。于是根据https://github.com/adjacentlink/emane-tutorial/wiki描述的node节点的IP地址信息和Raido接口的IP地址信息,将主机名称与IP地址的映射添加在/etc/hosts中,如下所示:
10.99.0.1 node-1
10.99.0.2 node-2
10.100.0.1 radio-1
10.100.0.2 radio-2再次重新启动节点,GPS信息终于可以显示出来,但是链路信息还是空的。
5 OLSRD TxtInfo plugin的加载
没有其他办法,只能继续分析olsrlinkview.py代码。在网页上搜索olsr how to show links之类的语句时,偶然一个txtinfo plugin相关的内容映入眼帘,大意是说正是借助于此插件,我们可以得到链路信息。于是在olsrd中的代码查看,果然在bmf同样的目录下存在着txtinfo目录,而且其已经编译安装在/usr/local/lib目录下,那问题应该是配置文件中没有加载此插件。想到这里,问题的答案已经呼之欲出了。于是在routing1.conf和routing2.conf中都要加载olsrd_txtinfo.so.1.1。还有一点需要注意,在配置文件中要正确设置其监听端口,在olsrlinkview.py中是访问2006端口来获取信息的, 所以在routing1.conf和routing2.conf中正确的配置方式如下:
LoadPlugin “olsrd_txtinfo.so.1.1”
{
PlParam “port” “2006”
PlParam “accept” “0.0.0.0”
}
重启所有节点后,终于在olsrlinkview.py中完整呈现示例程序中展示的信息:
至此,完成此示例程序0的全部调试,谨以记录。