This file is indexed.

/usr/include/dublintraceroute/icmp_messages.h is in libdublintraceroute-dev 0.3-3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**
 * \file   icmp_messages.h
 * \Author Andrea Barberio <insomniac@slackware.it>
 * \date   October 2015
 * \brief  ICMP messages definitions
 *
 * This file contains the ICMP messages definitions
 */
 
#ifndef _ICMP_MESSAGES_H
#define _ICMP_MESSAGES_H

#include <sstream>
#include <tuple>
#include <unordered_map>

// defining a map key that wraps ICMP type and code
typedef std::tuple<uint8_t, uint8_t> icmpmessage_t;


struct icmpmessage_hash: public std::unary_function<icmpmessage_t, std::size_t> {
	std::size_t operator()(const icmpmessage_t &key) const {
		return std::get<0>(key) ^ std::get<1>(key);
	}
};


struct icmpmessage_equals: public std::binary_function<icmpmessage_t, icmpmessage_t, bool> {
	bool operator()(const icmpmessage_t &left, const icmpmessage_t &right) const {
		return (
			std::get<0>(left) == std::get<0>(right) &&
			std::get<1>(left) == std::get<1>(right)
		);
	}
};


struct data {
	std::string x;
};


typedef std::unordered_map<icmpmessage_t, data, icmpmessage_hash, icmpmessage_equals> icmpmessagemap_t;


struct icmpmessages {
private:
	icmpmessagemap_t icmp_message_map;
public:
	icmpmessages() {
		// Codes coming from https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Control_messages
		// ICMP code 0 (echo reply)
		icmp_message_map[std::make_tuple(0, 0)] = {"Echo reply"};
		// ICMP code 1 is reserved
		// ICMP code 2 is reserved
		// ICMP code 3 (destination unreachable)
		icmp_message_map[std::make_tuple(3, 0)] = {"Destination network unreachable"};
		icmp_message_map[std::make_tuple(3, 1)] = {"Destination host unreachable"};
		icmp_message_map[std::make_tuple(3, 2)] = {"Destination protocol unreachable"};
		icmp_message_map[std::make_tuple(3, 3)] = {"Destination port unreachable"};
		icmp_message_map[std::make_tuple(3, 4)] = {"DF set but fragmentation required"};
		icmp_message_map[std::make_tuple(3, 5)] = {"Source route failed"};
		icmp_message_map[std::make_tuple(3, 6)] = {"Destination network unknown"};
		icmp_message_map[std::make_tuple(3, 7)] = {"Destination host unknown"};
		icmp_message_map[std::make_tuple(3, 8)] = {"Source host isolated"};
		icmp_message_map[std::make_tuple(3, 9)] = {"Network administratively prohibited"};
		icmp_message_map[std::make_tuple(3, 10)] = {"Host administratively prohibited"};
		icmp_message_map[std::make_tuple(3, 11)] = {"Network unreachable for TOS"};
		icmp_message_map[std::make_tuple(3, 12)] = {"Host unreachable for TOS"};
		icmp_message_map[std::make_tuple(3, 13)] = {"Communication administratively prohibited"};
		icmp_message_map[std::make_tuple(3, 14)] = {"Host precedence violation"};
		icmp_message_map[std::make_tuple(3, 15)] = {"Precedence cutoff in effect"};
		// ICMP code 4 (source quench) is deprecated
		icmp_message_map[std::make_tuple(4, 0)] = {"Source quench (congestion control)"};
		// ICMP code 5 (redirect message)
		icmp_message_map[std::make_tuple(5, 0)] = {"Redirect datagram for the network"};
		icmp_message_map[std::make_tuple(5, 1)] = {"Redirect datagram for the host"};
		icmp_message_map[std::make_tuple(5, 2)] = {"Redirect datagram for the TOS and network"};
		icmp_message_map[std::make_tuple(5, 3)] = {"Redirect datagram for the TOS and host"};
		// ICMP code 6 (alternate host address) is deprecated
		icmp_message_map[std::make_tuple(6, 0)] = {"Alternate host address"};
		// ICMP code 7 is reserved
		// ICMP code 8 (echo request)
		icmp_message_map[std::make_tuple(8, 0)] = {"Echo request"};
		// ICMP code 9 (Router advertisement)
		icmp_message_map[std::make_tuple(9, 0)] = {"Router advertisement"};
		// ICMP code 10 (Router solicitation)
		icmp_message_map[std::make_tuple(10, 0)] = {"Router solicitation"};
		// ICMP code 11
		icmp_message_map[std::make_tuple(11, 0)] = {"TTL expired in transit"};
		icmp_message_map[std::make_tuple(11, 1)] = {"Fragment reassembly time exceeded"};
		// ICMP code 12 (parameter problem: bad IP header)
		icmp_message_map[std::make_tuple(12, 0)] = {"Pointer indicates the error"};
		icmp_message_map[std::make_tuple(12, 1)] = {"Missing a required option"};
		icmp_message_map[std::make_tuple(12, 2)] = {"Bad length"};
		// ICMP code 13 (timestamp)
		icmp_message_map[std::make_tuple(13, 0)] = {"Timestamp"};
		// ICMP code 14 (timestamp reply)
		icmp_message_map[std::make_tuple(14, 0)] = {"Timestamp reply"};
		// ICMP code 15 (information request) is deprecated
		icmp_message_map[std::make_tuple(15, 0)] = {"Information request"};
		// ICMP code 16 (information reply) is deprecated
		icmp_message_map[std::make_tuple(16, 0)] = {"Information reply"};
		// ICMP code 17 (address mask request) is deprecated
		icmp_message_map[std::make_tuple(17, 0)] = {"Address mask request"};
		// ICMP code 18 (address mask reply) is deprecated
		icmp_message_map[std::make_tuple(18, 0)] = {"Address mask reply"};
		// ICMP code 19 is reserved for security
		// ICMP codes 20~29 are reserved for robustness experiment
		// ICMP code 30 (traceroute) is deprecated
		icmp_message_map[std::make_tuple(30, 0)] = {"Traceroute"};
		// ICMP code 31 is deprecated
		icmp_message_map[std::make_tuple(31, 0)] = {"Datagram conversion error"};
		// ICMP code 32 is deprecated
		icmp_message_map[std::make_tuple(32, 0)] = {"Mobile host redirect"};
		// ICMP code 33 is deprecated
		icmp_message_map[std::make_tuple(33, 0)] = {"Where-are-you (originally for IPv6)"};
		// ICMP code 34 is deprecated
		icmp_message_map[std::make_tuple(34, 0)] = {"Here-I-am (originally for IPv6)"};
		// ICMP code 35 is deprecated
		icmp_message_map[std::make_tuple(35, 0)] = {"Mobile registration request"};
		// ICMP code 36 is deprecated
		icmp_message_map[std::make_tuple(36, 0)] = {"Mobile registration reply"};
		// ICMP code 37 is deprecated
		icmp_message_map[std::make_tuple(37, 0)] = {"Domain name request"};
		// ICMP code 38 is deprecated
		icmp_message_map[std::make_tuple(38, 0)] = {"Domain name reply"};
		// ICMP code 39 is deprecated
		icmp_message_map[std::make_tuple(39, 0)] = {"SKIP algorighm discovery protocol"};
		// ICMP code 40 is deprecated
		icmp_message_map[std::make_tuple(40, 0)] = {"Photuris, security failures"};
		// ICMP code 41 is experimental
		icmp_message_map[std::make_tuple(41, 0)] = {"Experimental mobility protocols"};
		// ICMP codes 42~252 are reserved
		// ICMP code 253 is experimental
		icmp_message_map[std::make_tuple(253, 0)] = {"RFC3692-style experiment 1"};
		// ICMP code 254 is experimental
		icmp_message_map[std::make_tuple(254, 0)] = {"RFC3692-style experiment 2"};
		// ICMP code 255 is reserved
	}
	std::string get(uint8_t type, uint8_t code) {
		try {
			return icmp_message_map.at(std::make_tuple(type, code)).x;
		} catch (std::out_of_range) {
			std::stringstream ss;
			ss << "Unknown message (type=" << static_cast<int>(type) << ", code=" << static_cast<int>(code) << ")";
			return ss.str();
		}
	}
};

#endif /* _ICMP_MESSAGES_H */