xref: /dragonfly/lib/libc/net/inet6_opt_init.3 (revision 3851e4b8)
1.\"	$KAME: inet6_opt_init.3,v 1.7 2004/12/27 05:08:23 itojun Exp $
2.\"
3.\" Copyright (C) 2004 WIDE Project.
4.\" All rights reserved.
5.\"
6.\" Redistribution and use in source and binary forms, with or without
7.\" modification, are permitted provided that the following conditions
8.\" are met:
9.\" 1. Redistributions of source code must retain the above copyright
10.\"    notice, this list of conditions and the following disclaimer.
11.\" 2. Redistributions in binary form must reproduce the above copyright
12.\"    notice, this list of conditions and the following disclaimer in the
13.\"    documentation and/or other materials provided with the distribution.
14.\" 3. Neither the name of the project nor the names of its contributors
15.\"    may be used to endorse or promote products derived from this software
16.\"    without specific prior written permission.
17.\"
18.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
19.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
22.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY/
27.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28.\" SUCH DAMAGE.
29.\"
30.\" $FreeBSD: src/lib/libc/net/inet6_opt_init.3,v 1.10 2005/11/23 16:07:54 ru Exp $
31.\" $DragonFly: src/lib/libc/net/inet6_opt_init.3,v 1.2 2008/09/05 20:43:08 swildner Exp $
32.\"
33.Dd September 4, 2008
34.Dt INET6_OPT_INIT 3
35.Os
36.\"
37.Sh NAME
38.Nm inet6_opt_init ,
39.Nm inet6_opt_append ,
40.Nm inet6_opt_finish ,
41.Nm inet6_opt_set_val ,
42.Nm inet6_opt_next ,
43.Nm inet6_opt_find ,
44.Nm inet6_opt_get_val
45.Nd IPv6 Hop-by-Hop and Destination Options manipulation
46.\"
47.Sh LIBRARY
48.Lb libc
49.Sh SYNOPSIS
50.In netinet/in.h
51.Ft "int"
52.Fn inet6_opt_init "void *extbuf" "socklen_t extlen"
53.Ft "int"
54.Fn inet6_opt_append "void *extbuf" "socklen_t extlen" "int offset" "u_int8_t type" "socklen_t len" "u_int8_t align" "void **databufp"
55.Ft "int"
56.Fn inet6_opt_finish "void *extbuf" "socklen_t extlen" "int offset"
57.Ft "int"
58.Fn inet6_opt_set_val "void *databuf" "int offset" "void *val" "socklen_t vallen"
59.Ft "int"
60.Fn inet6_opt_next "void *extbuf" "socklen_t extlen" "int offset" "u_int8_t *typep" "socklen_t *lenp" "void **databufp"
61.Ft "int"
62.Fn inet6_opt_find "void *extbuf" "socklen_t extlen" "int offset" "u_int8_t type" "socklen_t *lenp" "void **databufp"
63.Ft "int"
64.Fn inet6_opt_get_val "void *databuf" "int offset" "void *val" "socklen_t vallen"
65.\"
66.Sh DESCRIPTION
67Building and parsing the Hop-by-Hop and Destination options is
68complicated.
69The advanced sockets API defines a set of functions to
70help applications create and manipulate Hop-by-Hop and Destination
71options.
72This man page describes the functions specified in
73IETF Draft RFC 3542.
74These functions use the
75formatting rules specified in Appendix B in RFC 2460, i.e., that the
76largest field is placed last in the option.
77The function prototypes
78for these functions are all contained in the
79.In netinet/in.h
80header file.
81.\"
82.Ss inet6_opt_init
83The
84.Fn inet6_opt_init
85function
86returns the number of bytes needed for an empty
87extension header, one without any options.
88If the
89.Fa extbuf
90argument points to a valid section of memory
91then the
92.Fn inet6_opt_init
93function also initializes the extension header's length field.
94When attempting to initialize an extension buffer passed in the
95.Fa extbuf
96argument,
97.Fa extlen
98must be a positive multiple of 8 or else the function fails and
99returns \-1 to the caller.
100.\"
101.Ss inet6_opt_append
102The
103.Fn inet6_opt_append
104function can perform two different jobs.
105When a valid
106.Fa extbuf
107argument is supplied it appends an option to the extension buffer and
108returns the updated total length as well as a pointer to the newly
109created option in
110.Fa databufp .
111If the value
112of
113.Fa extbuf
114is
115.Dv NULL
116then the
117.Fn inet6_opt_append
118function only reports what the total length would
119be if the option were actually appended.
120The
121.Fa len
122and
123.Fa align
124arguments specify the length of the option and the required data
125alignment which must be used when appending the option.
126The
127.Fa offset
128argument should be the length returned by the
129.Fn inet6_opt_init
130function or a previous call to
131.Fn inet6_opt_append .
132.Pp
133The
134.Fa type
135argument is the 8-bit option type.
136.Pp
137After
138.Fn inet6_opt_append
139has been called, the application can use the buffer pointed to by
140.Fa databufp
141directly, or use
142.Fn inet6_opt_set_val
143to specify the data to be contained in the option.
144.Pp
145Option types of
146.Li 0
147and
148.Li 1
149are reserved for the
150.Li Pad1
151and
152.Li PadN
153options.
154All other values from 2 through 255 may be used by applications.
155.Pp
156The length of the option data is contained in an 8-bit value and so
157may contain any value from 0 through 255.
158.Pp
159The
160.Fa align
161parameter must have a value of 1, 2, 4, or 8 and cannot exceed the
162value of
163.Fa len .
164The alignment values represent no alignment, 16 bit, 32 bit and 64 bit
165alignments, respectively.
166.\"
167.Ss inet6_opt_finish
168The
169.Fn inet6_opt_finish
170function
171calculates the final padding necessary to make the extension header a
172multiple of 8 bytes, as required by the IPv6 extension header
173specification, and returns the extension header's updated total
174length.
175The
176.Fa offset
177argument should be the length returned by
178.Fn inet6_opt_init
179or
180.Fn inet6_opt_append .
181When
182.Fa extbuf
183is not
184.Dv NULL
185the function also sets up the appropriate padding bytes by inserting a
186Pad1 or PadN option of the proper length.
187.Pp
188If the extension header is too small to contain the proper padding
189then an error of \-1 is returned to the caller.
190.\"
191.Ss inet6_opt_set_val
192The
193.Fn inet6_opt_set_val
194function inserts data items of various sizes into the data portion of
195the option.
196The
197.Fa databuf
198argument is a pointer to memory that was returned by the
199.Fn inet6_opt_append
200call and the
201.Fa offset
202argument specifies where the option should be placed in the
203data buffer.
204The
205.Fa val
206argument points to an area of memory containing the data to be
207inserted into the extension header, and the
208.Fa vallen
209argument indicates how much data to copy.
210.Pp
211The caller should ensure that each field is aligned on its natural
212boundaries as described in Appendix B of RFC 2460.
213.Pp
214The function returns the offset for the next field which is calculated as
215.Fa offset
216+
217.Fa vallen
218and is used when composing options with multiple fields.
219.\"
220.Ss inet6_opt_next
221The
222.Fn inet6_opt_next
223function parses received extension headers.
224The
225.Fa extbuf
226and
227.Fa extlen
228arguments specify the location and length of the extension header
229being parsed.
230The
231.Fa offset
232argument should either be zero, for the first option, or the length value
233returned by a previous call to
234.Fn inet6_opt_next
235or
236.Fn inet6_opt_find .
237The return value specifies the position where to continue scanning the
238extension buffer.
239The option is returned in the arguments
240.Fa typep , lenp ,
241and
242.Fa databufp ,
243which
244point to the 8-bit option type, the 8-bit option length and the option
245data, respectively.
246This function does not return any PAD1 or PADN options.
247When an error occurs or there are no more options, the return
248value is \-1.
249.\"
250.Ss inet6_opt_find
251The
252.Fn inet6_opt_find
253function searches the extension buffer for a particular option type,
254passed in through the
255.Fa type
256argument.
257If the option is found then the
258.Fa lenp
259and
260.Fa databufp
261arguments are updated to point to the option's length and data,
262respectively.
263The
264.Fa extbuf
265and
266.Fa extlen
267arguments
268must point to a valid extension buffer and give its length.
269The
270.Fa offset
271argument can be used to search from a location anywhere in the
272extension header.
273.Ss inet6_opt_get_val
274The
275.Fn inet6_opt_get_val
276function extracts data items of various sizes in the data portion of
277the option.
278The
279.Fa databuf
280is a pointer returned by the
281.Fn inet6_opt_next
282or
283.Fn inet6_opt_find
284functions.
285The
286.Fa val
287argument points where the data will be extracted.
288The
289.Fa offset
290argument specifies from where in the data portion of the option the
291value should be extracted; the first byte of option data is specified
292by an offset of zero.
293.Pp
294It is expected that each field is aligned on its natural boundaries as
295described in Appendix B of RFC 2460.
296.Pp
297The function returns the offset for the next field
298by calculating
299.Fa offset
300+
301.Fa vallen
302which can be used when extracting option content with multiple fields.
303Robust receivers must verify alignment before calling this function.
304.\"
305.Sh RETURN VALUES
306All the functions return
307\-1
308on an error.
309.\"
310.Sh EXAMPLES
311RFC 3542 gives comprehensive examples in Section 23.
312.Pp
313KAME also provides examples in the
314.Pa advapitest
315directory of its kit.
316.\"
317.Sh SEE ALSO
318.Rs
319.%A W. Stevens
320.%A M. Thomas
321.%A E. Nordmark
322.%A T. Jinmei
323.%T "Advanced Sockets API for IPv6"
324.%N RFC 3542
325.%D October 2002
326.Re
327.Rs
328.%A S. Deering
329.%A R. Hinden
330.%T "Internet Protocol, Version 6 (IPv6) Specification"
331.%N RFC 2460
332.%D December 1998
333.Re
334.Sh STANDARDS
335The functions are documented in
336.Dq Advanced Sockets API for IPv6
337.Pq RFC 3542 .
338.\"
339.Sh HISTORY
340The implementation first appeared in KAME advanced networking kit.
341