/*

(C) 2009 Mika Ilmaranta <ilmis@nullnet.fi>

License: GPLv2

*/

#include <stdio.h>

#include "icmp_t.h"

static struct icmpmsg icmpmsgs[] = {
	{ 0, 0, "Echo Reply", "" },

	{ 1, 0, "Reserved", "" },
	{ 2, 0, "Reserved", "" },

	{ 3, 0, "Destination Unreachable", "Destination network unreachable" },
	{ 3, 1, "Destination Unreachable", "Destination host unreachable" },
	{ 3, 2, "Destination Unreachable", "Destination protocol unreachable" },
	{ 3, 3, "Destination Unreachable", "Destination port unreachable" },
	{ 3, 4, "Destination Unreachable", "Fragmentation required, and DF flag set" },
	{ 3, 5, "Destination Unreachable", "Source route failed" },
	{ 3, 6, "Destination Unreachable", "Destination network unknown" },
	{ 3, 7, "Destination Unreachable", "Destination host unknown" },
	{ 3, 8, "Destination Unreachable", "Source host isolated" },
	{ 3, 9, "Destination Unreachable", "Network administratively prohibited" },
	{ 3, 10, "Destination Unreachable", "Host administratively prohibited" },
	{ 3, 11, "Destination Unreachable", "Network unreachable for TOS" },
	{ 3, 12, "Destination Unreachable", "Host unreachable for TOS" },
	{ 3, 13, "Destination Unreachable", "Communication administratively prohibited" },

	{ 4, 0, "Source Quench", "Source quench (congestion control)" },

	{ 5, 0, "Redirect Message", "Redirect Datagram for the Network" },
	{ 5, 1, "Redirect Message", "Redirect Datagram for the Host" },
	{ 5, 2, "Redirect Message", "Redirect Datagram for the TOS & network" },
	{ 5, 3, "Redirect Message", "Redirect Datagram for the TOS & host" },

	{ 6, 0, "Alternate Host Address", "" },

	{ 7, 0, "Reserved", "" },

	{ 8, 0, "Echo Request", "Echo request (used to ping)" },

	{ 9, 0, "Router Advertisement", "Router Advertisement" },

	{ 10, 0, "Router Solicitation", "Router discovery/selection/solicitation" },

	{ 11, 0, "Time Exceeded", "TTL expired in transit" },
	{ 11, 1, "Time Exceeded", "Fragment reassembly time exceeded" },

	{ 12, 0, "Parameter Problem: Bad IP header", "Pointer indicates the error" },
	{ 12, 1, "Parameter Problem: Bad IP header", "Missing a required option" },
	{ 12, 2, "Parameter Problem: Bad IP header", "Bad length" },

	{ 13, 0, "Timestamp", "Timestamp" },

	{ 14, 0, "Timestamp Reply", "Timestamp reply" },

	{ 15, 0, "Information Request", "Information Request" },

	{ 16, 0, "Information Reply", "Information Reply" },

	{ 17, 0, "Address Mask Request", "Address Mask Request" },

	{ 18, 0, "Address Mask Reply", "Address Mask Reply" },

	{ 19, 0, "Reserved for security", "Reserved for security" },

	{ 20, 0, "Reserved for robustness experiment", "" },
	{ 21, 0, "Reserved for robustness experiment", "" },
	{ 22, 0, "Reserved for robustness experiment", "" },
	{ 23, 0, "Reserved for robustness experiment", "" },
	{ 24, 0, "Reserved for robustness experiment", "" },
	{ 25, 0, "Reserved for robustness experiment", "" },
	{ 26, 0, "Reserved for robustness experiment", "" },
	{ 27, 0, "Reserved for robustness experiment", "" },
	{ 28, 0, "Reserved for robustness experiment", "" },
	{ 29, 0, "Reserved for robustness experiment", "" },

	{ 30, 0, "Traceroute", "Information Request" },

	{ 31, 0, "Datagram Conversion Error", "" },

	{ 32, 0, "Mobile Host Redirect", "" },

	{ 33, 0, "Where-Are-You (originally meant for IPv6)", "" },

	{ 34, 0, "Here-I-Am (originally meant for IPv6)", "" },

	{ 35, 0, "Mobile Registration Request", "" },

	{ 36, 0, "Mobile Registration Reply", "" },

	{ 37, 0, "Domain Name Request", "" },

	{ 38, 0, "Domain Name Reply", "" },

	{ 39, 0, "SKIP Algorithm Discovery Protocol, Simple Key-Management for Internet Protocol", "" },

	{ 40, 0, "Photuris, Security failures", "" },

	{ 41, 0, "ICMP for experimental mobility protocols such as Seamoby [RFC4065]", "" },

	{ 42, 0, "Reserved", "" },
	{ 43, 0, "Reserved", "" },
	{ 44, 0, "Reserved", "" },
	{ 45, 0, "Reserved", "" },
	{ 46, 0, "Reserved", "" },
	{ 47, 0, "Reserved", "" },
	{ 48, 0, "Reserved", "" },
	{ 49, 0, "Reserved", "" },
	{ 50, 0, "Reserved", "" },
	{ 51, 0, "Reserved", "" },
	{ 52, 0, "Reserved", "" },
	{ 53, 0, "Reserved", "" },
	{ 54, 0, "Reserved", "" },
	{ 55, 0, "Reserved", "" },
	{ 56, 0, "Reserved", "" },
	{ 57, 0, "Reserved", "" },
	{ 58, 0, "Reserved", "" },
	{ 59, 0, "Reserved", "" },
	{ 60, 0, "Reserved", "" },
	{ 61, 0, "Reserved", "" },
	{ 62, 0, "Reserved", "" },
	{ 63, 0, "Reserved", "" },
	{ 64, 0, "Reserved", "" },
	{ 65, 0, "Reserved", "" },
	{ 66, 0, "Reserved", "" },
	{ 67, 0, "Reserved", "" },
	{ 68, 0, "Reserved", "" },
	{ 69, 0, "Reserved", "" },
	{ 70, 0, "Reserved", "" },
	{ 71, 0, "Reserved", "" },
	{ 72, 0, "Reserved", "" },
	{ 73, 0, "Reserved", "" },
	{ 74, 0, "Reserved", "" },
	{ 75, 0, "Reserved", "" },
	{ 76, 0, "Reserved", "" },
	{ 77, 0, "Reserved", "" },
	{ 78, 0, "Reserved", "" },
	{ 79, 0, "Reserved", "" },
	{ 80, 0, "Reserved", "" },
	{ 81, 0, "Reserved", "" },
	{ 82, 0, "Reserved", "" },
	{ 83, 0, "Reserved", "" },
	{ 84, 0, "Reserved", "" },
	{ 85, 0, "Reserved", "" },
	{ 86, 0, "Reserved", "" },
	{ 87, 0, "Reserved", "" },
	{ 88, 0, "Reserved", "" },
	{ 89, 0, "Reserved", "" },
	{ 90, 0, "Reserved", "" },
	{ 91, 0, "Reserved", "" },
	{ 92, 0, "Reserved", "" },
	{ 93, 0, "Reserved", "" },
	{ 94, 0, "Reserved", "" },
	{ 95, 0, "Reserved", "" },
	{ 96, 0, "Reserved", "" },
	{ 97, 0, "Reserved", "" },
	{ 98, 0, "Reserved", "" },
	{ 99, 0, "Reserved", "" },
	{ 100, 0, "Reserved", "" },
	{ 101, 0, "Reserved", "" },
	{ 102, 0, "Reserved", "" },
	{ 103, 0, "Reserved", "" },
	{ 104, 0, "Reserved", "" },
	{ 105, 0, "Reserved", "" },
	{ 106, 0, "Reserved", "" },
	{ 107, 0, "Reserved", "" },
	{ 108, 0, "Reserved", "" },
	{ 109, 0, "Reserved", "" },
	{ 110, 0, "Reserved", "" },
	{ 111, 0, "Reserved", "" },
	{ 112, 0, "Reserved", "" },
	{ 113, 0, "Reserved", "" },
	{ 114, 0, "Reserved", "" },
	{ 115, 0, "Reserved", "" },
	{ 116, 0, "Reserved", "" },
	{ 117, 0, "Reserved", "" },
	{ 118, 0, "Reserved", "" },
	{ 119, 0, "Reserved", "" },
	{ 120, 0, "Reserved", "" },
	{ 121, 0, "Reserved", "" },
	{ 122, 0, "Reserved", "" },
	{ 123, 0, "Reserved", "" },
	{ 124, 0, "Reserved", "" },
	{ 125, 0, "Reserved", "" },
	{ 126, 0, "Reserved", "" },
	{ 127, 0, "Reserved", "" },
	{ 128, 0, "Reserved", "" },
	{ 129, 0, "Reserved", "" },
	{ 130, 0, "Reserved", "" },
	{ 131, 0, "Reserved", "" },
	{ 132, 0, "Reserved", "" },
	{ 133, 0, "Reserved", "" },
	{ 134, 0, "Reserved", "" },
	{ 135, 0, "Reserved", "" },
	{ 136, 0, "Reserved", "" },
	{ 137, 0, "Reserved", "" },
	{ 138, 0, "Reserved", "" },
	{ 139, 0, "Reserved", "" },
	{ 140, 0, "Reserved", "" },
	{ 141, 0, "Reserved", "" },
	{ 142, 0, "Reserved", "" },
	{ 143, 0, "Reserved", "" },
	{ 144, 0, "Reserved", "" },
	{ 145, 0, "Reserved", "" },
	{ 146, 0, "Reserved", "" },
	{ 147, 0, "Reserved", "" },
	{ 148, 0, "Reserved", "" },
	{ 149, 0, "Reserved", "" },
	{ 150, 0, "Reserved", "" },
	{ 151, 0, "Reserved", "" },
	{ 152, 0, "Reserved", "" },
	{ 153, 0, "Reserved", "" },
	{ 154, 0, "Reserved", "" },
	{ 155, 0, "Reserved", "" },
	{ 156, 0, "Reserved", "" },
	{ 157, 0, "Reserved", "" },
	{ 158, 0, "Reserved", "" },
	{ 159, 0, "Reserved", "" },
	{ 160, 0, "Reserved", "" },
	{ 161, 0, "Reserved", "" },
	{ 162, 0, "Reserved", "" },
	{ 163, 0, "Reserved", "" },
	{ 164, 0, "Reserved", "" },
	{ 165, 0, "Reserved", "" },
	{ 166, 0, "Reserved", "" },
	{ 167, 0, "Reserved", "" },
	{ 168, 0, "Reserved", "" },
	{ 169, 0, "Reserved", "" },
	{ 170, 0, "Reserved", "" },
	{ 171, 0, "Reserved", "" },
	{ 172, 0, "Reserved", "" },
	{ 173, 0, "Reserved", "" },
	{ 174, 0, "Reserved", "" },
	{ 175, 0, "Reserved", "" },
	{ 176, 0, "Reserved", "" },
	{ 177, 0, "Reserved", "" },
	{ 178, 0, "Reserved", "" },
	{ 179, 0, "Reserved", "" },
	{ 180, 0, "Reserved", "" },
	{ 181, 0, "Reserved", "" },
	{ 182, 0, "Reserved", "" },
	{ 183, 0, "Reserved", "" },
	{ 184, 0, "Reserved", "" },
	{ 185, 0, "Reserved", "" },
	{ 186, 0, "Reserved", "" },
	{ 187, 0, "Reserved", "" },
	{ 188, 0, "Reserved", "" },
	{ 189, 0, "Reserved", "" },
	{ 190, 0, "Reserved", "" },
	{ 191, 0, "Reserved", "" },
	{ 192, 0, "Reserved", "" },
	{ 193, 0, "Reserved", "" },
	{ 194, 0, "Reserved", "" },
	{ 195, 0, "Reserved", "" },
	{ 196, 0, "Reserved", "" },
	{ 197, 0, "Reserved", "" },
	{ 198, 0, "Reserved", "" },
	{ 199, 0, "Reserved", "" },
	{ 200, 0, "Reserved", "" },
	{ 201, 0, "Reserved", "" },
	{ 202, 0, "Reserved", "" },
	{ 203, 0, "Reserved", "" },
	{ 204, 0, "Reserved", "" },
	{ 205, 0, "Reserved", "" },
	{ 206, 0, "Reserved", "" },
	{ 207, 0, "Reserved", "" },
	{ 208, 0, "Reserved", "" },
	{ 209, 0, "Reserved", "" },
	{ 210, 0, "Reserved", "" },
	{ 211, 0, "Reserved", "" },
	{ 212, 0, "Reserved", "" },
	{ 213, 0, "Reserved", "" },
	{ 214, 0, "Reserved", "" },
	{ 215, 0, "Reserved", "" },
	{ 216, 0, "Reserved", "" },
	{ 217, 0, "Reserved", "" },
	{ 218, 0, "Reserved", "" },
	{ 219, 0, "Reserved", "" },
	{ 220, 0, "Reserved", "" },
	{ 221, 0, "Reserved", "" },
	{ 222, 0, "Reserved", "" },
	{ 223, 0, "Reserved", "" },
	{ 224, 0, "Reserved", "" },
	{ 225, 0, "Reserved", "" },
	{ 226, 0, "Reserved", "" },
	{ 227, 0, "Reserved", "" },
	{ 228, 0, "Reserved", "" },
	{ 229, 0, "Reserved", "" },
	{ 230, 0, "Reserved", "" },
	{ 231, 0, "Reserved", "" },
	{ 232, 0, "Reserved", "" },
	{ 233, 0, "Reserved", "" },
	{ 234, 0, "Reserved", "" },
	{ 235, 0, "Reserved", "" },
	{ 236, 0, "Reserved", "" },
	{ 237, 0, "Reserved", "" },
	{ 238, 0, "Reserved", "" },
	{ 239, 0, "Reserved", "" },
	{ 240, 0, "Reserved", "" },
	{ 241, 0, "Reserved", "" },
	{ 242, 0, "Reserved", "" },
	{ 243, 0, "Reserved", "" },
	{ 244, 0, "Reserved", "" },
	{ 245, 0, "Reserved", "" },
	{ 246, 0, "Reserved", "" },
	{ 247, 0, "Reserved", "" },
	{ 248, 0, "Reserved", "" },
	{ 249, 0, "Reserved", "" },
	{ 250, 0, "Reserved", "" },
	{ 251, 0, "Reserved", "" },
	{ 252, 0, "Reserved", "" },
	{ 253, 0, "Reserved", "" },
	{ 254, 0, "Reserved", "" },
	{ 255, 0, "Reserved", "" },

	{ 256, 256, "impossible combination", "impossible combination" }
};

struct icmpmsg *stricmp(int type, int code)
{
	int i;

	if(type > 255) return(&((struct icmpmsg) { 256, 256, "unknown", "unknown" }));

	for(i = 0; icmpmsgs[i].type <= type; i++)
		if(icmpmsgs[i].type == type && icmpmsgs[i].code == code) return(&(icmpmsgs[i]));

	for(i = 0; icmpmsgs[i].type <= type; i++)
		if(icmpmsgs[i].type == type) return(&(icmpmsgs[i]));

	return(&((struct icmpmsg) { 256, 256, "unknown", "unknown" }));
}

/* EOF */