1 .\" $OpenBSD: inet6_option_space.3,v 1.8 2001/06/23 05:57:04 deraadt Exp $
2 .\" $KAME: inet6_option_space.3,v 1.7 2000/05/17 14:32:13 itojun Exp $
4 .\" Copyright (c) 1983, 1987, 1991, 1993
5 .\" The Regents of the University of California. All rights reserved.
7 .\" Redistribution and use in source and binary forms, with or without
8 .\" modification, are permitted provided that the following conditions
10 .\" 1. Redistributions of source code must retain the above copyright
11 .\" notice, this list of conditions and the following disclaimer.
12 .\" 2. Redistributions in binary form must reproduce the above copyright
13 .\" notice, this list of conditions and the following disclaimer in the
14 .\" documentation and/or other materials provided with the distribution.
15 .\" 3. All advertising materials mentioning features or use of this software
16 .\" must display the following acknowledgement:
17 .\" This product includes software developed by the University of
18 .\" California, Berkeley and its contributors.
19 .\" 4. Neither the name of the University nor the names of its contributors
20 .\" may be used to endorse or promote products derived from this software
21 .\" without specific prior written permission.
23 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 .Dt INET6_OPTION_SPACE 3
40 .Nm inet6_option_space ,
41 .Nm inet6_option_init ,
42 .Nm inet6_option_append ,
43 .Nm inet6_option_alloc ,
44 .Nm inet6_option_next ,
46 .Nd IPv6 Hop-by-Hop and Destination Options manipulation
49 .Fd #include <netinet/in.h>
51 .Fn inet6_option_space "int nbytes"
53 .Fn inet6_option_init "void *bp" "struct cmsghdr **cmsgp" "int type"
55 .Fn inet6_option_append "struct cmsghdr *cmsg" "const u_int8_t *typep" "int multx" "int plusy"
57 .Fn inet6_option_alloc "struct cmsghdr *cmsg" "int datalen" "int multx" "int plusy";
59 .Fn inet6_option_next "const struct cmsghdr *cmsg" "u_int8_t **tptrp"
61 .Fn inet6_option_find "const struct cmsghdr *cmsg" "u_int8_t **tptrp" "int type"
65 Building and parsing the Hop-by-Hop and Destination options is
66 complicated due to alignment constranints, padding and
67 ancillary data manipulation.
68 RFC2292 defines a set of functions to help the application.
69 The function prototypes for
70 these functions are all in the
74 .Ss inet6_option_space
75 .Fn inet6_option_space
76 returns the number of bytes required to hold an option when it is stored as
77 ancillary data, including the
79 structure at the beginning,
80 and any padding at the end
82 to make its size a multiple of 8 bytes
84 The argument is the size of the structure defining the option,
85 which must include any pad bytes at the beginning
92 the type byte, the length byte, and the option data.
94 Note: If multiple options are stored in a single ancillary data
95 object, which is the recommended technique, this function
96 overestimates the amount of space required by the size of
102 is the number of options to be stored in the object.
103 This is of little consequence, since it is assumed that most
104 Hop-by-Hop option headers and Destination option headers carry only
106 .Pq appendix B of [RFC-2460] .
108 .Ss inet6_option_init
109 .Fn inet6_option_init
110 is called once per ancillary data object that will
111 contain either Hop-by-Hop or Destination options.
119 is a pointer to previously allocated space that will contain the
120 ancillary data object.
121 It must be large enough to contain all the
122 individual options to be added by later calls to
123 .Fn inet6_option_append
125 .Fn inet6_option_alloc .
128 is a pointer to a pointer to a
132 is initialized by this function to point to the
134 structure constructed by this function in the buffer pointed to by
148 structure pointed to by
151 .Ss inet6_option_append
152 This function appends a Hop-by-Hop option or a Destination option
153 into an ancillary data object that has been initialized by
154 .Fn inet6_option_init .
155 This function returns
164 structure that must have been
166 .Fn inet6_option_init .
169 is a pointer to the 8-bit option type.
170 It is assumed that this
171 field is immediately followed by the 8-bit option data length field,
172 which is then followed immediately by the option data.
174 initializes these three fields
175 .Pq the type-length-value, or TLV
176 before calling this function.
178 The option type must have a value from
191 options, respectively.
194 The option data length must have a value between
198 inclusive, and is the length of the option data that follows.
203 in the alignment term
205 It must have a value of
215 in the alignment term
217 It must have a value between
223 .Ss inet6_option_alloc
224 This function appends a Hop-by-Hop option or a Destination option
225 into an ancillary data object that has been initialized by
226 .Fn inet6_option_init .
227 This function returns a pointer to the 8-bit
228 option type field that starts the option on success, or
232 The difference between this function and
233 .Fn inet6_option_append
234 is that the latter copies the contents of a previously built option into
235 the ancillary data object while the current function returns a
236 pointer to the space in the data object where the option's TLV must
237 then be built by the caller.
242 structure that must have been
244 .Fn inet6_option_init .
247 is the value of the option data length byte for this option.
248 This value is required as an argument to allow the function to
249 determine if padding must be appended at the end of the option.
252 .Fn inet6_option_append
253 function does not need a data length argument
254 since the option data length must already be stored by the caller.
260 in the alignment term
262 It must have a value of
272 in the alignment term
274 It must have a value between
280 .Ss inet6_option_next
281 This function processes the next Hop-by-Hop option or Destination
282 option in an ancillary data object.
283 If another option remains to be
284 processed, the return value of the function is
289 the 8-bit option type field
291 which is followed by the 8-bit option
292 data length, followed by the option data
294 If no more options remain
295 to be processed, the return value is
301 If an error occurs, the return value is
323 is a pointer to a pointer to an 8-bit byte and
326 by the function to remember its place in the ancillary data object
327 each time the function is called.
328 The first time this function is
329 called for a given ancillary data object,
334 Each time this function returns success,
337 option type field for the next option to be processed.
339 .Ss inet6_option_find
340 This function is similar to the previously described
341 .Fn inet6_option_next
342 function, except this function lets the caller
343 specify the option type to be searched for, instead of always
344 returning the next option in the ancillary data object.
361 is a pointer to a pointer to an 8-bit byte and
364 by the function to remember its place in the ancillary data object
365 each time the function is called.
366 The first time this function is
367 called for a given ancillary data object,
372 This function starts searching for an option of the specified type
373 beginning after the value of
375 If an option of the specified
376 type is located, this function returns
381 bit option type field for the option of the specified type.
383 option of the specified type is not located, the return value is
389 If an error occurs, the return value is
397 .Fn inet6_option_init
399 .Fn inet6_option_append
406 .Fn inet6_option_alloc
412 .Fn inet6_option_next
414 .Fn inet6_option_find
424 RFC2292 gives comprehensive examples in chapter 6.
430 .%T "Advanced Sockets API for IPv6"
437 .%T "Internet Protocol, Version 6 (IPv6) Specification"
443 The implementation first appeared in KAME advanced networking kit.
448 .Dq Advanced Sockets API for IPv6
452 The text was shamelessly copied from RFC2292.