static void datalink_LayerDown(void *v, struct fsm *fp) { /* The given FSM has been told to come down */ struct datalink *dl = (struct datalink *)v; if (fp->proto == PROTO_LCP) { switch (dl->state) { case DATALINK_OPEN: peerid_Init(&dl->peer); fsm2initial(&dl->physical->link.ccp.fsm); datalink_NewState(dl, DATALINK_LCP); /* before parent TLD */ (*dl->parent->LayerDown)(dl->parent->object, fp); /* FALLTHROUGH (just in case) */ case DATALINK_CBCP: if (!dl->cbcp.required) cbcp_Down(&dl->cbcp); /* FALLTHROUGH (just in case) */ case DATALINK_AUTH: timer_Stop(&dl->pap.authtimer); timer_Stop(&dl->chap.auth.authtimer); } datalink_NewState(dl, DATALINK_LCP); datalink_AuthReInit(dl); } }
void datalink_Close(struct datalink *dl, int how) { /* Please close */ switch (dl->state) { case DATALINK_OPEN: peerid_Init(&dl->peer); fsm2initial(&dl->physical->link.ccp.fsm); /* FALLTHROUGH */ case DATALINK_CBCP: case DATALINK_AUTH: case DATALINK_LCP: datalink_AuthReInit(dl); if (how == CLOSE_LCP) datalink_DontHangup(dl); else if (how == CLOSE_STAYDOWN) datalink_StayDown(dl); fsm_Close(&dl->physical->link.lcp.fsm); break; default: datalink_ComeDown(dl, how); } }
static void datalink_LayerFinish(void *v, struct fsm *fp) { /* The given fsm is now down */ struct datalink *dl = (struct datalink *)v; if (fp->proto == PROTO_LCP) { fsm2initial(fp); (*dl->parent->LayerFinish)(dl->parent->object, fp); datalink_ComeDown(dl, CLOSE_NORMAL); } else if (fp->state == ST_CLOSED && fp->open_mode == OPEN_PASSIVE) fsm_Open(fp); /* CCP goes to ST_STOPPED */ }
void datalink_Down(struct datalink *dl, int how) { /* Carrier is lost */ switch (dl->state) { case DATALINK_OPEN: peerid_Init(&dl->peer); fsm2initial(&dl->physical->link.ccp.fsm); /* FALLTHROUGH */ case DATALINK_CBCP: case DATALINK_AUTH: case DATALINK_LCP: fsm2initial(&dl->physical->link.lcp.fsm); if (dl->state == DATALINK_OPENING) return; /* we're doing a callback... */ /* FALLTHROUGH */ default: datalink_ComeDown(dl, how); } }
static void StoppedTimeout(void *v) { struct fsm *fp = (struct fsm *)v; log_Printf(fp->LogLevel, "%s: Stopped timer expired\n", fp->link->name); if (fp->OpenTimer.state == TIMER_RUNNING) { log_Printf(LogWARN, "%s: %s: aborting open delay due to stopped timer\n", fp->link->name, fp->name); timer_Stop(&fp->OpenTimer); } if (fp->state == ST_STOPPED) fsm2initial(fp); }