1 #ifndef _NETINET_ICMP6_H 2 #define _NETINET_ICMP6_H 3 4 #ifdef __cplusplus 5 extern "C" { 6 #endif 7 8 #include <stdint.h> 9 #include <string.h> 10 #include <sys/types.h> 11 #include <netinet/in.h> 12 13 #define ICMP6_FILTER 1 14 15 #define ICMP6_FILTER_BLOCK 1 16 #define ICMP6_FILTER_PASS 2 17 #define ICMP6_FILTER_BLOCKOTHERS 3 18 #define ICMP6_FILTER_PASSONLY 4 19 20 struct icmp6_filter { 21 uint32_t icmp6_filt[8]; 22 }; 23 24 struct icmp6_hdr { 25 uint8_t icmp6_type; 26 uint8_t icmp6_code; 27 uint16_t icmp6_cksum; 28 union { 29 uint32_t icmp6_un_data32[1]; 30 uint16_t icmp6_un_data16[2]; 31 uint8_t icmp6_un_data8[4]; 32 } icmp6_dataun; 33 }; 34 35 #define icmp6_data32 icmp6_dataun.icmp6_un_data32 36 #define icmp6_data16 icmp6_dataun.icmp6_un_data16 37 #define icmp6_data8 icmp6_dataun.icmp6_un_data8 38 #define icmp6_pptr icmp6_data32[0] 39 #define icmp6_mtu icmp6_data32[0] 40 #define icmp6_id icmp6_data16[0] 41 #define icmp6_seq icmp6_data16[1] 42 #define icmp6_maxdelay icmp6_data16[0] 43 44 #define ICMP6_DST_UNREACH 1 45 #define ICMP6_PACKET_TOO_BIG 2 46 #define ICMP6_TIME_EXCEEDED 3 47 #define ICMP6_PARAM_PROB 4 48 49 #define ICMP6_INFOMSG_MASK 0x80 50 51 #define ICMP6_ECHO_REQUEST 128 52 #define ICMP6_ECHO_REPLY 129 53 #define MLD_LISTENER_QUERY 130 54 #define MLD_LISTENER_REPORT 131 55 #define MLD_LISTENER_REDUCTION 132 56 57 #define ICMP6_DST_UNREACH_NOROUTE 0 58 #define ICMP6_DST_UNREACH_ADMIN 1 59 #define ICMP6_DST_UNREACH_BEYONDSCOPE 2 60 #define ICMP6_DST_UNREACH_ADDR 3 61 #define ICMP6_DST_UNREACH_NOPORT 4 62 63 #define ICMP6_TIME_EXCEED_TRANSIT 0 64 #define ICMP6_TIME_EXCEED_REASSEMBLY 1 65 66 #define ICMP6_PARAMPROB_HEADER 0 67 #define ICMP6_PARAMPROB_NEXTHEADER 1 68 #define ICMP6_PARAMPROB_OPTION 2 69 70 #define ICMP6_FILTER_WILLPASS(type, filterp) \ 71 ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0) 72 73 #define ICMP6_FILTER_WILLBLOCK(type, filterp) \ 74 ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0) 75 76 #define ICMP6_FILTER_SETPASS(type, filterp) \ 77 ((((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31)))) 78 79 #define ICMP6_FILTER_SETBLOCK(type, filterp) \ 80 ((((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type) & 31)))) 81 82 #define ICMP6_FILTER_SETPASSALL(filterp) \ 83 memset (filterp, 0, sizeof (struct icmp6_filter)); 84 85 #define ICMP6_FILTER_SETBLOCKALL(filterp) \ 86 memset (filterp, 0xFF, sizeof (struct icmp6_filter)); 87 88 #define ND_ROUTER_SOLICIT 133 89 #define ND_ROUTER_ADVERT 134 90 #define ND_NEIGHBOR_SOLICIT 135 91 #define ND_NEIGHBOR_ADVERT 136 92 #define ND_REDIRECT 137 93 94 struct nd_router_solicit { 95 struct icmp6_hdr nd_rs_hdr; 96 }; 97 98 #define nd_rs_type nd_rs_hdr.icmp6_type 99 #define nd_rs_code nd_rs_hdr.icmp6_code 100 #define nd_rs_cksum nd_rs_hdr.icmp6_cksum 101 #define nd_rs_reserved nd_rs_hdr.icmp6_data32[0] 102 103 struct nd_router_advert { 104 struct icmp6_hdr nd_ra_hdr; 105 uint32_t nd_ra_reachable; 106 uint32_t nd_ra_retransmit; 107 }; 108 109 #define nd_ra_type nd_ra_hdr.icmp6_type 110 #define nd_ra_code nd_ra_hdr.icmp6_code 111 #define nd_ra_cksum nd_ra_hdr.icmp6_cksum 112 #define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0] 113 #define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1] 114 #define ND_RA_FLAG_MANAGED 0x80 115 #define ND_RA_FLAG_OTHER 0x40 116 #define ND_RA_FLAG_HOME_AGENT 0x20 117 #define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1] 118 119 struct nd_neighbor_solicit { 120 struct icmp6_hdr nd_ns_hdr; 121 struct in6_addr nd_ns_target; 122 }; 123 124 #define nd_ns_type nd_ns_hdr.icmp6_type 125 #define nd_ns_code nd_ns_hdr.icmp6_code 126 #define nd_ns_cksum nd_ns_hdr.icmp6_cksum 127 #define nd_ns_reserved nd_ns_hdr.icmp6_data32[0] 128 129 struct nd_neighbor_advert { 130 struct icmp6_hdr nd_na_hdr; 131 struct in6_addr nd_na_target; 132 }; 133 134 #define nd_na_type nd_na_hdr.icmp6_type 135 #define nd_na_code nd_na_hdr.icmp6_code 136 #define nd_na_cksum nd_na_hdr.icmp6_cksum 137 #define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0] 138 #if __BYTE_ORDER == __BIG_ENDIAN 139 #define ND_NA_FLAG_ROUTER 0x80000000 140 #define ND_NA_FLAG_SOLICITED 0x40000000 141 #define ND_NA_FLAG_OVERRIDE 0x20000000 142 #else 143 #define ND_NA_FLAG_ROUTER 0x00000080 144 #define ND_NA_FLAG_SOLICITED 0x00000040 145 #define ND_NA_FLAG_OVERRIDE 0x00000020 146 #endif 147 148 struct nd_redirect { 149 struct icmp6_hdr nd_rd_hdr; 150 struct in6_addr nd_rd_target; 151 struct in6_addr nd_rd_dst; 152 }; 153 154 #define nd_rd_type nd_rd_hdr.icmp6_type 155 #define nd_rd_code nd_rd_hdr.icmp6_code 156 #define nd_rd_cksum nd_rd_hdr.icmp6_cksum 157 #define nd_rd_reserved nd_rd_hdr.icmp6_data32[0] 158 159 struct nd_opt_hdr { 160 uint8_t nd_opt_type; 161 uint8_t nd_opt_len; 162 }; 163 164 #define ND_OPT_SOURCE_LINKADDR 1 165 #define ND_OPT_TARGET_LINKADDR 2 166 #define ND_OPT_PREFIX_INFORMATION 3 167 #define ND_OPT_REDIRECTED_HEADER 4 168 #define ND_OPT_MTU 5 169 #define ND_OPT_RTR_ADV_INTERVAL 7 170 #define ND_OPT_HOME_AGENT_INFO 8 171 172 struct nd_opt_prefix_info { 173 uint8_t nd_opt_pi_type; 174 uint8_t nd_opt_pi_len; 175 uint8_t nd_opt_pi_prefix_len; 176 uint8_t nd_opt_pi_flags_reserved; 177 uint32_t nd_opt_pi_valid_time; 178 uint32_t nd_opt_pi_preferred_time; 179 uint32_t nd_opt_pi_reserved2; 180 struct in6_addr nd_opt_pi_prefix; 181 }; 182 183 #define ND_OPT_PI_FLAG_ONLINK 0x80 184 #define ND_OPT_PI_FLAG_AUTO 0x40 185 #define ND_OPT_PI_FLAG_RADDR 0x20 186 187 struct nd_opt_rd_hdr { 188 uint8_t nd_opt_rh_type; 189 uint8_t nd_opt_rh_len; 190 uint16_t nd_opt_rh_reserved1; 191 uint32_t nd_opt_rh_reserved2; 192 }; 193 194 struct nd_opt_mtu { 195 uint8_t nd_opt_mtu_type; 196 uint8_t nd_opt_mtu_len; 197 uint16_t nd_opt_mtu_reserved; 198 uint32_t nd_opt_mtu_mtu; 199 }; 200 201 struct mld_hdr { 202 struct icmp6_hdr mld_icmp6_hdr; 203 struct in6_addr mld_addr; 204 }; 205 206 #define mld_type mld_icmp6_hdr.icmp6_type 207 #define mld_code mld_icmp6_hdr.icmp6_code 208 #define mld_cksum mld_icmp6_hdr.icmp6_cksum 209 #define mld_maxdelay mld_icmp6_hdr.icmp6_data16[0] 210 #define mld_reserved mld_icmp6_hdr.icmp6_data16[1] 211 212 #define ICMP6_ROUTER_RENUMBERING 138 213 214 struct icmp6_router_renum { 215 struct icmp6_hdr rr_hdr; 216 uint8_t rr_segnum; 217 uint8_t rr_flags; 218 uint16_t rr_maxdelay; 219 uint32_t rr_reserved; 220 }; 221 222 #define rr_type rr_hdr.icmp6_type 223 #define rr_code rr_hdr.icmp6_code 224 #define rr_cksum rr_hdr.icmp6_cksum 225 #define rr_seqnum rr_hdr.icmp6_data32[0] 226 227 #define ICMP6_RR_FLAGS_TEST 0x80 228 #define ICMP6_RR_FLAGS_REQRESULT 0x40 229 #define ICMP6_RR_FLAGS_FORCEAPPLY 0x20 230 #define ICMP6_RR_FLAGS_SPECSITE 0x10 231 #define ICMP6_RR_FLAGS_PREVDONE 0x08 232 233 struct rr_pco_match { 234 uint8_t rpm_code; 235 uint8_t rpm_len; 236 uint8_t rpm_ordinal; 237 uint8_t rpm_matchlen; 238 uint8_t rpm_minlen; 239 uint8_t rpm_maxlen; 240 uint16_t rpm_reserved; 241 struct in6_addr rpm_prefix; 242 }; 243 244 #define RPM_PCO_ADD 1 245 #define RPM_PCO_CHANGE 2 246 #define RPM_PCO_SETGLOBAL 3 247 248 struct rr_pco_use { 249 uint8_t rpu_uselen; 250 uint8_t rpu_keeplen; 251 uint8_t rpu_ramask; 252 uint8_t rpu_raflags; 253 uint32_t rpu_vltime; 254 uint32_t rpu_pltime; 255 uint32_t rpu_flags; 256 struct in6_addr rpu_prefix; 257 }; 258 259 #define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x20 260 #define ICMP6_RR_PCOUSE_RAFLAGS_AUTO 0x10 261 262 #if __BYTE_ORDER == __BIG_ENDIAN 263 #define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80000000 264 #define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40000000 265 #else 266 #define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80 267 #define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40 268 #endif 269 270 struct rr_result { 271 uint16_t rrr_flags; 272 uint8_t rrr_ordinal; 273 uint8_t rrr_matchedlen; 274 uint32_t rrr_ifid; 275 struct in6_addr rrr_prefix; 276 }; 277 278 #if __BYTE_ORDER == __BIG_ENDIAN 279 #define ICMP6_RR_RESULT_FLAGS_OOB 0x0002 280 #define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0001 281 #else 282 #define ICMP6_RR_RESULT_FLAGS_OOB 0x0200 283 #define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0100 284 #endif 285 286 struct nd_opt_adv_interval { 287 uint8_t nd_opt_adv_interval_type; 288 uint8_t nd_opt_adv_interval_len; 289 uint16_t nd_opt_adv_interval_reserved; 290 uint32_t nd_opt_adv_interval_ival; 291 }; 292 293 struct nd_opt_home_agent_info { 294 uint8_t nd_opt_home_agent_info_type; 295 uint8_t nd_opt_home_agent_info_len; 296 uint16_t nd_opt_home_agent_info_reserved; 297 uint16_t nd_opt_home_agent_info_preference; 298 uint16_t nd_opt_home_agent_info_lifetime; 299 }; 300 301 #ifdef __cplusplus 302 } 303 #endif 304 305 #endif 306