Path: blob/a-new-beginning/SharedDependencies/Sources/libslirp/include/ip_icmp.h
2 views
/* SPDX-License-Identifier: BSD-3-Clause */1/*2* Copyright (c) 1982, 1986, 19933* The Regents of the University of California. All rights reserved.4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10* 2. Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13* 3. Neither the name of the University nor the names of its contributors14* may be used to endorse or promote products derived from this software15* without specific prior written permission.16*17* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND18* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE19* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE20* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE21* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL22* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS23* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)24* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT25* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY26* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF27* SUCH DAMAGE.28*29* @(#)ip_icmp.h 8.1 (Berkeley) 6/10/9330* ip_icmp.h,v 1.4 1995/05/30 08:09:43 rgrimes Exp31*/3233#ifndef NETINET_IP_ICMP_H34#define NETINET_IP_ICMP_H3536/*37* Interface Control Message Protocol Definitions.38* Per RFC 792, September 1981.39*/4041typedef uint32_t n_time;4243#ifdef RSTSLIRP4445/*46* Structure of an icmp header.47*/48struct icmp {49uint8_t icmp_type; /* type of message, see below */50uint8_t icmp_code; /* type sub code */51uint16_t icmp_cksum; /* ones complement cksum of struct */52union {53uint8_t ih_pptr; /* ICMP_PARAMPROB */54struct in_addr ih_gwaddr; /* ICMP_REDIRECT */55struct ih_idseq {56uint16_t icd_id;57uint16_t icd_seq;58} ih_idseq;59int ih_void;6061/* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */62struct ih_pmtu {63uint16_t ipm_void;64uint16_t ipm_nextmtu;65} ih_pmtu;66} icmp_hun;67#define icmp_pptr icmp_hun.ih_pptr68#define icmp_gwaddr icmp_hun.ih_gwaddr69#define icmp_id icmp_hun.ih_idseq.icd_id70#define icmp_seq icmp_hun.ih_idseq.icd_seq71#define icmp_void icmp_hun.ih_void72#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void73#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu74union {75struct id_ts {76n_time its_otime;77n_time its_rtime;78n_time its_ttime;79} id_ts;80struct id_ip {81struct ip idi_ip;82/* options and then 64 bits of data */83} id_ip;84uint32_t id_mask;85char id_data[1];86} icmp_dun;87#define icmp_otime icmp_dun.id_ts.its_otime88#define icmp_rtime icmp_dun.id_ts.its_rtime89#define icmp_ttime icmp_dun.id_ts.its_ttime90#define icmp_ip icmp_dun.id_ip.idi_ip91#define icmp_mask icmp_dun.id_mask92#define icmp_data icmp_dun.id_data93};9495#endif9697/*98* Lower bounds on packet lengths for various types.99* For the error advice packets must first ensure that the100* packet is large enough to contain the returned ip header.101* Only then can we do the check to see if 64 bits of packet102* data have been returned, since we need to check the returned103* ip header length.104*/105#define ICMP_MINLEN 8 /* abs minimum */106#define ICMP_TSLEN (8 + 3 * sizeof(n_time)) /* timestamp */107#define ICMP_MASKLEN 12 /* address mask */108#define ICMP_ADVLENMIN (8 + sizeof(struct ip) + 8) /* min */109#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8)110/* N.B.: must separately check that ip_hl >= 5 */111112/*113* Definition of type and code field values.114*/115#define ICMP_ECHOREPLY 0 /* echo reply */116#define ICMP_UNREACH 3 /* dest unreachable, codes: */117#define ICMP_UNREACH_NET 0 /* bad net */118#define ICMP_UNREACH_HOST 1 /* bad host */119#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */120#define ICMP_UNREACH_PORT 3 /* bad port */121#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */122#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */123#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */124#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */125#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */126#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */127#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */128#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */129#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */130#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */131#define ICMP_REDIRECT 5 /* shorter route, codes: */132#define ICMP_REDIRECT_NET 0 /* for network */133#define ICMP_REDIRECT_HOST 1 /* for host */134#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */135#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */136#define ICMP_ECHO 8 /* echo service */137#define ICMP_ROUTERADVERT 9 /* router advertisement */138#define ICMP_ROUTERSOLICIT 10 /* router solicitation */139#define ICMP_TIMXCEED 11 /* time exceeded, code: */140#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */141#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */142#define ICMP_PARAMPROB 12 /* ip header bad */143#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */144#define ICMP_TSTAMP 13 /* timestamp request */145#define ICMP_TSTAMPREPLY 14 /* timestamp reply */146#define ICMP_IREQ 15 /* information request */147#define ICMP_IREQREPLY 16 /* information reply */148#define ICMP_MASKREQ 17 /* address mask request */149#define ICMP_MASKREPLY 18 /* address mask reply */150151#define ICMP_MAXTYPE 18152153#define ICMP_INFOTYPE(type) \154((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \155(type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \156(type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \157(type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \158(type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)159160/* Called from slirp_new */161void icmp_init(Slirp *slirp);162163/* Called from slirp_cleanup */164void icmp_cleanup(Slirp *slirp);165166/* Process an ICMP packet from the guest */167void icmp_input(struct mbuf *, int);168169/* Send an ICMP error related to the given packet, using the given ICMP type and code, appending the given message (if enabled at compilation), and using the given source. If minsize is sent, send only header + 8B of the given packet, otherwise send it all */170void icmp_forward_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize,171const char *message, struct in_addr *src);172173/* Similar to icmp_forward_error, but use the virtual host address as source */174void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize,175const char *message);176177/* Forward the ICMP packet to the guest (probably a ping reply) */178void icmp_reflect(struct mbuf *);179180/* Handle ICMP data from the ICMP socket, and forward it to the guest (using so_m as reference) */181void icmp_receive(struct socket *so);182183/* Forget about this pending ICMP request */184void icmp_detach(struct socket *so);185186#endif187188189