ns-3 を (macOSで) 動かすメモ

環境: macOS Sierra (低)

あまりにも多種多様な方法があったので、雑なメモを残しておく。

気持ち

  • VMLinux を入れるほうが簡単。Linux なら ns-3 が生やしてくれる tap とかを使って外部を巻き込んだシミュレーションもできる。
  • 2006年の気持ちに戻る。パッケージマネージャーに頼らない。
  • hg repo を clone してくると、謎のスクリプトを使って別途 ns-3 本体をダウンロードすることになるので使わない。tarball を落としてくるだけで良い。
  • ns-3 には waf という万能スクリプトが同梱されていて、これが configure や make をラップしている。これは使う。
  • waf をラップする build.py や bake というスクリプトも同梱されているが、よく言えば開発途中みたいなものなので使わなくて良い。
    • Wiki にも "Most users quickly transition to using Waf directly to configure and build ns-3." と書いてる。
  • "ns-3 mac" みたいなキーワードでググって出てきた公式っぽいページは見ない。10.6 の話をされても仕方あるまい。
  • Python 2 しか使わない。

ドキュメントを斜め読みする

ns-3 wikiGetting Started を読む。以下の項目は飛ばす。

  • Downloading ns-3 Using Bake
  • Building with build.py
  • Building with bake

下準備

tarball を落とす。ns-allinone-3.27 という名前はヤバそうだ、なにが all-in-one だ、という気持ちは抑え、落ち着いて展開する。

ns-3.27 ディレクトリに潜る。今後は ns-3.27 ディレクトリより上は忘れます。

ここからは万能スクリプト waf を叩いて回る。まずは configure 。

$ ./waf configure --build-profile=debug
(snip configureっぽい出力)
---- Summary of optional NS-3 features:
Build profile                 : debug
Build directory               :
BRITE Integration             : not enabled (BRITE not enabled (see option --with-brite))
DES Metrics event collection  : not enabled (defaults to disabled)
Emulation FdNetDevice         : enabled
Examples                      : enabled
File descriptor NetDevice     : enabled
GNU Scientific Library (GSL)  : not enabled (GSL not found)
Gcrypt library                : not enabled (libgcrypt not found: you can use libgcrypt-config to find its location.)
GtkConfigStore                : not enabled (library 'gtk+-2.0 >= 2.12' not found)
MPI Support                   : not enabled (option --enable-mpi not selected)
NS-3 Click Integration        : not enabled (nsclick not enabled (see option --with-nsclick))
NS-3 OpenFlow Integration     : not enabled (Required boost libraries not found)
Network Simulation Cradle     : not enabled (NSC not found (see option --with-nsc))
PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected (see option --force-planetlab))
PyViz visualizer              : not enabled (Python Bindings are needed but not enabled)
Python Bindings               : not enabled (Python library or headers missing)
Real Time Simulator           : enabled
SQlite stats data output      : not enabled (library 'sqlite3' not found)
Tap Bridge                    : enabled
Tap FdNetDevice               : enabled
Tests                         : not enabled (defaults to disabled)
Threading Primitives          : enabled
Use sudo to set suid bit      : not enabled (option --enable-sudo not selected)
XmlIo                         : not enabled (library 'libxml-2.0 >= 2.7' not found)
'configure' finished successfully (2.432s)

not enabled で必要そうなコンポーネントがあったら、Homebrew を使って入れると良いと思う。LD_LIBRARY_PATH とか渡して上げる必要はあるかも。やってないからわからん

ではいわゆる make をしましょう。ns-3 本体の全体をビルドするから時間がかかる。

./waf -j4  # make っぽく -jN できる
[   1/2261] Compiling install-ns3-header: ns3/antenna-model.h
[   2/2261] Compiling install-ns3-header: ns3/isotropic-antenna-model.h
[   3/2261] Compiling install-ns3-header: ns3/angles.h
(snip)

適当なスクリプトを動かす

scratch ディレクトリの中に自分が書いた C++ スクリプト(シナリオ)を置いておくとビルドされる。っぽい。

$ cp examples/tutorial/first.cc scratch/myfirst.cc  # 適当なサンプルをコピー
$ ./waf  # ビルド
$ ./waf --run scratch/myfirst
Waf: Entering directory `/Users/osyoyu/Development/ns-allinone-3.27/ns-3.27/build'
Waf: Leaving directory `/Users/osyoyu/Development/ns-allinone-3.27/ns-3.27/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (4.567s)
At time 2s client sent 1024 bytes to 10.1.1.2 port 9
At time 2.00369s server received 1024 bytes from 10.1.1.1 port 49153
At time 2.00369s server sent 1024 bytes to 10.1.1.1 port 49153
At time 2.00737s client received 1024 bytes from 10.1.1.2 port 9

動いてそう。良かったですね。