- /** Timeout, ID not received */
- conn->internal->registering = FALSE;
- silc_fsm_next(fsm, silc_client_st_register_error);
+ if (conn->internal->retry_count++ >= SILC_CLIENT_RETRY_COUNT) {
+ /** Timeout, ID not received */
+ conn->internal->registering = FALSE;
+ conn->internal->retry_count = 0;
+ conn->internal->retry_timer = SILC_CLIENT_RETRY_MIN;
+ silc_fsm_next(fsm, silc_client_st_register_error);
+ return SILC_FSM_CONTINUE;
+ }
+
+ /** Resend registering packet */
+ silc_fsm_next(fsm, silc_client_st_register);
+ conn->internal->retry_timer = ((conn->internal->retry_timer *
+ SILC_CLIENT_RETRY_MUL) +
+ (silc_rng_get_rn16(client->rng) %
+ SILC_CLIENT_RETRY_RAND));