From 2176fcc5a3fe08b51eee800007235cb26cf367ea Mon Sep 17 00:00:00 2001 From: Blake Harnden <32446120+bharnden@users.noreply.github.com> Date: Mon, 5 Jun 2023 13:57:06 -0700 Subject: [PATCH] docs: adding tutorial 7 --- docs/static/tutorial7/scenario.png | Bin 0 -> 51422 bytes docs/tutorials/tutorial7.md | 236 ++++++++++++++++++ mkdocs.yml | 1 + .../examples/tutorials/tutorial7/scenario.py | 52 ++++ .../examples/tutorials/tutorial7/scenario.xml | 90 +++++++ .../tutorials/tutorial7/scenario_service.py | 53 ++++ .../tutorials/tutorial7/scenario_service.xml | 91 +++++++ 7 files changed, 523 insertions(+) create mode 100644 docs/static/tutorial7/scenario.png create mode 100644 docs/tutorials/tutorial7.md create mode 100644 package/examples/tutorials/tutorial7/scenario.py create mode 100644 package/examples/tutorials/tutorial7/scenario.xml create mode 100644 package/examples/tutorials/tutorial7/scenario_service.py create mode 100644 package/examples/tutorials/tutorial7/scenario_service.xml diff --git a/docs/static/tutorial7/scenario.png b/docs/static/tutorial7/scenario.png new file mode 100644 index 0000000000000000000000000000000000000000..1c677aa339468cac652ac0ce0bf26822f4c92944 GIT binary patch literal 51422 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 + +

+ +For more detailed information on EMANE see the following: + +* [EMANE in CORE](../emane.md) +* [EMANE Wiki](https://github.com/adjacentlink/emane/wiki) + +## Files + +Below is a list of the files used for this tutorial. + +* 2 node EMANE ieee80211abg scenario + * scenario.xml + * scenario.py +* 2 node EMANE ieee80211abg scenario, with **n2** running the "Chat App Server" service + * scenario_service.xml + * scenario_service.py + +## Running this Tutorial + +This section covers interactions that can be carried out for this scenario. + +Our scenario has the following nodes and addresses: + +* emane1 - no address, this is a representative node for the EMANE network +* n2 - 10.0.0.1 +* n3 - 10.0.0.2 + +All usages below assume a clean scenario start. + +### Using Ping + +Using the command line utility **ping** can be a good way to verify connectivity +between nodes in CORE. + +* Make sure the CORE daemon is running a terminal, if not already + ``` shell + sudop core-daemon + ``` +* In another terminal run the GUI + ``` shell + core-gui + ``` +* In the GUI menu bar select **File->Open...**, then navigate to and select **scenario.xml** +

+ +

+* You can now click on the **Start Session** button to run the scenario +

+ +

+* Open a terminal on **n2** by double clicking it in the GUI +* Run the following in **n2** terminal + ``` shell + ping -c 3 10.0.0.2 + ``` +* You should see the following output + ``` shell + PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. + 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=7.93 ms + 64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=3.07 ms + 64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=3.05 ms + + --- 10.0.0.2 ping statistics --- + 3 packets transmitted, 3 received, 0% packet loss, time 2000ms + rtt min/avg/max/mdev = 3.049/4.685/7.932/2.295 ms + ``` + +### Using Tcpdump + +Using **tcpdump** can be very beneficial for examining a network. You can verify +traffic being sent/received among many other uses. + +* Make sure the CORE daemon is running a terminal, if not already + ``` shell + sudop core-daemon + ``` +* In another terminal run the GUI + ``` shell + core-gui + ``` +* In the GUI menu bar select **File->Open...**, then navigate to and select **scenario.xml** +

+ +

+* You can now click on the **Start Session** button to run the scenario +

+ +

+* Open a terminal on **n2** by double clicking it in the GUI +* Open a terminal on **n3** by double clicking it in the GUI +* Run the following in **n3** terminal + ``` shell + tcpdump -lenni eth0 + ``` +* Run the following in **n2** terminal + ``` shell + ping -c 1 10.0.0.2 + ``` +* You should see the following in **n2** terminal + ``` shell + tcpdump: verbose output suppressed, use -v[v]... for full protocol decode + listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes + 14:56:25.414283 02:02:00:00:00:01 > 02:02:00:00:00:02, ethertype IPv4 (0x0800), length 98: 10.0.0.1 > 10.0.0.2: ICMP echo request, id 64832, seq 1, length 64 + 14:56:25.414303 02:02:00:00:00:02 > 02:02:00:00:00:01, ethertype IPv4 (0x0800), length 98: 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 64832, seq 1, length 64 + ``` + +### Running Software + +We will now leverage the installed Chat App software to stand up a server and client +within the nodes of our scenario. + +* Make sure the CORE daemon is running a terminal, if not already + ``` shell + sudop core-daemon + ``` +* In another terminal run the GUI + ``` shell + core-gui + ``` +* In the GUI menu bar select **File->Open...**, then navigate to and select **scenario.xml** +

+ +

+* You can now click on the **Start Session** button to run the scenario +

+ +

+* Open a terminal on **n2** by double clicking it in the GUI +* Run the following in **n2** terminal + ``` shell + export PATH=$PATH:/usr/local/bin + chatapp-server + ``` +* Open a terminal on **n3** by double clicking it in the GUI +* Run the following in **n3** terminal + ``` shell + export PATH=$PATH:/usr/local/bin + chatapp-client -a 10.0.0.1 + ``` +* You will see the following output in **n1** terminal + ``` shell + chat server listening on: :9001 + [server] 10.0.0.1:44362 joining + ``` +* Type the following in **n2** terminal and hit enter + ``` shell + hello world + ``` +* You will see the following output in **n1** terminal + ``` shell + chat server listening on: :9001 + [server] 10.0.0.2:44362 joining + [10.0.0.2:44362] hello world + ``` + +### Tailing a Log + +In this case we are using the service based scenario. This will automatically start +and run the Chat App Server on **n2** and log to a file. This case will demonstrate +using `tail -f` to observe the output of running software. + +* Make sure the CORE daemon is running a terminal, if not already + ``` shell + sudop core-daemon + ``` +* In another terminal run the GUI + ``` shell + core-gui + ``` +* In the GUI menu bar select **File->Open...**, then navigate to and select **scenario_service.xml** +

+ +

+* You can now click on the **Start Session** button to run the scenario +

+ +

+* Open a terminal on **n2** by double clicking it in the GUI +* Run the following in **n2** terminal + ``` shell + tail -f chatapp.log + ``` +* Open a terminal on **n3** by double clicking it in the GUI +* Run the following in **n3** terminal + ``` shell + export PATH=$PATH:/usr/local/bin + chatapp-client -a 10.0.0.1 + ``` +* You will see the following output in **n2** terminal + ``` shell + chat server listening on: :9001 + [server] 10.0.0.2:44362 joining + ``` +* Type the following in **n3** terminal and hit enter + ``` shell + hello world + ``` +* You will see the following output in **n2** terminal + ``` shell + chat server listening on: :9001 + [server] 10.0.0.2:44362 joining + [10.0.0.2:44362] hello world + ``` + +## Advanced Topics + +This section will cover some high level topics and examples for running and +using EMANE in CORE. You can find more detailed tutorials and examples at +the [EMANE Tutorial](https://github.com/adjacentlink/emane-tutorial/wiki). + +!!! note + + Every topic below assumes CORE, EMANE, and OSPF MDR have been installed. + + Scenario files to support the EMANE topics below will be found in + the GUI default directory for opening XML files. + +| Topic | Model | Description | +|-----------------------------------------|---------|-----------------------------------------------------------| +| [XML Files](../emane/files.md) | RF Pipe | Overview of generated XML files used to drive EMANE | +| [GPSD](../emane/gpsd.md) | RF Pipe | Overview of running and integrating gpsd with EMANE | +| [Precomputed](../emane/precomputed.md) | RF Pipe | Overview of using the precomputed propagation model | +| [EEL](../emane/eel.md) | RF Pipe | Overview of using the Emulation Event Log (EEL) Generator | +| [Antenna Profiles](../emane/antenna.md) | RF Pipe | Overview of using antenna profiles in EMANE | + +--8<-- "tutorials/common/grpc.md" diff --git a/mkdocs.yml b/mkdocs.yml index 74bfd331..4879e09e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -42,6 +42,7 @@ nav: - Setup: tutorials/setup.md - Tutorial 1: tutorials/tutorial1.md - Tutorial 4: tutorials/tutorial4.md + - Tutorial 7: tutorials/tutorial7.md - Detailed Topics: - GUI: gui.md - Node Types: diff --git a/package/examples/tutorials/tutorial7/scenario.py b/package/examples/tutorials/tutorial7/scenario.py new file mode 100644 index 00000000..6c4125ed --- /dev/null +++ b/package/examples/tutorials/tutorial7/scenario.py @@ -0,0 +1,52 @@ +from core.api.grpc import client +from core.api.grpc.wrappers import Position, Interface, NodeType +from core.emane.models.ieee80211abg import EmaneIeee80211abgModel + + +def main(): + # interface helper + iface_helper = client.InterfaceHelper(ip4_prefix="10.0.0.0/24", ip6_prefix="2001::/64") + + # create grpc client and connect + core = client.CoreGrpcClient() + core.connect() + + # create session + session = core.create_session() + + # create nodes + position = Position(x=375, y=500) + emane_net = session.add_node( + _id=1, + _type=NodeType.EMANE, + name="emane1", + position=position, + emane=EmaneIeee80211abgModel.name + ) + position = Position(x=250, y=250) + node2 = session.add_node(_id=2, model="mdr", name="n2", position=position) + position = Position(x=500, y=250) + node3 = session.add_node(_id=3, model="mdr", name="n3", position=position) + + # create links to emane + node2_iface = iface_helper.create_iface(node_id=node2.id, iface_id=0) + node2_iface.ip4 = "10.0.0.1" + node2_iface.ip4_mask = 32 + node2_iface.ip6 = "2001::1" + node2_iface.ip6_mask = 128 + # emane_iface1 = Interface(id=0) + session.add_link(node1=node2, node2=emane_net, iface1=node2_iface) + node3_iface = iface_helper.create_iface(node_id=node3.id, iface_id=0) + node3_iface.ip4 = "10.0.0.2" + node3_iface.ip4_mask = 32 + node3_iface.ip6 = "2001::2" + node3_iface.ip6_mask = 128 + # emane_iface2 = Interface(id=1) + session.add_link(node1=node3, node2=emane_net, iface1=node3_iface) + + # start session + core.start_session(session=session) + + +if __name__ == "__main__": + main() diff --git a/package/examples/tutorials/tutorial7/scenario.xml b/package/examples/tutorials/tutorial7/scenario.xml new file mode 100644 index 00000000..721a7b8f --- /dev/null +++ b/package/examples/tutorials/tutorial7/scenario.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package/examples/tutorials/tutorial7/scenario_service.py b/package/examples/tutorials/tutorial7/scenario_service.py new file mode 100644 index 00000000..1f8b0f72 --- /dev/null +++ b/package/examples/tutorials/tutorial7/scenario_service.py @@ -0,0 +1,53 @@ +from core.api.grpc import client +from core.api.grpc.wrappers import Position, Interface, NodeType +from core.emane.models.ieee80211abg import EmaneIeee80211abgModel + + +def main(): + # interface helper + iface_helper = client.InterfaceHelper(ip4_prefix="10.0.0.0/24", ip6_prefix="2001::/64") + + # create grpc client and connect + core = client.CoreGrpcClient() + core.connect() + + # create session + session = core.create_session() + + # create nodes + position = Position(x=375, y=500) + emane_net = session.add_node( + _id=1, + _type=NodeType.EMANE, + name="emane1", + position=position, + emane=EmaneIeee80211abgModel.name + ) + position = Position(x=250, y=250) + node2 = session.add_node(_id=2, model="mdr", name="n2", position=position) + node2.config_services.add("ChatApp Server") + position = Position(x=500, y=250) + node3 = session.add_node(_id=3, model="mdr", name="n3", position=position) + + # create links to emane + node2_iface = iface_helper.create_iface(node_id=node2.id, iface_id=0) + node2_iface.ip4 = "10.0.0.1" + node2_iface.ip4_mask = 32 + node2_iface.ip6 = "2001::1" + node2_iface.ip6_mask = 128 + # emane_iface1 = Interface(id=0) + session.add_link(node1=node2, node2=emane_net, iface1=node2_iface) + node3_iface = iface_helper.create_iface(node_id=node3.id, iface_id=0) + node3_iface.ip4 = "10.0.0.2" + node3_iface.ip4_mask = 32 + node3_iface.ip6 = "2001::2" + node3_iface.ip6_mask = 128 + # emane_iface2 = Interface(id=1) + session.add_link(node1=node3, node2=emane_net, iface1=node3_iface) + + # start session + core.start_session(session=session) + + +if __name__ == "__main__": + main() diff --git a/package/examples/tutorials/tutorial7/scenario_service.xml b/package/examples/tutorials/tutorial7/scenario_service.xml new file mode 100644 index 00000000..da2cb8e8 --- /dev/null +++ b/package/examples/tutorials/tutorial7/scenario_service.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +