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