Statistics
| Branch: | Revision:

root / slirp / ip_icmp.h @ 3a9d8549

History | View | Annotate | Download (6.1 kB)

1
/*
2
 * Copyright (c) 1982, 1986, 1993
3
 *        The Regents of the University of California.  All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 * 1. Redistributions of source code must retain the above copyright
9
 *    notice, this list of conditions and the following disclaimer.
10
 * 2. Redistributions in binary form must reproduce the above copyright
11
 *    notice, this list of conditions and the following disclaimer in the
12
 *    documentation and/or other materials provided with the distribution.
13
 * 3. Neither the name of the University nor the names of its contributors
14
 *    may be used to endorse or promote products derived from this software
15
 *    without specific prior written permission.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
 * SUCH DAMAGE.
28
 *
29
 *        @(#)ip_icmp.h        8.1 (Berkeley) 6/10/93
30
 * ip_icmp.h,v 1.4 1995/05/30 08:09:43 rgrimes Exp
31
 */
32

    
33
#ifndef _NETINET_IP_ICMP_H_
34
#define _NETINET_IP_ICMP_H_
35

    
36
/*
37
 * Interface Control Message Protocol Definitions.
38
 * Per RFC 792, September 1981.
39
 */
40

    
41
typedef uint32_t n_time;
42

    
43
/*
44
 * Structure of an icmp header.
45
 */
46
struct icmp {
47
        u_char        icmp_type;                /* type of message, see below */
48
        u_char        icmp_code;                /* type sub code */
49
        u_short        icmp_cksum;                /* ones complement cksum of struct */
50
        union {
51
                u_char ih_pptr;                        /* ICMP_PARAMPROB */
52
                struct in_addr ih_gwaddr;        /* ICMP_REDIRECT */
53
                struct ih_idseq {
54
                        u_short        icd_id;
55
                        u_short        icd_seq;
56
                } ih_idseq;
57
                int ih_void;
58

    
59
                /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
60
                struct ih_pmtu {
61
                        u_short ipm_void;
62
                        u_short ipm_nextmtu;
63
                } ih_pmtu;
64
        } icmp_hun;
65
#define        icmp_pptr        icmp_hun.ih_pptr
66
#define        icmp_gwaddr        icmp_hun.ih_gwaddr
67
#define        icmp_id                icmp_hun.ih_idseq.icd_id
68
#define        icmp_seq        icmp_hun.ih_idseq.icd_seq
69
#define        icmp_void        icmp_hun.ih_void
70
#define        icmp_pmvoid        icmp_hun.ih_pmtu.ipm_void
71
#define        icmp_nextmtu        icmp_hun.ih_pmtu.ipm_nextmtu
72
        union {
73
                struct id_ts {
74
                        n_time its_otime;
75
                        n_time its_rtime;
76
                        n_time its_ttime;
77
                } id_ts;
78
                struct id_ip  {
79
                        struct ip idi_ip;
80
                        /* options and then 64 bits of data */
81
                } id_ip;
82
                uint32_t        id_mask;
83
                char                id_data[1];
84
        } icmp_dun;
85
#define        icmp_otime        icmp_dun.id_ts.its_otime
86
#define        icmp_rtime        icmp_dun.id_ts.its_rtime
87
#define        icmp_ttime        icmp_dun.id_ts.its_ttime
88
#define        icmp_ip                icmp_dun.id_ip.idi_ip
89
#define        icmp_mask        icmp_dun.id_mask
90
#define        icmp_data        icmp_dun.id_data
91
};
92

    
93
/*
94
 * Lower bounds on packet lengths for various types.
95
 * For the error advice packets must first insure that the
96
 * packet is large enought to contain the returned ip header.
97
 * Only then can we do the check to see if 64 bits of packet
98
 * data have been returned, since we need to check the returned
99
 * ip header length.
100
 */
101
#define        ICMP_MINLEN        8                                /* abs minimum */
102
#define        ICMP_TSLEN        (8 + 3 * sizeof (n_time))        /* timestamp */
103
#define        ICMP_MASKLEN        12                                /* address mask */
104
#define        ICMP_ADVLENMIN        (8 + sizeof (struct ip) + 8)        /* min */
105
#define        ICMP_ADVLEN(p)        (8 + ((p)->icmp_ip.ip_hl << 2) + 8)
106
        /* N.B.: must separately check that ip_hl >= 5 */
107

    
108
/*
109
 * Definition of type and code field values.
110
 */
111
#define        ICMP_ECHOREPLY                0                /* echo reply */
112
#define        ICMP_UNREACH                3                /* dest unreachable, codes: */
113
#define                ICMP_UNREACH_NET        0                /* bad net */
114
#define                ICMP_UNREACH_HOST        1                /* bad host */
115
#define                ICMP_UNREACH_PROTOCOL        2                /* bad protocol */
116
#define                ICMP_UNREACH_PORT        3                /* bad port */
117
#define                ICMP_UNREACH_NEEDFRAG        4                /* IP_DF caused drop */
118
#define                ICMP_UNREACH_SRCFAIL        5                /* src route failed */
119
#define                ICMP_UNREACH_NET_UNKNOWN 6                /* unknown net */
120
#define                ICMP_UNREACH_HOST_UNKNOWN 7                /* unknown host */
121
#define                ICMP_UNREACH_ISOLATED        8                /* src host isolated */
122
#define                ICMP_UNREACH_NET_PROHIB        9                /* prohibited access */
123
#define                ICMP_UNREACH_HOST_PROHIB 10                /* ditto */
124
#define                ICMP_UNREACH_TOSNET        11                /* bad tos for net */
125
#define                ICMP_UNREACH_TOSHOST        12                /* bad tos for host */
126
#define        ICMP_SOURCEQUENCH        4                /* packet lost, slow down */
127
#define        ICMP_REDIRECT                5                /* shorter route, codes: */
128
#define                ICMP_REDIRECT_NET        0                /* for network */
129
#define                ICMP_REDIRECT_HOST        1                /* for host */
130
#define                ICMP_REDIRECT_TOSNET        2                /* for tos and net */
131
#define                ICMP_REDIRECT_TOSHOST        3                /* for tos and host */
132
#define        ICMP_ECHO                8                /* echo service */
133
#define        ICMP_ROUTERADVERT        9                /* router advertisement */
134
#define        ICMP_ROUTERSOLICIT        10                /* router solicitation */
135
#define        ICMP_TIMXCEED                11                /* time exceeded, code: */
136
#define                ICMP_TIMXCEED_INTRANS        0                /* ttl==0 in transit */
137
#define                ICMP_TIMXCEED_REASS        1                /* ttl==0 in reass */
138
#define        ICMP_PARAMPROB                12                /* ip header bad */
139
#define                ICMP_PARAMPROB_OPTABSENT 1                /* req. opt. absent */
140
#define        ICMP_TSTAMP                13                /* timestamp request */
141
#define        ICMP_TSTAMPREPLY        14                /* timestamp reply */
142
#define        ICMP_IREQ                15                /* information request */
143
#define        ICMP_IREQREPLY                16                /* information reply */
144
#define        ICMP_MASKREQ                17                /* address mask request */
145
#define        ICMP_MASKREPLY                18                /* address mask reply */
146

    
147
#define        ICMP_MAXTYPE                18
148

    
149
#define        ICMP_INFOTYPE(type) \
150
        ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
151
        (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
152
        (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
153
        (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
154
        (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
155

    
156
void icmp_input(struct mbuf *, int);
157
void icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize,
158
                const char *message);
159
void icmp_reflect(struct mbuf *);
160

    
161
#endif