struct timeval * rtadvd_timer_rest(struct rtadvd_timer *rat) { static struct timeval returnval, now; gettimeofday(&now, NULL); if (TIMEVAL_LEQ(&rat->rat_tm, &now)) { syslog(LOG_DEBUG, "<%s> a timer must be expired, but not yet", __func__); returnval.tv_sec = returnval.tv_usec = 0; } else TIMEVAL_SUB(&rat->rat_tm, &now, &returnval); return (&returnval); }
/*----------------------------------------------------------------------- * Name : imp_source_is_scheduled * * Brief : check if source member is scheduled to be inlcuded group source specific query * Params : [in] p_is -- source member [in] sflag -- 1:member's timer is greater than LMQT 0:member's timer is less than LMQT * Return : 1:exsit 0:not exsit *------------------------------------------------------------------------ */ int imp_source_is_scheduled(imp_source *p_is, int sflag) { struct timeval lmqt; if(TIMEVAL_ISZERO(p_is->timer->tm) || p_is->times == 0 ) return 0; imp_time_val(TIMER_LMQT, &lmqt); if(sflag == 1 && TIMEVAL_LT(lmqt, p_is->timer->tm)) return 1; else if (sflag == 0 && TIMEVAL_LEQ(p_is->timer->tm, lmqt)) { return 1; } return 0; }
static struct timeval * rtsol_check_timer(void) { static struct timeval returnval; struct timeval now, rtsol_timer; struct ifinfo *ifinfo; int flags; gettimeofday(&now, NULL); rtsol_timer = tm_max; for (ifinfo = iflist; ifinfo; ifinfo = ifinfo->next) { if (TIMEVAL_LEQ(ifinfo->expire, now)) { if (dflag > 1) warnmsg(LOG_DEBUG, __func__, "timer expiration on %s, " "state = %d", ifinfo->ifname, ifinfo->state); switch (ifinfo->state) { case IFS_DOWN: case IFS_TENTATIVE: /* interface_up returns 0 on success */ flags = interface_up(ifinfo->ifname); if (flags == 0) ifinfo->state = IFS_DELAY; else if (flags == IFS_TENTATIVE) ifinfo->state = IFS_TENTATIVE; else ifinfo->state = IFS_DOWN; break; case IFS_IDLE: { int oldstatus = ifinfo->active; int probe = 0; ifinfo->active = interface_status(ifinfo); if (oldstatus != ifinfo->active) { warnmsg(LOG_DEBUG, __func__, "%s status is changed" " from %d to %d", ifinfo->ifname, oldstatus, ifinfo->active); probe = 1; ifinfo->state = IFS_DELAY; } else if (ifinfo->probeinterval && (ifinfo->probetimer -= ifinfo->timer.tv_sec) <= 0) { /* probe timer expired */ ifinfo->probetimer = ifinfo->probeinterval; probe = 1; ifinfo->state = IFS_PROBE; } if (probe && mobile_node) defrouter_probe(ifinfo->sdl->sdl_index); break; } case IFS_DELAY: ifinfo->state = IFS_PROBE; sendpacket(ifinfo); break; case IFS_PROBE: if (ifinfo->probes < MAX_RTR_SOLICITATIONS) sendpacket(ifinfo); else { warnmsg(LOG_INFO, __func__, "No answer " "after sending %d RSs", ifinfo->probes); ifinfo->probes = 0; ifinfo->state = IFS_IDLE; } break; } rtsol_timer_update(ifinfo); } if (TIMEVAL_LT(ifinfo->expire, rtsol_timer)) rtsol_timer = ifinfo->expire; } if (TIMEVAL_EQ(rtsol_timer, tm_max)) { warnmsg(LOG_DEBUG, __func__, "there is no timer"); return(NULL); } else if (TIMEVAL_LT(rtsol_timer, now)) /* this may occur when the interval is too small */ returnval.tv_sec = returnval.tv_usec = 0; else TIMEVAL_SUB(&rtsol_timer, &now, &returnval); if (dflag > 1) warnmsg(LOG_DEBUG, __func__, "New timer is %ld:%08ld", (long)returnval.tv_sec, (long)returnval.tv_usec); return(&returnval); }