Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:54:01

0001 /*
0002  * Copyright (c) 1982, 1986, 1993
0003  *  The Regents of the University of California.  All rights reserved.
0004  *
0005  * Redistribution and use in source and binary forms, with or without
0006  * modification, are permitted provided that the following conditions
0007  * are met:
0008  * 1. Redistributions of source code must retain the above copyright
0009  *    notice, this list of conditions and the following disclaimer.
0010  * 2. Redistributions in binary form must reproduce the above copyright
0011  *    notice, this list of conditions and the following disclaimer in the
0012  *    documentation and/or other materials provided with the distribution.
0013  * 3. Neither the name of the University nor the names of its contributors
0014  *    may be used to endorse or promote products derived from this software
0015  *    without specific prior written permission.
0016  *
0017  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
0018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
0021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
0022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
0023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
0024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
0025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
0026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
0027  * SUCH DAMAGE.
0028  *
0029  *  @(#)ip_icmp.h   8.1 (Berkeley) 6/10/93
0030  * $FreeBSD: src/sys/netinet/ip_icmp.h,v 1.22 2004/04/07 20:46:13 imp Exp $
0031  */
0032 
0033 #ifndef LIBBSD_NETINET_IP_ICMP_H
0034 #define LIBBSD_NETINET_IP_ICMP_H
0035 
0036 #include <sys/types.h>      /* uint32_t */
0037 #include <netinet/in.h>     /* in_addr */
0038 #include <netinet/in_systm.h>   /* n_short */
0039 #include <netinet/ip.h>     /* idi_ip */
0040 
0041 /*
0042  * Interface Control Message Protocol Definitions.
0043  * Per RFC 792, September 1981.
0044  */
0045 
0046 /*
0047  * Internal of an ICMP Router Advertisement
0048  */
0049 struct icmp_ra_addr {
0050     uint32_t ira_addr;
0051     uint32_t ira_preference;
0052 };
0053 
0054 /*
0055  * Structure of an icmp header.
0056  */
0057 struct icmp {
0058     unsigned char   icmp_type;  /* type of message, see below */
0059     unsigned char   icmp_code;  /* type sub code */
0060     unsigned short  icmp_cksum; /* ones complement cksum of struct */
0061     union {
0062         unsigned char ih_pptr;      /* ICMP_PARAMPROB */
0063         struct in_addr ih_gwaddr;   /* ICMP_REDIRECT */
0064         struct ih_idseq {
0065             n_short icd_id;
0066             n_short icd_seq;
0067         } ih_idseq;
0068         int ih_void;
0069 
0070         /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
0071         struct ih_pmtu {
0072             n_short ipm_void;
0073             n_short ipm_nextmtu;
0074         } ih_pmtu;
0075 
0076         struct ih_rtradv {
0077             unsigned char irt_num_addrs;
0078             unsigned char irt_wpa;
0079             uint16_t irt_lifetime;
0080         } ih_rtradv;
0081     } icmp_hun;
0082 #define icmp_pptr   icmp_hun.ih_pptr
0083 #define icmp_gwaddr icmp_hun.ih_gwaddr
0084 #define icmp_id     icmp_hun.ih_idseq.icd_id
0085 #define icmp_seq    icmp_hun.ih_idseq.icd_seq
0086 #define icmp_void   icmp_hun.ih_void
0087 #define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
0088 #define icmp_nextmtu    icmp_hun.ih_pmtu.ipm_nextmtu
0089 #define icmp_num_addrs  icmp_hun.ih_rtradv.irt_num_addrs
0090 #define icmp_wpa    icmp_hun.ih_rtradv.irt_wpa
0091 #define icmp_lifetime   icmp_hun.ih_rtradv.irt_lifetime
0092     union {
0093         struct id_ts {          /* ICMP Timestamp */
0094             n_time its_otime;   /* Originate */
0095             n_time its_rtime;   /* Receive */
0096             n_time its_ttime;   /* Transmit */
0097         } id_ts;
0098         struct id_ip  {
0099             struct ip idi_ip;
0100             /* options and then 64 bits of data */
0101         } id_ip;
0102         struct icmp_ra_addr id_radv;
0103         uint32_t id_mask;
0104         char    id_data[1];
0105     } icmp_dun;
0106 #define icmp_otime  icmp_dun.id_ts.its_otime
0107 #define icmp_rtime  icmp_dun.id_ts.its_rtime
0108 #define icmp_ttime  icmp_dun.id_ts.its_ttime
0109 #define icmp_ip     icmp_dun.id_ip.idi_ip
0110 #define icmp_radv   icmp_dun.id_radv
0111 #define icmp_mask   icmp_dun.id_mask
0112 #define icmp_data   icmp_dun.id_data
0113 };
0114 
0115 /*
0116  * Lower bounds on packet lengths for various types.
0117  * For the error advice packets must first insure that the
0118  * packet is large enough to contain the returned ip header.
0119  * Only then can we do the check to see if 64 bits of packet
0120  * data have been returned, since we need to check the returned
0121  * ip header length.
0122  */
0123 #define ICMP_MINLEN 8               /* abs minimum */
0124 #define ICMP_TSLEN  (8 + 3 * sizeof (n_time))   /* timestamp */
0125 #define ICMP_MASKLEN    12              /* address mask */
0126 #define ICMP_ADVLENMIN  (8 + sizeof (struct ip) + 8)    /* min */
0127 #define ICMP_ADVLEN(p)  (8 + ((p)->icmp_ip.ip_hl << 2) + 8)
0128     /* N.B.: must separately check that ip_hl >= 5 */
0129 
0130 /*
0131  * Definition of type and code field values.
0132  */
0133 #define ICMP_ECHOREPLY      0       /* echo reply */
0134 #define ICMP_UNREACH        3       /* dest unreachable, codes: */
0135 #define     ICMP_UNREACH_NET    0       /* bad net */
0136 #define     ICMP_UNREACH_HOST   1       /* bad host */
0137 #define     ICMP_UNREACH_PROTOCOL   2       /* bad protocol */
0138 #define     ICMP_UNREACH_PORT   3       /* bad port */
0139 #define     ICMP_UNREACH_NEEDFRAG   4       /* IP_DF caused drop */
0140 #define     ICMP_UNREACH_SRCFAIL    5       /* src route failed */
0141 #define     ICMP_UNREACH_NET_UNKNOWN 6      /* unknown net */
0142 #define     ICMP_UNREACH_HOST_UNKNOWN 7     /* unknown host */
0143 #define     ICMP_UNREACH_ISOLATED   8       /* src host isolated */
0144 #define     ICMP_UNREACH_NET_PROHIB 9       /* prohibited access */
0145 #define     ICMP_UNREACH_HOST_PROHIB 10     /* ditto */
0146 #define     ICMP_UNREACH_TOSNET 11      /* bad tos for net */
0147 #define     ICMP_UNREACH_TOSHOST    12      /* bad tos for host */
0148 #define     ICMP_UNREACH_FILTER_PROHIB 13       /* admin prohib */
0149 #define     ICMP_UNREACH_HOST_PRECEDENCE 14     /* host prec vio. */
0150 #define     ICMP_UNREACH_PRECEDENCE_CUTOFF 15   /* prec cutoff */
0151 #define ICMP_SOURCEQUENCH   4       /* packet lost, slow down */
0152 #define ICMP_REDIRECT       5       /* shorter route, codes: */
0153 #define     ICMP_REDIRECT_NET   0       /* for network */
0154 #define     ICMP_REDIRECT_HOST  1       /* for host */
0155 #define     ICMP_REDIRECT_TOSNET    2       /* for tos and net */
0156 #define     ICMP_REDIRECT_TOSHOST   3       /* for tos and host */
0157 #define ICMP_ALTHOSTADDR    6       /* alternate host address */
0158 #define ICMP_ECHO       8       /* echo service */
0159 #define ICMP_ROUTERADVERT   9       /* router advertisement */
0160 #define     ICMP_ROUTERADVERT_NORMAL        0   /* normal advertisement */
0161 #define     ICMP_ROUTERADVERT_NOROUTE_COMMON    16  /* selective routing */
0162 #define ICMP_ROUTERSOLICIT  10      /* router solicitation */
0163 #define ICMP_TIMXCEED       11      /* time exceeded, code: */
0164 #define     ICMP_TIMXCEED_INTRANS   0       /* ttl==0 in transit */
0165 #define     ICMP_TIMXCEED_REASS 1       /* ttl==0 in reass */
0166 #define ICMP_PARAMPROB      12      /* ip header bad */
0167 #define     ICMP_PARAMPROB_ERRATPTR 0       /* error at param ptr */
0168 #define     ICMP_PARAMPROB_OPTABSENT 1      /* req. opt. absent */
0169 #define     ICMP_PARAMPROB_LENGTH 2         /* bad length */
0170 #define ICMP_TSTAMP     13      /* timestamp request */
0171 #define ICMP_TSTAMPREPLY    14      /* timestamp reply */
0172 #define ICMP_IREQ       15      /* information request */
0173 #define ICMP_IREQREPLY      16      /* information reply */
0174 #define ICMP_MASKREQ        17      /* address mask request */
0175 #define ICMP_MASKREPLY      18      /* address mask reply */
0176 #define ICMP_TRACEROUTE     30      /* traceroute */
0177 #define ICMP_DATACONVERR    31      /* data conversion error */
0178 #define ICMP_MOBILE_REDIRECT    32      /* mobile host redirect */
0179 #define ICMP_IPV6_WHEREAREYOU   33      /* IPv6 where-are-you */
0180 #define ICMP_IPV6_IAMHERE   34      /* IPv6 i-am-here */
0181 #define ICMP_MOBILE_REGREQUEST  35      /* mobile registration req */
0182 #define ICMP_MOBILE_REGREPLY    36      /* mobile registration reply */
0183 #define ICMP_SKIP       39      /* SKIP */
0184 #define ICMP_PHOTURIS       40      /* Photuris */
0185 #define     ICMP_PHOTURIS_UNKNOWN_INDEX 1   /* unknown sec index */
0186 #define     ICMP_PHOTURIS_AUTH_FAILED   2   /* auth failed */
0187 #define     ICMP_PHOTURIS_DECRYPT_FAILED    3   /* decrypt failed */
0188 
0189 #define ICMP_MAXTYPE        40
0190 
0191 #define ICMP_INFOTYPE(type) \
0192     ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
0193     (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
0194     (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
0195     (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
0196     (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
0197 
0198 #ifdef _KERNEL
0199 void    icmp_error(struct mbuf *, int, int, n_long, struct ifnet *);
0200 void    icmp_input(struct mbuf *, int);
0201 #endif
0202 
0203 #endif