static void nr_stun_client_timer_expired_cb(int a, int b, void *cb_arg) { int _status; nr_stun_client_ctx *ctx=cb_arg; struct timeval now; INT8 ms_waited; /* Prevent this timer from being cancelled later */ ctx->timer_handle=0; /* Shouldn't happen */ if(ctx->state==NR_STUN_CLIENT_STATE_CANCELLED) ABORT(R_REJECTED); gettimeofday(&now, 0); if (r_timeval_diff_ms(&now, &ctx->timer_set, &ms_waited)) { r_log(NR_LOG_STUN,LOG_DEBUG,"STUN-CLIENT(%s): Timer expired",ctx->label); } else { r_log(NR_LOG_STUN,LOG_DEBUG,"STUN-CLIENT(%s): Timer expired (after %llu ms)",ctx->label, ms_waited); } if (ctx->request_ct >= ctx->maximum_transmits) { r_log(NR_LOG_STUN,LOG_DEBUG,"STUN-CLIENT(%s): Timed out",ctx->label); ctx->state=NR_STUN_CLIENT_STATE_TIMED_OUT; ABORT(R_FAILED); } if (ctx->state != NR_STUN_CLIENT_STATE_RUNNING) ABORT(R_NOT_PERMITTED); /* as a side effect will reset the timer */ nr_stun_client_send_request(ctx); _status = 0; abort: if (ctx->state != NR_STUN_CLIENT_STATE_RUNNING) { /* Cancel the timer firing */ if (ctx->timer_handle) { NR_async_timer_cancel(ctx->timer_handle); ctx->timer_handle=0; } if (ctx->finished_cb) { NR_async_cb finished_cb = ctx->finished_cb; ctx->finished_cb = 0; /* prevent 2nd call */ /* finished_cb call must be absolutely last thing in function * because as a side effect this ctx may be operated on in the * callback */ finished_cb(0,0,ctx->cb_arg); } } return; }
static void nr_stun_client_timer_expired_cb(NR_SOCKET s, int b, void *cb_arg) { int _status; nr_stun_client_ctx *ctx=cb_arg; struct timeval now; INT8 ms_waited; /* Prevent this timer from being cancelled later */ ctx->timer_handle=0; /* Shouldn't happen */ if(ctx->state==NR_STUN_CLIENT_STATE_CANCELLED) ABORT(R_REJECTED); gettimeofday(&now, 0); if (r_timeval_diff_ms(&now, &ctx->timer_set, &ms_waited)) { r_log(NR_LOG_STUN,LOG_DEBUG,"STUN-CLIENT(%s): Timer expired",ctx->label); } else { r_log(NR_LOG_STUN,LOG_DEBUG,"STUN-CLIENT(%s): Timer expired (after %llu ms)",ctx->label, ms_waited); } if (ctx->request_ct >= ctx->maximum_transmits) { r_log(NR_LOG_STUN,LOG_INFO,"STUN-CLIENT(%s): Timed out",ctx->label); ctx->state=NR_STUN_CLIENT_STATE_TIMED_OUT; ABORT(R_FAILED); } if (ctx->state != NR_STUN_CLIENT_STATE_RUNNING) ABORT(R_NOT_PERMITTED); /* as a side effect will reset the timer */ nr_stun_client_send_request(ctx); _status = 0; abort: if (ctx->state != NR_STUN_CLIENT_STATE_RUNNING) { /* Cancel the timer firing */ if (ctx->timer_handle){ NR_async_timer_cancel(ctx->timer_handle); ctx->timer_handle=0; } nr_stun_client_fire_finished_cb(ctx); } return; }