move retry logic to the protocol level