RPL

RPL implementation for GNRC.

Configuration

USEMODULE

  • RPL (Storing Mode)
    1
    USEMODULE += gnrc_rpl
    
  • RPL auto-initialization on interface
    1
    USEMODULE += auto_init_gnrc_rpl
    

Auto-Initialization

If the application defines only one interface (GNRC_NETIF_NUMOF == 1), then RPL will be initialized on this interface.

If the application defines several interfaces (GNRC_NETIF_NUMOF > 1), then RPL will be initialized on the interface GNRC_RPL_DEFAULT_NETIF. Your application is responsible for setting GNRC_RPL_DEFAULT_NETIF to a valid interface PID, e.g. via CFLAGS.

Initializing RPL on multiple interfaces automatically is currently not supported. Call gnrc_rpl_init() manually from your application for the desired interfaces in this case.

CFLAGS

  • Exclude Prefix Information Options from DIOs
    1
    CFLAGS += -DGNRC_RPL_WITHOUT_PIO
    
  • Modify trickle parameters
    1
    2
    3
    CFLAGS += -DGNRC_RPL_DEFAULT_DIO_INTERVAL_DOUBLINGS=20
    CFLAGS += -DGNRC_RPL_DEFAULT_DIO_INTERVAL_MIN=3
    CFLAGS += -DGNRC_RPL_DEFAULT_DIO_REDUNDANCY_CONSTANT=10
    
  • Make reception of DODAG_CONF optional when joining a DODAG. This will use the default trickle parameters until a DODAG_CONF is received from the parent. The DODAG_CONF is requested once from the parent while joining the DODAG. The standard behaviour is to request a DODAG_CONF and join only a DODAG once a DODAG_CONF is received.
    1
    CFLAGS += -DGNRC_RPL_DODAG_CONF_OPTIONAL_ON_JOIN
    
  • Set interface for auto-initialization if more than one interface exists (GNRC_NETIF_NUMOF > 1)
    1
    CFLAGS += -DGNRC_RPL_DEFAULT_NETIF=6
    
  • By default, all incoming control messages get checked for validation. This validation can be disabled in case the involved RPL implementations are known to produce valid messages.
    1
    CFLAGS += -DGNRC_RPL_WITHOUT_VALIDATION
    

USEMODULE

  • RPL (Storing Mode)
    1
    USEMODULE += gnrc_rpl
    
  • RPL auto-initialization on interface
    1
    USEMODULE += auto_init_gnrc_rpl
    

Auto-Initialization

If the application defines only one interface (GNRC_NETIF_NUMOF == 1), then RPL will be initialized on this interface.

If the application defines several interfaces (GNRC_NETIF_NUMOF > 1), then RPL will be initialized on the interface GNRC_RPL_DEFAULT_NETIF. Your application is responsible for setting GNRC_RPL_DEFAULT_NETIF to a valid interface PID, e.g. via CFLAGS.

Initializing RPL on multiple interfaces automatically is currently not supported. Call gnrc_rpl_init() manually from your application for the desired interfaces in this case.

CFLAGS

  • Exclude Prefix Information Options from DIOs
    1
    CFLAGS += -DGNRC_RPL_WITHOUT_PIO
    
  • Modify trickle parameters
    1
    2
    3
    CFLAGS += -DGNRC_RPL_DEFAULT_DIO_INTERVAL_DOUBLINGS=20
    CFLAGS += -DGNRC_RPL_DEFAULT_DIO_INTERVAL_MIN=3
    CFLAGS += -DGNRC_RPL_DEFAULT_DIO_REDUNDANCY_CONSTANT=10
    
  • Make reception of DODAG_CONF optional when joining a DODAG. This will use the default trickle parameters until a DODAG_CONF is received from the parent. The DODAG_CONF is requested once from the parent while joining the DODAG. The standard behaviour is to request a DODAG_CONF and join only a DODAG once a DODAG_CONF is received.
    1
    CFLAGS += -DGNRC_RPL_DODAG_CONF_OPTIONAL_ON_JOIN
    
  • Set interface for auto-initialization if more than one interface exists (GNRC_NETIF_NUMOF > 1)
    1
    CFLAGS += -DGNRC_RPL_DEFAULT_NETIF=6
    
  • By default, all incoming control messages get checked for validation. This validation can be disabled in case the involved RPL implementations are known to produce valid messages.
    1
    CFLAGS += -DGNRC_RPL_WITHOUT_VALIDATION
    

GNRC_RPL_MOP_NO_DOWNWARD_ROUTES
1
(0x00)
GNRC_RPL_MOP_NON_STORING_MODE
1
(0x01)
GNRC_RPL_MOP_STORING_MODE_NO_MC
1
(0x02)
GNRC_RPL_MOP_STORING_MODE_MC
1
(0x03)
GNRC_RPL_DEFAULT_MOP

default MOP set on compile time

1
GNRC_RPL_MOP_STORING_MODE_NO_MC
uint8_t GNRC_RPL_COUNTER_INCREMENT(uint8_t counter)
bool GNRC_RPL_COUNTER_IS_INIT(uint8_t counter)
bool GNRC_RPL_COUNTER_GREATER_THAN_LOCAL(uint8_t A, uint8_t B)
bool GNRC_RPL_COUNTER_GREATER_THAN(uint8_t A, uint8_t B)
GNRC_RPL_COUNTER_MAX
1
(255)
GNRC_RPL_COUNTER_LOWER_REGION
1
(127)
GNRC_RPL_COUNTER_SEQ_WINDOW
1
(16)
GNRC_RPL_COUNTER_INIT
1
(GNRC_RPL_COUNTER_MAX - GNRC_RPL_COUNTER_SEQ_WINDOW + 1)
GNRC_RPL_DEFAULT_DIO_INTERVAL_DOUBLINGS
1
(20)
GNRC_RPL_DEFAULT_DIO_INTERVAL_MIN
1
(3)
GNRC_RPL_DEFAULT_DIO_REDUNDANCY_CONSTANT
1
(10)
GNRC_RPL_DEFAULT_LIFETIME
1
(5)
GNRC_RPL_LIFETIME_UNIT
1
(60)
GNRC_RPL_DAO_SEND_RETRIES
1
(4)
GNRC_RPL_DAO_ACK_DELAY
1
(3000UL)
GNRC_RPL_DAO_DELAY_LONG

Long delay for DAOs in milli seconds.

1
(60000UL)
GNRC_RPL_DAO_DELAY_DEFAULT

Default delay for DAOs in milli seconds.

1
(1000UL)
GNRC_RPL_DAO_DELAY_JITTER

Jitter for DAOs in milli seconds.

1
(1000UL)
GNRC_RPL_NORMAL_NODE
1
(0)
GNRC_RPL_ROOT_NODE
1
(1)
GNRC_RPL_LEAF_NODE
1
(2)
GNRC_RPL_OPT_PAD1
1
(0)
GNRC_RPL_OPT_PADN
1
(1)
GNRC_RPL_OPT_DAG_METRIC_CONTAINER
1
(2)
GNRC_RPL_OPT_ROUTE_INFO
1
(3)
GNRC_RPL_OPT_DODAG_CONF
1
(4)
GNRC_RPL_OPT_TARGET
1
(5)
GNRC_RPL_OPT_TRANSIT
1
(6)
GNRC_RPL_OPT_SOLICITED_INFO
1
(7)
GNRC_RPL_OPT_PREFIX_INFO
1
(8)
GNRC_RPL_OPT_TARGET_DESC
1
(9)
GNRC_RPL_INSTANCE_ID_MSB
1
(1 << 7)
GNRC_RPL_GLOBAL_INSTANCE_MASK
1
(0x7F)
GNRC_RPL_LOCAL_INSTANCE_MASK
1
(0x3F)
GNRC_RPL_INSTANCE_D_FLAG_MASK
1
(1 << 6)
GNRC_RPL_DIS_SOLICITED_INFO_LENGTH

DIS Solicited Information option (numbers)

1
(19)

GNRC_RPL_DIS_SOLICITED_INFO_FLAG_V
1
(1 << 7)
GNRC_RPL_DIS_SOLICITED_INFO_FLAG_I
1
(1 << 6)
GNRC_RPL_DIS_SOLICITED_INFO_FLAG_D
1
(1 << 5)
kernel_types.h::kernel_pid_t gnrc_rpl_pid

PID of the RPL thread.

const ipv6_addr_t ipv6_addr_all_rpl_nodes

kernel_types.h::kernel_pid_t gnrc_rpl_init(kernel_types.h::kernel_pid_t if_pid)

Initialization of the RPL thread.

Parameters

if_pid:PID of the interface

Return values

  • The PID of the RPL thread, on success.
  • a negative errno on error.
structs.h::gnrc_rpl_instance_t * gnrc_rpl_root_init(uint8_t instance_id, ipv6_addr_t * dodag_id, bool gen_inst_id, bool local_inst_id)

Initialization of a node as root.

Parameters

instance_id:Id of the instance
dodag_id:Id of the DODAG
gen_inst_id:Flag indicating whether to generate an instance id. If true, instance_id will be ignored
local_inst_id:Flag indicating whether a local or global instance id should be generatad

Return values

  • Pointer to the new RPL Instance, on success.
  • NULL, otherwise.
void gnrc_rpl_send_DIO(structs.h::gnrc_rpl_instance_t * instance, ipv6_addr_t * destination)

Send a DIO of the instance to the destination.

Parameters

instance:Pointer to the RPL instance.
destination:IPv6 addres of the destination.

void gnrc_rpl_send_DIS(structs.h::gnrc_rpl_instance_t * instance, ipv6_addr_t * destination, gnrc_rpl_internal_opt_t ** options, msp430_types.h::size_t num_opts)

Send a DIS of the instace to the destination.

Parameters

instance:Pointer to the RPL instance, optional.
destination:IPv6 addres of the destination.
options:Pointer to the first option to be attached.
num_opts:The number of options to attach.

void gnrc_rpl_send_DAO(structs.h::gnrc_rpl_instance_t * instance, ipv6_addr_t * destination, uint8_t lifetime)

Send a DAO of the dodag to the destination.

Parameters

instance:Pointer to the instance.
destination:IPv6 addres of the destination.
lifetime:Lifetime of the route to announce.

void gnrc_rpl_send_DAO_ACK(structs.h::gnrc_rpl_instance_t * instance, ipv6_addr_t * destination, uint8_t seq)

Send a DAO-ACK of the instance to the destination.

Parameters

instance:Pointer to the RPL instance.
destination:IPv6 addres of the destination.
seq:Sequence number to be acknowledged.

void gnrc_rpl_recv_DIS(gnrc_rpl_dis_t * dis, kernel_types.h::kernel_pid_t iface, ipv6_addr_t * src, ipv6_addr_t * dst, uint16_t len)

Parse a DIS.

Parameters

dis:Pointer to the DIS message.
iface:Interface PID of the incoming DIS.
src:Pointer to the source address of the IPv6 packet.
dst:Pointer to the destination address of the IPv6 packet.
len:Length of the IPv6 packet.

void gnrc_rpl_recv_DIO(gnrc_rpl_dio_t * dio, kernel_types.h::kernel_pid_t iface, ipv6_addr_t * src, ipv6_addr_t * dst, uint16_t len)

Parse a DIO.

Parameters

dio:Pointer to the DIO message.
iface:Interface PID of the incoming DIO.
src:Pointer to the source address of the IPv6 packet.
dst:Pointer to the destination address of the IPv6 packet.
len:Length of the IPv6 packet.

void gnrc_rpl_recv_DAO(gnrc_rpl_dao_t * dao, kernel_types.h::kernel_pid_t iface, ipv6_addr_t * src, ipv6_addr_t * dst, uint16_t len)

Parse a DAO.

Parameters

dao:Pointer to the DAO message.
iface:Interface PID of the incoming DIO.
src:Pointer to the source address of the IPv6 packet.
dst:Pointer to the destination address of the IPv6 packet.
len:Length of the IPv6 packet.

void gnrc_rpl_recv_DAO_ACK(gnrc_rpl_dao_ack_t * dao_ack, kernel_types.h::kernel_pid_t iface, ipv6_addr_t * src, ipv6_addr_t * dst, uint16_t len)

Parse a DAO-ACK.

Parameters

dao_ack:Pointer to the DAO-ACK message.
iface:Interface PID of the incoming DIO.
src:Pointer to the source address of the IPv6 packet.
dst:Pointer to the destination address of the IPv6 packet.
len:Length of the IPv6 packet.

void gnrc_rpl_delay_dao(structs.h::gnrc_rpl_dodag_t * dodag)

Delay the DAO sending interval.

Parameters

dodag:The DODAG of the DAO

void gnrc_rpl_long_delay_dao(structs.h::gnrc_rpl_dodag_t * dodag)

Long delay the DAO sending interval.

Parameters

dodag:The DODAG of the DAO

structs.h::gnrc_rpl_instance_t * gnrc_rpl_root_instance_init(uint8_t instance_id, ipv6_addr_t * dodag_id, uint8_t mop)

Create a new RPL instance and RPL DODAG.

Parameters

instance_id:Id of the instance
dodag_id:Id of the DODAG
mop:Mode of Operation

Return values

  • Pointer to the new RPL instance, on success.
  • NULL, otherwise.
void gnrc_rpl_send(include/net/gnrc/pkt.h::gnrc_pktsnip_t * pkt, kernel_types.h::kernel_pid_t iface, ipv6_addr_t * src, ipv6_addr_t * dst, ipv6_addr_t * dodag_id)

Send a control message.

Parameters

pkt:gnrc_pktnsip_t to send
iface:Interface PID to send this pkt to
src:Source address of the packet
dst:Destination address of the packet
dodag_id:Id of the DODAG

uint8_t gnrc_rpl_gen_instance_id(bool local)

Generate a local or global instance id.

Parameters

local:flag to indicate whether a local or global instance id is requested

Return values

  • Local instance id, if local is true
  • Global instance id, otherwise.
void gnrc_rpl_config_pio(structs.h::gnrc_rpl_dodag_t * dodag, bool status)

(De-)Activate the transmission of Prefix Information Options within DIOs for a particular DODAG

Parameters

dodag:Pointer to the DODAG
status:true for activating PIOs and false for deactivating them

GNRC_RPL_STACK_SIZE

Default stack size to use for the RPL thread.

1
(THREAD_STACKSIZE_DEFAULT)
GNRC_RPL_PRIO

Default priority for the RPL thread.

1
(GNRC_IPV6_PRIO + 1)
GNRC_RPL_MSG_QUEUE_SIZE

Default message queue size to use for the RPL thread.

1
(8U)
GNRC_RPL_ALL_NODES_ADDR

Static initializer for the all-RPL-nodes multicast IPv6 address (ff02::1a)

1
{{ 0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1a }}

GNRC_RPL_MSG_TYPE_LIFETIME_UPDATE

Message type for lifetime updates.

1
(0x0900)
GNRC_RPL_MSG_TYPE_TRICKLE_MSG

Message type for trickle.

1
(0x0901)
GNRC_RPL_MSG_TYPE_DAO_HANDLE

Message type for handling DAO sending.

1
(0x0903)
GNRC_RPL_INFINITE_RANK

Infinite rank.

1
(0xFFFF)

GNRC_RPL_DEFAULT_MIN_HOP_RANK_INCREASE

Default minimum hop rank increase.

1
(256)

GNRC_RPL_DEFAULT_MAX_RANK_INCREASE

Maximum rank increase.

1
(0)
GNRC_RPL_IMPLEMENTED_OFS_NUMOF

Number of implemented Objective Functions.

1
(1)
GNRC_RPL_DEFAULT_OCP

Default Objective Code Point (OF0)

1
(0)
GNRC_RPL_DEFAULT_INSTANCE

Default Instance ID.

1
(0)
GNRC_RPL_DEFAULT_PREFIX_LEN

Default prefix length for the DODAG id.

1
(64)
GNRC_RPL_DEFAULT_PREFIX_LIFETIME

Default prefix valid and preferred time for the DODAG id.

1
(0xFFFFFFFF)

Note

Currently not used, but needed for RIOs

GNRC_RPL_GROUNDED

A DODAG can be grounded or floating.

1
(1)

GNRC_RPL_CLEANUP_TIME

Cleanup interval in milliseconds.

1
(5 * MS_PER_SEC)
GNRC_RPL_ROOT_RANK

Rank of the root node.

1
(GNRC_RPL_DEFAULT_MIN_HOP_RANK_INCREASE)
GNRC_RPL_ICMPV6_CODE_DIS

DIS ICMPv6 code.

1
(0x00)

GNRC_RPL_ICMPV6_CODE_DIO

DIO ICMPv6 code.

1
(0x01)

GNRC_RPL_ICMPV6_CODE_DAO

DAO ICMPv6 code.

1
(0x02)

GNRC_RPL_ICMPV6_CODE_DAO_ACK

DAO ACK ICMPv6 code.

1
(0x03)

GNRC_RPL_LIFETIME_UPDATE_STEP

Update interval of the lifetime update function.

1
(2)
DAGRANK( rank, mhri)

Rank part of the DODAG.

1
(rank/mhri)

GNRC_RPL_PARENT_TIMEOUT_DIS_RETRIES

Number of DIS retries before parent times out.

1
(3)