1 /* |
|
2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. |
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
4 * |
|
5 * This code is free software; you can redistribute it and/or modify it |
|
6 * under the terms of the GNU General Public License version 2 only, as |
|
7 * published by the Free Software Foundation. Oracle designates this |
|
8 * particular file as subject to the "Classpath" exception as provided |
|
9 * by Oracle in the LICENSE file that accompanied this code. |
|
10 * |
|
11 * This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 * version 2 for more details (a copy is included in the LICENSE file that |
|
15 * accompanied this code). |
|
16 * |
|
17 * You should have received a copy of the GNU General Public License version |
|
18 * 2 along with this work; if not, write to the Free Software Foundation, |
|
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 * |
|
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
22 * or visit www.oracle.com if you need additional information or have any |
|
23 * questions. |
|
24 */ |
|
25 |
|
26 #ifndef ICMP_H |
|
27 #define ICMP_H |
|
28 |
|
29 /* |
|
30 * Structure of an internet header, naked of options. |
|
31 * |
|
32 * We declare ip_len and ip_off to be short, rather than ushort_t |
|
33 * pragmatically since otherwise unsigned comparisons can result |
|
34 * against negative integers quite easily, and fail in subtle ways. |
|
35 */ |
|
36 struct ip { |
|
37 unsigned char ip_hl:4, /* header length */ |
|
38 ip_v:4; /* version */ |
|
39 unsigned char ip_tos; /* type of service */ |
|
40 short ip_len; /* total length */ |
|
41 unsigned short ip_id; /* identification */ |
|
42 short ip_off; /* fragment offset field */ |
|
43 #define IP_DF 0x4000 /* don't fragment flag */ |
|
44 #define IP_MF 0x2000 /* more fragments flag */ |
|
45 unsigned char ip_ttl; /* time to live */ |
|
46 unsigned char ip_p; /* protocol */ |
|
47 unsigned short ip_sum; /* checksum */ |
|
48 struct in_addr ip_src, ip_dst; /* source and dest address */ |
|
49 }; |
|
50 |
|
51 /* |
|
52 * Structure of an icmp header. |
|
53 */ |
|
54 struct icmp { |
|
55 unsigned char icmp_type; /* type of message, see below */ |
|
56 unsigned char icmp_code; /* type sub code */ |
|
57 unsigned short icmp_cksum; /* ones complement cksum of struct */ |
|
58 union { |
|
59 unsigned char ih_pptr; /* ICMP_PARAMPROB */ |
|
60 struct in_addr ih_gwaddr; /* ICMP_REDIRECT */ |
|
61 struct ih_idseq { |
|
62 unsigned short icd_id; |
|
63 unsigned short icd_seq; |
|
64 } ih_idseq; |
|
65 int ih_void; |
|
66 |
|
67 /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */ |
|
68 struct ih_pmtu { |
|
69 unsigned short ipm_void; |
|
70 unsigned short ipm_nextmtu; |
|
71 } ih_pmtu; |
|
72 |
|
73 struct ih_rtradv { |
|
74 unsigned char irt_num_addrs; |
|
75 unsigned char irt_wpa; |
|
76 unsigned short irt_lifetime; |
|
77 } ih_rtradv; |
|
78 } icmp_hun; |
|
79 #define icmp_pptr icmp_hun.ih_pptr |
|
80 #define icmp_gwaddr icmp_hun.ih_gwaddr |
|
81 #define icmp_id icmp_hun.ih_idseq.icd_id |
|
82 #define icmp_seq icmp_hun.ih_idseq.icd_seq |
|
83 #define icmp_void icmp_hun.ih_void |
|
84 #define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void |
|
85 #define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu |
|
86 union { |
|
87 struct id_ts { |
|
88 unsigned int its_otime; |
|
89 unsigned int its_rtime; |
|
90 unsigned int its_ttime; |
|
91 } id_ts; |
|
92 struct id_ip { |
|
93 struct ip idi_ip; |
|
94 /* options and then 64 bits of data */ |
|
95 } id_ip; |
|
96 unsigned int id_mask; |
|
97 char id_data[1]; |
|
98 } icmp_dun; |
|
99 #define icmp_otime icmp_dun.id_ts.its_otime |
|
100 #define icmp_rtime icmp_dun.id_ts.its_rtime |
|
101 #define icmp_ttime icmp_dun.id_ts.its_ttime |
|
102 #define icmp_ip icmp_dun.id_ip.idi_ip |
|
103 #define icmp_mask icmp_dun.id_mask |
|
104 #define icmp_data icmp_dun.id_data |
|
105 }; |
|
106 |
|
107 #define ICMP_ECHOREPLY 0 /* echo reply */ |
|
108 #define ICMP_ECHO 8 /* echo service */ |
|
109 |
|
110 /* |
|
111 * ICMPv6 structures & constants |
|
112 */ |
|
113 |
|
114 typedef struct icmp6_hdr { |
|
115 u_char icmp6_type; /* type field */ |
|
116 u_char icmp6_code; /* code field */ |
|
117 u_short icmp6_cksum; /* checksum field */ |
|
118 union { |
|
119 u_int icmp6_un_data32[1]; /* type-specific field */ |
|
120 u_short icmp6_un_data16[2]; /* type-specific field */ |
|
121 u_char icmp6_un_data8[4]; /* type-specific field */ |
|
122 } icmp6_dataun; |
|
123 } icmp6_t; |
|
124 |
|
125 #define icmp6_data32 icmp6_dataun.icmp6_un_data32 |
|
126 #define icmp6_data16 icmp6_dataun.icmp6_un_data16 |
|
127 #define icmp6_data8 icmp6_dataun.icmp6_un_data8 |
|
128 #define icmp6_pptr icmp6_data32[0] /* parameter prob */ |
|
129 #define icmp6_mtu icmp6_data32[0] /* packet too big */ |
|
130 #define icmp6_id icmp6_data16[0] /* echo request/reply */ |
|
131 #define icmp6_seq icmp6_data16[1] /* echo request/reply */ |
|
132 #define icmp6_maxdelay icmp6_data16[0] /* mcast group membership */ |
|
133 |
|
134 struct ip6_pseudo_hdr /* for calculate the ICMPv6 checksum */ |
|
135 { |
|
136 struct in6_addr ip6_src; |
|
137 struct in6_addr ip6_dst; |
|
138 u_int ip6_plen; |
|
139 u_int ip6_nxt; |
|
140 }; |
|
141 |
|
142 #define ICMP6_ECHO_REQUEST 128 |
|
143 #define ICMP6_ECHO_REPLY 129 |
|
144 #define IPPROTO_ICMPV6 58 |
|
145 #define IPV6_UNICAST_HOPS 4 /* Set/get IP unicast hop limit */ |
|
146 |
|
147 |
|
148 #endif |
|