1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*4882a593Smuzhiyun #ifndef _UAPI_IPV6_H 3*4882a593Smuzhiyun #define _UAPI_IPV6_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/libc-compat.h> 6*4882a593Smuzhiyun #include <linux/types.h> 7*4882a593Smuzhiyun #include <linux/in6.h> 8*4882a593Smuzhiyun #include <asm/byteorder.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun /* The latest drafts declared increase in minimal mtu up to 1280. */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define IPV6_MIN_MTU 1280 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /* 15*4882a593Smuzhiyun * Advanced API 16*4882a593Smuzhiyun * source interface/address selection, source routing, etc... 17*4882a593Smuzhiyun * *under construction* 18*4882a593Smuzhiyun */ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #if __UAPI_DEF_IN6_PKTINFO 21*4882a593Smuzhiyun struct in6_pktinfo { 22*4882a593Smuzhiyun struct in6_addr ipi6_addr; 23*4882a593Smuzhiyun int ipi6_ifindex; 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun #endif 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #if __UAPI_DEF_IP6_MTUINFO 28*4882a593Smuzhiyun struct ip6_mtuinfo { 29*4882a593Smuzhiyun struct sockaddr_in6 ip6m_addr; 30*4882a593Smuzhiyun __u32 ip6m_mtu; 31*4882a593Smuzhiyun }; 32*4882a593Smuzhiyun #endif 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct in6_ifreq { 35*4882a593Smuzhiyun struct in6_addr ifr6_addr; 36*4882a593Smuzhiyun __u32 ifr6_prefixlen; 37*4882a593Smuzhiyun int ifr6_ifindex; 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define IPV6_SRCRT_STRICT 0x01 /* Deprecated; will be removed */ 41*4882a593Smuzhiyun #define IPV6_SRCRT_TYPE_0 0 /* Deprecated; will be removed */ 42*4882a593Smuzhiyun #define IPV6_SRCRT_TYPE_2 2 /* IPv6 type 2 Routing Header */ 43*4882a593Smuzhiyun #define IPV6_SRCRT_TYPE_3 3 /* RPL Segment Routing with IPv6 */ 44*4882a593Smuzhiyun #define IPV6_SRCRT_TYPE_4 4 /* Segment Routing with IPv6 */ 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* 47*4882a593Smuzhiyun * routing header 48*4882a593Smuzhiyun */ 49*4882a593Smuzhiyun struct ipv6_rt_hdr { 50*4882a593Smuzhiyun __u8 nexthdr; 51*4882a593Smuzhiyun __u8 hdrlen; 52*4882a593Smuzhiyun __u8 type; 53*4882a593Smuzhiyun __u8 segments_left; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* 56*4882a593Smuzhiyun * type specific data 57*4882a593Smuzhiyun * variable length field 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun struct ipv6_opt_hdr { 63*4882a593Smuzhiyun __u8 nexthdr; 64*4882a593Smuzhiyun __u8 hdrlen; 65*4882a593Smuzhiyun /* 66*4882a593Smuzhiyun * TLV encoded option data follows. 67*4882a593Smuzhiyun */ 68*4882a593Smuzhiyun } __attribute__((packed)); /* required for some archs */ 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun #define ipv6_destopt_hdr ipv6_opt_hdr 71*4882a593Smuzhiyun #define ipv6_hopopt_hdr ipv6_opt_hdr 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* Router Alert option values (RFC2711) */ 74*4882a593Smuzhiyun #define IPV6_OPT_ROUTERALERT_MLD 0x0000 /* MLD(RFC2710) */ 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* 77*4882a593Smuzhiyun * routing header type 0 (used in cmsghdr struct) 78*4882a593Smuzhiyun */ 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun struct rt0_hdr { 81*4882a593Smuzhiyun struct ipv6_rt_hdr rt_hdr; 82*4882a593Smuzhiyun __u32 reserved; 83*4882a593Smuzhiyun struct in6_addr addr[0]; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define rt0_type rt_hdr.type 86*4882a593Smuzhiyun }; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* 89*4882a593Smuzhiyun * routing header type 2 90*4882a593Smuzhiyun */ 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun struct rt2_hdr { 93*4882a593Smuzhiyun struct ipv6_rt_hdr rt_hdr; 94*4882a593Smuzhiyun __u32 reserved; 95*4882a593Smuzhiyun struct in6_addr addr; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun #define rt2_type rt_hdr.type 98*4882a593Smuzhiyun }; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* 101*4882a593Smuzhiyun * home address option in destination options header 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct ipv6_destopt_hao { 105*4882a593Smuzhiyun __u8 type; 106*4882a593Smuzhiyun __u8 length; 107*4882a593Smuzhiyun struct in6_addr addr; 108*4882a593Smuzhiyun } __attribute__((packed)); 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* 111*4882a593Smuzhiyun * IPv6 fixed header 112*4882a593Smuzhiyun * 113*4882a593Smuzhiyun * BEWARE, it is incorrect. The first 4 bits of flow_lbl 114*4882a593Smuzhiyun * are glued to priority now, forming "class". 115*4882a593Smuzhiyun */ 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun struct ipv6hdr { 118*4882a593Smuzhiyun #if defined(__LITTLE_ENDIAN_BITFIELD) 119*4882a593Smuzhiyun __u8 priority:4, 120*4882a593Smuzhiyun version:4; 121*4882a593Smuzhiyun #elif defined(__BIG_ENDIAN_BITFIELD) 122*4882a593Smuzhiyun __u8 version:4, 123*4882a593Smuzhiyun priority:4; 124*4882a593Smuzhiyun #else 125*4882a593Smuzhiyun #error "Please fix <asm/byteorder.h>" 126*4882a593Smuzhiyun #endif 127*4882a593Smuzhiyun __u8 flow_lbl[3]; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun __be16 payload_len; 130*4882a593Smuzhiyun __u8 nexthdr; 131*4882a593Smuzhiyun __u8 hop_limit; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #ifndef __GENKSYMS__ 134*4882a593Smuzhiyun __struct_group(/* no tag */, addrs, /* no attrs */, 135*4882a593Smuzhiyun #endif 136*4882a593Smuzhiyun struct in6_addr saddr; 137*4882a593Smuzhiyun struct in6_addr daddr; 138*4882a593Smuzhiyun #ifndef __GENKSYMS__ 139*4882a593Smuzhiyun ); 140*4882a593Smuzhiyun #endif 141*4882a593Smuzhiyun }; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /* index values for the variables in ipv6_devconf */ 145*4882a593Smuzhiyun enum { 146*4882a593Smuzhiyun DEVCONF_FORWARDING = 0, 147*4882a593Smuzhiyun DEVCONF_HOPLIMIT, 148*4882a593Smuzhiyun DEVCONF_MTU6, 149*4882a593Smuzhiyun DEVCONF_ACCEPT_RA, 150*4882a593Smuzhiyun DEVCONF_ACCEPT_REDIRECTS, 151*4882a593Smuzhiyun DEVCONF_AUTOCONF, 152*4882a593Smuzhiyun DEVCONF_DAD_TRANSMITS, 153*4882a593Smuzhiyun DEVCONF_RTR_SOLICITS, 154*4882a593Smuzhiyun DEVCONF_RTR_SOLICIT_INTERVAL, 155*4882a593Smuzhiyun DEVCONF_RTR_SOLICIT_DELAY, 156*4882a593Smuzhiyun DEVCONF_USE_TEMPADDR, 157*4882a593Smuzhiyun DEVCONF_TEMP_VALID_LFT, 158*4882a593Smuzhiyun DEVCONF_TEMP_PREFERED_LFT, 159*4882a593Smuzhiyun DEVCONF_REGEN_MAX_RETRY, 160*4882a593Smuzhiyun DEVCONF_MAX_DESYNC_FACTOR, 161*4882a593Smuzhiyun DEVCONF_MAX_ADDRESSES, 162*4882a593Smuzhiyun DEVCONF_FORCE_MLD_VERSION, 163*4882a593Smuzhiyun DEVCONF_ACCEPT_RA_DEFRTR, 164*4882a593Smuzhiyun DEVCONF_ACCEPT_RA_PINFO, 165*4882a593Smuzhiyun DEVCONF_ACCEPT_RA_RTR_PREF, 166*4882a593Smuzhiyun DEVCONF_RTR_PROBE_INTERVAL, 167*4882a593Smuzhiyun DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN, 168*4882a593Smuzhiyun DEVCONF_PROXY_NDP, 169*4882a593Smuzhiyun DEVCONF_OPTIMISTIC_DAD, 170*4882a593Smuzhiyun DEVCONF_ACCEPT_SOURCE_ROUTE, 171*4882a593Smuzhiyun DEVCONF_MC_FORWARDING, 172*4882a593Smuzhiyun DEVCONF_DISABLE_IPV6, 173*4882a593Smuzhiyun DEVCONF_ACCEPT_DAD, 174*4882a593Smuzhiyun DEVCONF_FORCE_TLLAO, 175*4882a593Smuzhiyun DEVCONF_NDISC_NOTIFY, 176*4882a593Smuzhiyun DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL, 177*4882a593Smuzhiyun DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL, 178*4882a593Smuzhiyun DEVCONF_SUPPRESS_FRAG_NDISC, 179*4882a593Smuzhiyun DEVCONF_ACCEPT_RA_FROM_LOCAL, 180*4882a593Smuzhiyun DEVCONF_USE_OPTIMISTIC, 181*4882a593Smuzhiyun DEVCONF_ACCEPT_RA_MTU, 182*4882a593Smuzhiyun DEVCONF_STABLE_SECRET, 183*4882a593Smuzhiyun DEVCONF_USE_OIF_ADDRS_ONLY, 184*4882a593Smuzhiyun DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT, 185*4882a593Smuzhiyun DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN, 186*4882a593Smuzhiyun DEVCONF_DROP_UNICAST_IN_L2_MULTICAST, 187*4882a593Smuzhiyun DEVCONF_DROP_UNSOLICITED_NA, 188*4882a593Smuzhiyun DEVCONF_KEEP_ADDR_ON_DOWN, 189*4882a593Smuzhiyun DEVCONF_RTR_SOLICIT_MAX_INTERVAL, 190*4882a593Smuzhiyun DEVCONF_SEG6_ENABLED, 191*4882a593Smuzhiyun DEVCONF_SEG6_REQUIRE_HMAC, 192*4882a593Smuzhiyun DEVCONF_ENHANCED_DAD, 193*4882a593Smuzhiyun DEVCONF_ADDR_GEN_MODE, 194*4882a593Smuzhiyun DEVCONF_DISABLE_POLICY, 195*4882a593Smuzhiyun DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN, 196*4882a593Smuzhiyun DEVCONF_NDISC_TCLASS, 197*4882a593Smuzhiyun DEVCONF_RPL_SEG_ENABLED, 198*4882a593Smuzhiyun DEVCONF_MAX 199*4882a593Smuzhiyun }; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun #endif /* _UAPI_IPV6_H */ 203