hướng dẫn giả lập mạng ns-3. Chương 3

hướng dẫn giả lập mạng ns-3. Chương 3
chương 1,2

3 Bắt đầu
3.1 Tổng quan
3.2 Điều kiện tiên quyết
3.2.1 Tải xuống bản phát hành ns-3 dưới dạng kho lưu trữ nguồn
3.3 Tải xuống ns-3 bằng Git
3.3.1 Đang tải ns-3 bằng Bake
3.4 Hội ns-3
3.4.1 Tòa nhà với build.py
3.4.2 Xây dựng bằng Bake
3.4.3 Xây dựng với Waf
3.5 Kiểm tra ns-3
3.6 Chạy tập lệnh
3.6.1 Đối số dòng lệnh
3.6.2 Gỡ lỗi
3.6.3 Thư mục làm việc

Chương 3

Bắt đầu

Chương này nhằm chuẩn bị cho người đọc bắt đầu với một máy tính có thể chưa bao giờ cài đặt ns-3. Nó bao gồm các nền tảng được hỗ trợ, các điều kiện tiên quyết, cách lấy ns-3, cách xây dựng ns-3 cũng như cách kiểm tra bản dựng và chạy các chương trình đơn giản của bạn.

3.1 Tổng quan

Trình mô phỏng ns-3 được xây dựng như một hệ thống các thư viện phần mềm cộng tác. Trong quá trình lắp ráp, mã của chương trình người dùng được liên kết với các thư viện này. Ngôn ngữ lập trình C++ hoặc Python được sử dụng để viết các chương trình tùy chỉnh.

Ns-3 được phân phối dưới dạng mã nguồn, có nghĩa là hệ thống đích phải có môi trường phát triển phần mềm để trước tiên có thể xây dựng các thư viện và sau đó là xây dựng chương trình người dùng. Về nguyên tắc, ns-3 có thể được phân phối dưới dạng thư viện làm sẵn cho một hệ thống cụ thể và trong tương lai chúng có thể được phân phối theo cách này. Nhưng ngày nay nhiều người dùng thực sự thực hiện công việc của họ bằng cách chỉnh sửa chính ns-3, vì vậy việc có mã nguồn để xây dựng các thư viện là rất hữu ích. Nếu ai muốn đảm nhận công việc tạo các thư viện và gói làm sẵn cho hệ điều hành, vui lòng liên hệ với danh sách gửi thư ns-Developers.

Tiếp theo, chúng ta sẽ xem xét ba cách để tải xuống và xây dựng ns-3. Đầu tiên là tải xuống và xây dựng bản phát hành chính thức từ trang web chính. Thứ hai là lựa chọn và tập hợp các bản sao của phiên bản phát triển của bản cài đặt cơ bản ns-3. Thứ ba là sử dụng các công cụ xây dựng bổ sung để tải thêm tiện ích mở rộng cho ns-3. Chúng ta sẽ đi qua từng cái vì các công cụ hơi khác nhau.

Người dùng Linux có kinh nghiệm có thể thắc mắc tại sao ns-3 không được cung cấp dưới dạng gói như hầu hết các thư viện khác sử dụng trình quản lý gói? Mặc dù có các gói nhị phân cho nhiều bản phân phối Linux khác nhau (ví dụ Debian), hầu hết người dùng cuối cùng đều chỉnh sửa thư viện và phải tự xây dựng lại ns-3, vì vậy việc có sẵn mã nguồn là điều tiện lợi. Vì lý do này, chúng tôi sẽ tập trung vào việc cài đặt từ nguồn.

Đối với hầu hết các ứng dụng quyền ns-3 nguồn gốc không cần thiết, nên sử dụng tài khoản người dùng không có đặc quyền.

3.2 Điều kiện tiên quyết

Toàn bộ tập hợp thư viện ns-3 có sẵn có một số phụ thuộc vào thư viện của bên thứ ba, nhưng phần lớn ns-3 có thể được xây dựng và sử dụng với sự hỗ trợ cho một số thành phần phổ biến (thường được cài đặt theo mặc định): trình biên dịch C++, Python, trình soạn thảo mã nguồn (ví dụ: khí lực, emacs hoặc Eclipse) và, nếu sử dụng kho phát triển, hệ thống kiểm soát phiên bản Git. Hầu hết người dùng lần đầu sẽ không cần phải lo lắng nếu cấu hình của họ báo thiếu một số tính năng nâng cao ns-3, nhưng đối với những người muốn cài đặt đầy đủ, dự án cung cấp một wiki bao gồm các trang với nhiều mẹo và thủ thuật hữu ích. Một trang như vậy là trang Cài đặt, có hướng dẫn cài đặt cho các hệ thống khác nhau, có sẵn tại: https://www.nsnam.org/wiki/Installation.

Phần Điều kiện tiên quyết của wiki này giải thích những gói nào được yêu cầu để hỗ trợ các tùy chọn ns-3 phổ biến và cũng cung cấp các lệnh được sử dụng để cài đặt chúng trên các phiên bản phổ biến của Linux hoặc macOS.

Bạn có thể tận dụng cơ hội này để khám phá trang wiki ns-3 hoặc trang web chính: https://www.nsnam.org, vì ở đó có rất nhiều thông tin. Bắt đầu với phiên bản mới nhất của ns-3 (ns-3.29), cần có các công cụ sau để chạy ns-3:

Gói/Phiên bản công cụ

  • Trình biên dịch C++
    clang++ hoặc g++ (g++ phiên bản 4.9 trở lên)
  • Python
    phiên bản python2 >= 2.7.10 hoặc phiên bản python3 >=3.4
  • đi
    mọi phiên bản mới nhất (để truy cập ns-3 trên GitLab.com)
  • tar
    mọi phiên bản mới nhất (để giải nén bản phát hành ns‑3)
  • bunzip2
    bất kỳ phiên bản mới nhất nào (để giải nén bản phát hành ns‑3)

Để kiểm tra phiên bản mặc định của Python, hãy nhập python -V. Để kiểm tra phiên bản g++, hãy nhập g++ -v. Nếu bất kỳ công cụ nào bị thiếu hoặc quá cũ, vui lòng tham khảo hướng dẫn cài đặt trên trang wiki ns-3.

Từ giờ trở đi, chúng tôi giả định rằng người đọc đang chạy Linux, MacOS hoặc trình giả lập Linux và có ít nhất các công cụ trên.

3.2.1 Tải xuống bản phát hành ns-3 dưới dạng kho lưu trữ nguồn

Đây là quá trình hành động dành cho người dùng mới muốn tải xuống và thử nghiệm phiên bản gói và bản phát hành mới nhất của ns-3. Các bản phát hành ns-3 được xuất bản dưới dạng kho lưu trữ nguồn nén, đôi khi được gọi là tập tin nén. tập tin nén là một định dạng lưu trữ phần mềm đặc biệt trong đó một số tệp được kết hợp với nhau. Kho lưu trữ thường được nén. quá trình khởi động ns-3 thông qua tập tin nén rất đơn giản, bạn chỉ cần chọn một bản phát hành, tải xuống và giải nén nó.

Giả sử rằng bạn, với tư cách là người dùng, muốn xây dựng ns-3 trong một thư mục cục bộ có tên không gian làm việc. Bạn có thể lấy bản sao hoạt động của bản phát hành bằng cách nhập thông tin sau vào bảng điều khiển Linux (tất nhiên là thay thế số phiên bản thích hợp)

$ cd 
$ mkdir workspace 
$ cd workspace 
$ wget https://www.nsnam.org/release/ns-allinone-3.29.tar.bz2 
$ tar xjf ns-allinone-3.29.tar.bz2 

Chú ý đến tiện ích sử dụng ở trên wget, là một công cụ dòng lệnh để tải xuống các đối tượng từ Internet. Nếu bạn chưa cài đặt nó, bạn có thể sử dụng trình duyệt của mình cho việc này.

Làm theo các bước sau sẽ đưa bạn đến thư mục ns-allinone-3.29, ở đó bạn sẽ thấy một số tệp và thư mục

$ cd ns-allinone-3.29
$ ls
bake constants.py ns-3.29 README
build.py netanim-3.108 pybindgen-0.17.0.post58+ngcf00cc0 util.py

Bây giờ bạn đã sẵn sàng xây dựng bản phân phối cơ sở ns-3 và có thể chuyển sang phần xây dựng ns-3.

3.3 Tải xuống ns-3 bằng Git

Mã ns-3 có sẵn trong kho Git trên GitLab.com tại https://gitlab.com/nsnam/. Nhóm nsnam tập hợp các kho lưu trữ khác nhau được sử dụng bởi một dự án nguồn mở.

Cách dễ nhất để bắt đầu sử dụng kho Git là phân nhánh hoặc sao chép môi trường ns-3-allinone. Đây là một tập lệnh quản lý việc tải và lắp ráp các hệ thống con ns-3 được sử dụng phổ biến nhất. Nếu bạn mới làm quen với Git, các thuật ngữ "fork" và "clone" có thể xa lạ với bạn; nếu vậy, chúng tôi khuyên bạn chỉ cần sao chép (tạo bản sao của riêng mình) kho lưu trữ trên GitLab.com như thế này:

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git 
$ cd ns-3-allinone 

Ở giai đoạn này, chế độ xem thư mục của bạn ns-3-allinone hơi khác so với thư mục lưu trữ phát hành được mô tả ở trên. Nó sẽ trông giống như thế này:

$ ls
build.py constants.py download.py README util.py

Xin lưu ý rằng có một kịch bản tải xuống.py, nó sẽ trích xuất thêm ns-3 và mã nguồn đi kèm. Ở đây bạn có thể lựa chọn: tải xuống ảnh chụp nhanh phát triển ns-3 mới nhất:

$ python download.py

hoặc thích bản phát hành ns-3 hơn bằng cách sử dụng cờ -n để chỉ ra số phát hành:

$ python download.py -n ns-3.29

Sau bước này vào thư mục ns-3-allinone kho bổ sung sẽ được tải xuống ns-3, nướng, pybindgen и netanim.

Ghi
Trên máy có Ubuntu16.04 sạch, tôi cần thay đổi lệnh này: $ sudo python3 download.py -n ns-3.29 (sau đây là ghi chú của người dịch).

3.3.1 Đang tải ns-3 bằng Bake

Hai phương pháp trên (lưu trữ nguồn hoặc kho lưu trữ ns-3-allinone thông qua Git) rất hữu ích để cài đặt ns-3 đơn giản nhất với nhiều tiện ích bổ sung (pybindgen để tạo các ràng buộc Python và netanim cho hoạt ảnh mạng). Kho lưu trữ thứ ba được cung cấp theo mặc định trong ns-3-allinone được gọi là nướng.

Nướng là một công cụ để phối hợp xây dựng phần mềm từ nhiều kho lưu trữ, được phát triển cho dự án ns-3. Nướng có thể được sử dụng để lấy các phiên bản phát triển của ns-3, cũng như tải xuống và xây dựng các phần mở rộng của phiên bản cơ sở của bản phân phối ns-3, chẳng hạn như môi trường Thực thi mã trực tiếp, Cái nôi Cái nôi mô phỏng mạng, khả năng tạo các liên kết Python mới và các “ứng dụng” ns-3 khác nhau.

Ghi
CradleNetwork Simulator Cradle là một khung cho phép bạn sử dụng các ngăn xếp mạng TCP/IP thực bên trong trình mô phỏng mạng.

Nếu bạn muốn cài đặt ns-3 của mình có các tính năng nâng cao hoặc bổ sung, bạn có thể đi theo đường dẫn cài đặt này.

Trong phiên bản ns-3 mới nhất Nướng đã được thêm vào bản phát hành tar. Bản phát hành bao gồm tệp cấu hình cho phép bạn tải xuống các phiên bản phần mềm hiện tại tại thời điểm phát hành. Ví dụ, đó là phiên bản Nướng, được phân phối cùng với bản phát hành ns-3.29, có thể được sử dụng để truy xuất các thành phần cho bản phát hành ns-3 đó hoặc cũ hơn, nhưng không thể được sử dụng để truy xuất các thành phần cho các bản phát hành sau này (nếu tệp mô tả gói nướngconf.xml không được cập nhật).

Bạn cũng có thể nhận được bản sao mới nhất nướngbằng cách nhập lệnh sau vào bảng điều khiển Linux của bạn (giả sử bạn đã cài đặt Git):

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/bake.git

Khi bạn chạy lệnh git, bạn sẽ thấy nội dung như sau:

Cloning into 'bake'...
remote: Enumerating objects: 2086, done. 
remote: Counting objects: 100% (2086/2086), done. 
remote: Compressing objects: 100% (649/649), done. 
remote: Total 2086 (delta 1404), reused 2078 (delta 1399) 
Receiving objects: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, done. 
Resolving deltas: 100% (1404/1404), done.

Sau khi lệnh hoàn thành nhân bản bạn nên có một thư mục có tên nướng, nội dung của nó sẽ trông giống như thế này:

$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO

Lưu ý rằng bạn đã tải một số tập lệnh Python, một mô-đun Python có tên nướng và một tệp cấu hình XML. Bước tiếp theo là sử dụng các tập lệnh này để tải xuống và xây dựng bản phân phối ns-3 theo lựa chọn của bạn. Một số mục tiêu tùy chỉnh có sẵn:

  1. ns-3.29: module tương ứng với bản phát hành; nó sẽ tải xuống các thành phần tương tự như bản phát hành trong tarball;

  2. ns-3-dev: một mô-đun tương tự, nhưng sử dụng mã từ cây phát triển;

  3. ns-allinone-3.29: Một mô-đun bao gồm các tính năng bổ sung khác như Định tuyến nhấp chuột và Giá đỡ mô phỏng mạng, Openflow cho ns-3.

  4. ns-3-allinone: tương tự như phiên bản phát hành của mô-đun tất cả trong một, nhưng dành cho mã phát triển.

Ghi
Nhấp chuột - kiến ​​trúc phần mềm mô-đun để tạo bộ định tuyến.

Openflow là giao thức quản lý quá trình xử lý dữ liệu được truyền qua mạng dữ liệu bởi các bộ định tuyến và chuyển mạch, triển khai công nghệ mạng được xác định bằng phần mềm.

Ảnh chụp nhanh phát triển hiện tại (không phát hành) ns-3 có thể được tìm thấy tại:https://gitlab.com/nsnam/ns-3-dev.git.

Các nhà phát triển cố gắng giữ các kho lưu trữ này theo thứ tự hoạt động nhất quán, nhưng chúng nằm trong khu vực phát triển và chứa mã chưa được phát hành, vì vậy nếu bạn không có ý định sử dụng các tính năng mới thì hãy chọn bản phát hành chính thức.

Bạn có thể tìm thấy phiên bản mới nhất của mã bằng cách duyệt qua danh sách các kho lưu trữ hoặc bằng cách truy cập trang web Bản phát hành ns-3:https://www.nsnam.org/releases/ và nhấp vào liên kết phiên bản mới nhất. Trong ví dụ này chúng ta sẽ tiếp tục với ns-3.29.

Bây giờ, để có được các thành phần ns-3 cần thiết, chúng ta sẽ sử dụng công cụ Nướng. Hãy nói vài lời giới thiệu về tác phẩm Nướng.

Bake hoạt động bằng cách tải nguồn gói vào một thư mục nguồn và cài đặt các thư viện vào thư mục build. Nướng có thể được chạy bằng cách tham chiếu nhị phân, nhưng nếu bạn muốn chạy Nướng không phải từ thư mục đã tải xuống, bạn nên thêm đường dẫn đến nướng vào đường dẫn của bạn (biến môi trường PATH), ví dụ như sau (ví dụ cho shell bash Linux). Chuyển đến thư mục "nướng" rồi đặt các biến môi trường sau:

$ export BAKE_HOME=`pwd` 
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin 
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

Điều này sẽ đặt chương trình nướng.py vào đường dẫn shell và sẽ cho phép các chương trình khác tìm thấy các tệp thực thi và thư viện mà nó đã tạo nướng. Trong một số trường hợp sử dụng nướng, cài đặt PATH và PYTHONPATH được mô tả ở trên là không bắt buộc, nhưng bản dựng hoàn chỉnh của ns-3-allinone (với các gói bổ sung) thường yêu cầu cài đặt này.

Chuyển đến thư mục làm việc của bạn và nhập thông tin sau vào bảng điều khiển:

$ ./bake.py configure -e ns-3.29

Tiếp theo chúng ta sẽ hỏi Nướng kiểm tra xem chúng tôi có đủ công cụ để tải các thành phần khác nhau hay không. Quay số:

$ ./bake.py check

Bạn sẽ thấy một cái gì đó như sau:

> Python - OK 
> GNU C++ compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar tool - OK 
> Unzip tool - OK 
> Make - OK 
> cMake - OK 
> patch tool - OK 
> Path searched for tools: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

Đặc biệt, các công cụ tải lên như Mercurial, CVS, Git và Bazaar rất cần thiết trong bước này vì chúng cho phép chúng ta lấy mã. Tại thời điểm này, hãy cài đặt các công cụ còn thiếu theo cách thông thường cho hệ thống của bạn (nếu bạn biết cách) hoặc liên hệ với quản trị viên hệ thống của bạn để được trợ giúp.

Tiếp theo, hãy thử tải phần mềm:

$ ./bake.py download

kết quả sẽ giống như sau:

>> Searching for system dependency setuptools - OK 
>> Searching for system dependency libgoocanvas2 - OK 
>> Searching for system dependency gi-cairo - OK 
>> Searching for system dependency pygobject - OK 
>> Searching for system dependency pygraphviz - OK 
>> Searching for system dependency python-dev - OK 
>> Searching for system dependency qt - OK 
>> Searching for system dependency g++ - OK 
>> Downloading pybindgen-0.19.0.post4+ng823d8b2 (target directory:pybindgen) - OK 
>> Downloading netanim-3.108 - OK 
>> Downloading ns-3.29 - OK

Điều này có nghĩa là ba nguồn đã được tải xuống. Bây giờ hãy vào thư mục nguồn và gõ ls; Bạn nên thấy:

$ cd source 
$ ls
netanim-3.108 ns-3.29 pybindgen

Bây giờ bạn đã sẵn sàng xây dựng bản phân phối ns-3.

3.4 Hội ns-3

Giống như việc tải xuống ns-3, có một số cách để xây dựng ns-3. Điều chính chúng tôi muốn nhấn mạnh là ns-3 được xây dựng bằng công cụ xây dựng có tên là Wafđược mô tả dưới đây. Hầu hết người dùng sẽ làm việc với Waf, nhưng có một số tập lệnh hữu ích giúp bạn bắt đầu hoặc sắp xếp các bản dựng phức tạp hơn. Vì vậy làm ơn, trước khi bạn đọc về Waf, hãy xem build.py và lắp ráp với nướng.

3.4.1 Tòa nhà với build.py

Cảnh báo! Bước xây dựng này chỉ có sẵn từ phiên bản lưu trữ nguồn thu được như mô tả ở trên; và không được tải xuống qua git hoặc nướng.

Khi làm việc với kho lưu trữ phát hành tập tin nénTrong ns-3-allinone Có một tập lệnh tiện dụng có thể giúp việc lắp ráp các thành phần trở nên dễ dàng hơn. Nó được gọi là build.py. Chương trình này sẽ thiết lập dự án cho bạn theo cách hữu ích nhất. Tuy nhiên, lưu ý rằng việc thiết lập và làm việc nâng cao hơn với ns-3 thường liên quan đến việc sử dụng hệ thống xây dựng riêng của ns-3, Waf, hệ thống này sẽ được giới thiệu sau trong hướng dẫn này.

Nếu bạn đã tải xuống bằng cách sử dụng tập tin nén, sau đó trong thư mục của bạn ~ / không gian làm việc một thư mục có tên giống như ns-allinone-3.29. Nhập theo chỉ dẫn:

$ ./build.py --enable-examples --enable-tests

Khi được gọi build.py Chúng tôi đã sử dụng các đối số dòng lệnh để xây dựng các ví dụ và thử nghiệm được sử dụng trong hướng dẫn này, những ví dụ này không được xây dựng theo mặc định trong ns-3. Theo mặc định, chương trình cũng xây dựng tất cả các mô-đun có sẵn. Sau đó, nếu muốn, bạn có thể xây dựng ns-3 mà không cần ví dụ và thử nghiệm, hoặc loại trừ các mô-đun không cần thiết cho công việc của bạn.

Bạn sẽ thấy rất nhiều thông báo đầu ra của trình biên dịch được hiển thị bởi tập lệnh khi nó xây dựng các phần khác nhau mà bạn đã tải. Đầu tiên, tập lệnh sẽ cố gắng xây dựng trình hoạt hình netanim, thì trình tạo liên kết pybindgen và cuối cùng là ns-3. Khi quá trình hoàn tất, bạn sẽ thấy như sau:

Waf: Leaving directory '/path/to/workspace/ns-allinone-3.29/ns-3.29/build'
'build' finished successfully (6m25.032s) 

Modules built:
antenna                aodv                     applications
bridge                 buildings                config-store
core                   csma                     csma-layout
dsdv                   dsr                      energy 
fd-net-device          flow-monitor             internet
internet-apps          lr-wpan                  lte
mesh                   mobility                 mpi
netanim (no Python)    network                  nix-vector-routing 
olsr                   point-to-point           point-to-point-layout 
propagation            sixlowpan                spectrum 
stats                  tap-bridge               test (no Python) 
topology-read          traffic-control          uan 
virtual-net-device     visualizer               wave 
wifi                   wimax 

Modules not built (see ns-3 tutorial for explanation):
brite                  click                    openflow 
Leaving directory ./ns-3.29

Trong ba dòng cuối cùng của danh sách, chúng ta thấy thông báo về các mô-đun chưa được xây dựng:

Modules not built (see ns-3 tutorial for explanation):
brite                     click

Điều này đơn giản có nghĩa là một số mô-đun ns-3 phụ thuộc vào thư viện bên ngoài có thể chưa được xây dựng hoặc chúng không bắt buộc phải được xây dựng cho cấu hình này. Điều này không có nghĩa là trình mô phỏng chưa được lắp ráp hoặc các mô-đun đã lắp ráp sẽ không hoạt động chính xác.

3.4.2 Xây dựng bằng Bake

Nếu bạn đã sử dụng Bake ở trên để lấy mã nguồn từ kho dự án, bạn có thể tiếp tục sử dụng nó để xây dựng ns-3. Quay số:

$ ./bake.py build

và bạn sẽ thấy một cái gì đó như:

>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK 
>> Building netanim-3.108 - OK 
>> Building ns-3.29 - OK

Chú giải công cụ: Bạn cũng có thể thực hiện cả bước tải xuống và bước xây dựng cùng một lúc bằng cách gọi "bake.py triển khai".

Việc lắp ráp tất cả các thành phần có thể thất bại nhưng việc lắp ráp sẽ tiếp tục nếu không cần đến một thành phần nào đó. Ví dụ: một vấn đề về tính di động gần đây là castxml có thể được lắp ráp bằng công cụ nướng không phải trên tất cả các nền tảng. Trong trường hợp này, một thông báo như thế này sẽ xuất hiện:

>> Building castxml - Problem 
> Problem: Optional dependency, module "castxml" failed
This may reduce the functionality of the final build.
However, bake will continue since "castxml" is not an essential dependency.
For more information call bake with -v or -vvv, for full verbose mode.

Nhưng castxml chỉ cần thiết nếu bạn muốn tạo các ràng buộc Python được cập nhật. Đối với hầu hết người dùng thì không cần điều này (ít nhất là cho đến khi họ thay đổi ns-3), vì vậy hiện tại những cảnh báo như vậy có thể được bỏ qua một cách an toàn.

Nếu thất bại, lệnh sau sẽ cho bạn gợi ý về các phần phụ thuộc bị thiếu:

$ ./bake.py show

Các phần phụ thuộc khác nhau của các gói bạn đang cố gắng xây dựng sẽ được liệt kê.

3.4.3 Xây dựng với Waf

Cho đến thời điểm này, để bắt đầu xây dựng ns-3, chúng tôi đã sử dụng tập lệnh build.py, hoặc công cụ nướng. Những công cụ này hữu ích cho việc xây dựng ns-3 và duy trì các thư viện. Trên thực tế, để xây dựng họ chạy công cụ xây dựng Waf từ thư mục ns-3. Waf được cài đặt với mã nguồn ns-3. Hầu hết người dùng nhanh chóng chuyển sang sử dụng trực tiếp để định cấu hình và lắp ráp ns‑3 Waf. Vì vậy, để tiếp tục, hãy vào thư mục ns-3 mà bạn đã tạo ban đầu.

Điều này không được yêu cầu nghiêm ngặt vào lúc này, nhưng sẽ rất hữu ích nếu bạn quay lại một chút và xem cách thực hiện các thay đổi đối với cấu hình dự án. Có lẽ thay đổi cấu hình hữu ích nhất mà bạn có thể thực hiện là tạo một phiên bản mã được tối ưu hóa. Theo mặc định, bạn đã định cấu hình dự án của mình để xây dựng phiên bản gỡ lỗi. Chúng ta hãy xem một dự án để tạo một bản dựng được tối ưu hóa. Để giải thích cho Waf rằng nó sẽ tạo các bản dựng được tối ưu hóa bao gồm các ví dụ và thử nghiệm, bạn sẽ cần chạy các lệnh sau:

$ ./waf clean 
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests

Điều này sẽ khởi chạy Waf bên ngoài thư mục cục bộ (để thuận tiện cho bạn). Lệnh đầu tiên dọn dẹp khỏi bản dựng trước, điều này thường không thực sự cần thiết nhưng đó là một cách thực hành tốt (xem thêm hồ sơ bản dựng bên dưới); thao tác này sẽ xóa các thư viện và tệp đối tượng đã tạo trước đó nằm trong thư mục xây dựng/. Khi dự án được cấu hình lại và hệ thống xây dựng kiểm tra các phần phụ thuộc khác nhau, bạn sẽ thấy kết quả tương tự như sau:

Setting top to      : /home/ns3user/workspace/bake/source/ns-3-dev
Setting out to      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Checking for 'gcc' (C compiler)        : /usr/bin/gcc 
Checking for cc version                : 7.3.0 
Checking for 'g++' (C++ compiler)      : /usr/bin/g++ 
Checking for compilation flag -march=native support : ok 
Checking for compilation flag -Wl,--soname=foo support : ok 
Checking for compilation flag -std=c++11 support       : ok 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking for program 'python'            : /usr/bin/python 
Checking for python version >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Asking python-config for pyembed '--cflags --libs --ldflags' flags : yes
Testing pyembed configuration                                      : yes
Asking python-config for pyext '--cflags --libs --ldflags' flags   : yes
Testing pyext configuration                                        : yes

Checking for compilation flag -fvisibility=hidden support          : ok 
Checking for compilation flag -Wno-array-bounds support            : ok 
Checking for pybindgen location          : ../pybindgen ,!(guessed) 
Checking for python module 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Checking for pybindgen version           : 0.19.0. ,!post4+g823d8b2 
Checking for code snippet                : yes 
Checking for types uint64_t and unsigned long equivalence : no 
Checking for code snippet                                 : no 
Checking for types uint64_t and unsigned long long equivalence     : yes 
Checking for the apidefs that can be used for Python bindings                       : gcc-LP64 
Checking for internal GCC cxxabi         : complete 
Checking for python module 'pygccxml'    : not found 
Checking for click location              : not found 
Checking for program 'pkg-config'        : /usr/bin/pkg- ,!config 
Checking for 'gtk+-3.0'                  : not found 
Checking for 'libxml-2.0'                : yes 
checking for uint128_t                   : not found 
checking for __uint128_t                 : yes 
Checking high precision implementation   : 128-bit integer ,!(default) 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found 
Checking for header sys/types.h          : yes 
Checking for header sys/stat.h           : yes 
Checking for header dirent.h             : yes 
Checking for header stdlib.h             : yes 
Checking for header signal.h             : yes 
Checking for header pthread.h            : yes 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found
Checking for library rt                  : yes 
Checking for header sys/ioctl.h          : yes 
Checking for header net/if.h             : yes 
Checking for header net/ethernet.h       : yes 
Checking for header linux/if_tun.h       : yes 
Checking for header netpacket/packet.h   : yes 
Checking for NSC location                : not found 
Checking for 'sqlite3'                   : not found 
Checking for header linux/if_tun.h       : yes 
Checking for python module 'gi'          : 3.26.1 
Checking for python module 'gi.repository.GObject'      : ok 
Checking for python module 'cairo'                      : ok 
Checking for python module 'pygraphviz'                 : 1.4rc1 
Checking for python module 'gi.repository.Gtk'          : ok 
Checking for python module 'gi.repository.Gdk'          : ok 
Checking for python module 'gi.repository.Pango'        : ok 
Checking for python module 'gi.repository.GooCanvas'    : ok 
Checking for program 'sudo'                             : /usr/bin/sudo 
Checking for program 'valgrind'                         : not found 
Checking for 'gsl' : not found python-config            : not found 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for program 'doxygen'                          : /usr/bin/doxygen
---- Summary of optional ns-3 features:
Build profile : optimized
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+-3.0 >= 3.0' not fou   nd)
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 : enabled 
Python API Scanning Support   : not enabled (Missing 'pygccxml' Python module)
Python Bindings : enabled 
Real Time Simulator           : enabled 
SQlite stats data output      : not enabled (library 'sqlite3' not found)
Tap Bridge                    : enabled 
Tap FdNetDevice               : enabled
Tests                         : enabled 
Threading Primitives          : enabled 
Use sudo to set suid bit   : not enabled (option --enable-sudo not selected)
XmlIo                         : enabled
'configure' finished successfully (6.387s)

Xin lưu ý phần cuối cùng của danh sách trên. Một số tùy chọn ns-3 không được bật theo mặc định hoặc yêu cầu hỗ trợ hệ thống để hoạt động bình thường. Ví dụ: để kích hoạt XmlTo thì thư viện phải có trên hệ thống libxml-2.0. Nếu không tìm thấy thư viện này và chức năng ns-3 tương ứng không được bật, một thông báo sẽ được hiển thị. Cũng lưu ý rằng có thể sử dụng lệnh sudo để đặt bit suid “đặt ID nhóm khi chạy” cho một số chương trình nhất định. Nó không được bật theo mặc định và do đó tính năng này xuất hiện dưới dạng “không được bật”. Cuối cùng, để có danh sách các tùy chọn đã bật, hãy sử dụng Waf với tham số --check-config.

Bây giờ chúng ta hãy quay lại và chuyển về bản dựng gỡ lỗi chứa các ví dụ và bài kiểm tra.

$ ./waf clean 
$ ./waf configure --build-profile=debug --enable-examples --enable-tests

Hệ thống xây dựng hiện đã được thiết lập và bạn có thể xây dựng các phiên bản gỡ lỗi của chương trình ns-3 bằng cách gõ:

$ ./waf

Các bước trên có thể đã buộc bạn phải xây dựng một phần của hệ thống ns-3 hai lần, nhưng bây giờ bạn đã biết cách thay đổi cấu hình và xây dựng mã được tối ưu hóa.

Để kiểm tra cấu hình nào đang hoạt động cho cấu hình dự án nhất định, có một lệnh:

$ ./waf --check-profile 
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build' 
Build profile: debug

Kịch bản trên build.py cũng hỗ trợ các đối số --enable-examples и --enable-tests, nhưng các lựa chọn khác Waf nó không hỗ trợ trực tiếp. Ví dụ: điều này sẽ không hoạt động:

$ ./build.py --disable-python

phản ứng sẽ như thế này:

build.py: error: no such option: --disable-python

Tuy nhiên, toán tử đặc biệt - - có thể được sử dụng để truyền các tham số bổ sung thông qua WAFvì vậy thay vì lệnh trên, lệnh sau sẽ hoạt động:

$ ./build.py -- --disable-python

bởi vì nó tạo ra lệnh chính ./waf cấu hình --disable-python. Dưới đây là một số lời khuyên giới thiệu thêm về Waf.

Xử lý lỗi xây dựng

Các bản phát hành ns-3 được thử nghiệm trên các trình biên dịch C++ mới nhất hiện có tại thời điểm phát hành trên các bản phân phối Linux và MacOS phổ biến. Tuy nhiên, theo thời gian, các bản phân phối mới được phát hành cùng với các trình biên dịch mới và các trình biên dịch mới hơn này có xu hướng mang tính mô phạm hơn về các cảnh báo. ns-3 định cấu hình bản dựng của nó để coi tất cả các cảnh báo là lỗi, vì vậy đôi khi nếu bạn đang chạy phiên bản cũ hơn trên hệ thống mới hơn, cảnh báo trình biên dịch có thể dừng quá trình xây dựng.

Ví dụ: trước đây đã có bản phát hành ns‑3.28 cho Fedora 28, bao gồm một phiên bản chính mới gcc (gcc-8). Xây dựng bản phát hành ns-3.28 hoặc các phiên bản cũ hơn trong Fedora 28, đã cài đặt Gtk2+, sẽ xảy ra lỗi sau:

/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);

Trong các bản phát hành bắt đầu từ ns‑3.28.1, trong Waf một lựa chọn có sẵn để giải quyết những vấn đề này. Nó vô hiệu hóa việc cài đặt cờ "-Werror" trong g++ và clang++. Đây là tùy chọn "--disable-werror" và phải được áp dụng trong quá trình định cấu hình:

$ ./waf configure --disable-werror --enable-examples --enable-tests

Cấu hình hoặc lắp ráp

Một số lệnh Waf chỉ có ý nghĩa trong giai đoạn cấu hình và một số chỉ có giá trị trong giai đoạn xây dựng. Ví dụ: nếu bạn muốn sử dụng các tính năng mô phỏng ns-3, bạn có thể bật cài đặt bit SUID sử dụng sudo, như đã mô tả ở trên. Điều này sẽ ghi đè các lệnh của bước cấu hình và do đó bạn có thể thay đổi cấu hình bằng lệnh sau, lệnh này cũng bao gồm các ví dụ và kiểm tra.

$ ./waf configure --enable-sudo --enable-examples --enable-tests

Nếu bạn làm điều này Waf Sẽ khởi chạy sudođể thay đổi các chương trình tạo ổ cắm mã mô phỏng để chạy với quyền nguồn gốc. Trong Waf Có nhiều tùy chọn khác có sẵn cho các bước cấu hình và xây dựng. Để khám phá các tùy chọn của bạn, hãy nhập:

$ ./waf --help

Trong phần tiếp theo, chúng tôi sẽ sử dụng một số tùy chọn liên quan đến thử nghiệm.

Hồ sơ hội

Chúng tôi đã thấy cách bạn có thể định cấu hình Waf cho hội đồng gỡ lỗi и tối ưu hóa:

$ ./waf --build-profile=debug

Ngoài ra còn có hồ sơ lắp ráp trung gian, phát hành. Lựa chọn -d đồng nghĩa với --build-profile. Cấu hình bản dựng kiểm soát việc sử dụng các công tắc ghi nhật ký, xác nhận và tối ưu hóa trình biên dịch:

hướng dẫn giả lập mạng ns-3. Chương 3

Như bạn có thể thấy, việc ghi nhật ký và xác nhận chỉ có sẵn trong các bản dựng gỡ lỗi. Phương pháp được đề xuất là phát triển tập lệnh của bạn ở chế độ gỡ lỗi, sau đó thực hiện các lần chạy lặp lại (để thống kê hoặc thay đổi tham số) trong cấu hình bản dựng được tối ưu hóa.

Nếu bạn có mã chỉ nên chạy trong một số cấu hình bản dựng nhất định, hãy sử dụng Macro Trình bao bọc Mã:

NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)

Mặc định, Waf đặt các tạo phẩm xây dựng trong thư mục xây dựng. Bạn có thể chỉ định một thư mục đầu ra khác bằng cách sử dụng tùy chọn - -out, ví dụ:

$ ./waf configure --out=my-build-dir

Bằng cách kết hợp điều này với cấu hình bản dựng, bạn có thể dễ dàng chuyển đổi giữa các tùy chọn biên dịch khác nhau:

$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
... 
$ ./waf configure --build-profile=optimized --out=build/optimized 
$ ./waf build
...

Điều này cho phép bạn làm việc với nhiều cụm mà không cần phải viết lại cụm mới nhất mỗi lần. Khi bạn chuyển sang hồ sơ khác, Waf sẽ chỉ biên dịch nó mà không biên dịch lại hoàn toàn mọi thứ.

Khi chuyển đổi cấu hình bản dựng theo cách này, bạn cần cẩn thận đưa ra các tùy chọn cấu hình giống nhau mỗi lần. Việc xác định một số biến môi trường sẽ giúp bạn tránh được những sai lầm:

$ export NS3CONFIG="--enable-examples --enable-tests" 
$ export NS3DEBUG="--build-profile=debug --out=build/debug"
$ export NS3OPT=="--build-profile=optimized --out=build/optimized" 

$ ./waf configure $NS3CONFIG $NS3DEBUG
$ ./waf build 
... 
$ ./waf configure $NS3CONFIG $NS3OPT
$ ./waf build

Trình biên dịch và cờ

Trong các ví dụ trên Waf để xây dựng ns-3 sử dụng trình biên dịch C++ từ GCC ( g ++). Tuy nhiên, bạn có thể thay đổi cái bạn sử dụng Waf Trình biên dịch C++, bằng cách xác định biến môi trường CXX. Ví dụ: để sử dụng trình biên dịch C++ Clang, clang++,

$ CXX="clang++" ./waf configure 
$ ./waf build 

Tương tự như vậy, bạn có thể cấu hình Waf để sử dụng trình biên dịch phân tán bằng cách sử dụng ditcc:

$ CXX="distcc g++" ./waf configure 
$ ./waf build

Thông tin thêm về distcc và biên dịch phân tán có thể được tìm thấy trên trang dự án trong phần Tài liệu. Để thêm cờ trình biên dịch khi định cấu hình ns-3, hãy sử dụng biến môi trường CXXFLAGS_EXTRA.

Cài đặt

Waf có thể được sử dụng để cài đặt thư viện ở những nơi khác nhau trên hệ thống. Theo mặc định, các thư viện đã biên dịch và các tệp thực thi được đặt trong thư mục xây dựngvà vì Waf biết vị trí của các thư viện và tệp thực thi này nên không cần phải cài đặt thư viện ở bất kỳ nơi nào khác.

Nếu người dùng thích cài đặt bên ngoài thư mục build, họ có thể chạy lệnh ./waf cài đặt. Tiền tố mặc định để cài đặt là / usr / localVì vậy, ./waf cài đặt sẽ cài đặt các chương trình trong / usr / local / bin, thư viện ở / Usr / local / lib và các tập tin tiêu đề trong / usr / local / bao gồm. Quyền siêu người dùng thường cần được đặt bằng tiền tố mặc định, vì vậy một lệnh thông thường sẽ là cài đặt sudo ./waf. Khi khởi chạy, trước tiên Waf sẽ chọn sử dụng các thư viện dùng chung trong thư mục bản dựng, sau đó tìm kiếm các thư viện dọc theo đường dẫn đến các thư viện được định cấu hình trong môi trường cục bộ. Vì vậy, khi cài đặt thư viện trên hệ thống, bạn nên kiểm tra xem có đang sử dụng đúng thư viện hay không. Người dùng có thể chọn cài đặt với tiền tố khác bằng cách chuyển tùy chọn trong khi cấu hình --prefix, ví dụ:

./waf configure --prefix=/opt/local

Nếu sau này, sau khi build người dùng nhập lệnh cài đặt ./waf, tiền tố sẽ được sử dụng / opt / local.

Đội ./waf clean phải được sử dụng trước khi cấu hình lại dự án nếu quá trình cài đặt sẽ sử dụng Waf dưới một tiền tố khác.

Vì vậy, để sử dụng ns-3 không cần phải gọi ./waf install. Hầu hết người dùng sẽ không cần lệnh này vì Waf sẽ lấy các thư viện hiện tại từ thư mục build, nhưng một số người dùng có thể thấy điều này hữu ích nếu hoạt động của họ liên quan đến việc làm việc với các chương trình bên ngoài thư mục ns-3.

waf đơn

Ở cấp cao nhất của cây nguồn ns-3, chỉ có một tập lệnh Waf. Khi bắt đầu làm việc, bạn sẽ dành nhiều thời gian cho thư mục scratch/ hoặc sâu hơn vàosrc/... và đồng thời phải chạy Waf. Bạn chỉ cần nhớ mình đang ở đâu và chạy Waf như sau:

$ ../../../waf ...

nhưng điều này sẽ tẻ nhạt và dễ xảy ra lỗi, vì vậy có những giải pháp tốt hơn. Một cách phổ biến là sử dụng trình soạn thảo văn bản như emacs hoặc khí lực, trong đó hai phiên cuối được mở, một phiên dùng để xây dựng ns-3 và phiên thứ hai dùng để chỉnh sửa mã nguồn. Nếu bạn chỉ có tập tin nén, thì một biến môi trường có thể giúp:

$ export NS3DIR="$PWD" 
$ function waff { cd $NS3DIR && ./waf $* ; } 

$ cd scratch 
$ waff build

Trong thư mục mô-đun, có thể bạn nên thêm một tập lệnh waf tầm thường như exec ../../waf. Xin đừng làm điều đó. Điều này gây nhầm lẫn cho người mới và khi thực hiện kém sẽ dẫn đến các lỗi xây dựng khó phát hiện. Các giải pháp trình bày ở trên là con đường nên được sử dụng.

3.5 Kiểm tra ns-3

Bạn có thể chạy thử nghiệm đơn vị của bản phân phối ns-3 bằng cách chạy tập lệnh ./test.py:

$ ./test.py

Các thử nghiệm này được thực hiện song song với Waf. Cuối cùng, bạn sẽ thấy một thông báo cho biết:

92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Đây là thông báo quan trọng để xác định sự cố, sự cố hoặc lỗi valgrind, cho biết sự cố với mã hoặc sự không tương thích giữa các công cụ và mã.

Bạn cũng sẽ thấy đầu ra cuối cùng từ Waf và một người thử nghiệm đang chạy từng thử nghiệm, nó sẽ trông giống như thế này:

Waf: Entering directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
Waf: Leaving directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
'build' finished successfully (1.799s) 

Modules built:
aodv           applications          bridge
click          config-store          core
csma           csma-layout           dsdv
emu            energy                flow-monitor
internet       lte                   mesh
mobility       mpi                   netanim
network        nix-vector-routing    ns3tcp
ns3wifi        olsr                  openflow
point-to-point point-to-point-layout propagation
spectrum       stats                 tap-bridge
template       test                  tools
topology-read  uan                   virtual-net-device
visualizer     wifi                  wimax

PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram 

...

PASS: TestSuite object
PASS: TestSuite random-number-generators
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Lệnh này thường được người dùng chạy để nhanh chóng xác minh rằng bản phân phối ns-3 được xây dựng chính xác. (Lưu ý rằng thứ tự các dòng "PASS: ..." có thể khác nhau, điều này là bình thường. Điều quan trọng là dòng tóm tắt ở cuối báo cáo cho thấy tất cả các bài kiểm tra đều đạt; không có bài kiểm tra nào thất bại hoặc bị hỏng.) Và Waftest.py sẽ song song hóa công việc trên các lõi xử lý có sẵn của máy.

3.6 Chạy tập lệnh

Chúng tôi thường chạy các tập lệnh dưới sự kiểm soát Waf. Điều này cho phép hệ thống xây dựng đảm bảo rằng các đường dẫn thư viện dùng chung được đặt chính xác và các thư viện có sẵn trong thời gian chạy. Để chạy chương trình, chỉ cần sử dụng Waf với tham số - -run. Hãy chạy ns-3 tương đương với chương trình phổ biến hello thế giớibằng cách gõ như sau:

$ ./waf --run hello-simulator

Trước tiên, Waf sẽ kiểm tra xem chương trình đã được xây dựng chính xác chưa và xây dựng nếu cần thiết. Sau đó Waf sẽ thực hiện một chương trình tạo ra kết quả sau.

Hello Simulator

Chúc mừng! Bây giờ bạn là người dùng ns-3!

Tôi nên làm gì nếu không thấy kết quả?

Nếu bạn thấy tin nhắn Wafcho biết quá trình xây dựng đã hoàn tất thành công nhưng bạn không thấy kết quả "Xin chào Trình mô phỏng", thì có khả năng là trong phần [Build-with-Waf] bạn đã chuyển chế độ xây dựng của mình sang tối ưu hóa, nhưng lỡ chuyển về chế độ gỡ lỗi. Tất cả đầu ra của bàn điều khiển được sử dụng trong hướng dẫn này đều sử dụng thành phần ns-3 đặc biệt để thực hiện ghi nhật ký và được dùng để in các thông báo tùy chỉnh tới bàn điều khiển. Đầu ra từ thành phần này sẽ tự động bị tắt khi mã được tối ưu hóa được biên dịch - nó được "tối ưu hóa". Nếu bạn không thấy đầu ra "Hello Simulator", hãy nhập thông tin sau:

$ ./waf configure --build-profile=debug --enable-examples --enable-tests

để tùy chỉnh Waf để xây dựng các phiên bản gỡ lỗi của chương trình ns-3, bao gồm các ví dụ và thử nghiệm. Sau đó, bạn nên xây dựng lại phiên bản gỡ lỗi hiện tại của mã bằng cách nhập

$ ./waf

Bây giờ nếu bạn chạy chương trình xin chào-mô phỏng, bạn sẽ thấy kết quả mong đợi.

3.6.1 Đối số dòng lệnh

Để truyền các đối số dòng lệnh cho chương trình ns-3, hãy sử dụng mẫu sau:

$ ./waf --run <ns3-program> --command-template="%s <args>"

Thay thế vào tên chương trình của bạn và các đối số. Lý lẽ - -command-template cho Waf về cơ bản là một công thức để xây dựng dòng lệnh thực tế Waf dùng để thực thi chương trình. Waf kiểm tra xem bản dựng đã hoàn tất chưa, đặt đường dẫn thư viện dùng chung, sau đó sử dụng mẫu dòng lệnh được cung cấp và thay thế tên chương trình cho trình giữ chỗ %s để gọi tệp thực thi. Nếu bạn thấy cú pháp này phức tạp thì có một phiên bản đơn giản hơn bao gồm chương trình ns-3 và các đối số của nó được đặt trong dấu ngoặc đơn:

$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'

Một ví dụ đặc biệt hữu ích khác là chạy các bộ thử nghiệm một cách có chọn lọc. Giả sử có một bộ thử nghiệm tên là mytest (thực tế là không có). Ở trên, chúng tôi đã sử dụng tập lệnh ./test.py để chạy song song một số thử nghiệm, lệnh này liên tục gọi chương trình thử nghiệm người chạy thử nghiệm. Gọi người chạy thử nghiệm trực tiếp để chạy một bài kiểm tra:

$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"

Các đối số sẽ được truyền vào chương trình người chạy thử nghiệm. Vì mytest không tồn tại nên thông báo lỗi sẽ được tạo ra. Để in các tùy chọn chạy thử có sẵn, hãy nhập:

$ ./waf --run test-runner --command-template="%s --help"

3.6.2 Gỡ lỗi

Để chạy các chương trình ns-3 dưới một tiện ích khác, chẳng hạn như trình gỡ lỗi (ví dụ: gdb) hoặc công cụ kiểm tra bộ nhớ (ví dụ: valgrind), sử dụng dạng tương tự - -command-template = "…". Ví dụ: để chạy trong trình gỡ lỗi gdb chương trình mô phỏng xin chào ns-3 của bạn với các đối số:

$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"

Lưu ý rằng tên chương trình ns-3 đi kèm với đối số - -runvà tiện ích quản lý (ở đây gdb) là mã thông báo đầu tiên trong đối số - -command-template. Lựa chọn - -args báo cáo gdbrằng phần còn lại của dòng lệnh thuộc về chương trình "thấp hơn". (Một số phiên bản gdb không hiểu lựa chọn - -args. Trong trường hợp này, hãy xóa các đối số chương trình khỏi - -command-template và sử dụng bộ lệnh gdb args..) Chúng ta có thể kết hợp công thức này và công thức trước đó để chạy thử nghiệm trong trình gỡ lỗi:

$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"

3.6.3 Thư mục làm việc

Waf nên được khởi chạy từ vị trí của nó ở đầu cây ns-3. Thư mục này trở thành thư mục làm việc nơi các tập tin đầu ra sẽ được ghi. Nhưng nếu bạn muốn giữ những tập tin này bên ngoài cây nguồn ns-3 thì sao? Sử dụng đối số - -cwd:

$ ./waf --cwd=...

Bạn có thể thấy thuận tiện hơn khi lấy các tập tin đầu ra trong thư mục làm việc của mình. Trong trường hợp này, hành động gián tiếp sau đây có thể giúp ích:

$ function waff {
CWD="$PWD" 
cd $NS3DIR >/dev/null 
./waf --cwd="$CWD" $*
cd - >/dev/null 
}

Việc trang trí phiên bản trước của lệnh này sẽ bảo tồn thư mục làm việc hiện tại, chuyển đến thư mục Wafrồi hướng dẫn Waf để thay đổi thư mục làm việc trở lại thư mục làm việc hiện tại đã được lưu trước khi bắt đầu chương trình. Chúng tôi đề cập đến đội - -cwd Để hoàn thiện, hầu hết người dùng chỉ cần chạy Waf từ thư mục cấp cao nhất và tạo các tệp đầu ra ở đó.

Tiếp theo: Chương 4

Nguồn: www.habr.com

Thêm một lời nhận xét