Getting Started
===============

## Installation
Please see [INSTALL.md](../INSTALL.md) for instructions on installing Mini-NDN and its dependencies.

## Running Mini-NDN

To run Mini-NDN with the default topology, `ndn_utils/topologies/default-topology.conf`, type:

    sudo minindn

A full list of options can be printed by using:

    sudo minindn --help

To run Mini-NDN with a topology file, provide the filename as the first argument:

    sudo minindn my-topology.conf

During set up, the list of nodes in the network will be listed as they are initialized:

    *** Adding hosts:
    a b c d

After set up, the command-line interface (CLI) will display a prompt.

    mini-ndn>

To interact with a node, first type the node's name and then the command to be executed:

    mini-ndn> a echo "Hello, world!"
    Hello, world!

To see the status of the forwarder on the node:

    mini-ndn> a nfdc status report

To see the status of routing on the node:

    mini-ndn> a nlsrc status

To exit Mini-NDN, type `quit` in the CLI:

    mini-ndn> quit

Another option to quit Mini-NDN is sending a SIGQUIT (ctrl+\). SIGINT (ctrl+c)
is reserved for the purpose of stopping applications initiated on the minindn command
line.

For a more in depth explanation of the CLI, please see the
[Mininet Walkthrough](http://mininet.org/walkthrough/).

## Command-line options

To run Mini-NDN with a replica of the NDN testbed, use the `--testbed` parameter:

    sudo minindn --testbed

To change the working directory from default `/tmp/minindn` following option can be used:

    sudo minindn --work-dir /home/mydir/test

#### Routing options

To run minindn without NLSR, use the `--no-nlsr` parameter:

    sudo minindn --no-nlsr

To run NLSR with hyperbolic routing enabled, use the `--routing` parameter:

    sudo minindn --routing hr

Topology files given under ndn_utils/topologies/minindn* have hyperbolic coordinates configured
and can be used with this option.

To run NLSR in dry-run mode, use the `--routing` parameter:

    sudo minindn --routing dry

To configure the max number of faces added by NLSR to reach each name prefix, use the `--faces`
parameter:

    sudo minindn --faces 3

`--faces` can be an integer from 0 to 60; 0 indicates NLSR can add all available faces.

To run Mini-NDN with NLSR security configured

    sudo minindn --nlsr-security

## Working Directory Structure

Currently Mini-NDN uses /tmp/minindn as the working directory if not specified otherwise by using
the option --work-dir.

Each node is given a HOME directory under /tmp/minindn/node-name
where node-name is the name of the node specified in the [nodes] section of the conf file.

### NFD
NFD conf file is stored at `/tmp/minindn/node-name/node-name.conf`

NFD log file is stored at `/tmp/minindn/node-name/node-name.log`

`.ndn` folder is stored at `/tmp/minindn/node-name/.ndn`

### NLSR
NLSR conf file is stored at `/tmp/minindn/node-name/nlsr.conf`

NLSR log file is stored at `/tmp/minindn/node-name/log/nlsr.log`

When security is enabled, NLSR security certificates are stored in: `/tmp/minindn/node-name/security`
Note that no NLSR publishes the root certificate, Mini-NDN installs root.cert in security folder for each NLSR.
