Next: 3.3 Handling Broadcast Packets
Up: 3 The Network Layer:
Previous: 3.1 Sending Packets
3.2 Receiving Packets
Figure 3:
Receiving a packet from the simulated network
|
This section describes what happens when a packet is received from the
simulated network. Figure 3 depicts the sequence of steps
that take place.
After a packet is received from the
network by the network interface device, and processed by the link layer,
the processed packet is delivered
to the network layer. More specifically, the link layer will invoke the
IP routine ip_input() (more details on how to interact with the
link layer can be found in the simulator handout).
When ip_input() is called, it will check the packet for errors, such as
IP version mismatch, IP checksum error, etc. If the packet is error-free,
there are two possible scenarios:
- The packet is destined to this host: In this case,
ip_input() will deliver the packet to UDP, TCP, or
ICMP. This is done by invoking udp_receive(), tcp_receive(), or
icmp_receive(), depending on the type of the packet. (Note that
although icmp_receive() is at the transport layer in the figure,
ICMP is not really a transport protocol.). If tcp_receive() or
udp_receive() fail because there is no receiver binding
to the port the packet was sent to, an ICMP message of type ICMP_UNREACH and code ICMP_UNREACH_PORT needs to be sent
back to the sender by the network layer.
This failure condition can be detected by checking the return value of tcp_receive() or udp_receive(), which is going to be set to
FAILURE_PORT_UNREACH. To avoid ICMP floods, ICMP messages must
not be sent as a reaction to failed icmp_receive()
calls. Interaction with ICMP is described in the simulator handout.
- The packet is destined to some other host: Since the destination is
not us, IP needs to forward the packet to its
destination. Forwarding a packet to its destination is called
``routing''. Routing is typically done only by routers and not by end
hosts. To forward a packet,
ip_forward() is invoked, which performs some additional work such as
decrementing the IP TTL. It then calls ip_output() to
actually send out the packet (ip_output() is described
in Section 3.1). If the TTL in an IP packet expires, an ICMP
message of type ICMP_TIMXCEED and code ICMP_TIMXCEED_INTRANS needs to be sent back to the sender.
To complete our description of what happens when a packet is received,
let's look at what takes place above the network layer, when the
packet is a UDP packet. In this case, udp_receive() will
process the packet
(checking for errors, etc.) and then invoke the socket layer function
enqueue_data() to insert the packet into the socket receive buffer
of the socket this packet is addressed to.
The socket layer function enqueue_data() then inserts the packet
into the socket receive buffer of the specified socket structure.
The enqueue_data() function must wake up any processes blocked
on the Recvfrom() call on the socket. Recvfrom()
grabs a packet from the socket receive buffer and return immediately only
if the buffer is not empty. If it is empty, the process that called
Recvfrom() must be blocked, waiting for the arrival of packets.
Therefore, when enqueue_data() is called, it must check whether there
is any process blocked on Recvfrom(), and if there is, it must wake up
the blocked process(es). Then Recvfrom() can grab the packet and return
immediately to the user process.
Next: 3.3 Handling Broadcast Packets
Up: 3 The Network Layer:
Previous: 3.1 Sending Packets