从NS3.25搬迁到NS3.30.1
前言:博主对C++并无太多了解,搬移过程中也不断的踩坑,希望此文章能对读者有所帮助。
搬迁对象:github.com/snowzjx/ns3…, 是一个基于NS3.25的负载均衡模拟器。由于G++等编译器的不断更新,半年前还能编译运行的软件在2020年遇到了诸多问题。NS3通过增量升级是基本无望的,升级版本的唯一方法就是重装。于是笔者想,与其在落后的NS3.25上不断的修改,不如尝试直接移植到最新的NS3.30.1,以期能够运行的更为长久。
搬移的基本思路:版本变动最大的问题就在于API的变动。我们希望直接在最新的文件、对照NS3.25原版和负载均衡修改版改动。搬迁过程使用到Google检索和VsCode、各个版本的原文件以及本地文件全文搜索工具LocalFile Pro。编译器反馈的错误和推荐修改经常并不能解决问题,优先在NS3相关的Google社区、StackOverflow查找之前解决过的问题。
过程:
- 根据原src目录,创建新模块。
Following:www.nsnam.org/docs/manual…
在src文件夹中运行如下代码:
./create-module.py MODULENAME
不要不通过命令行,直接复制原始文件!否则编译器找不到你的文件的。
-
在src/internet/model里添加负载均衡相关头文件。
-
修改文件,主要是tcp-socket-base:
通过查询官方的修改文档,我们可以发现,3.25相比3.30.1最大的区别就在于TCP-SOCKET-STATE文件的出现。我们首先需要从原始的TCP-SOCKET-BASE删除原始代码中关于TCP-SOCKET-STATE的内容。接下来,通过在原版本和3.30.1的tcp-socket-base文件中不断的搜索TLB/CLOVE/Resequence/AttachFlowId等来对比修改3.30.1的base的文件内容。
期间遇到的问题:
-
相比3.25,3.30.1在头文件中使用列表式初始化。故需要删除原来cc文件中的初始化的相关内容。并且,在TcpSocketBase::TcpSocketBase (const TcpSocketBase& sock) 后续的初始化部分,需要按照头文件初始化的顺序来赋值。否则将产生Reorder错误。
-
由于tcp-socket-state的出现,原来在tcp-socket-base.h的内容搬迁了。需要通过使用m_tcb指针来避免出现“变量在编译中未定义的变量”的错误。
-
ProcessAcked的函数需要修改形参的变量数目和类型。
-
TcpCongestionOps中的PktsAcked需要函数名复用。
-
在TcpSocketBase里的m_lasrRtt变量被移除,在官方的文档中也并没有找到原因。可能是与dupAckCount变量功能相同有关。
-
Reference相关:头文件中声明的函数均需要在源程序中定义使用。由于源代码量过于庞大,无法查找函数在哪里被定义使用。故推荐将src中的文件打包搬迁到windows平台中,使用LocalFile Pro工具进行全文检索。
-
dctcp.cc中缺少“log.h"和 "simulator.h"两个核心的文件。
-
解决Link问题:修改internet文件中的wscript。在Source和Header中添加相关文件,在bld.create_ns3_module中添加tlb、clove。[1]
每次关于wscript文件的修改,都需要重新configure。
-
编译运行(这个大家都清楚)
sudo ./waf configure --enbale-examples
sudo ./waf
搬迁过程后记:
花了将近30H。最初的想法是把原来的tcp-socket-base通过删改进行文件替换,以期在3.30.1上运行通过。后来发现这种方法不可行,原因在于NS3.30.1已经变动了太多API,不能只修改tcp-socket-base一个文件。
尽量按照自带的已经成功运行的文件修改。根据编译器的反馈的错误和Google搜索,一步一步向前走就好。
参考链接: