Blocking may occur for two reasons, no data available or the handshake isn't complete. If the handshake isn't complete, the timer will be set to >= 0, at 0, we need to call handshake to continue, if it is greater than 0, we need to schedule a timer to call handshake later.