|
Packit |
b802ec |
/*
|
|
Packit |
b802ec |
mtr -- a network diagnostic tool
|
|
Packit |
b802ec |
Copyright (C) 2016 Matt Kimball
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
This program is free software; you can redistribute it and/or modify
|
|
Packit |
b802ec |
it under the terms of the GNU General Public License version 2 as
|
|
Packit |
b802ec |
published by the Free Software Foundation.
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
This program is distributed in the hope that it will be useful,
|
|
Packit |
b802ec |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
b802ec |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
b802ec |
GNU General Public License for more details.
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
You should have received a copy of the GNU General Public License
|
|
Packit |
b802ec |
along with this program; if not, write to the Free Software
|
|
Packit |
b802ec |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
Packit |
b802ec |
*/
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#ifndef PROTOCOLS_H
|
|
Packit |
b802ec |
#define PROTOCOLS_H
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* ICMPv4 type codes */
|
|
Packit |
b802ec |
#define ICMP_ECHOREPLY 0
|
|
Packit |
b802ec |
#define ICMP_DEST_UNREACH 3
|
|
Packit |
b802ec |
#define ICMP_ECHO 8
|
|
Packit |
b802ec |
#define ICMP_TIME_EXCEEDED 11
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* ICMP_DEST_UNREACH codes */
|
|
Packit |
b802ec |
#define ICMP_PORT_UNREACH 3
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* ICMPv6 type codes */
|
|
Packit |
b802ec |
#define ICMP6_DEST_UNREACH 1
|
|
Packit |
b802ec |
#define ICMP6_TIME_EXCEEDED 3
|
|
Packit |
b802ec |
#define ICMP6_ECHO 128
|
|
Packit |
b802ec |
#define ICMP6_ECHOREPLY 129
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* ICMP6_DEST_UNREACH codes */
|
|
Packit |
b802ec |
#define ICMP6_PORT_UNREACH 4
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/*
|
|
Packit |
b802ec |
The minimum size of the ICMP "original datagram" when
|
|
Packit |
b802ec |
using ICMP extensions
|
|
Packit |
b802ec |
*/
|
|
Packit |
b802ec |
#define ICMP_ORIGINAL_DATAGRAM_MIN_SIZE 128
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The classnum and type of MPLS labels in an ICMP extension object */
|
|
Packit |
b802ec |
#define ICMP_EXT_MPLS_CLASSNUM 1
|
|
Packit |
b802ec |
#define ICMP_EXT_MPLS_CTYPE 1
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#define HTTP_PORT 80
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* We can't rely on header files to provide this information, because
|
|
Packit |
b802ec |
the fields have different names between, for instance, Linux and
|
|
Packit |
b802ec |
Solaris */
|
|
Packit |
b802ec |
struct ICMPHeader {
|
|
Packit |
b802ec |
uint8_t type;
|
|
Packit |
b802ec |
uint8_t code;
|
|
Packit |
b802ec |
uint16_t checksum;
|
|
Packit |
b802ec |
uint16_t id;
|
|
Packit |
b802ec |
uint16_t sequence;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* ICMP extension header, which might contain MPLS labels */
|
|
Packit |
b802ec |
/* See RFC 4884 */
|
|
Packit |
b802ec |
struct ICMPExtensionHeader {
|
|
Packit |
b802ec |
uint8_t version;
|
|
Packit |
b802ec |
uint8_t reserved;
|
|
Packit |
b802ec |
uint16_t checksum;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* An object in an extended ICMP object */
|
|
Packit |
b802ec |
struct ICMPExtensionObject {
|
|
Packit |
b802ec |
uint16_t len;
|
|
Packit |
b802ec |
uint8_t classnum;
|
|
Packit |
b802ec |
uint8_t ctype;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* An MPLS label included in an ICMP extension */
|
|
Packit |
b802ec |
/* See RFC 4950 */
|
|
Packit |
b802ec |
struct ICMPExtMPLSLabel {
|
|
Packit |
b802ec |
uint8_t label[3]; // Low 4 bits are Experimental Use, Stack
|
|
Packit |
b802ec |
uint8_t ttl;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Structure of an UDP header. */
|
|
Packit |
b802ec |
struct UDPHeader {
|
|
Packit |
b802ec |
uint16_t srcport;
|
|
Packit |
b802ec |
uint16_t dstport;
|
|
Packit |
b802ec |
uint16_t length;
|
|
Packit |
b802ec |
uint16_t checksum;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Structure of an TCP header, as far as we need it. */
|
|
Packit |
b802ec |
struct TCPHeader {
|
|
Packit |
b802ec |
uint16_t srcport;
|
|
Packit |
b802ec |
uint16_t dstport;
|
|
Packit |
b802ec |
uint32_t seq;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Structure of an SCTP header */
|
|
Packit |
b802ec |
struct SCTPHeader {
|
|
Packit |
b802ec |
uint16_t srcport;
|
|
Packit |
b802ec |
uint16_t dstport;
|
|
Packit |
b802ec |
uint32_t veri_tag;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Structure of an IPv4 UDP pseudoheader. */
|
|
Packit |
b802ec |
struct UDPPseudoHeader {
|
|
Packit |
b802ec |
uint32_t saddr;
|
|
Packit |
b802ec |
uint32_t daddr;
|
|
Packit |
b802ec |
uint8_t zero;
|
|
Packit |
b802ec |
uint8_t protocol;
|
|
Packit |
b802ec |
uint16_t len;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Structure of an IP header. */
|
|
Packit |
b802ec |
struct IPHeader {
|
|
Packit |
b802ec |
uint8_t version;
|
|
Packit |
b802ec |
uint8_t tos;
|
|
Packit |
b802ec |
uint16_t len;
|
|
Packit |
b802ec |
uint16_t id;
|
|
Packit |
b802ec |
uint16_t frag;
|
|
Packit |
b802ec |
uint8_t ttl;
|
|
Packit |
b802ec |
uint8_t protocol;
|
|
Packit |
b802ec |
uint16_t check;
|
|
Packit |
b802ec |
uint32_t saddr;
|
|
Packit |
b802ec |
uint32_t daddr;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* IP version 6 header */
|
|
Packit |
b802ec |
struct IP6Header {
|
|
Packit |
b802ec |
uint8_t version;
|
|
Packit |
b802ec |
uint8_t flow[3];
|
|
Packit |
b802ec |
uint16_t len;
|
|
Packit |
b802ec |
uint8_t protocol;
|
|
Packit |
b802ec |
uint8_t ttl;
|
|
Packit |
b802ec |
uint8_t saddr[16];
|
|
Packit |
b802ec |
uint8_t daddr[16];
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The pseudo-header used for checksum computation for ICMPv6 and UDPv6 */
|
|
Packit |
b802ec |
struct IP6PseudoHeader {
|
|
Packit |
b802ec |
uint8_t saddr[16];
|
|
Packit |
b802ec |
uint8_t daddr[16];
|
|
Packit |
b802ec |
uint32_t len;
|
|
Packit |
b802ec |
uint8_t zero[3];
|
|
Packit |
b802ec |
uint8_t protocol;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#endif
|