xref: /dflybsd-src/lib/libc/net/inet6_opt_init.3 (revision 25dcc235f42b4a5124c1d45fa687c6737666174c)
15aa41e7cSHasso Tepper.\"	$KAME: inet6_opt_init.3,v 1.7 2004/12/27 05:08:23 itojun Exp $
25aa41e7cSHasso Tepper.\"
35aa41e7cSHasso Tepper.\" Copyright (C) 2004 WIDE Project.
45aa41e7cSHasso Tepper.\" All rights reserved.
55aa41e7cSHasso Tepper.\"
65aa41e7cSHasso Tepper.\" Redistribution and use in source and binary forms, with or without
75aa41e7cSHasso Tepper.\" modification, are permitted provided that the following conditions
85aa41e7cSHasso Tepper.\" are met:
95aa41e7cSHasso Tepper.\" 1. Redistributions of source code must retain the above copyright
105aa41e7cSHasso Tepper.\"    notice, this list of conditions and the following disclaimer.
115aa41e7cSHasso Tepper.\" 2. Redistributions in binary form must reproduce the above copyright
125aa41e7cSHasso Tepper.\"    notice, this list of conditions and the following disclaimer in the
135aa41e7cSHasso Tepper.\"    documentation and/or other materials provided with the distribution.
145aa41e7cSHasso Tepper.\" 3. Neither the name of the project nor the names of its contributors
155aa41e7cSHasso Tepper.\"    may be used to endorse or promote products derived from this software
165aa41e7cSHasso Tepper.\"    without specific prior written permission.
175aa41e7cSHasso Tepper.\"
185aa41e7cSHasso Tepper.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
195aa41e7cSHasso Tepper.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
205aa41e7cSHasso Tepper.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
215aa41e7cSHasso Tepper.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
225aa41e7cSHasso Tepper.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
235aa41e7cSHasso Tepper.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
245aa41e7cSHasso Tepper.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
255aa41e7cSHasso Tepper.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
265aa41e7cSHasso Tepper.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY/
275aa41e7cSHasso Tepper.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
285aa41e7cSHasso Tepper.\" SUCH DAMAGE.
295aa41e7cSHasso Tepper.\"
305aa41e7cSHasso Tepper.\" $FreeBSD: src/lib/libc/net/inet6_opt_init.3,v 1.10 2005/11/23 16:07:54 ru Exp $
315aa41e7cSHasso Tepper.\"
32*25dcc235SSascha Wildner.Dd December 8, 2020
335aa41e7cSHasso Tepper.Dt INET6_OPT_INIT 3
345aa41e7cSHasso Tepper.Os
355aa41e7cSHasso Tepper.\"
365aa41e7cSHasso Tepper.Sh NAME
375aa41e7cSHasso Tepper.Nm inet6_opt_init ,
385aa41e7cSHasso Tepper.Nm inet6_opt_append ,
395aa41e7cSHasso Tepper.Nm inet6_opt_finish ,
405aa41e7cSHasso Tepper.Nm inet6_opt_set_val ,
415aa41e7cSHasso Tepper.Nm inet6_opt_next ,
425aa41e7cSHasso Tepper.Nm inet6_opt_find ,
435aa41e7cSHasso Tepper.Nm inet6_opt_get_val
445aa41e7cSHasso Tepper.Nd IPv6 Hop-by-Hop and Destination Options manipulation
455aa41e7cSHasso Tepper.\"
46306a0714SSascha Wildner.Sh LIBRARY
47306a0714SSascha Wildner.Lb libc
485aa41e7cSHasso Tepper.Sh SYNOPSIS
495aa41e7cSHasso Tepper.In netinet/in.h
505aa41e7cSHasso Tepper.Ft "int"
515aa41e7cSHasso Tepper.Fn inet6_opt_init "void *extbuf" "socklen_t extlen"
525aa41e7cSHasso Tepper.Ft "int"
53*25dcc235SSascha Wildner.Fn inet6_opt_append "void *extbuf" "socklen_t extlen" "int offset" "uint8_t type" "socklen_t len" "uint8_t align" "void **databufp"
545aa41e7cSHasso Tepper.Ft "int"
555aa41e7cSHasso Tepper.Fn inet6_opt_finish "void *extbuf" "socklen_t extlen" "int offset"
565aa41e7cSHasso Tepper.Ft "int"
575aa41e7cSHasso Tepper.Fn inet6_opt_set_val "void *databuf" "int offset" "void *val" "socklen_t vallen"
585aa41e7cSHasso Tepper.Ft "int"
59*25dcc235SSascha Wildner.Fn inet6_opt_next "void *extbuf" "socklen_t extlen" "int offset" "uint8_t *typep" "socklen_t *lenp" "void **databufp"
605aa41e7cSHasso Tepper.Ft "int"
61*25dcc235SSascha Wildner.Fn inet6_opt_find "void *extbuf" "socklen_t extlen" "int offset" "uint8_t type" "socklen_t *lenp" "void **databufp"
625aa41e7cSHasso Tepper.Ft "int"
635aa41e7cSHasso Tepper.Fn inet6_opt_get_val "void *databuf" "int offset" "void *val" "socklen_t vallen"
645aa41e7cSHasso Tepper.\"
655aa41e7cSHasso Tepper.Sh DESCRIPTION
665aa41e7cSHasso TepperBuilding and parsing the Hop-by-Hop and Destination options is
675aa41e7cSHasso Teppercomplicated.
685aa41e7cSHasso TepperThe advanced sockets API defines a set of functions to
695aa41e7cSHasso Tepperhelp applications create and manipulate Hop-by-Hop and Destination
705aa41e7cSHasso Tepperoptions.
715aa41e7cSHasso TepperThis man page describes the functions specified in
725aa41e7cSHasso TepperIETF Draft RFC 3542.
735aa41e7cSHasso TepperThese functions use the
745aa41e7cSHasso Tepperformatting rules specified in Appendix B in RFC 2460, i.e., that the
755aa41e7cSHasso Tepperlargest field is placed last in the option.
765aa41e7cSHasso TepperThe function prototypes
775aa41e7cSHasso Tepperfor these functions are all contained in the
785aa41e7cSHasso Tepper.In netinet/in.h
795aa41e7cSHasso Tepperheader file.
805aa41e7cSHasso Tepper.\"
815aa41e7cSHasso Tepper.Ss inet6_opt_init
825aa41e7cSHasso TepperThe
835aa41e7cSHasso Tepper.Fn inet6_opt_init
845aa41e7cSHasso Tepperfunction
855aa41e7cSHasso Tepperreturns the number of bytes needed for an empty
865aa41e7cSHasso Tepperextension header, one without any options.
875aa41e7cSHasso TepperIf the
885aa41e7cSHasso Tepper.Fa extbuf
895aa41e7cSHasso Tepperargument points to a valid section of memory
905aa41e7cSHasso Tepperthen the
915aa41e7cSHasso Tepper.Fn inet6_opt_init
925aa41e7cSHasso Tepperfunction also initializes the extension header's length field.
935aa41e7cSHasso TepperWhen attempting to initialize an extension buffer passed in the
945aa41e7cSHasso Tepper.Fa extbuf
955aa41e7cSHasso Tepperargument,
965aa41e7cSHasso Tepper.Fa extlen
975aa41e7cSHasso Teppermust be a positive multiple of 8 or else the function fails and
985aa41e7cSHasso Tepperreturns \-1 to the caller.
995aa41e7cSHasso Tepper.\"
1005aa41e7cSHasso Tepper.Ss inet6_opt_append
1015aa41e7cSHasso TepperThe
1025aa41e7cSHasso Tepper.Fn inet6_opt_append
1035aa41e7cSHasso Tepperfunction can perform two different jobs.
1045aa41e7cSHasso TepperWhen a valid
1055aa41e7cSHasso Tepper.Fa extbuf
1065aa41e7cSHasso Tepperargument is supplied it appends an option to the extension buffer and
1075aa41e7cSHasso Tepperreturns the updated total length as well as a pointer to the newly
1085aa41e7cSHasso Teppercreated option in
1095aa41e7cSHasso Tepper.Fa databufp .
1105aa41e7cSHasso TepperIf the value
1115aa41e7cSHasso Tepperof
1125aa41e7cSHasso Tepper.Fa extbuf
1135aa41e7cSHasso Tepperis
1145aa41e7cSHasso Tepper.Dv NULL
1155aa41e7cSHasso Tepperthen the
1165aa41e7cSHasso Tepper.Fn inet6_opt_append
1175aa41e7cSHasso Tepperfunction only reports what the total length would
1185aa41e7cSHasso Tepperbe if the option were actually appended.
1195aa41e7cSHasso TepperThe
1205aa41e7cSHasso Tepper.Fa len
1215aa41e7cSHasso Tepperand
1225aa41e7cSHasso Tepper.Fa align
1235aa41e7cSHasso Tepperarguments specify the length of the option and the required data
1245aa41e7cSHasso Tepperalignment which must be used when appending the option.
1255aa41e7cSHasso TepperThe
1265aa41e7cSHasso Tepper.Fa offset
1275aa41e7cSHasso Tepperargument should be the length returned by the
1285aa41e7cSHasso Tepper.Fn inet6_opt_init
1295aa41e7cSHasso Tepperfunction or a previous call to
1305aa41e7cSHasso Tepper.Fn inet6_opt_append .
1315aa41e7cSHasso Tepper.Pp
1325aa41e7cSHasso TepperThe
1335aa41e7cSHasso Tepper.Fa type
1345aa41e7cSHasso Tepperargument is the 8-bit option type.
1355aa41e7cSHasso Tepper.Pp
1365aa41e7cSHasso TepperAfter
1375aa41e7cSHasso Tepper.Fn inet6_opt_append
1385aa41e7cSHasso Tepperhas been called, the application can use the buffer pointed to by
1395aa41e7cSHasso Tepper.Fa databufp
1405aa41e7cSHasso Tepperdirectly, or use
1415aa41e7cSHasso Tepper.Fn inet6_opt_set_val
1425aa41e7cSHasso Tepperto specify the data to be contained in the option.
1435aa41e7cSHasso Tepper.Pp
1445aa41e7cSHasso TepperOption types of
1455aa41e7cSHasso Tepper.Li 0
1465aa41e7cSHasso Tepperand
1475aa41e7cSHasso Tepper.Li 1
1485aa41e7cSHasso Tepperare reserved for the
1495aa41e7cSHasso Tepper.Li Pad1
1505aa41e7cSHasso Tepperand
1515aa41e7cSHasso Tepper.Li PadN
1525aa41e7cSHasso Tepperoptions.
1535aa41e7cSHasso TepperAll other values from 2 through 255 may be used by applications.
1545aa41e7cSHasso Tepper.Pp
1555aa41e7cSHasso TepperThe length of the option data is contained in an 8-bit value and so
1565aa41e7cSHasso Teppermay contain any value from 0 through 255.
1575aa41e7cSHasso Tepper.Pp
1585aa41e7cSHasso TepperThe
1595aa41e7cSHasso Tepper.Fa align
1605aa41e7cSHasso Tepperparameter must have a value of 1, 2, 4, or 8 and cannot exceed the
1615aa41e7cSHasso Teppervalue of
1625aa41e7cSHasso Tepper.Fa len .
1635aa41e7cSHasso TepperThe alignment values represent no alignment, 16 bit, 32 bit and 64 bit
1645aa41e7cSHasso Tepperalignments, respectively.
1655aa41e7cSHasso Tepper.\"
1665aa41e7cSHasso Tepper.Ss inet6_opt_finish
1675aa41e7cSHasso TepperThe
1685aa41e7cSHasso Tepper.Fn inet6_opt_finish
1695aa41e7cSHasso Tepperfunction
1705aa41e7cSHasso Teppercalculates the final padding necessary to make the extension header a
1715aa41e7cSHasso Teppermultiple of 8 bytes, as required by the IPv6 extension header
1725aa41e7cSHasso Tepperspecification, and returns the extension header's updated total
1735aa41e7cSHasso Tepperlength.
1745aa41e7cSHasso TepperThe
1755aa41e7cSHasso Tepper.Fa offset
1765aa41e7cSHasso Tepperargument should be the length returned by
1775aa41e7cSHasso Tepper.Fn inet6_opt_init
1785aa41e7cSHasso Tepperor
1795aa41e7cSHasso Tepper.Fn inet6_opt_append .
1805aa41e7cSHasso TepperWhen
1815aa41e7cSHasso Tepper.Fa extbuf
1825aa41e7cSHasso Tepperis not
1835aa41e7cSHasso Tepper.Dv NULL
1845aa41e7cSHasso Tepperthe function also sets up the appropriate padding bytes by inserting a
1855aa41e7cSHasso TepperPad1 or PadN option of the proper length.
1865aa41e7cSHasso Tepper.Pp
1875aa41e7cSHasso TepperIf the extension header is too small to contain the proper padding
1885aa41e7cSHasso Tepperthen an error of \-1 is returned to the caller.
1895aa41e7cSHasso Tepper.\"
1905aa41e7cSHasso Tepper.Ss inet6_opt_set_val
1915aa41e7cSHasso TepperThe
1925aa41e7cSHasso Tepper.Fn inet6_opt_set_val
1935aa41e7cSHasso Tepperfunction inserts data items of various sizes into the data portion of
1945aa41e7cSHasso Tepperthe option.
1955aa41e7cSHasso TepperThe
1965aa41e7cSHasso Tepper.Fa databuf
1975aa41e7cSHasso Tepperargument is a pointer to memory that was returned by the
1985aa41e7cSHasso Tepper.Fn inet6_opt_append
1995aa41e7cSHasso Teppercall and the
2005aa41e7cSHasso Tepper.Fa offset
2015aa41e7cSHasso Tepperargument specifies where the option should be placed in the
2025aa41e7cSHasso Tepperdata buffer.
2035aa41e7cSHasso TepperThe
2045aa41e7cSHasso Tepper.Fa val
2055aa41e7cSHasso Tepperargument points to an area of memory containing the data to be
2065aa41e7cSHasso Tepperinserted into the extension header, and the
2075aa41e7cSHasso Tepper.Fa vallen
2085aa41e7cSHasso Tepperargument indicates how much data to copy.
2095aa41e7cSHasso Tepper.Pp
2105aa41e7cSHasso TepperThe caller should ensure that each field is aligned on its natural
2115aa41e7cSHasso Tepperboundaries as described in Appendix B of RFC 2460.
2125aa41e7cSHasso Tepper.Pp
2135aa41e7cSHasso TepperThe function returns the offset for the next field which is calculated as
2145aa41e7cSHasso Tepper.Fa offset
2155aa41e7cSHasso Tepper+
2165aa41e7cSHasso Tepper.Fa vallen
2175aa41e7cSHasso Tepperand is used when composing options with multiple fields.
2185aa41e7cSHasso Tepper.\"
2195aa41e7cSHasso Tepper.Ss inet6_opt_next
2205aa41e7cSHasso TepperThe
2215aa41e7cSHasso Tepper.Fn inet6_opt_next
2225aa41e7cSHasso Tepperfunction parses received extension headers.
2235aa41e7cSHasso TepperThe
2245aa41e7cSHasso Tepper.Fa extbuf
2255aa41e7cSHasso Tepperand
2265aa41e7cSHasso Tepper.Fa extlen
2275aa41e7cSHasso Tepperarguments specify the location and length of the extension header
2285aa41e7cSHasso Tepperbeing parsed.
2295aa41e7cSHasso TepperThe
2305aa41e7cSHasso Tepper.Fa offset
2315aa41e7cSHasso Tepperargument should either be zero, for the first option, or the length value
2325aa41e7cSHasso Tepperreturned by a previous call to
2335aa41e7cSHasso Tepper.Fn inet6_opt_next
2345aa41e7cSHasso Tepperor
2355aa41e7cSHasso Tepper.Fn inet6_opt_find .
2365aa41e7cSHasso TepperThe return value specifies the position where to continue scanning the
2375aa41e7cSHasso Tepperextension buffer.
2385aa41e7cSHasso TepperThe option is returned in the arguments
2395aa41e7cSHasso Tepper.Fa typep , lenp ,
2405aa41e7cSHasso Tepperand
2415aa41e7cSHasso Tepper.Fa databufp ,
2425aa41e7cSHasso Tepperwhich
2435aa41e7cSHasso Tepperpoint to the 8-bit option type, the 8-bit option length and the option
2445aa41e7cSHasso Tepperdata, respectively.
2455aa41e7cSHasso TepperThis function does not return any PAD1 or PADN options.
2465aa41e7cSHasso TepperWhen an error occurs or there are no more options, the return
2475aa41e7cSHasso Teppervalue is \-1.
2485aa41e7cSHasso Tepper.\"
2495aa41e7cSHasso Tepper.Ss inet6_opt_find
2505aa41e7cSHasso TepperThe
2515aa41e7cSHasso Tepper.Fn inet6_opt_find
2525aa41e7cSHasso Tepperfunction searches the extension buffer for a particular option type,
2535aa41e7cSHasso Tepperpassed in through the
2545aa41e7cSHasso Tepper.Fa type
2555aa41e7cSHasso Tepperargument.
2565aa41e7cSHasso TepperIf the option is found then the
2575aa41e7cSHasso Tepper.Fa lenp
2585aa41e7cSHasso Tepperand
2595aa41e7cSHasso Tepper.Fa databufp
2605aa41e7cSHasso Tepperarguments are updated to point to the option's length and data,
2615aa41e7cSHasso Tepperrespectively.
2625aa41e7cSHasso TepperThe
2635aa41e7cSHasso Tepper.Fa extbuf
2645aa41e7cSHasso Tepperand
2655aa41e7cSHasso Tepper.Fa extlen
2665aa41e7cSHasso Tepperarguments
2675aa41e7cSHasso Teppermust point to a valid extension buffer and give its length.
2685aa41e7cSHasso TepperThe
2695aa41e7cSHasso Tepper.Fa offset
2705aa41e7cSHasso Tepperargument can be used to search from a location anywhere in the
2715aa41e7cSHasso Tepperextension header.
2725aa41e7cSHasso Tepper.Ss inet6_opt_get_val
2735aa41e7cSHasso TepperThe
2745aa41e7cSHasso Tepper.Fn inet6_opt_get_val
2755aa41e7cSHasso Tepperfunction extracts data items of various sizes in the data portion of
2765aa41e7cSHasso Tepperthe option.
2775aa41e7cSHasso TepperThe
2785aa41e7cSHasso Tepper.Fa databuf
2795aa41e7cSHasso Tepperis a pointer returned by the
2805aa41e7cSHasso Tepper.Fn inet6_opt_next
2815aa41e7cSHasso Tepperor
2825aa41e7cSHasso Tepper.Fn inet6_opt_find
2835aa41e7cSHasso Tepperfunctions.
2845aa41e7cSHasso TepperThe
2855aa41e7cSHasso Tepper.Fa val
2865aa41e7cSHasso Tepperargument points where the data will be extracted.
2875aa41e7cSHasso TepperThe
2885aa41e7cSHasso Tepper.Fa offset
2895aa41e7cSHasso Tepperargument specifies from where in the data portion of the option the
2905aa41e7cSHasso Teppervalue should be extracted; the first byte of option data is specified
2915aa41e7cSHasso Tepperby an offset of zero.
2925aa41e7cSHasso Tepper.Pp
2935aa41e7cSHasso TepperIt is expected that each field is aligned on its natural boundaries as
2945aa41e7cSHasso Tepperdescribed in Appendix B of RFC 2460.
2955aa41e7cSHasso Tepper.Pp
2965aa41e7cSHasso TepperThe function returns the offset for the next field
2975aa41e7cSHasso Tepperby calculating
2985aa41e7cSHasso Tepper.Fa offset
2995aa41e7cSHasso Tepper+
3005aa41e7cSHasso Tepper.Fa vallen
3015aa41e7cSHasso Tepperwhich can be used when extracting option content with multiple fields.
3025aa41e7cSHasso TepperRobust receivers must verify alignment before calling this function.
3035aa41e7cSHasso Tepper.\"
3045aa41e7cSHasso Tepper.Sh RETURN VALUES
3055aa41e7cSHasso TepperAll the functions return
3065aa41e7cSHasso Tepper\-1
3075aa41e7cSHasso Tepperon an error.
3085aa41e7cSHasso Tepper.\"
3095aa41e7cSHasso Tepper.Sh EXAMPLES
3105aa41e7cSHasso TepperRFC 3542 gives comprehensive examples in Section 23.
3115aa41e7cSHasso Tepper.Pp
3125aa41e7cSHasso TepperKAME also provides examples in the
3135aa41e7cSHasso Tepper.Pa advapitest
3145aa41e7cSHasso Tepperdirectory of its kit.
3155aa41e7cSHasso Tepper.\"
3165aa41e7cSHasso Tepper.Sh SEE ALSO
3175aa41e7cSHasso Tepper.Rs
3185aa41e7cSHasso Tepper.%A W. Stevens
3195aa41e7cSHasso Tepper.%A M. Thomas
3205aa41e7cSHasso Tepper.%A E. Nordmark
3215aa41e7cSHasso Tepper.%A T. Jinmei
3225aa41e7cSHasso Tepper.%T "Advanced Sockets API for IPv6"
3235aa41e7cSHasso Tepper.%N RFC 3542
3245aa41e7cSHasso Tepper.%D October 2002
3255aa41e7cSHasso Tepper.Re
3265aa41e7cSHasso Tepper.Rs
3275aa41e7cSHasso Tepper.%A S. Deering
3285aa41e7cSHasso Tepper.%A R. Hinden
3295aa41e7cSHasso Tepper.%T "Internet Protocol, Version 6 (IPv6) Specification"
3305aa41e7cSHasso Tepper.%N RFC 2460
3315aa41e7cSHasso Tepper.%D December 1998
3325aa41e7cSHasso Tepper.Re
3335aa41e7cSHasso Tepper.Sh STANDARDS
3345aa41e7cSHasso TepperThe functions are documented in
3355aa41e7cSHasso Tepper.Dq Advanced Sockets API for IPv6
3365aa41e7cSHasso Tepper.Pq RFC 3542 .
3375aa41e7cSHasso Tepper.\"
3385aa41e7cSHasso Tepper.Sh HISTORY
3395aa41e7cSHasso TepperThe implementation first appeared in KAME advanced networking kit.
340