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
149