Ethereal-users: Re: [Ethereal-users] icmp port unreachable

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Guy Harris <gharris@xxxxxxxxx>
Date: Tue, 18 Apr 2006 11:24:13 -0700
swati desai wrote:

 1st we create ethlen =sizeof(struct ether_header);

Unless you're using a compiler that would pad that structure to, for example, 16 bytes. I'd suggest using 14.

iplen =sizeof(struct iphdr);

Not necessarily, for IPv4. The IPv4 header is not necessarily 20 bytes long; it's longer if there are options.

See

	http://www.tcpdump.org/pcap.htm

for example (see the "The actual sniffing" section).

Also, the packet in your example is IPv6. The IPv6 header is fixed length, *BUT* there can be extension headers after it. You'd need to process the "Next header" field until you get a header - such as an ICMPv6 header - with no "Next header".

udplen =sizeof(struct udphdr);

That would work, because the UDP header has a fixed length.

icmplen=sizeof(struct icmphdr);

OK, as long as you realize that the ICMP header is *before* the UDP header - and that there'll be an IPv4/IPv6 header between the ICMP header and the UDP header.

Note also that the ICMP header is only the first 4 bytes, with type, code, and checksum. Then, if it's an "unreachable" message, you have 4 bytes of padding, followed by the packet.

than how to extract the source and destination port from this icmp packet.

Do the parsing necessary to find the ICMP packet (and to determine that it *is* an ICMP packet, unless you're doing filtering to ensure that), and then:

check whether it's an unreachable message (unless you're doing filtering to ensure that);

	get to the beginning of the packet with the error;

	parse *its* IPv4/IPv6 header;

if it's a UDP packet, parse its UDP header, and get the source and destination address from that.