Some of the ?elds of IP and ICMP datagrams will be ?xed, some will be settable by the application, and others will computed according to the situation. You must set all ?elds of the IP header correctly. Two ?elds have ?xed and known values: the version is 4, and all service type bits are always 0. The header's protocol ?eld will be set to 1 for ICMP datagrams and 17 for ordinary data-carrying datagrams.
(Seventeen denotes UDP-we'll pretend that there is a real UDP application above IP). Datagram IDs should start at 1 and go up with each new datagram sent. Implement only the "record route" option. Details of this option are discussed below.
Use the following IP addresses:
- A = 192.168.0.2
- B = 192.168.0.3
- R1 interface to A and B = 192.168.0.1
- C = 10.0.0.2
- D = 10.0.0.3
- R2 interface to C and D = 10.0.0.1
- R1 interface to R2 = 172.16.20.49
- R2 interface to R1 = 172.16.20.50
Remember that IP datagrams forwarded by a router retain their original IP source address; the router does not substitute its own address in the source ?eld.
A few ICMP messages must be implemented. If a router decrements a TTL ?eld down to 0, it should send an ICMP "time exceeded" message to the originating host and discard the datagram. Routers should also generate ICMP "destination unreachable" messages for three reasons:
1. "Destination network unknown" (i.e., the router has no route to the destination network).
2. "Destination host unknown" (i.e., the destination network is OK but the host part of the IP address is bogus).
3. "Fragmentation needed and don't-fragment bit set." Set the ICMP type and code values correctly. Routers must maintain a very small routing table. 2 R1 should have routes to 192.168.0.2, 192.168.0.3, and the network 10. If it receives a datagram whose destination network is anything but 10 or 192.168, it should send a "destination unreachable-destination network unknown" ICMP message to the source IP address then drop the datagram. R1 should route any datagram destined to network 10 to R2. It should route datagrams destined to 192.168.0.2 and 192.168.0.3 to A and B, respectively. Any datagram addressed to network 192.168 but not to hosts 0.2 or 0.3 should result in a "destination unreachable-destination host unknown" ICMP message. R2 should behave similarly. Your code must set all remaining IP ?elds according to conditions. In particular, routers must decrement the TTL, discard the datagram if TTL reaches zero, and re-compute the checksum otherwise. You must implement fragmentation at the routers and reassembly at the hosts.