When A sends a message M that's received by A (M is either a multicast, or a unicast to A), and the message is dropped below NAKACK2 / UNICAST2, then A might receive M, but not deliver it if M is the last message sent.
Scenario (for NAKACK2, but similar to UNICAST2):
- A's table is: HD=9, HR=9
- A sends M10
- NAKACK2 adds M10: HD=9, HR=10 (highest-delivered is still 9, as we haven't removed M10 yet)
- The transport drops M10
- A sends no further messages
- STABLE will make sure that A's HR is 10, but since no message was received, we won't remove any messages from A's table !
--> The result is that although A received M10, it won't deliver M10 (until another message is received) !
SOLUTION:
- Maybe we can use the retransmit task to see if there are any unremoved messages in a table and - if so - remove them and pass them up the stack to the application.