Wireshark-bugs: [Wireshark-bugs] [Bug 6561] IPv4 UDP/TCP Checksum incorrect if routing header pr
Date: Thu, 17 Nov 2011 22:03:20 -0800 (PST)
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6561 --- Comment #4 from Guy Harris <guy@xxxxxxxxxxxx> 2011-11-17 22:03:17 PST --- RFC 791 says: Loose Source and Record Route +--------+--------+--------+---------//--------+ |10000011| length | pointer| route data | +--------+--------+--------+---------//--------+ Type=131 The loose source and record route (LSRR) option provides a means for the source of an internet datagram to supply routing information to be used by the gateways in forwarding the datagram to the destination, and to record the route information. The option begins with the option type code. The second octet is the option length which includes the option type code and the length octet, the pointer octet, and length-3 octets of route data. The third octet is the pointer into the route data indicating the octet which begins the next source address to be processed. The pointer is relative to this option, and the smallest legal value for the pointer is 4. A route data is composed of a series of internet addresses. Each internet address is 32 bits or 4 octets. If the pointer is greater than the length, the source route is empty (and the recorded route full) and the routing is to be based on the destination address field. If the address in destination address field has been reached and the pointer is not greater than the length, the next address in the source route replaces the address in the destination address field, and the recorded route address replaces the source address just used, and pointer is increased by four. The recorded route address is the internet module's own internet address as known in the environment into which this datagram is being forwarded. This procedure of replacing the source route with the recorded route (though it is in the reverse of the order it must be in to be used as a source route) means the option (and the IP header as a whole) remains a constant length as the datagram progresses through the internet. This option is a loose source route because the gateway or host IP is allowed to use any route of any number of other intermediate gateways to reach the next address in the route. Must be copied on fragmentation. Appears at most once in a datagram. Strict Source and Record Route +--------+--------+--------+---------//--------+ |10001001| length | pointer| route data | +--------+--------+--------+---------//--------+ Type=137 The strict source and record route (SSRR) option provides a means for the source of an internet datagram to supply routing information to be used by the gateways in forwarding the datagram to the destination, and to record the route information. The option begins with the option type code. The second octet is the option length which includes the option type code and the length octet, the pointer octet, and length-3 octets of route data. The third octet is the pointer into the route data indicating the octet which begins the next source address to be processed. The pointer is relative to this option, and the smallest legal value for the pointer is 4. A route data is composed of a series of internet addresses. Each internet address is 32 bits or 4 octets. If the pointer is greater than the length, the source route is empty (and the recorded route full) and the routing is to be based on the destination address field. If the address in destination address field has been reached and the pointer is not greater than the length, the next address in the source route replaces the address in the destination address field, and the recorded route address replaces the source address just used, and pointer is increased by four. The recorded route address is the internet module's own internet address as known in the environment into which this datagram is being forwarded. This procedure of replacing the source route with the recorded route (though it is in the reverse of the order it must be in to be used as a source route) means the option (and the IP header as a whole) remains a constant length as the datagram progresses through the internet. This option is a strict source route because the gateway or host IP must send the datagram directly to the next address in the source route through only the directly connected network indicated in the next address to reach the next gateway or host specified in the route. Must be copied on fragmentation. Appears at most once in a datagram. RFC 768 says Checksum is the 16-bit one's complement of the one's complement sum of a pseudo header of information from the IP header, the UDP header, and the data, padded with zero octets at the end (if necessary) to make a multiple of two octets. TThe pseudo header conceptually prefixed to the UDP header contains the source address, the destination address, the protocol, and the UDP length. This information gives protection against misrouted datagrams. This checksum procedure is the same as is used in TCP. 0 7 8 15 16 23 24 31 +--------+--------+--------+--------+ | source address | +--------+--------+--------+--------+ | destination address | +--------+--------+--------+--------+ | zero |protocol| UDP length | +--------+--------+--------+--------+ *If* this means that the destination host should check the checksum using the source and destination address *it* sees, that means that the source host should calculate the checksum using what will be the ultimate source and destination addresses, even if they'll be rewritten along the way due to LSRR or SSRR options, and packet sniffers that check UDP checksums should, if they're not capturing the packet as it's delivered to the destination host, check the checksum based on what would be the ultimate source and destination addresses. And, in fact, that's what tcpdump's checksum-checker does. NOTE: this arguably means that the UDP and TCP dissector, and all dissectors they call, should treat the *final* destination address, even when it's not the same as the destination address in the fixed-length portion of the IP header as the address in the destination endpoint, e.g. for finding conversations; two packets sent to the same address/port endpoint could belong to the same conversation *even if they're not being captured at the destination and they have different source routes, so that the destination addresses in the fixed-length portion of the IP header are not the same*. And, in fact, that's what tcpdump's relative-sequence-number printing code does *NOT* do, so it arguably needs to be fixed as well. -- Configure bugmail: https://bugs.wireshark.org/bugzilla/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are watching all bug changes.
- References:
- Prev by Date: [Wireshark-bugs] [Bug 6561] IPv4 UDP/TCP Checksum incorrect if routing header present.
- Next by Date: [Wireshark-bugs] [Bug 6561] IPv4 UDP/TCP Checksum incorrect if routing header present.
- Previous by thread: [Wireshark-bugs] [Bug 6561] IPv4 UDP/TCP Checksum incorrect if routing header present.
- Next by thread: [Wireshark-bugs] [Bug 6561] IPv4 UDP/TCP Checksum incorrect if routing header present.
- Index(es):