  1 /*      $OpenBSD: ip_icmp.h,v 1.21 2005/07/31 03:30:55 pascoe Exp $     */
  2 /*      $NetBSD: ip_icmp.h,v 1.10 1996/02/13 23:42:28 christos Exp $    */
  3 
  4 /*
  5  * Copyright (c) 1982, 1986, 1993
  6  *      The Regents of the University of California.  All rights reserved.
  7  *
  8  * Redistribution and use in source and binary forms, with or without
  9  * modification, are permitted provided that the following conditions
 10  * are met:
 11  * 1. Redistributions of source code must retain the above copyright
 12  *    notice, this list of conditions and the following disclaimer.
 13  * 2. Redistributions in binary form must reproduce the above copyright
 14  *    notice, this list of conditions and the following disclaimer in the
 15  *    documentation and/or other materials provided with the distribution.
 16  * 3. Neither the name of the University nor the names of its contributors
 17  *    may be used to endorse or promote products derived from this software
 18  *    without specific prior written permission.
 19  *
 20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 30  * SUCH DAMAGE.
 31  *
 32  *      @(#)ip_icmp.h   8.1 (Berkeley) 6/10/93
 33  */
 34 
 35 #ifndef _NETINET_IP_ICMP_H_
 36 #define _NETINET_IP_ICMP_H_
 37 
 38 /*
 39  * Interface Control Message Protocol Definitions.
 40  * Per RFC 792, September 1981.
 41  * RFC 950, August 1985. (Address Mask Request / Reply)
 42  * RFC 1256, September 1991. (Router Advertisement and Solicitation)
 43  * RFC 1108, November 1991. (Param Problem, Missing Req. Option)
 44  * RFC 1393, January 1993. (Traceroute)
 45  * RFC 1475, June 1993. (Datagram Conversion Error)
 46  * RFC 1812, June 1995. (adm prohib, host precedence, precedence cutoff)
 47  * RFC 2002, October 1996. (Mobility changes to Router Advertisement)
 48  */
 49 
 50 /*
 51  * ICMP Router Advertisement data
 52  */
 53 struct icmp_ra_addr {
 54         n_long ira_addr;
 55         n_long ira_preference;
 56 };
 57 
 58 /*
 59  * Structure of an icmp header.
 60  */
 61 struct icmp {
 62         u_int8_t  icmp_type;            /* type of message, see below */
 63         u_int8_t  icmp_code;            /* type sub code */
 64         u_int16_t icmp_cksum;           /* ones complement cksum of struct */
 65         union {
 66                 u_int8_t  ih_pptr;              /* ICMP_PARAMPROB */
 67                 struct in_addr ih_gwaddr;       /* ICMP_REDIRECT */
 68                 struct ih_idseq {
 69                           n_short icd_id;
 70                           n_short icd_seq;
 71                 } ih_idseq;
 72                 int32_t   ih_void;
 73 
 74                 /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
 75                 struct ih_pmtu {
 76                           n_short ipm_void;
 77                           n_short ipm_nextmtu;
 78                 } ih_pmtu;
 79 
 80                 struct ih_rtradv {
 81                         u_int8_t irt_num_addrs;
 82                         u_int8_t irt_wpa;
 83                         n_short irt_lifetime;
 84                 } ih_rtradv;
 85         } icmp_hun;
 86 #define icmp_pptr         icmp_hun.ih_pptr
 87 #define icmp_gwaddr       icmp_hun.ih_gwaddr
 88 #define icmp_id           icmp_hun.ih_idseq.icd_id
 89 #define icmp_seq          icmp_hun.ih_idseq.icd_seq
 90 #define icmp_void         icmp_hun.ih_void
 91 #define icmp_pmvoid       icmp_hun.ih_pmtu.ipm_void
 92 #define icmp_nextmtu      icmp_hun.ih_pmtu.ipm_nextmtu
 93 #define icmp_num_addrs    icmp_hun.ih_rtradv.irt_num_addrs
 94 #define icmp_wpa          icmp_hun.ih_rtradv.irt_wpa
 95 #define icmp_lifetime     icmp_hun.ih_rtradv.irt_lifetime
 96         union {
 97                 struct id_ts {
 98                           n_time its_otime;
 99                           n_time its_rtime;
100                           n_time its_ttime;
101                 } id_ts;
102                 struct id_ip  {
103                           struct ip idi_ip;
104                           /* options and then 64 bits of data */
105                 } id_ip;
106                 u_int32_t id_mask;
107                 int8_t    id_data[1];
108         } icmp_dun;
109 #define icmp_otime        icmp_dun.id_ts.its_otime
110 #define icmp_rtime        icmp_dun.id_ts.its_rtime
111 #define icmp_ttime        icmp_dun.id_ts.its_ttime
112 #define icmp_ip           icmp_dun.id_ip.idi_ip
113 #define icmp_mask         icmp_dun.id_mask
114 #define icmp_data         icmp_dun.id_data
115 };
116 
117 /*
118  * For IPv6 transition related ICMP errors.
119  */
120 #define ICMP_V6ADVLENMIN        (8 + sizeof(struct ip) + 40)
121 #define ICMP_V6ADVLEN(p)        (8 + ((p)->icmp_ip.ip_hl << 2) + 40)
122 
123 /*
124  * Lower bounds on packet lengths for various types.
125  * For the error advice packets must first insure that the
126  * packet is large enough to contain the returned ip header.
127  * Only then can we do the check to see if 64 bits of packet
128  * data have been returned, since we need to check the returned
129  * ip header length.

