/** * The Subscription timer looks for almost expired subscriptions and subscribes again. * @param ticks - the current time * @param param - the generic parameter */ void subscription_timer(unsigned int ticks, void* param) { r_subscription *s,*ns; int i; #ifdef WITH_IMS_PM int subs_cnt=0; #endif for(i=0;i<subscriptions_hash_size;i++){ subs_lock(i); s = subscriptions[i].head; r_act_time(); while(s){ ns = s->next; if (s->attempts_left > 0 ){ /* attempt to send a subscribe */ if (!r_send_subscribe(s,s->duration)){ LOG(L_ERR,"ERR:"M_NAME":subscription_timer: Error on SUBSCRIBE (%d times)... droping\n", pcscf_subscribe_retries); del_r_subscription_nolock(s); }else{ s->attempts_left--; #ifdef WITH_IMS_PM subs_cnt++; #endif } }else if (s->attempts_left==0) { /* we failed to many times, drop the subscription */ LOG(L_ERR,"ERR:"M_NAME":subscription_timer: Error on SUBSCRIBE for %d times... aborting\n",pcscf_subscribe_retries); del_r_subscription_nolock(s); }else{ /* we are subscribed already */ /* if expired, drop it */ if (s->expires<time_now) del_r_subscription_nolock(s); #ifdef WITH_IMS_PM else subs_cnt++; #endif /* if not expired, check for renewal */ // Commented as the S-CSCF should adjust the subscription time accordingly // if ((s->duration<1200 && s->expires-time_now<s->duration/2)|| // (s->duration>=1200 && s->expires-time_now<600)) // { // /* if we need a resubscribe, we mark it as such and try to subscribe again */ // s->attempts_left = pcscf_subscribe_retries; // ns = s; // } } s = ns; } subs_unlock(i); } print_subs(L_INFO); #ifdef WITH_IMS_PM IMS_PM_LOG01(RD_NbrSubs,subs_cnt); #endif }
/** * Updates the expiration time of a subscription. * \todo Maybe we should use a hash here to index it as this is called for every notification * @param aor - aor to look for * @param expires - new expiration time * @returns 1 if found, 0 if not */ int update_r_subscription(r_subscription *s,int expires) { LOG(L_DBG,"DBG:"M_NAME":update_r_subscription: refreshing subscription for <%.*s> [%d]\n", s->req_uri.len,s->req_uri.s,expires); s->attempts_left = -1; if (expires == 0) del_r_subscription_nolock(s); else s->expires = expires+time_now;; subs_unlock(s->hash); return 1; }