xref: /minix3/external/bsd/tcpdump/dist/rpl.h (revision b636d99d91c3d54204248f643c14627405d4afd1)
1*b636d99dSDavid van Moolenbroek #ifndef _RPL_H_
2*b636d99dSDavid van Moolenbroek 
3*b636d99dSDavid van Moolenbroek /*
4*b636d99dSDavid van Moolenbroek  * NOTE: the contents of this file are an interpretation of RFC6550.
5*b636d99dSDavid van Moolenbroek  *       no copyright is asserted on this file, as it transcribes
6*b636d99dSDavid van Moolenbroek  *       a public specification.
7*b636d99dSDavid van Moolenbroek  *
8*b636d99dSDavid van Moolenbroek  */
9*b636d99dSDavid van Moolenbroek 
10*b636d99dSDavid van Moolenbroek /*
11*b636d99dSDavid van Moolenbroek  * DIO: Updated to RFC6550, as published in 2012: section 6. (page 30)
12*b636d99dSDavid van Moolenbroek  */
13*b636d99dSDavid van Moolenbroek 
14*b636d99dSDavid van Moolenbroek #define ND_RPL_MESSAGE 155  /* 0x9B */
15*b636d99dSDavid van Moolenbroek 
16*b636d99dSDavid van Moolenbroek enum ND_RPL_CODE {
17*b636d99dSDavid van Moolenbroek     ND_RPL_DAG_IS=0x00,
18*b636d99dSDavid van Moolenbroek     ND_RPL_DAG_IO=0x01,
19*b636d99dSDavid van Moolenbroek     ND_RPL_DAO   =0x02,
20*b636d99dSDavid van Moolenbroek     ND_RPL_DAO_ACK=0x03,
21*b636d99dSDavid van Moolenbroek     ND_RPL_SEC_DAG_IS = 0x80,
22*b636d99dSDavid van Moolenbroek     ND_RPL_SEC_DAG_IO = 0x81,
23*b636d99dSDavid van Moolenbroek     ND_RPL_SEC_DAG    = 0x82,
24*b636d99dSDavid van Moolenbroek     ND_RPL_SEC_DAG_ACK= 0x83,
25*b636d99dSDavid van Moolenbroek     ND_RPL_SEC_CONSIST= 0x84,
26*b636d99dSDavid van Moolenbroek };
27*b636d99dSDavid van Moolenbroek 
28*b636d99dSDavid van Moolenbroek enum ND_RPL_DIO_FLAGS {
29*b636d99dSDavid van Moolenbroek         ND_RPL_DIO_GROUNDED = 0x80,
30*b636d99dSDavid van Moolenbroek         ND_RPL_DIO_DATRIG   = 0x40,
31*b636d99dSDavid van Moolenbroek         ND_RPL_DIO_DASUPPORT= 0x20,
32*b636d99dSDavid van Moolenbroek         ND_RPL_DIO_RES4     = 0x10,
33*b636d99dSDavid van Moolenbroek         ND_RPL_DIO_RES3     = 0x08,
34*b636d99dSDavid van Moolenbroek         ND_RPL_DIO_PRF_MASK = 0x07,  /* 3-bit preference */
35*b636d99dSDavid van Moolenbroek };
36*b636d99dSDavid van Moolenbroek 
37*b636d99dSDavid van Moolenbroek #define DAGID_LEN 16
38*b636d99dSDavid van Moolenbroek 
39*b636d99dSDavid van Moolenbroek /* section 6 of draft-ietf-roll-rpl-19 */
40*b636d99dSDavid van Moolenbroek struct nd_rpl_security {
41*b636d99dSDavid van Moolenbroek     uint8_t  rpl_sec_t_reserved;     /* bit 7 is T-bit */
42*b636d99dSDavid van Moolenbroek     uint8_t  rpl_sec_algo;
43*b636d99dSDavid van Moolenbroek     uint16_t rpl_sec_kim_lvl_flags;  /* bit 15/14, KIM */
44*b636d99dSDavid van Moolenbroek                                       /* bit 10-8, LVL, bit 7-0 flags */
45*b636d99dSDavid van Moolenbroek     uint32_t rpl_sec_counter;
46*b636d99dSDavid van Moolenbroek #if 0
47*b636d99dSDavid van Moolenbroek     uint8_t  rpl_sec_ki[0];          /* depends upon kim */
48*b636d99dSDavid van Moolenbroek #endif
49*b636d99dSDavid van Moolenbroek };
50*b636d99dSDavid van Moolenbroek 
51*b636d99dSDavid van Moolenbroek /* section 6.2.1, DODAG Information Solication (DIS_IS) */
52*b636d99dSDavid van Moolenbroek struct nd_rpl_dis_is {
53*b636d99dSDavid van Moolenbroek     uint8_t rpl_dis_flags;
54*b636d99dSDavid van Moolenbroek     uint8_t rpl_dis_reserved;
55*b636d99dSDavid van Moolenbroek #if 0
56*b636d99dSDavid van Moolenbroek     uint8_t rpl_dis_options[0];
57*b636d99dSDavid van Moolenbroek #endif
58*b636d99dSDavid van Moolenbroek };
59*b636d99dSDavid van Moolenbroek 
60*b636d99dSDavid van Moolenbroek /* section 6.3.1, DODAG Information Object (DIO) */
61*b636d99dSDavid van Moolenbroek struct nd_rpl_dio {
62*b636d99dSDavid van Moolenbroek     uint8_t  rpl_instanceid;
63*b636d99dSDavid van Moolenbroek     uint8_t  rpl_version;
64*b636d99dSDavid van Moolenbroek     uint16_t rpl_dagrank;
65*b636d99dSDavid van Moolenbroek     uint8_t  rpl_mopprf;   /* bit 7=G, 5-3=MOP, 2-0=PRF */
66*b636d99dSDavid van Moolenbroek     uint8_t  rpl_dtsn;     /* Dest. Advertisement Trigger Sequence Number */
67*b636d99dSDavid van Moolenbroek     uint8_t  rpl_flags;    /* no flags defined yet */
68*b636d99dSDavid van Moolenbroek     uint8_t  rpl_resv1;
69*b636d99dSDavid van Moolenbroek     uint8_t  rpl_dagid[DAGID_LEN];
70*b636d99dSDavid van Moolenbroek };
71*b636d99dSDavid van Moolenbroek #define RPL_DIO_GROUND_FLAG 0x80
72*b636d99dSDavid van Moolenbroek #define RPL_DIO_MOP_SHIFT   3
73*b636d99dSDavid van Moolenbroek #define RPL_DIO_MOP_MASK    (7 << RPL_DIO_MOP_SHIFT)
74*b636d99dSDavid van Moolenbroek #define RPL_DIO_PRF_SHIFT   0
75*b636d99dSDavid van Moolenbroek #define RPL_DIO_PRF_MASK    (7 << RPL_DIO_PRF_SHIFT)
76*b636d99dSDavid van Moolenbroek #define RPL_DIO_GROUNDED(X) ((X)&RPL_DIO_GROUND_FLAG)
77*b636d99dSDavid van Moolenbroek #define RPL_DIO_MOP(X)      (enum RPL_DIO_MOP)(((X)&RPL_DIO_MOP_MASK) >> RPL_DIO_MOP_SHIFT)
78*b636d99dSDavid van Moolenbroek #define RPL_DIO_PRF(X)      (((X)&RPL_DIO_PRF_MASK) >> RPL_DIO_PRF_SHIFT)
79*b636d99dSDavid van Moolenbroek 
80*b636d99dSDavid van Moolenbroek enum RPL_DIO_MOP {
81*b636d99dSDavid van Moolenbroek     RPL_DIO_NONSTORING= 0x0,
82*b636d99dSDavid van Moolenbroek     RPL_DIO_STORING   = 0x1,
83*b636d99dSDavid van Moolenbroek     RPL_DIO_NONSTORING_MULTICAST = 0x2,
84*b636d99dSDavid van Moolenbroek     RPL_DIO_STORING_MULTICAST    = 0x3,
85*b636d99dSDavid van Moolenbroek };
86*b636d99dSDavid van Moolenbroek 
87*b636d99dSDavid van Moolenbroek enum RPL_SUBOPT {
88*b636d99dSDavid van Moolenbroek         RPL_OPT_PAD0        = 0,
89*b636d99dSDavid van Moolenbroek         RPL_OPT_PADN        = 1,
90*b636d99dSDavid van Moolenbroek         RPL_DIO_METRICS     = 2,
91*b636d99dSDavid van Moolenbroek         RPL_DIO_ROUTINGINFO = 3,
92*b636d99dSDavid van Moolenbroek         RPL_DIO_CONFIG      = 4,
93*b636d99dSDavid van Moolenbroek         RPL_DAO_RPLTARGET   = 5,
94*b636d99dSDavid van Moolenbroek         RPL_DAO_TRANSITINFO = 6,
95*b636d99dSDavid van Moolenbroek         RPL_DIO_DESTPREFIX  = 8,
96*b636d99dSDavid van Moolenbroek         RPL_DAO_RPLTARGET_DESC=9,
97*b636d99dSDavid van Moolenbroek };
98*b636d99dSDavid van Moolenbroek 
99*b636d99dSDavid van Moolenbroek struct rpl_dio_genoption {
100*b636d99dSDavid van Moolenbroek     uint8_t rpl_dio_type;
101*b636d99dSDavid van Moolenbroek     uint8_t rpl_dio_len;        /* suboption length, not including type/len */
102*b636d99dSDavid van Moolenbroek };
103*b636d99dSDavid van Moolenbroek #define RPL_DIO_GENOPTION_LEN	2
104*b636d99dSDavid van Moolenbroek 
105*b636d99dSDavid van Moolenbroek #define RPL_DIO_LIFETIME_INFINITE   0xffffffff
106*b636d99dSDavid van Moolenbroek #define RPL_DIO_LIFETIME_DISCONNECT 0
107*b636d99dSDavid van Moolenbroek 
108*b636d99dSDavid van Moolenbroek struct rpl_dio_destprefix {
109*b636d99dSDavid van Moolenbroek     uint8_t rpl_dio_type;
110*b636d99dSDavid van Moolenbroek     uint8_t rpl_dio_len;
111*b636d99dSDavid van Moolenbroek     uint8_t rpl_dio_prefixlen;        /* in bits */
112*b636d99dSDavid van Moolenbroek     uint8_t rpl_dio_prf;              /* flags, including Route Preference */
113*b636d99dSDavid van Moolenbroek     uint32_t rpl_dio_prefixlifetime;  /* in seconds */
114*b636d99dSDavid van Moolenbroek #if 0
115*b636d99dSDavid van Moolenbroek     uint8_t rpl_dio_prefix[0];        /* variable number of bytes */
116*b636d99dSDavid van Moolenbroek #endif
117*b636d99dSDavid van Moolenbroek };
118*b636d99dSDavid van Moolenbroek 
119*b636d99dSDavid van Moolenbroek /* section 6.4.1, DODAG Information Object (DIO) */
120*b636d99dSDavid van Moolenbroek struct nd_rpl_dao {
121*b636d99dSDavid van Moolenbroek     uint8_t  rpl_instanceid;
122*b636d99dSDavid van Moolenbroek     uint8_t  rpl_flags;      /* bit 7=K, 6=D */
123*b636d99dSDavid van Moolenbroek     uint8_t  rpl_resv;
124*b636d99dSDavid van Moolenbroek     uint8_t  rpl_daoseq;
125*b636d99dSDavid van Moolenbroek     uint8_t  rpl_dagid[DAGID_LEN];   /* present when D set. */
126*b636d99dSDavid van Moolenbroek };
127*b636d99dSDavid van Moolenbroek #define ND_RPL_DAO_MIN_LEN	4	/* length without DAGID */
128*b636d99dSDavid van Moolenbroek 
129*b636d99dSDavid van Moolenbroek /* indicates if this DAO is to be acK'ed */
130*b636d99dSDavid van Moolenbroek #define RPL_DAO_K_SHIFT   7
131*b636d99dSDavid van Moolenbroek #define RPL_DAO_K_MASK    (1 << RPL_DAO_K_SHIFT)
132*b636d99dSDavid van Moolenbroek #define RPL_DAO_K(X)      (((X)&RPL_DAO_K_MASK) >> RPL_DAO_K_SHIFT)
133*b636d99dSDavid van Moolenbroek 
134*b636d99dSDavid van Moolenbroek /* indicates if the DAGID is present */
135*b636d99dSDavid van Moolenbroek #define RPL_DAO_D_SHIFT   6
136*b636d99dSDavid van Moolenbroek #define RPL_DAO_D_MASK    (1 << RPL_DAO_D_SHIFT)
137*b636d99dSDavid van Moolenbroek #define RPL_DAO_D(X)      (((X)&RPL_DAO_D_MASK) >> RPL_DAO_D_SHIFT)
138*b636d99dSDavid van Moolenbroek 
139*b636d99dSDavid van Moolenbroek struct rpl_dao_target {
140*b636d99dSDavid van Moolenbroek     uint8_t rpl_dao_type;
141*b636d99dSDavid van Moolenbroek     uint8_t rpl_dao_len;
142*b636d99dSDavid van Moolenbroek     uint8_t rpl_dao_flags;            /* unused */
143*b636d99dSDavid van Moolenbroek     uint8_t rpl_dao_prefixlen;        /* in bits */
144*b636d99dSDavid van Moolenbroek #if 0
145*b636d99dSDavid van Moolenbroek     uint8_t rpl_dao_prefix[0];        /* variable number of bytes */
146*b636d99dSDavid van Moolenbroek #endif
147*b636d99dSDavid van Moolenbroek };
148*b636d99dSDavid van Moolenbroek 
149*b636d99dSDavid van Moolenbroek /* section 6.5.1, Destination Advertisement Object Acknowledgement (DAO-ACK) */
150*b636d99dSDavid van Moolenbroek struct nd_rpl_daoack {
151*b636d99dSDavid van Moolenbroek     uint8_t  rpl_instanceid;
152*b636d99dSDavid van Moolenbroek     uint8_t  rpl_flags;      /* bit 7=D */
153*b636d99dSDavid van Moolenbroek     uint8_t  rpl_daoseq;
154*b636d99dSDavid van Moolenbroek     uint8_t  rpl_status;
155*b636d99dSDavid van Moolenbroek     uint8_t  rpl_dagid[DAGID_LEN];   /* present when D set. */
156*b636d99dSDavid van Moolenbroek };
157*b636d99dSDavid van Moolenbroek #define ND_RPL_DAOACK_MIN_LEN	4	/* length without DAGID */
158*b636d99dSDavid van Moolenbroek /* indicates if the DAGID is present */
159*b636d99dSDavid van Moolenbroek #define RPL_DAOACK_D_SHIFT   7
160*b636d99dSDavid van Moolenbroek #define RPL_DAOACK_D_MASK    (1 << RPL_DAOACK_D_SHIFT)
161*b636d99dSDavid van Moolenbroek #define RPL_DAOACK_D(X)      (((X)&RPL_DAOACK_D_MASK) >> RPL_DAOACK_D_SHIFT)
162*b636d99dSDavid van Moolenbroek 
163*b636d99dSDavid van Moolenbroek 
164*b636d99dSDavid van Moolenbroek 
165*b636d99dSDavid van Moolenbroek #define _RPL_H_
166*b636d99dSDavid van Moolenbroek #endif /* _RPL_H_ */
167*b636d99dSDavid van Moolenbroek 
168*b636d99dSDavid van Moolenbroek /*
169*b636d99dSDavid van Moolenbroek  * Local Variables:
170*b636d99dSDavid van Moolenbroek  * c-basic-offset:4
171*b636d99dSDavid van Moolenbroek  * c-style: whitesmith
172*b636d99dSDavid van Moolenbroek  * End:
173*b636d99dSDavid van Moolenbroek  */
174*b636d99dSDavid van Moolenbroek 
175