static void datalink_LayerUp(void *v, struct fsm *fp) { /* The given fsm is now up */ struct datalink *dl = (struct datalink *)v; struct lcp *lcp = &dl->physical->link.lcp; if (fp->proto == PROTO_LCP) { datalink_GotAuthname(dl, ""); lcp->auth_ineed = lcp->want_auth; lcp->auth_iwait = lcp->his_auth; if (lcp->his_auth || lcp->want_auth) { if (bundle_Phase(dl->bundle) != PHASE_NETWORK) bundle_NewPhase(dl->bundle, PHASE_AUTHENTICATE); log_Printf(LogPHASE, "%s: his = %s, mine = %s\n", dl->name, Auth2Nam(lcp->his_auth, lcp->his_authtype), Auth2Nam(lcp->want_auth, lcp->want_authtype)); if (lcp->his_auth == PROTO_PAP) auth_StartReq(&dl->pap); if (lcp->want_auth == PROTO_CHAP) auth_StartReq(&dl->chap.auth); } else datalink_AuthOk(dl); } else if (fp->proto == PROTO_CCP) (*dl->parent->LayerUp)(dl->parent->object, &dl->physical->link.ccp.fsm); }
void datalink_NCPUp(struct datalink *dl) { int ccpok = ccp_SetOpenMode(&dl->physical->link.ccp); if (dl->physical->link.lcp.want_mrru && dl->physical->link.lcp.his_mrru) { /* we've authenticated in multilink mode ! */ switch (mp_Up(&dl->bundle->ncp.mp, dl)) { case MP_LINKSENT: /* We've handed the link off to another ppp (well, we will soon) ! */ return; case MP_UP: /* First link in the bundle */ auth_Select(dl->bundle, dl->peer.authname); bundle_CalculateBandwidth(dl->bundle); /* FALLTHROUGH */ case MP_ADDED: /* We're in multilink mode ! */ dl->physical->link.ccp.fsm.open_mode = OPEN_PASSIVE; /* override */ bundle_CalculateBandwidth(dl->bundle); break; case MP_FAILED: datalink_AuthNotOk(dl); return; } } else if (bundle_Phase(dl->bundle) == PHASE_NETWORK) { log_Printf(LogPHASE, "%s: Already in NETWORK phase\n", dl->name); datalink_NewState(dl, DATALINK_OPEN); bundle_CalculateBandwidth(dl->bundle); (*dl->parent->LayerUp)(dl->parent->object, &dl->physical->link.lcp.fsm); return; } else { dl->bundle->ncp.mp.peer = dl->peer; ncp_SetLink(&dl->bundle->ncp, &dl->physical->link); auth_Select(dl->bundle, dl->peer.authname); } if (ccpok) { fsm_Up(&dl->physical->link.ccp.fsm); fsm_Open(&dl->physical->link.ccp.fsm); } datalink_NewState(dl, DATALINK_OPEN); bundle_NewPhase(dl->bundle, PHASE_NETWORK); (*dl->parent->LayerUp)(dl->parent->object, &dl->physical->link.lcp.fsm); }
void datalink_Up(struct datalink *dl, int runscripts, int packetmode) { if (!Enabled(dl->bundle, OPT_FORCE_SCRIPTS) && (dl->physical->type & (PHYS_DIRECT|PHYS_DEDICATED))) /* Ignore scripts */ runscripts = 0; switch (dl->state) { case DATALINK_CLOSED: if (bundle_Phase(dl->bundle) == PHASE_DEAD || bundle_Phase(dl->bundle) == PHASE_TERMINATE) bundle_NewPhase(dl->bundle, PHASE_ESTABLISH); datalink_NewState(dl, DATALINK_OPENING); dl->reconnect_tries = dl->physical->type == PHYS_DIRECT ? 0 : dl->cfg.reconnect.max; dl->dial.tries = dl->cfg.dial.max; dl->script.run = runscripts; dl->script.packetmode = packetmode; break; case DATALINK_OPENING: if (!dl->script.run && runscripts) dl->script.run = 1; /* FALLTHROUGH */ case DATALINK_DIAL: case DATALINK_LOGIN: case DATALINK_READY: if (!dl->script.packetmode && packetmode) { dl->script.packetmode = 1; if (dl->state == DATALINK_READY) { dl->script.run = 0; datalink_NewState(dl, DATALINK_CARRIER); } } break; } }
static void datalink_HangupDone(struct datalink *dl) { if (dl->physical->type == PHYS_DEDICATED && !dl->bundle->CleaningUp && dl->physical->fd != -1) { /* Don't close our device if the link is dedicated */ datalink_LoginDone(dl); return; } chat_Finish(&dl->chat); physical_Close(dl->physical); dl->phone.chosen = "N/A"; if (dl->cbcp.required) { log_Printf(LogPHASE, "Call peer back on %s\n", dl->cbcp.fsm.phone); dl->cfg.callback.opmask = 0; strncpy(dl->cfg.phone.list, dl->cbcp.fsm.phone, sizeof dl->cfg.phone.list - 1); dl->cfg.phone.list[sizeof dl->cfg.phone.list - 1] = '\0'; dl->phone.alt = dl->phone.next = NULL; dl->reconnect_tries = dl->cfg.reconnect.max; dl->dial.tries = dl->cfg.dial.max; dl->dial.incs = 0; dl->script.run = 1; dl->script.packetmode = 1; if (!physical_SetMode(dl->physical, PHYS_BACKGROUND)) log_Printf(LogERROR, "Oops - can't change mode to BACKGROUND (gulp) !\n"); bundle_LinksRemoved(dl->bundle); /* if dial.timeout is < 0 (random), we don't override fsm.delay */ if (dl->cbcp.fsm.delay < dl->cfg.dial.timeout) dl->cbcp.fsm.delay = dl->cfg.dial.timeout; datalink_StartDialTimer(dl, dl->cbcp.fsm.delay); cbcp_Down(&dl->cbcp); datalink_NewState(dl, DATALINK_OPENING); if (bundle_Phase(dl->bundle) == PHASE_DEAD || bundle_Phase(dl->bundle) == PHASE_TERMINATE) bundle_NewPhase(dl->bundle, PHASE_ESTABLISH); } else if (dl->bundle->CleaningUp || (dl->physical->type == PHYS_DIRECT) || ((!dl->dial.tries || (dl->dial.tries < 0 && !dl->reconnect_tries)) && !(dl->physical->type & (PHYS_DDIAL|PHYS_DEDICATED)))) { datalink_NewState(dl, DATALINK_CLOSED); dl->dial.tries = -1; dl->dial.incs = 0; dl->reconnect_tries = 0; bundle_LinkClosed(dl->bundle, dl); if (!dl->bundle->CleaningUp && !(dl->physical->type & (PHYS_DIRECT|PHYS_BACKGROUND|PHYS_FOREGROUND))) datalink_StartDialTimer(dl, datalink_GetDialTimeout(dl)); } else { datalink_NewState(dl, DATALINK_OPENING); if (bundle_Phase(dl->bundle) == PHASE_DEAD || bundle_Phase(dl->bundle) == PHASE_TERMINATE) bundle_NewPhase(dl->bundle, PHASE_ESTABLISH); if (dl->dial.tries < 0) { datalink_StartDialTimer(dl, dl->cfg.reconnect.timeout); dl->dial.tries = dl->cfg.dial.max; dl->dial.incs = 0; dl->reconnect_tries--; log_Printf(LogCHAT, "%s: Reconnect try %d of %d\n", dl->name, dl->cfg.reconnect.max - dl->reconnect_tries, dl->cfg.reconnect.max); bundle_Notify(dl->bundle, EX_RECONNECT); } else { if (dl->phone.next == NULL) datalink_StartDialTimer(dl, datalink_GetDialTimeout(dl)); else datalink_StartDialTimer(dl, dl->cfg.dial.next_timeout); bundle_Notify(dl->bundle, EX_REDIAL); } } }