从NS3.25搬迁到NS3.30.1

873 阅读3分钟

从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查找之前解决过的问题。

过程:

  1. 根据原src目录,创建新模块。

Following:www.nsnam.org/docs/manual…

在src文件夹中运行如下代码:

./create-module.py MODULENAME

不要不通过命令行,直接复制原始文件!否则编译器找不到你的文件的。

  1. 在src/internet/model里添加负载均衡相关头文件。

  2. 修改文件,主要是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"两个核心的文件。

  1. 解决Link问题:修改internet文件中的wscript。在Source和Header中添加相关文件,在bld.create_ns3_module中添加tlb、clove。[1]

    每次关于wscript文件的修改,都需要重新configure。

  2. 编译运行(这个大家都清楚)

sudo ./waf configure --enbale-examples
sudo ./waf 

搬迁过程后记:

花了将近30H。最初的想法是把原来的tcp-socket-base通过删改进行文件替换,以期在3.30.1上运行通过。后来发现这种方法不可行,原因在于NS3.30.1已经变动了太多API,不能只修改tcp-socket-base一个文件。

尽量按照自带的已经成功运行的文件修改。根据编译器的反馈的错误和Google搜索,一步一步向前走就好。

参考链接:

[1]:groups.google.com/forum/#!sea…20bubblegum%7Csort:date/ns-3-users/VeTFGBYwSxQ/LsB29qos5TcJ](https://groups.google.com/forum/#!searchin/ns-3-users/Tommaso