diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 07:42:04 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 07:42:04 +0000 |
commit | 0d47952611198ef6b1163f366dc03922d20b1475 (patch) | |
tree | 3d840a3b8c0daef0754707bfb9f5e873b6b1ac13 /struct_ip.h | |
parent | Initial commit. (diff) | |
download | nmap-upstream.tar.xz nmap-upstream.zip |
Adding upstream version 7.94+git20230807.3be01efb1+dfsg.upstream/7.94+git20230807.3be01efb1+dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | struct_ip.h | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/struct_ip.h b/struct_ip.h new file mode 100644 index 0000000..34c2602 --- /dev/null +++ b/struct_ip.h @@ -0,0 +1,168 @@ +/* The C library on AIX defines the names of various members of struct ip to + something else in <netinet/ip.h>: + +struct ip { + struct ip_firstfour ip_ff; +#define ip_v ip_ff.ip_fv +#define ip_hl ip_ff.ip_fhl +#define ip_vhl ip_ff.ip_fvhl +#define ip_tos ip_ff.ip_ftos +#define ip_len ip_ff.ip_flen + + This breaks code that actually wants to use names like ip_v for its own + purposes, like struct ip_hdr in libdnet. The AIX definitions will work + if they are included late in the list of includes, before other code that + might want to use the above names has already been preprocessed. The + includes that end up defining struct ip are therefore limited to this + file, so it can be included in a .cc file after other .h have been + included. */ + +#ifdef WIN32 +typedef unsigned __int32 u_int32_t; +typedef unsigned __int16 u_int16_t; +typedef unsigned __int8 u_int8_t; +#endif +/* Linux uses these defines in netinet/ip.h to use the correct struct ip */ +#ifndef __FAVOR_BSD +#define __FAVOR_BSD +#endif +#ifndef __USE_BSD +#define __USE_BSD +#endif +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif + +/* BSDI needs this to insure the correct struct ip */ +#undef _IP_VHL + +#ifndef NETINET_IN_SYSTM_H /* This guarding is needed for at least some versions of OpenBSD */ +#include <netinet/in_systm.h> /* defines n_long needed for netinet/ip.h */ +#define NETINET_IN_SYSTM_H +#endif +#if HAVE_NET_IF_H +#ifndef NET_IF_H /* This guarding is needed for at least some versions of OpenBSD */ +#include <net/if.h> +#define NET_IF_H +#endif +#endif +#ifndef NETINET_IP_H /* This guarding is needed for at least some versions of OpenBSD */ +#include <netinet/ip.h> +#define NETINET_IP_H +#endif +#include <net/if_arp.h> + +#ifndef WIN32 +#include <netinet/ip_icmp.h> +#endif + +#ifndef HAVE_STRUCT_IP +#define HAVE_STRUCT_IP + +/* From Linux glibc, which apparently borrowed it from + BSD code. Slightly modified for portability --fyodor@nmap.org */ +/* + * Structure of an internet header, naked of options. + */ +struct ip + { +#if WORDS_BIGENDIAN + u_int8_t ip_v:4; /* version */ + u_int8_t ip_hl:4; /* header length */ +#else + u_int8_t ip_hl:4; /* header length */ + u_int8_t ip_v:4; /* version */ +#endif + u_int8_t ip_tos; /* type of service */ + u_short ip_len; /* total length */ + u_short ip_id; /* identification */ + u_short ip_off; /* fragment offset field */ +#define IP_RF 0x8000 /* reserved fragment flag */ +#define IP_DF 0x4000 /* don't fragment flag */ +#define IP_MF 0x2000 /* more fragments flag */ +#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ + u_int8_t ip_ttl; /* time to live */ + u_int8_t ip_p; /* protocol */ + u_short ip_sum; /* checksum */ + struct in_addr ip_src, ip_dst; /* source and dest address */ + }; + +#endif /* HAVE_STRUCT_IP */ + +#ifndef HAVE_STRUCT_ICMP +#define HAVE_STRUCT_ICMP +/* From Linux /usr/include/netinet/ip_icmp.h GLIBC */ + +/* + * Internal of an ICMP Router Advertisement + */ +struct icmp_ra_addr +{ + u_int32_t ira_addr; + u_int32_t ira_preference; +}; + +struct icmp +{ + u_int8_t icmp_type; /* type of message, see below */ + u_int8_t icmp_code; /* type sub code */ + u_int16_t icmp_cksum; /* ones complement checksum of struct */ + union + { + struct ih_idseq /* echo datagram */ + { + u_int16_t icd_id; + u_int16_t icd_seq; + } ih_idseq; + u_int32_t ih_void; + + /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */ + struct ih_pmtu + { + u_int16_t ipm_void; + u_int16_t ipm_nextmtu; + } ih_pmtu; + + struct ih_rtradv + { + u_int8_t irt_num_addrs; + u_int8_t irt_wpa; + u_int16_t irt_lifetime; + } ih_rtradv; + } icmp_hun; + /* Removed icmp_pptr and icmp_gwaddr from union and #defines because they conflict with dnet */ +#define icmp_id icmp_hun.ih_idseq.icd_id +#define icmp_seq icmp_hun.ih_idseq.icd_seq +#define icmp_void icmp_hun.ih_void +#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void +#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu +#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs +#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa +#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime + union + { + struct + { + u_int32_t its_otime; + u_int32_t its_rtime; + u_int32_t its_ttime; + } id_ts; + struct + { + struct ip idi_ip; + /* options and then 64 bits of data */ + } id_ip; + struct icmp_ra_addr id_radv; + u_int32_t id_mask; + u_int8_t id_data[1]; + } icmp_dun; +#define icmp_otime icmp_dun.id_ts.its_otime +#define icmp_rtime icmp_dun.id_ts.its_rtime +#define icmp_ttime icmp_dun.id_ts.its_ttime +#define icmp_ip icmp_dun.id_ip.idi_ip +#define icmp_radv icmp_dun.id_radv +#define icmp_mask icmp_dun.id_mask +#define icmp_data icmp_dun.id_data +}; +#endif /* HAVE_STRUCT_ICMP */ + |