Blame packet/protocols.h

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