blob: 50f0f0e3ffc62c3c2b9cb8de0c6f4a9241f7da0a [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
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 */
36struct 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 */
54struct 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
114typedef 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
134struct 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