summaryrefslogtreecommitdiff
path: root/nuttx/include/net/uip/uip-ipopt.h
blob: 1625fbab6700d36704e83afb4d3de0f0386cf741 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
/************************************************************************************************************
 * net/uip/uip-ipopt.h
 *
 * Defines values for the IP header options
 *
 *   Copyright (C) 2010 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ************************************************************************************************************/

#ifndef __NET_UIP_UIP_IPOPT_H
#define __NET_UIP_UIP_IPOPT_H

/************************************************************************************************************
 * Included Files
 ************************************************************************************************************/

#include <nuttx/config.h>

/************************************************************************************************************
 * Pre-processor Definitions
 ************************************************************************************************************/

/* IP Header Options:
 *
 * The basic 20-byte IP header can be extended by up to another 40 bytes
 * (in units of 4 bytes) to provide IP options.  The format of a single IP
 * option is as follows:
 *
 * Single byte options:
 *
 *   Type:         8-bits
 *
 * Multi-byte options:
 *
 *   Type:         8-bits
 *   Length:       8-bits
 *   Pointer:      8-bits:
 *   Option Data: (depends on Length)
 *
 * The IP Option Type byte consists of the following subfields:
 */
 
#define IPOPT_TYPE_OPTION_SHIFT       (0)      /* Bits 0-5: Option number*/
#define IPOPT_TYPE_OPTION_MASK        (0x1f << IPOPT_TYPE_OPTION_SHIFT)
#  define IPOPT_TYPE_OPTION_END       (0  << IPOPT_TYPE_OPTION_SHIFT) /* End of options list (RFC 791) */
#  define IPOPT_TYPE_OPTION_NOOP      (1  << IPOPT_TYPE_OPTION_SHIFT) /* No operation (RFC 791) */
#  define IPOPT_TYPE_OPTION_SEC       (2  << IPOPT_TYPE_OPTION_SHIFT) /* Security (RFC 791, 1108) */
#  define IPOPT_TYPE_OPTION_LSRR      (3  << IPOPT_TYPE_OPTION_SHIFT) /* Loose source and record route (RFC 791) */
#  define IPOPT_TYPE_OPTION_TIMESTAMP (4  << IPOPT_TYPE_OPTION_SHIFT) /* Timestamp (RFC 781, 791) */
#  define IPOPT_TYPE_OPTION_EXTSEC    (5  << IPOPT_TYPE_OPTION_SHIFT) /* Extended security (RFC 1108) */
#  define IPOPT_TYPE_OPTION_COMMSEC   (6  << IPOPT_TYPE_OPTION_SHIFT) /* Commercial security */
#  define IPOPT_TYPE_OPTION_RR        (7  << IPOPT_TYPE_OPTION_SHIFT) /* Record route (RFC 791) */
#  define IPOPT_TYPE_OPTION_SSID      (8  << IPOPT_TYPE_OPTION_SHIFT) /* Stream ID (RFC 791, 1122) */
#  define IPOPT_TYPE_OPTION_SSRR      (9  << IPOPT_TYPE_OPTION_SHIFT) /* Strict source and record route (RFC 791) */
#  define IPOPT_TYPE_OPTION_EXPMEAS   (10 << IPOPT_TYPE_OPTION_SHIFT) /* Experimental measurement */
#  define IPOPT_TYPE_OPTION_MTUPROBE  (11 << IPOPT_TYPE_OPTION_SHIFT) /* MTU Probe (RFC 1063) */
#  define IPOPT_TYPE_OPTION_MTUREPLY  (12 << IPOPT_TYPE_OPTION_SHIFT) /* MTU Reply (RFC 1063) */
#  define IPOPT_TYPE_OPTION_EXPFC     (13 << IPOPT_TYPE_OPTION_SHIFT) /* Experimental flow control */
#  define IPOPT_TYPE_OPTION_EXPAC     (14 << IPOPT_TYPE_OPTION_SHIFT) /* Experimental access control */
#  define IPOPT_TYPE_OPTION_ENCODE    (15 << IPOPT_TYPE_OPTION_SHIFT) /* ENCODE */
#  define IPOPT_TYPE_OPTION_IMITD     (16 << IPOPT_TYPE_OPTION_SHIFT) /* IMI traffic descriptor */
#  define IPOPT_TYPE_OPTION_EXTIP     (17 << IPOPT_TYPE_OPTION_SHIFT) /* Extended IP (RFC 1385) */
#  define IPOPT_TYPE_OPTION_TR        (18 << IPOPT_TYPE_OPTION_SHIFT) /* Traceroute (RFC 1393) */
#  define IPOPT_TYPE_OPTION_ADDREXT   (19 << IPOPT_TYPE_OPTION_SHIFT) /* Address extension (RFC 1475) */
#  define IPOPT_TYPE_OPTION_RA        (20 << IPOPT_TYPE_OPTION_SHIFT) /* Router alert (RFC 2113) */
#  define IPOPT_TYPE_OPTION_SDBM      (21 << IPOPT_TYPE_OPTION_SHIFT) /* Selective direct broadcast mode (RFC 1770) */
#  define IPOPT_TYPE_OPTION_DPS       (23 << IPOPT_TYPE_OPTION_SHIFT) /* Dynamic packet state */
#  define IPOPT_TYPE_OPTION_UMP       (24 << IPOPT_TYPE_OPTION_SHIFT) /* Upstream multicast packet */
#  define IPOPT_TYPE_OPTION_QS        (25 << IPOPT_TYPE_OPTION_SHIFT) /* Quick start (RFC 4782) */
#  define IPOPT_TYPE_OPTION_EXP3692   (30 << IPOPT_TYPE_OPTION_SHIFT) /* RFC 3692-style experiment (RFC 4782) */
#define IPOPT_TYPE_CLASS_SHIFT        (5)      /* Bits 5-6: Class */
#define IPOPT_TYPE_CLASS_MASK         (3 << IPOPT_TYPE_CLASS_SHIFT)
#  define IPOPT_TYPE_CLASS_CTRL       (0 << IPOPT_TYPE_CLASS_SHIFT)   /* Control */
#  define IPOPT_TYPE_CLASS_MEASURE    (2 << IPOPT_TYPE_CLASS_SHIFT)   /* Debugging and measurement */
#define IPOPT_TYPE_COPIED             (1 << 7) /* Bit 7: IP layer must copy option to each fragment */
#define IPOPT_TYPE_NOTCOPIED          (0)

/* IP Option encoding macros */

#define IPOPT_MKTYPE(copied,class,option) (copied|class|option)

#define IPOPT_MKOPTION8(copied,class,option) \
  ((uint8_t)IPOPT_MKTYPE(copied,class,option))
#define IPOPT_MKOPTION32(type,len,ptr,data) \
  ((uint32_t)(type) << 24 | (uint32_t)(len) << 16 | \
   (uint32_t)(ptr)   << 8 | (uint32_t)(data))

/* Option Copy Class Length    Description References
 * ------ ---- ----- --------- ------------------------------------------------
 *   0     0    0     1        End of options list (RFC 791)
 *   1     0    0     1        NOP (RFC 791 
 *   2     1    0     11       Security (RFC 791, RFC 1108)
 *   3     1    0     variable Loose Source Route (RFC 791)
 *   4     0    2     variable Time stamp (RFC 781, RFC 791)
 *   5     1    0     3-31     Extended Security (RFC 1108)
 *   6     1    0              Commercial Security
 *   7     0    0     variable Record Route (RFC 791)
 *   8     1    0     4        Stream Identifier (RFC 791, RFC 1122)
 *   9     1    0     variable Strict Source Route (RFC 791)
 *  10     0    0              Experimental Measurement
 *  11     0    0     4        MTU Probe (obsolete) (RFC 1063)
 *  12     0    0     4        MTU Reply (obsolete) (RFC 1063)
 *  13     1    2              Experimental Flow Control
 *  14     1    0              Experimental Access Control
 *  15     0    0              ENCODE
 *  16     1    0              IMI Traffic Descriptor
 *  17     1    0     variable Extended Internet Protocol (RFC 1385)
 *  18     0    2     12       Traceroute (RFC 1393)
 *  19     1    0     10       Address Extension (RFC 1475)
 *  20     1    0     4        Router Alert (RFC 2113)
 *  21     1    0     6-38     Selective Directed Broadcast Mode (RFC 1770)
 *  22     1    0        
 *  23     1    0              Dynamic Packet State
 *  24     1    0              Upstream Multicast Packet
 *  25     0    0              QS, Quick-Start (RFC 4782)
 *  26
 *  -
 *  29             
 *  30     0    0             EXP - RFC3692-style Experiment (RFC 4727)
 *  30     0    2             EXP - RFC3692-style Experiment (RFC 4727)
 *  30     1    0             EXP - RFC3692-style Experiment RFC 4727)
 *  30     1    2             EXP - RFC3692-style Experiment (RFC 4727)
 *  31             
 */

#define IPOTR_END_LEN 1
#define IPOPT_END_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_NOTCOPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_END)

#define IPOTR_NOOP_LEN 1
#define IPOPT_NOOP_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_NOTCOPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_NOOP)

#define IPOPT_SEC_LEN 11
#define IPOPT_SEC_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_SEC)

#define IPOPT_LSRR_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_LSRR)

#define IPOPT_TIMESTAMP_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_NOTCOPIED, IPOPT_TYPE_CLASS_MEASURE, IPOPT_TYPE_OPTION_TIMESTAMP)

#define IPOPT_EXTSEC_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_EXTSEC)

#define IPOPT_COMMSEC_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_COMMSEC)

#define IPOPT_RR_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_NOTCOPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_RR)

#define IPOPT_SSID_LEN 4
#define IPOPT_SSID_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_SSID)

#define IPOPT_SSRR_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_SSRR)
#define IPOPT_EXPMEAS_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_NOTCOPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_EXPMEAS)

#define IPOPT_MTUPROBE_LEN 4
#define IPOPT_MTUPROBE_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_NOTCOPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_MTUPROBE)

#define IPOPT_MTUREPLY_LEN 4
#define IPOPT_MTUREPLY_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_NOTCOPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_MTUREPLY)

#define IPOPT_EXPFC_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_MEASURE, IPOPT_TYPE_OPTION_EXPFC)

#define IPOPT_EXPAC_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_EXPAC)

#define IPOPT_ENCODE_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_NOTCOPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_ENCODE)

#define IPOPT_IMITD_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_IMITD)

#define IPOPT_EXTIP_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_EXTIP)

#define IPOPT_TR_LEN 12
#define IPOPT_TR_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_NOTCOPIED, IPOPT_TYPE_CLASS_MEASURE, IPOPT_TYPE_OPTION_TR)

#define IPOPT_ADDREXT_LEN 10
#define IPOPT_ADDREXT_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_ADDREXT)

#define IPOPT_RA_LEN 4
#define IPOPT_RA_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_RA)
#define IPOPT_RA \
  IPOPT_MKOPTION32(IPOPT_RA_TYPE, 4, 0, 0)

#define IPOPT_SDBM_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_SDBM)
  
#define IPOPT_DPS_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_DPS)
  
#define IPOPT_UMP_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_COPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_UMP)
  
#define IPOPT_QS_TYPE \
  IPOPT_MKTYPE(IPOPT_TYPE_NOTCOPIED, IPOPT_TYPE_CLASS_CTRL, IPOPT_TYPE_OPTION_QS)

/************************************************************************************************************
 * Public Type Definitions
 ************************************************************************************************************/

/************************************************************************************************************
 * Public Data
 ************************************************************************************************************/

/************************************************************************************************************
 * Public Function Prototypes
 ************************************************************************************************************/

#endif /* __NET_UIP_UIP_IPOPT_H */