2
|
1 |
/*
|
|
2 |
* Copyright 2003 Sun Microsystems, Inc. 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. Sun designates this
|
|
8 |
* particular file as subject to the "Classpath" exception as provided
|
|
9 |
* by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
22 |
* CA 95054 USA or visit www.sun.com if you need additional information or
|
|
23 |
* have any 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 /* dont 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
|