Where Online Learning is simpler!
The C and C++ Include Header Files
cat -n /usr/include/netinet/ip6.h
1 /* Copyright (C) 1991-2026 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library; if not, see 16 <https://www.gnu.org/licenses/>. */ 17 18 #ifndef _NETINET_IP6_H 19 #define _NETINET_IP6_H 1 20 21 #include <inttypes.h> 22 #include <netinet/in.h> 23 24 struct ip6_hdr 25 { 26 union 27 { 28 struct ip6_hdrctl 29 { 30 uint32_t ip6_un1_flow; /* 4 bits version, 8 bits TC, 31 20 bits flow-ID */ 32 uint16_t ip6_un1_plen; /* payload length */ 33 uint8_t ip6_un1_nxt; /* next header */ 34 uint8_t ip6_un1_hlim; /* hop limit */ 35 } ip6_un1; 36 uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits tclass */ 37 } ip6_ctlun; 38 struct in6_addr ip6_src; /* source address */ 39 struct in6_addr ip6_dst; /* destination address */ 40 }; 41 42 #define ip6_vfc ip6_ctlun.ip6_un2_vfc 43 #define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow 44 #define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen 45 #define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt 46 #define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim 47 #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim 48 49 #define IPV6_VERSION 0x60 50 #define IPV6_VERSION_MASK 0xf0 51 52 #if __BYTE_ORDER == __BIG_ENDIAN 53 #define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */ 54 #define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */ 55 #else /* __BYTE_ORDER == __LITTLE_ENDIAN */ 56 #define IPV6_FLOWINFO_MASK 0xffffff0f /* flow info (28 bits) */ 57 #define IPV6_FLOWLABEL_MASK 0xffff0f00 /* flow label (20 bits) */ 58 #endif 59 60 /* Generic extension header. */ 61 struct ip6_ext 62 { 63 uint8_t ip6e_nxt; /* next header. */ 64 uint8_t ip6e_len; /* length in units of 8 octets. */ 65 }; 66 67 /* Hop-by-Hop options header. */ 68 struct ip6_hbh 69 { 70 uint8_t ip6h_nxt; /* next header. */ 71 uint8_t ip6h_len; /* length in units of 8 octets. */ 72 /* followed by options */ 73 }; 74 75 /* Destination options header */ 76 struct ip6_dest 77 { 78 uint8_t ip6d_nxt; /* next header */ 79 uint8_t ip6d_len; /* length in units of 8 octets */ 80 /* followed by options */ 81 }; 82 83 /* Routing header */ 84 struct ip6_rthdr 85 { 86 uint8_t ip6r_nxt; /* next header */ 87 uint8_t ip6r_len; /* length in units of 8 octets */ 88 uint8_t ip6r_type; /* routing type */ 89 uint8_t ip6r_segleft; /* segments left */ 90 /* followed by routing type specific data */ 91 }; 92 93 /* Type 0 Routing header */ 94 struct ip6_rthdr0 95 { 96 uint8_t ip6r0_nxt; /* next header */ 97 uint8_t ip6r0_len; /* length in units of 8 octets */ 98 uint8_t ip6r0_type; /* always zero */ 99 uint8_t ip6r0_segleft; /* segments left */ 100 uint8_t ip6r0_reserved; /* reserved field */ 101 uint8_t ip6r0_slmap[3]; /* strict/loose bit map */ 102 /* followed by up to 127 struct in6_addr */ 103 struct in6_addr ip6r0_addr[0]; 104 }; 105 106 /* Fragment header */ 107 struct ip6_frag 108 { 109 uint8_t ip6f_nxt; /* next header */ 110 uint8_t ip6f_reserved; /* reserved field */ 111 uint16_t ip6f_offlg; /* offset, reserved, and flag */ 112 uint32_t ip6f_ident; /* identification */ 113 }; 114 115 #if __BYTE_ORDER == __BIG_ENDIAN 116 # define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */ 117 # define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */ 118 # define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */ 119 #else /* __BYTE_ORDER == __LITTLE_ENDIAN */ 120 # define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */ 121 # define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */ 122 # define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */ 123 #endif 124 125 /* IPv6 options */ 126 struct ip6_opt 127 { 128 uint8_t ip6o_type; 129 uint8_t ip6o_len; 130 }; 131 132 /* The high-order 3 bits of the option type define the behavior 133 * when processing an unknown option and whether or not the option 134 * content changes in flight. 135 */ 136 #define IP6OPT_TYPE(o) ((o) & 0xc0) 137 #define IP6OPT_TYPE_SKIP 0x00 138 #define IP6OPT_TYPE_DISCARD 0x40 139 #define IP6OPT_TYPE_FORCEICMP 0x80 140 #define IP6OPT_TYPE_ICMP 0xc0 141 #define IP6OPT_TYPE_MUTABLE 0x20 142 143 /* Special option types for padding. */ 144 #define IP6OPT_PAD1 0 145 #define IP6OPT_PADN 1 146 147 #define IP6OPT_JUMBO 0xc2 148 #define IP6OPT_NSAP_ADDR 0xc3 149 #define IP6OPT_TUNNEL_LIMIT 0x04 150 #define IP6OPT_ROUTER_ALERT 0x05 151 152 /* Jumbo Payload Option */ 153 struct ip6_opt_jumbo 154 { 155 uint8_t ip6oj_type; 156 uint8_t ip6oj_len; 157 uint8_t ip6oj_jumbo_len[4]; 158 }; 159 #define IP6OPT_JUMBO_LEN 6 160 161 /* NSAP Address Option */ 162 struct ip6_opt_nsap 163 { 164 uint8_t ip6on_type; 165 uint8_t ip6on_len; 166 uint8_t ip6on_src_nsap_len; 167 uint8_t ip6on_dst_nsap_len; 168 /* followed by source NSAP */ 169 /* followed by destination NSAP */ 170 }; 171 172 /* Tunnel Limit Option */ 173 struct ip6_opt_tunnel 174 { 175 uint8_t ip6ot_type; 176 uint8_t ip6ot_len; 177 uint8_t ip6ot_encap_limit; 178 }; 179 180 /* Router Alert Option */ 181 struct ip6_opt_router 182 { 183 uint8_t ip6or_type; 184 uint8_t ip6or_len; 185 uint8_t ip6or_value[2]; 186 }; 187 188 /* Router alert values (in network byte order) */ 189 #if __BYTE_ORDER == __BIG_ENDIAN 190 # define IP6_ALERT_MLD 0x0000 191 # define IP6_ALERT_RSVP 0x0001 192 # define IP6_ALERT_AN 0x0002 193 #else /* __BYTE_ORDER == __LITTLE_ENDIAN */ 194 # define IP6_ALERT_MLD 0x0000 195 # define IP6_ALERT_RSVP 0x0100 196 # define IP6_ALERT_AN 0x0200 197 #endif 198 199 #endif /* netinet/ip6.h */