# Hardware-In-the-Loop (HIL) network simulation for supporting electrical power grid sub-stations
This is the NS3 applications from my master thesis that were made in the spring of 2021. The master thesis developed a working verison of DPDK enhanced ns-3, capable of supporting multiple NIC.
____
Alterations to the source code are made in the folder “/ns-3.33/src/fd-net-device/” to:
dpdk-net-device.cc/.h
dpdk-net-device-helper.cc/.h
fd-net-device.cc/.h
fd-net-device-helper.cc/.h
____
## Setting the Ubuntu Environment
The OS used in the thesis was Ubuntu 20.04.
1. First download this repository to your Ubuntu computer. It contain altered ns-3.33.
2. Install DPDK by using the apt-get command below.
* DPDK version used in the thesis was 20.11, so to prevent any compatibility issue, I recomend using that version.
* DPDK can manually be downloaded from [Downloads](https://core.dpdk.org/download/)
* Check that your NIC is supported by DPDK [Supported HW](https://core.dpdk.org/supported/)
```js
sudoapt-getinstalldpdk
```
* Make sure you can run the following from the commandline terminal:
```js
sudodpdk-devbind
```
* If not, add the dpdk commands to path.
3. Alter the GRUB bootloader configuration file to enable hugepages and set driver parameters. The alteration is made by changing the GRUB_CMDLINE_LINUX_DEFAULT parameter in the file “/etc/default/grub”. The provided parameter is my entire parameter setting.
* "maybe-ubiquity" was present by default.
* The hugepages set 1GB hugepage by default and enables 1 hugepage. Tests showed that the application only used 1 hugepage. Set more if needed, but the more you set the more memory will be unavailable by your OS.
**iommu* parameters are for enabling the vfio-pci (and uio_igb if wanted) driver that was used by DPDK in the thesis.
**isolcpus* isolate logical cpu cores and prevents the OS from using the logical cores. Add the cores you would like to use in your application here. The thesis used logical cores 4, 5, 10 and 11 that was used to run the DPDK application on.
* Hopefully ns-3 is able to be built. If not, please refer to [ns-3 Installation guide](https://www.nsnam.org/docs/release/3.33/tutorial/html/getting-started.html)
4. Try to run a sample ns-3 application with:
```js
sudo./waf--runfirst
```
## Running DpdkOneNode
**The examples from the thesis are located in /ns-3.33/scratch/**
The simulation used in the thesis was dpdkOneNode.cc
1. To run dpdkOneNode some parameters might need to be changed:
* dpdkDriver: refer to the PCI-address of your NIC to be used in the simulation
* lCorelist: Should be the same as you chose to isolate in the GRUB parameter *isolcpus* as it tells the DPDK what cores to use in te simulation
* firstLCore: Sets the logical core of the first NIC you would like to handle incoming traffic on. Must be part of lCorelist.
* secLCore: Sets the logical core of the second NIC you would like to handle incoming traffic on. Must be part of lCorelist.
2. The dpdkOneNode accept input parameter
* pcap: Boolean if you want to write pcap files from the node in the simulation to file
* routeTable: Boolean if you want to write routing table of the node to file.
* runTime: Sets how long you would like the simulation to run in seconds.
3. Example of running dpdkOneNode for 30 seconds, writing both pcap and routing tables to file: