+/* section 6.3.1, DODAG Information Object (DIO) */
+struct nd_rpl_dio {
+ nd_uint8_t rpl_instanceid;
+ nd_uint8_t rpl_version;
+ nd_uint16_t rpl_dagrank;
+ nd_uint8_t rpl_mopprf; /* bit 7=G, 5-3=MOP, 2-0=PRF */
+ nd_uint8_t rpl_dtsn; /* Dest. Advertisement Trigger Sequence Number */
+ nd_uint8_t rpl_flags; /* no flags defined yet */
+ nd_uint8_t rpl_resv1;
+ nd_byte rpl_dagid[DAGID_LEN];
+};
+#define RPL_DIO_GROUND_FLAG 0x80
+#define RPL_DIO_MOP_SHIFT 3
+#define RPL_DIO_MOP_MASK (7 << RPL_DIO_MOP_SHIFT)
+#define RPL_DIO_PRF_SHIFT 0
+#define RPL_DIO_PRF_MASK (7 << RPL_DIO_PRF_SHIFT)
+#define RPL_DIO_GROUNDED(X) ((X)&RPL_DIO_GROUND_FLAG)
+#define RPL_DIO_MOP(X) (enum RPL_DIO_MOP)(((X)&RPL_DIO_MOP_MASK) >> RPL_DIO_MOP_SHIFT)
+#define RPL_DIO_PRF(X) (((X)&RPL_DIO_PRF_MASK) >> RPL_DIO_PRF_SHIFT)
+
+enum RPL_DIO_MOP {
+ RPL_DIO_NONSTORING= 0x0,
+ RPL_DIO_STORING = 0x1,
+ RPL_DIO_NONSTORING_MULTICAST = 0x2,
+ RPL_DIO_STORING_MULTICAST = 0x3
+};
+
+enum RPL_SUBOPT {
+ RPL_OPT_PAD1 = 0,
+ RPL_OPT_PADN = 1,
+ RPL_DIO_METRICS = 2,
+ RPL_DIO_ROUTINGINFO = 3,
+ RPL_DIO_CONFIG = 4,
+ RPL_DAO_RPLTARGET = 5,
+ RPL_DAO_TRANSITINFO = 6,
+ RPL_DIO_DESTPREFIX = 8,
+ RPL_DAO_RPLTARGET_DESC=9
+};
+
+struct rpl_genoption {
+ nd_uint8_t rpl_dio_type;
+ nd_uint8_t rpl_dio_len; /* suboption length, not including type/len */
+};
+#define RPL_GENOPTION_LEN 2
+
+#define RPL_DIO_LIFETIME_INFINITE 0xffffffff
+#define RPL_DIO_LIFETIME_DISCONNECT 0
+
+struct rpl_dio_destprefix {
+ nd_uint8_t rpl_dio_type;
+ nd_uint8_t rpl_dio_len;
+ nd_uint8_t rpl_dio_prefixlen; /* in bits */
+ nd_uint8_t rpl_dio_prf; /* flags, including Route Preference */
+ nd_uint32_t rpl_dio_prefixlifetime; /* in seconds */
+#if 0
+ nd_byte rpl_dio_prefix[0]; /* variable number of bytes */
+#endif
+};
+
+/* section 6.4.1, DODAG Information Object (DIO) */
+struct nd_rpl_dao {
+ nd_uint8_t rpl_instanceid;
+ nd_uint8_t rpl_flags; /* bit 7=K, 6=D */
+ nd_uint8_t rpl_resv;
+ nd_uint8_t rpl_daoseq;
+ nd_byte rpl_dagid[DAGID_LEN]; /* present when D set. */
+};
+#define ND_RPL_DAO_MIN_LEN 4 /* length without DAGID */
+
+/* indicates if this DAO is to be acK'ed */
+#define RPL_DAO_K_SHIFT 7
+#define RPL_DAO_K_MASK (1 << RPL_DAO_K_SHIFT)
+#define RPL_DAO_K(X) (((X)&RPL_DAO_K_MASK) >> RPL_DAO_K_SHIFT)
+
+/* indicates if the DAGID is present */
+#define RPL_DAO_D_SHIFT 6
+#define RPL_DAO_D_MASK (1 << RPL_DAO_D_SHIFT)
+#define RPL_DAO_D(X) (((X)&RPL_DAO_D_MASK) >> RPL_DAO_D_SHIFT)
+
+struct rpl_dao_target {
+ nd_uint8_t rpl_dao_type;
+ nd_uint8_t rpl_dao_len;
+ nd_uint8_t rpl_dao_flags; /* unused */
+ nd_uint8_t rpl_dao_prefixlen; /* in bits */
+#if 0
+ nd_byte rpl_dao_prefix[0]; /* variable number of bytes */
+#endif
+};
+
+/* section 6.5.1, Destination Advertisement Object Acknowledgement (DAO-ACK) */
+struct nd_rpl_daoack {
+ nd_uint8_t rpl_instanceid;
+ nd_uint8_t rpl_flags; /* bit 7=D */
+ nd_uint8_t rpl_daoseq;
+ nd_uint8_t rpl_status;
+ nd_byte rpl_dagid[DAGID_LEN]; /* present when D set. */
+};
+#define ND_RPL_DAOACK_MIN_LEN 4 /* length without DAGID */
+/* indicates if the DAGID is present */
+#define RPL_DAOACK_D_SHIFT 7
+#define RPL_DAOACK_D_MASK (1 << RPL_DAOACK_D_SHIFT)
+#define RPL_DAOACK_D(X) (((X)&RPL_DAOACK_D_MASK) >> RPL_DAOACK_D_SHIFT)