⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsm.c

📁 最新的lwip 1.3.0版本在ucos平台上的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
    case LS_STOPPING:    case LS_REQSENT:    case LS_ACKRCVD:    case LS_ACKSENT:      UNTIMEOUT(fsm_timeout, f);  /* Cancel timeout */      /* fall through */    case LS_STOPPED:      f->state = LS_STOPPED;      if( f->callbacks->finished ) {        (*f->callbacks->finished)(f);      }      break;        case LS_OPENED:      if( f->callbacks->down ) {        (*f->callbacks->down)(f);      }      /* Init restart counter, send Terminate-Request */      f->retransmits = f->maxtermtransmits;      fsm_sdata(f, TERMREQ, f->reqid = ++f->id,            (u_char *) f->term_reason, f->term_reason_len);      TIMEOUT(fsm_timeout, f, f->timeouttime);      --f->retransmits;            f->state = LS_STOPPING;      break;        default:      FSMDEBUG((LOG_INFO, "%s: Protocol-reject event in state %d (%s)!\n",            PROTO_NAME(f), f->state, ppperr_strerr[f->state]));    }}/**********************************//*** LOCAL FUNCTION DEFINITIONS ***//**********************************//* * fsm_timeout - Timeout expired. */static voidfsm_timeout(void *arg){  fsm *f = (fsm *) arg;  switch (f->state) {    case LS_CLOSING:    case LS_STOPPING:      if( f->retransmits <= 0 ) {        FSMDEBUG((LOG_WARNING, "%s: timeout sending Terminate-Request state=%d (%s)\n",             PROTO_NAME(f), f->state, ppperr_strerr[f->state]));        /*         * We've waited for an ack long enough.  Peer probably heard us.         */        f->state = (f->state == LS_CLOSING)? LS_CLOSED: LS_STOPPED;        if( f->callbacks->finished ) {          (*f->callbacks->finished)(f);        }      } else {        FSMDEBUG((LOG_WARNING, "%s: timeout resending Terminate-Requests state=%d (%s)\n",             PROTO_NAME(f), f->state, ppperr_strerr[f->state]));        /* Send Terminate-Request */        fsm_sdata(f, TERMREQ, f->reqid = ++f->id,            (u_char *) f->term_reason, f->term_reason_len);        TIMEOUT(fsm_timeout, f, f->timeouttime);        --f->retransmits;      }      break;    case LS_REQSENT:    case LS_ACKRCVD:    case LS_ACKSENT:      if (f->retransmits <= 0) {        FSMDEBUG((LOG_WARNING, "%s: timeout sending Config-Requests state=%d (%s)\n",         PROTO_NAME(f), f->state, ppperr_strerr[f->state]));        f->state = LS_STOPPED;        if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished ) {          (*f->callbacks->finished)(f);        }      } else {        FSMDEBUG((LOG_WARNING, "%s: timeout resending Config-Request state=%d (%s)\n",         PROTO_NAME(f), f->state, ppperr_strerr[f->state]));        /* Retransmit the configure-request */        if (f->callbacks->retransmit) {          (*f->callbacks->retransmit)(f);        }        fsm_sconfreq(f, 1);    /* Re-send Configure-Request */        if( f->state == LS_ACKRCVD ) {          f->state = LS_REQSENT;        }      }      break;    default:      FSMDEBUG((LOG_INFO, "%s: Timeout event in state %d (%s)!\n",          PROTO_NAME(f), f->state, ppperr_strerr[f->state]));  }}/* * fsm_rconfreq - Receive Configure-Request. */static voidfsm_rconfreq(fsm *f, u_char id, u_char *inp, int len){  int code, reject_if_disagree;  FSMDEBUG((LOG_INFO, "fsm_rconfreq(%s): Rcvd id %d state=%d (%s)\n",         PROTO_NAME(f), id, f->state, ppperr_strerr[f->state]));  switch( f->state ) {    case LS_CLOSED:      /* Go away, we're closed */      fsm_sdata(f, TERMACK, id, NULL, 0);      return;    case LS_CLOSING:    case LS_STOPPING:      return;    case LS_OPENED:      /* Go down and restart negotiation */      if( f->callbacks->down ) {        (*f->callbacks->down)(f);  /* Inform upper layers */      }      fsm_sconfreq(f, 0);    /* Send initial Configure-Request */      break;    case LS_STOPPED:      /* Negotiation started by our peer */      fsm_sconfreq(f, 0);    /* Send initial Configure-Request */      f->state = LS_REQSENT;      break;  }    /*  * Pass the requested configuration options  * to protocol-specific code for checking.  */  if (f->callbacks->reqci) {    /* Check CI */    reject_if_disagree = (f->nakloops >= f->maxnakloops);    code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree);  } else if (len) {    code = CONFREJ;      /* Reject all CI */  } else {    code = CONFACK;  }    /* send the Ack, Nak or Rej to the peer */  fsm_sdata(f, (u_char)code, id, inp, len);    if (code == CONFACK) {    if (f->state == LS_ACKRCVD) {      UNTIMEOUT(fsm_timeout, f);  /* Cancel timeout */      f->state = LS_OPENED;      if (f->callbacks->up) {        (*f->callbacks->up)(f);  /* Inform upper layers */      }    } else {      f->state = LS_ACKSENT;    }    f->nakloops = 0;  } else {    /* we sent CONFACK or CONFREJ */    if (f->state != LS_ACKRCVD) {      f->state = LS_REQSENT;    }    if( code == CONFNAK ) {      ++f->nakloops;    }  }}/* * fsm_rconfack - Receive Configure-Ack. */static voidfsm_rconfack(fsm *f, int id, u_char *inp, int len){  FSMDEBUG((LOG_INFO, "fsm_rconfack(%s): Rcvd id %d state=%d (%s)\n",        PROTO_NAME(f), id, f->state, ppperr_strerr[f->state]));    if (id != f->reqid || f->seen_ack) {   /* Expected id? */    return; /* Nope, toss... */  }  if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len): (len == 0)) ) {    /* Ack is bad - ignore it */    FSMDEBUG((LOG_INFO, "%s: received bad Ack (length %d)\n",          PROTO_NAME(f), len));    return;  }  f->seen_ack = 1;    switch (f->state) {    case LS_CLOSED:    case LS_STOPPED:      fsm_sdata(f, TERMACK, (u_char)id, NULL, 0);      break;        case LS_REQSENT:      f->state = LS_ACKRCVD;      f->retransmits = f->maxconfreqtransmits;      break;        case LS_ACKRCVD:      /* Huh? an extra valid Ack? oh well... */      UNTIMEOUT(fsm_timeout, f);  /* Cancel timeout */      fsm_sconfreq(f, 0);      f->state = LS_REQSENT;      break;        case LS_ACKSENT:      UNTIMEOUT(fsm_timeout, f);  /* Cancel timeout */      f->state = LS_OPENED;      f->retransmits = f->maxconfreqtransmits;      if (f->callbacks->up) {        (*f->callbacks->up)(f);  /* Inform upper layers */      }      break;        case LS_OPENED:      /* Go down and restart negotiation */      if (f->callbacks->down) {        (*f->callbacks->down)(f);  /* Inform upper layers */      }      fsm_sconfreq(f, 0);    /* Send initial Configure-Request */      f->state = LS_REQSENT;      break;  }}/* * fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject. */static voidfsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len){  int (*proc) (fsm *, u_char *, int);  int ret;  FSMDEBUG((LOG_INFO, "fsm_rconfnakrej(%s): Rcvd id %d state=%d (%s)\n",        PROTO_NAME(f), id, f->state, ppperr_strerr[f->state]));  if (id != f->reqid || f->seen_ack) { /* Expected id? */    return;        /* Nope, toss... */  }  proc = (code == CONFNAK)? f->callbacks->nakci: f->callbacks->rejci;  if (!proc || !((ret = proc(f, inp, len)))) {    /* Nak/reject is bad - ignore it */    FSMDEBUG((LOG_INFO, "%s: received bad %s (length %d)\n",          PROTO_NAME(f), (code==CONFNAK? "Nak": "reject"), len));    return;  }  f->seen_ack = 1;  switch (f->state) {    case LS_CLOSED:    case LS_STOPPED:      fsm_sdata(f, TERMACK, (u_char)id, NULL, 0);      break;        case LS_REQSENT:    case LS_ACKSENT:      /* They didn't agree to what we wanted - try another request */      UNTIMEOUT(fsm_timeout, f);  /* Cancel timeout */      if (ret < 0) {        f->state = LS_STOPPED;    /* kludge for stopping CCP */      } else {        fsm_sconfreq(f, 0);    /* Send Configure-Request */      }      break;        case LS_ACKRCVD:      /* Got a Nak/reject when we had already had an Ack?? oh well... */      UNTIMEOUT(fsm_timeout, f);  /* Cancel timeout */      fsm_sconfreq(f, 0);      f->state = LS_REQSENT;      break;        case LS_OPENED:      /* Go down and restart negotiation */      if (f->callbacks->down) {        (*f->callbacks->down)(f);  /* Inform upper layers */      }      fsm_sconfreq(f, 0);    /* Send initial Configure-Request */      f->state = LS_REQSENT;      break;  }}/* * fsm_rtermreq - Receive Terminate-Req. */static voidfsm_rtermreq(fsm *f, int id, u_char *p, int len){  LWIP_UNUSED_ARG(p);  FSMDEBUG((LOG_INFO, "fsm_rtermreq(%s): Rcvd id %d state=%d (%s)\n",        PROTO_NAME(f), id, f->state, ppperr_strerr[f->state]));  switch (f->state) {    case LS_ACKRCVD:    case LS_ACKSENT:      f->state = LS_REQSENT;    /* Start over but keep trying */      break;    case LS_OPENED:      if (len > 0) {        FSMDEBUG((LOG_INFO, "%s terminated by peer (%x)\n", PROTO_NAME(f), p));      } else {        FSMDEBUG((LOG_INFO, "%s terminated by peer\n", PROTO_NAME(f)));      }      if (f->callbacks->down) {        (*f->callbacks->down)(f);  /* Inform upper layers */      }      f->retransmits = 0;      f->state = LS_STOPPING;      TIMEOUT(fsm_timeout, f, f->timeouttime);      break;  }  fsm_sdata(f, TERMACK, (u_char)id, NULL, 0);}/* * fsm_rtermack - Receive Terminate-Ack. */static voidfsm_rtermack(fsm *f){  FSMDEBUG((LOG_INFO, "fsm_rtermack(%s): state=%d (%s)\n",         PROTO_NAME(f), f->state, ppperr_strerr[f->state]));    switch (f->state) {    case LS_CLOSING:      UNTIMEOUT(fsm_timeout, f);      f->state = LS_CLOSED;      if( f->callbacks->finished ) {        (*f->callbacks->finished)(f);      }      break;    case LS_STOPPING:      UNTIMEOUT(fsm_timeout, f);      f->state = LS_STOPPED;      if( f->callbacks->finished ) {        (*f->callbacks->finished)(f);      }      break;        case LS_ACKRCVD:      f->state = LS_REQSENT;      break;        case LS_OPENED:      if (f->callbacks->down) {        (*f->callbacks->down)(f);  /* Inform upper layers */      }      fsm_sconfreq(f, 0);      break;  }}/* * fsm_rcoderej - Receive an Code-Reject. */static voidfsm_rcoderej(fsm *f, u_char *inp, int len){  u_char code, id;    FSMDEBUG((LOG_INFO, "fsm_rcoderej(%s): state=%d (%s)\n",         PROTO_NAME(f), f->state, ppperr_strerr[f->state]));    if (len < HEADERLEN) {    FSMDEBUG((LOG_INFO, "fsm_rcoderej: Rcvd short Code-Reject packet!\n"));    return;  }  GETCHAR(code, inp);  GETCHAR(id, inp);  FSMDEBUG((LOG_WARNING, "%s: Rcvd Code-Reject for code %d, id %d\n",        PROTO_NAME(f), code, id));    if( f->state == LS_ACKRCVD ) {    f->state = LS_REQSENT;  }}/* * fsm_sconfreq - Send a Configure-Request. */static voidfsm_sconfreq(fsm *f, int retransmit){  u_char *outp;  int cilen;    if( f->state != LS_REQSENT && f->state != LS_ACKRCVD && f->state != LS_ACKSENT ) {    /* Not currently negotiating - reset options */    if( f->callbacks->resetci ) {      (*f->callbacks->resetci)(f);    }    f->nakloops = 0;  }    if( !retransmit ) {    /* New request - reset retransmission counter, use new ID */    f->retransmits = f->maxconfreqtransmits;    f->reqid = ++f->id;  }    f->seen_ack = 0;    /*   * Make up the request packet   */  outp = outpacket_buf[f->unit] + PPP_HDRLEN + HEADERLEN;  if( f->callbacks->cilen && f->callbacks->addci ) {    cilen = (*f->callbacks->cilen)(f);    if( cilen > peer_mru[f->unit] - (int)HEADERLEN ) {      cilen = peer_mru[f->unit] - HEADERLEN;    }    if (f->callbacks->addci) {      (*f->callbacks->addci)(f, outp, &cilen);    }  } else {    cilen = 0;  }  /* send the request to our peer */  fsm_sdata(f, CONFREQ, f->reqid, outp, cilen);    /* start the retransmit timer */  --f->retransmits;  TIMEOUT(fsm_timeout, f, f->timeouttime);    FSMDEBUG((LOG_INFO, "%s: sending Configure-Request, id %d\n",        PROTO_NAME(f), f->reqid));}#endif /* PPP_SUPPORT */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -