1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/net/include/rpl/rpl_structs.h

183 lines
4.4 KiB
C
Raw Normal View History

/**
* RPL data structs
*
* Copyright (C) 2013 INRIA.
*
2013-11-22 20:47:05 +01:00
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License. See the file LICENSE in the top level directory for more
* details.
*
* @ingroup rpl
* @{
* @file rpl_structs.h
* @brief RPL data structs
* @author Eric Engel <eric.engel@fu-berlin.de>
* @}
*/
#include <string.h>
2013-08-05 16:10:54 +02:00
#include "ipv6.h"
2012-01-19 17:35:50 +01:00
#ifndef RPL_STRUCTS_H_INCLUDED
#define RPL_STRUCTS_H_INCLUDED
/* Modes of Operation */
2012-01-19 17:35:50 +01:00
/* DIO Base Object (RFC 6550 Fig. 14) */
struct __attribute__((packed)) rpl_dio_t {
2012-01-19 17:35:50 +01:00
uint8_t rpl_instanceid;
uint8_t version_number;
uint16_t rank;
uint8_t g_mop_prf;
uint8_t dtsn;
uint8_t flags;
2012-01-19 17:35:50 +01:00
uint8_t reserved;
ipv6_addr_t dodagid;
};
struct __attribute__((packed)) rpl_dis_t {
2012-01-19 17:35:50 +01:00
uint8_t flags;
uint8_t reserved;
};
/* DAO Base Object (RFC 6550 Fig. 16) */
struct __attribute__((packed)) rpl_dao_t {
2012-01-19 17:35:50 +01:00
uint8_t rpl_instanceid;
uint8_t k_d_flags;
uint8_t reserved;
uint8_t dao_sequence;
};
/* DAO ACK Base Object (RFC 6550 Fig. 17.) */
struct __attribute__((packed)) rpl_dao_ack_t {
2012-01-19 17:35:50 +01:00
uint8_t rpl_instanceid;
uint8_t d_reserved;
uint8_t dao_sequence;
uint8_t status;
};
/* DODAG ID Struct */
/* may be present in dao or dao_ack packets */
struct __attribute__((packed)) dodag_id_t {
2012-01-19 17:35:50 +01:00
ipv6_addr_t dodagid;
};
/* RPL-Option Generic Format (RFC 6550 Fig. 19) */
typedef struct __attribute__((packed)) {
2012-01-19 17:35:50 +01:00
uint8_t type;
uint8_t length;
} rpl_opt_t;
2012-01-19 17:35:50 +01:00
/* DODAG Configuration-Option (RFC 6550 Fig. 24) */
typedef struct __attribute__((packed)) {
2012-01-19 17:35:50 +01:00
uint8_t type;
uint8_t length;
uint8_t flags_a_pcs;
uint8_t DIOIntDoubl;
uint8_t DIOIntMin;
uint8_t DIORedun;
uint16_t MaxRankIncrease;
uint16_t MinHopRankIncrease;
uint16_t ocp;
uint8_t reserved;
uint8_t default_lifetime;
uint16_t lifetime_unit;
} rpl_opt_dodag_conf_t;
2012-01-19 17:35:50 +01:00
/* RPL Solicited Information Option (RFC 6550 Fig. 28) */
typedef struct __attribute__((packed)) {
uint8_t type;
uint8_t length;
uint8_t rplinstanceid;
uint8_t VID_Flags;
ipv6_addr_t dodagid;
uint8_t version;
} rpl_opt_solicited_t;
2012-02-16 23:23:15 +01:00
/* RPL Target-Option (RFC 6550 Fig. 25) */
/* TODO: ipv6_addr_t target may be replaced by a target prefix of variable length */
typedef struct __attribute__((packed)) {
uint8_t type;
uint8_t length;
uint8_t flags;
uint8_t prefix_length;
ipv6_addr_t target;
} rpl_opt_target_t;
2012-02-16 23:23:15 +01:00
/* RPL Transit-Option (RFC 6550 Fig. 26) */
typedef struct __attribute__((packed)) {
uint8_t type;
uint8_t length;
uint8_t e_flags;
uint8_t path_control;
uint8_t path_sequence;
uint8_t path_lifetime;
} rpl_opt_transit_t;
2012-02-26 19:30:48 +01:00
2012-01-19 17:35:50 +01:00
struct rpl_dodag_t;
typedef struct {
ipv6_addr_t addr;
uint16_t rank;
uint8_t dtsn;
2012-01-19 17:35:50 +01:00
struct rpl_dodag_t *dodag;
uint16_t lifetime;
double link_metric;
uint8_t link_metric_type;
uint8_t used;
2012-01-19 17:35:50 +01:00
} rpl_parent_t;
struct rpl_of_t;
typedef struct {
2012-01-19 17:35:50 +01:00
uint8_t id;
uint8_t used;
uint8_t joined;
2012-01-19 17:35:50 +01:00
} rpl_instance_t;
//Node-internal representation of a DODAG, with nodespecific information
typedef struct rpl_dodag_t {
2012-01-19 17:35:50 +01:00
rpl_instance_t *instance;
ipv6_addr_t dodag_id;
uint8_t used;
uint8_t mop;
uint8_t dtsn;
uint8_t prf;
2012-01-19 17:35:50 +01:00
uint8_t dio_interval_doubling;
uint8_t dio_min;
uint8_t dio_redundancy;
uint16_t maxrankincrease;
uint16_t minhoprankincrease;
2012-01-19 17:35:50 +01:00
uint8_t default_lifetime;
uint16_t lifetime_unit;
2012-01-19 17:35:50 +01:00
uint8_t version;
uint8_t grounded;
uint16_t my_rank;
uint8_t node_status;
uint8_t dao_seq;
uint16_t min_rank;
2012-01-19 17:35:50 +01:00
uint8_t joined;
rpl_parent_t *my_preferred_parent;
struct rpl_of_t *of;
2012-01-19 17:35:50 +01:00
} rpl_dodag_t;
typedef struct rpl_of_t {
2012-01-19 17:35:50 +01:00
uint16_t ocp;
uint16_t (*calc_rank)(rpl_parent_t *parent, uint16_t base_rank);
2012-01-19 17:35:50 +01:00
rpl_parent_t *(*which_parent)(rpl_parent_t *, rpl_parent_t *);
rpl_dodag_t *(*which_dodag)(rpl_dodag_t *, rpl_dodag_t *);
void (*reset)(rpl_dodag_t *);
2012-01-19 17:35:50 +01:00
void (*parent_state_callback)(rpl_parent_t *, int, int);
void (*init)(void); //OF specific init function
void (*process_dio)(void); //DIO processing callback (acc. to OF0 spec, chpt 5)
2012-01-19 17:35:50 +01:00
} rpl_of_t;
typedef struct {
ipv6_addr_t address;
ipv6_addr_t next_hop;
uint16_t lifetime;
2014-03-07 15:34:09 +01:00
uint8_t used;
} rpl_routing_entry_t;
#endif