OLD | NEW |
(Empty) | |
| 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 |
OLD | NEW |