蓋索林 Gasolin

人們總是高估一年可以完成的事,卻低估十年能完成的事

0%

這系列文章僅記錄過程, 目的是從紀錄中看到自己對的 ipv6 了解, 對做事方法的改進. 不總結經驗. 因為一但總結經驗就會陷入長段撰寫文件的誤區. 而且在現在階段, 甚至不能確定此專案能否成功. 希望我能有寫出總結經驗文章來的一天吧:)

1st. Part: 第一步先從ICMPv6開始著手 Porting. 在熟悉INET目錄規劃後, 首先是根據INET目錄規則來建立INET專案所應用到的目錄, 剛開始在Network目錄下先建立IPv6與IPv6d兩個目錄. 並在Nodes目錄下建立INET6目錄.

從 IETF RFC列表 中挖出了 RFC 2463, Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification, 依此為憑開始 porting.

編輯 Network/IPv6/ICMPv6.ned 參照 IPv6Suite, 從 IPv6Suite/IP/IPv6/Generic 目錄下的 ICMPv6.ned. 觀察它的 ICMPv6 模組組成. 發現該模組與INET的ICMP.ned大不相同, 是由 IPv6Core, Neighbourdiscovery, ICMPv6Combine, 還有 MLD (multicast) 模組組成的複合模組. MLD模組在剛開始 porting 時可以忽略暫時不處理. 剩下的三塊中…應不應分拆成三個檔案三個simplemodule? , 是否要使用到 ICMPv6Combine 這塊呢? 我馬上陷入了第一個難題中.

2nd. Part: 告解式除錯(Confessional Debug): 為何不先弄好IP header呢? 這絕對是問題. 還好意識到這件事情的時間點還算早. 更堅定了我"只有邊寫邊紀錄才能意識到自己的錯誤"的想法, 因此接下來應先搜尋 IP header 定義的部分, 從這裡開始作修改.

暫時將 DualStack 放到一邊, 完成純 IPv6 Support 的模組後再考慮 DualStack. 但一定會將之排入計畫裡. 因為雖然 DualStack 對我的論文模擬來說重要性不大, 但在實際工作上將會遇到. porting 過一遍心裡會先有點底, 相信多少有些助益.

3rd. Part:

再次瀏覽 INET 目錄, 評估應該增修的檔案: 初步規劃大致如下:

  • Network/IPv6 //.ned, .msg 資源檔, IP6 實作
  • Network/IPv6d //IP6 分模組實作
  • Network/Autorouting/FlatNetworkConfigurator6.ned //模擬用位址自動設定
  • Nodes/INET6 //組合模組成為節點
  • Applications/PingApp6

這時又發現了 INET 的一個好處: 模組所包含的目錄大致與 TCP/IP 架構分層符合, 對熟悉網路的我來說, 很容易找到應該增修檔案的位址.

順便規劃 DualStack, 但暫時不做, 原因如 Day1 2nd. Part:

  • Network/DualStack
  • Network/Autorouting/FlatNetworkConfiguratorDS.ned
  • Nodes/DualStack 應用層不必修改.

做 DualStack 的話還會另外引入 6to4 等 transition/tunnel 模組, 工作量會遠遠比目前列出的 DualStack所需修改內容多上許多, 且現在自己還不具備白手疊床架屋的能力. 因此先弄好 IPv6 部分的 porting 才是最重要的.

昨天思考 ICMPv6 3個模組部分, 決定分拆成多個 simplemodule, 在 NetworkLayer6 裡再進行合作.

4th. Part: 編輯 Network/IPv6/IPv6.ned:

IPControlInfo: When IPv6 sends up a packet to a higher layer protocol, it will also attach an IP6ControlInfo to the packet, with the source and destination IPv6 address

  • 與上層溝通的訊息, 若名稱不改的話. 以後做 DualStack 從上層傳下來的封包會否出問題?

  • 另外弄個小 script 來判斷位址長度是否比改名造成的後果來的容易? When delivering packets to higher-layer protocols, the output gate is determined from the Protocol field in the IPv6 header. The protocol-to-gateindex mapping must be given in the protocolMapping string parameter

  • protocolMapping 應該被 NextHeader 或延伸標頭分析取代 routing table 儲存在 RoutingTable6 模組裡. if the route entry contained a next hop address, it will be passed to the interface in the attached IPRoutingDecision.

//1.1.1 03/06/05 Doc is Included in INET6 Project //1.1 01/05/05 //1.0 12/31/04 //0.9 12/28/04 //0.5 12/26/04 init

Install and Using OMNET++ on Windows 對開發者來說, 儘管在 Linux 環境下編譯 OMNET++ 模擬套件也是個好選擇, 但是也有不少人希望能在 Windows 環境下順利利用 OMNET++ 編譯模擬套件. 而目前相關文件仍然極少. 本文總結了作者如何在 Windows 環境下利用 Microsoft Visual C++ 6 (MSVC6) 編譯 OMNET++ 模擬套件的經驗

1. 安裝 MSVC6 & MSVC Service Pack 6 安裝 MSVC6 時"註冊變數"選項一定要勾選

2. 設定 打開選單 -> 工具(Tools) -> 自訂(Customize) 點選 Add-ins and Macro files 分頁標籤(Tab) , 看到omnetpp選項, 將之勾選

回到命令(Commands) 分頁標籤(Tab), 分頁左上角的分類(Category) 選單會多出巨集(Macros) 選項. 選擇巨集(Macros) 選項, 看到 addNEDfileToProject 巨集, 點選 addNEDfileToProject 巨集, 使用鼠標將巨集拖曳到工具列上, 選擇合適的位置, 圖示後按確定.

在完成上兩步之後, 我們已經將 VC 環境設定完成, 可以準備開始在 VC 上建立新的 OMNET++ 專案, 或是匯入原本不是在 Windows 環境下執行的專案

3. VC 中建立新專案 若要從頭開始建立新的模擬套件, 可以先在 Windows 檔案管理員中任意地點建立放置新專案的資料夾, 再從 OMNET++ 安裝目錄/sample 中複製 .dsw, .dsp 專案檔到新專案的資料夾中.

複製範例專案檔的目的是因為範例專案檔已經將 OMNET++ 編譯所需的編譯器, 連結旗標, Tkenv/Cmdenv 參數等都設定好了, 讓我們不需再重新設定.

點擊 .dsw檔進入 VC 編輯畫面. 將檔案檢視 (File View) 中的檔案名稱清空後, 即可開始編輯新的專案

4. VC 中匯入專案 有時我們會想使用別人在 OMNET++ 中已完成的模擬套件或成果, 而對方使用的平台並非 Windows, 此時我們可以用類似前一步驟的方式為這個模擬套件加入新的 VC 專案檔. 從omnet安裝目錄/sample 中複製 .dsw, .dsp 專案檔到原來模擬套件的資料夾中. 點擊 .dsw 檔進入 VC 編輯畫面. 將 File View 中的檔案名稱清空後, 即可開始編輯新的專案

5. VC 中編輯專案 在 IDE 環境下依照一般 VC 中編輯專案的方式增刪編輯檔案. 但要將其他平台上的 c++ 檔案拿來用時, 注意檔案副檔名不能使用 .cc, 副檔名都要先改成 .cpp 後在VC下才能正常編譯 (這點好像不一定, 至少在 INET 模組裡就不必改)

當遇到設計好 .ned 檔要加入 VC 時, 先點選工具列上新增的 addNEDfileToProject 巨集圖示, 輸入該 .ned 檔檔名(包含副檔名), 之後 addNEDfileToProject 巨集會幫忙生成 .ned 對應的 cpp 檔.

詳細設定可參考 OMNeT++ 安裝目錄下 doc/Readme-MSVC.txt

6, VC 中編譯專案 首先打開命令列, 準備開始編譯的動作. 命令列開啟流程為按作業系統左下角的"開始", 在選單中選擇"執行", 其後將跳出輸入視窗, 在視窗中鍵入 cmd (或 Terminal) 按下確定後即彈出類似 Dos 視窗. 接著用一般 Dos 指令切換到專案目錄下準備開始編譯, 鍵入 opp_nmakemake 這動作會根據目錄中的來源檔案生成 Makefile.vc 檔案

接著使用下面指令來生成模擬: nmake -f Makefile.vc 做完以上部驟之後就可以照一般 VC 編譯方式編譯啦:)

7, 重新編譯專案 之前已編譯過時資料夾中會存有舊的 Makefile.vc 檔案, 可鍵入 opp_nmakemake -f 來強制覆寫 Makefile.vc .

在編譯前要清除過時連結資料, 可以在命令列中輸入 nmake Makefile.vc clean 也可以在 VC 中使用 選單/Build/Clean 選項將過時連結資料清除

8.選擇 Tkenv 視窗模式模擬 在預設的情況下, 使用 OMNET++ 編譯出來的檔案將是在 cmdenv 命令列環境下執行. 為了更容易檢視模擬結果, 我們可以透過以下方法將模擬切換到在 TKenv 環境下執行:

選單/Build/Set Active Project Configuration 從四個選項中選取 xx- win32 Release Tkenv

參考資料: 1. OMNeT++ and MF build instructions for Windows 2. OMNeT/doc/Readme-MSVC.txt

refer: Make sure you enter these settings for all configurations (In the Project|Settings dialog, select ‘All configurations’ from the combo in the top-left corner.)

  • include path: You must tell MSVC the location of omnetpp.h and other header files. Add c:\omnetpp-2.3\include to the include path in Project|Settings --> ‘C/C++’ tab --> ‘Preprocessor’ category --> Additional include directories.
  • library path: MSVC needs to know where to find sim_std.lib, envir.lib and other libraries. Add omnetpp/lib to the linker path in Project|Settings --> ‘Link’ tab --> ‘Input’ category --> Additional library path.
  • nedc: It’s advisable to put OMNeT++'s bin directory into the PATH so that MSVC will find the NED compiler. (An alternative is to enter explicit nedc path for each NED file’s Custom build step, but that’s much more cumbersome.)

Add the .ned files to the project and set custom build option for them: Description: NED Compiling $(InputPath) Command: nedc -s _n.cpp $(InputPath) Outputs: $(InputPath)_n.cpp Hint: you can select all .ned files together, and ‘All configurations’ from the combo at the left of the Settings dialog, and then you have to type this settings only once. Note: If you copied one of the sample projects, you’ll have to adjust Command, because they contain explicit nedc path (…\bin\nedc).

動機: 由於自己論文的模擬需求, 嘗試了許多網路模擬工具, 包括 OPNET, NS2, OMNET++ 等. 試用後發現 OPNET 架構完備, 然而複雜度過高, 因授權關係使用上亦受到重重限制. NS2 使用免費, 牌子老又擁有不可忽視的模組群, 然而OTCL與 C 之間模組關係處理複雜, 模組使用時還必需與版本配合, 毫無可攜性. 而 OMNET++ 具有許多 NS2 沒有的優點, 例如是物件導向式的模擬工具. 跨平台通用, 使用C++語言撰寫. 在網路模擬上目前則提供了 INET, Mobility Framework, IPv6Suite 等網路模擬模組. Mobility Framework 是一個相似於 NS2 的網路模擬模組, 提供樣版檔案, 讓使用者從 Mac 層至 Application 層自行挑選, 組合出所需的網路. 而 INET 是三者中支援OSI七層最完整的網路模擬模組, 使用上也最為簡便. 然而目前並不支援 IPv6 與 IP Mobility. IPv6Suite 提供 IPv6, IPv4, MIPv6 等的模擬, , 功能最為強大. 然而問題頗多, 由於綁定太過額外模組, 僅限於 Linux 平台, 也不容易修改, 在網路模擬上具有分層不夠清楚, 安裝不夠簡單, 文件不夠友善等缺點. 因此一個主要目的以 INET 模組為基礎, 依據 INET 網路分層, 並以 IPv6Suite 為參考, 使 INET 支援 IPv6 的 INET6 計畫於焉成型

INET6 計畫包含

  • IPv6 模組程式
  • nedDoc 模組程式碼生成文件
  • 安裝步驟
  • 導覽 Tutorial
  • 模擬寫作指引

未來計畫:

  • MIPv6 模組程式 (待 Mobility Framework 整合後繼續開發)
  • NEMO 模組程式
  • DualStack 模組程式

本計畫發展穩定後, 最終將合併入 INET 模組中, 提供OMNET++平台上完整的網路模擬環境.