zephyr/samples/net/rpl_border_router
Leandro Pereira 7cfd5a4184 samples: net: hrpl_border_router: Fix NULL pointer dereference
Null-checking `pkt` before making a call to net_pkt_unref() suggests
that it might be NULL, but the pointer is dereferenced before it's
checked.  Perform the check at the beginning of the function and
dereference and drop its reference unconditionally afterwards.

Coverity-ID: 178789
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
2018-06-08 13:07:19 -05:00
..
src samples: net: hrpl_border_router: Fix NULL pointer dereference 2018-06-08 13:07:19 -05:00
CMakeLists.txt
README.rst
prj_frdm_k64f_mcr20a.conf
sample.yaml

README.rst

.. _rpl-border-router-sample:

RPL Border Router
#################

Overview
********

The RPL border router sample application for Zephyr provides a HTTP(S) server
and net shell for management purposes. Typically border router would be used to
connect to IEEE 802.15.4 network but Bluetooth IPSP network functionality is
also possible.

The source code for this sample application can be found at:
:file:`samples/net/rpl_border_router`.

Requirements
************

- Real device like Freedom Board (FRDM-K64F) with MCR20A IEEE 802.15.4 support.
- Linux machine with web browser and the screen terminal emulator (optional).
- Ethernet access for management purposes (optional).

Note that there is no support for running an RPL border router in QEMU, as the
border router requires access to a real radio network technology such as
IEEE 802.15.4, which is not available in QEMU.

For testing purposes you can compile the RPL border router for QEMU and do some
testing with the web UI. But with QEMU, it is not possible to connect to RPL
network and get information about the RPL nodes.

Building and Running
********************

By default, the integrated HTTP server is configured to listen at port 80.
If you want to modify the HTTP server config options, please check
the configuration settings in :file:`samples/net/rpl_border_router/src/main.c`
file and also in the :file:`samples/net/rpl_border_router/src/config.h` file.

This sample code supports both static and dynamic (DHCPv4) IP addresses that
can be defined in the project configuration file:

.. code-block:: console

	CONFIG_NET_APP_MY_IPV6_ADDR="2001:db8::1"
	CONFIG_NET_APP_MY_IPV4_ADDR="192.0.2.1"

Note that the IPv4 address is only used for connection to the integrated web
server that provides an admin web page for management purposes. The web server
can also be connected using IPv6 address. If you do not have a web management
network interface for your host computer, then IPv4 support can be disabled
in the configuration file by setting :option:`CONFIG_NET_IPV4` to "n".
The RPL router uses only IPv6 when routing the network traffic.

Note that the default project configuration file
:file:`samples/net/rpl_border_router/prj.conf` does not currently provide
a working system as there are no boards that would provide suitable network
interface support. The prj.conf file is provided only to compile test the
border router sample application.

It is possible to use the border router application with these boards and
add-on cards:

* `FRDM-K64F with Freescale CR20A card <http://www.nxp.com/products/developer-resources/hardware-development-tools/freedom-development-boards/freedom-development-board-for-mcr20a-wireless-transceiver:FRDM-CR20A>`_

You can build the application like this for CR20A:

.. zephyr-app-commands::
   :zephyr-app: samples/net/rpl_border_router
   :board: frdm_k64f
   :conf: prj_frdm_k64f_mcr20a.conf
   :goals: build flash
   :compact:

By default, the RPL border router application enables net shell support and
provides some useful commands for debugging and viewing the network status.

The **br repair** command will cause the RPL network to re-configure itself.

.. code-block:: console

	shell> br repair
	[rpl-br/shell] [INF] br_repair: Starting global repair...

The **net rpl** command first prints out static compile time configuration
settings. Then it prints information about runtime configuration of the system.

.. code-block:: console

	shell> net rpl
	RPL Configuration
	=================
	RPL mode                     : mesh
	Used objective function      : MRHOF
	Used routing metric          : none
	Mode of operation (MOP)      : Storing, no mcast (MOP2)
	Send probes to nodes         : disabled
	Max instances                : 1
	Max DAG / instance           : 2
	Min hop rank increment       : 256
	Initial link metric          : 2
	RPL preference value         : 0
	DAG grounded by default      : no
	Default instance id          : 30 (0x1e)
	Insert Hop-by-hop option     : yes
	Specify DAG when sending DAO : yes
	DIO min interval             : 12 (4096 ms)
	DIO doublings interval       : 8
	DIO redundancy value         : 10
	DAO sending timer value      : 4 sec
	DAO max retransmissions      : 4
	Node expecting DAO ack       : yes
	Send DIS periodically        : yes
	DIS interval                 : 60 sec
	Default route lifetime unit  : 65535 sec
	Default route lifetime       : 255

	Runtime status
	==============
	Default instance (id 30) : 0xa80081e0 (active)
	Instance DAGs   :
	[ 1]* fde3:2cda:3eea:4d14::1 prefix fde3:2cda:3eea:4d14::/64 rank 256/65535 ver 255 flags GJ parent 0x00000000

	No parents found.

The **net nbr** command prints information about currently found IPv6 neighbor
nodes. In this example there are two leaf nodes that are part of this RPL
network.

.. code-block:: console

	shell> net nbr
	     Neighbor   Flags   Interface  State        Remain  Link                    Address
	[ 1] 0xa80065e0 1/0/1/0 0xa8007140 reachable      2920  00:12:4B:00:00:00:00:01 fe80::212:4b00:0:1
	[ 2] 0xa8006660 1/0/1/0 0xa8007140 stale             0  00:12:4B:00:00:00:00:03 fe80::212:4b00:0:3

The **nbr route** command prints information about currently found IPv6 routes.
In this example all the nodes are directly connected to this RPL border router
root node.

.. code-block:: console

	shell> net route
	IPv6 routes for interface 0xa8007140
	====================================
	IPv6 prefix : fde3:2cda:3eea:4d14::212:4b00:0:3/128
	        neighbor  : 0xa80065e0
	        link addr : 00:12:4B:00:00:00:00:03
	IPv6 prefix : fde3:2cda:3eea:4d14::212:4b00:0:1/128
	        neighbor  : 0xa8006660
	        link addr : 00:12:4B:00:00:00:00:01

The IEEE 802.15.4 shell support is enabled by default, so the **ieee15_4**
command can be used to change the IEEE 802.15.4 network parameters such as
used channel or PAN id, if needed.

.. code-block:: console

	shell> ieee15_4 set_chan 15
	Channel 15 set

The border router sample application provides integrated HTTP(S) server.
Currently the admin support is very rudimentary but you can try it by connecting
to http://192.0.2.1 or http://[2001:db8::1] using web browser.