亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fsm.c

?? stm32+ucos-ii
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*****************************************************************************
* fsm.c - Network Control Protocol Finite State Machine program file.
*
* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
* portions Copyright (c) 1997 by Global Election Systems Inc.
*
* The authors hereby grant permission to use, copy, modify, distribute,
* and license this software and its documentation for any purpose, provided
* that existing copyright notices are retained in all copies and that this
* notice and the following disclaimer are included verbatim in any 
* distributions. No written agreement, license, or royalty fee is required
* for any of the authorized uses.
*
* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
* REVISION HISTORY
*
* 03-01-01 Marc Boucher <marc@mbsi.ca>
*   Ported to lwIP.
* 97-12-01 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
*   Original based on BSD fsm.c.
*****************************************************************************/
/*
 * fsm.c - {Link, IP} Control Protocol Finite State Machine.
 *
 * Copyright (c) 1989 Carnegie Mellon University.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by Carnegie Mellon University.  The name of the
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

/*
 * TODO:
 * Randomize fsm id on link/init.
 * Deal with variable outgoing MTU.
 */

#include "lwip/opt.h"

#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */

#include "ppp.h"
#include "pppdebug.h"

#include "fsm.h"


/*************************/
/*** LOCAL DEFINITIONS ***/
/*************************/

#if PPP_DEBUG

static const char *ppperr_strerr[] = {
           "LS_INITIAL",  /* LS_INITIAL  0 */
           "LS_STARTING", /* LS_STARTING 1 */
           "LS_CLOSED",   /* LS_CLOSED   2 */
           "LS_STOPPED",  /* LS_STOPPED  3 */
           "LS_CLOSING",  /* LS_CLOSING  4 */
           "LS_STOPPING", /* LS_STOPPING 5 */
           "LS_REQSENT",  /* LS_REQSENT  6 */
           "LS_ACKRCVD",  /* LS_ACKRCVD  7 */
           "LS_ACKSENT",  /* LS_ACKSENT  8 */
           "LS_OPENED"    /* LS_OPENED   9 */
};

#endif /* PPP_DEBUG */

/************************/
/*** LOCAL DATA TYPES ***/
/************************/


/***********************************/
/*** LOCAL FUNCTION DECLARATIONS ***/
/***********************************/
static void fsm_timeout (void *);
static void fsm_rconfreq (fsm *, u_char, u_char *, int);
static void fsm_rconfack (fsm *, int, u_char *, int);
static void fsm_rconfnakrej (fsm *, int, int, u_char *, int);
static void fsm_rtermreq (fsm *, int, u_char *, int);
static void fsm_rtermack (fsm *);
static void fsm_rcoderej (fsm *, u_char *, int);
static void fsm_sconfreq (fsm *, int);

#define PROTO_NAME(f) ((f)->callbacks->proto_name)


/******************************/
/*** PUBLIC DATA STRUCTURES ***/
/******************************/


/*****************************/
/*** LOCAL DATA STRUCTURES ***/
/*****************************/
int peer_mru[NUM_PPP];


/***********************************/
/*** PUBLIC FUNCTION DEFINITIONS ***/
/***********************************/

/*
 * fsm_init - Initialize fsm.
 *
 * Initialize fsm state.
 */
void
fsm_init(fsm *f)
{
  f->state = LS_INITIAL;
  f->flags = 0;
  f->id = 0;        /* XXX Start with random id? */
  f->timeouttime = FSM_DEFTIMEOUT;
  f->maxconfreqtransmits = FSM_DEFMAXCONFREQS;
  f->maxtermtransmits = FSM_DEFMAXTERMREQS;
  f->maxnakloops = FSM_DEFMAXNAKLOOPS;
  f->term_reason_len = 0;
}


/*
 * fsm_lowerup - The lower layer is up.
 */
void
fsm_lowerup(fsm *f)
{
  int oldState = f->state;

  LWIP_UNUSED_ARG(oldState);

  switch( f->state ) {
    case LS_INITIAL:
      f->state = LS_CLOSED;
      break;

    case LS_STARTING:
      if( f->flags & OPT_SILENT ) {
        f->state = LS_STOPPED;
      } else {
        /* Send an initial configure-request */
        fsm_sconfreq(f, 0);
        f->state = LS_REQSENT;
      }
    break;

    default:
      FSMDEBUG((LOG_INFO, "%s: Up event in state %d (%s)!\n",
          PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
  }
  
  FSMDEBUG((LOG_INFO, "%s: lowerup state %d (%s) -> %d (%s)\n",
      PROTO_NAME(f), oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state]));
}


/*
 * fsm_lowerdown - The lower layer is down.
 *
 * Cancel all timeouts and inform upper layers.
 */
void
fsm_lowerdown(fsm *f)
{
  int oldState = f->state;

  LWIP_UNUSED_ARG(oldState);

  switch( f->state ) {
    case LS_CLOSED:
      f->state = LS_INITIAL;
      break;

    case LS_STOPPED:
      f->state = LS_STARTING;
      if( f->callbacks->starting ) {
        (*f->callbacks->starting)(f);
      }
      break;

    case LS_CLOSING:
      f->state = LS_INITIAL;
      UNTIMEOUT(fsm_timeout, f);  /* Cancel timeout */
      break;

    case LS_STOPPING:
    case LS_REQSENT:
    case LS_ACKRCVD:
    case LS_ACKSENT:
      f->state = LS_STARTING;
      UNTIMEOUT(fsm_timeout, f);  /* Cancel timeout */
      break;

    case LS_OPENED:
      if( f->callbacks->down ) {
        (*f->callbacks->down)(f);
      }
      f->state = LS_STARTING;
      break;

    default:
      FSMDEBUG((LOG_INFO, "%s: Down event in state %d (%s)!\n",
          PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
  }

  FSMDEBUG((LOG_INFO, "%s: lowerdown state %d (%s) -> %d (%s)\n",
      PROTO_NAME(f), oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state]));
}


/*
 * fsm_open - Link is allowed to come up.
 */
void
fsm_open(fsm *f)
{
  int oldState = f->state;

  LWIP_UNUSED_ARG(oldState);

  switch( f->state ) {
    case LS_INITIAL:
      f->state = LS_STARTING;
      if( f->callbacks->starting ) {
        (*f->callbacks->starting)(f);
      }
      break;

    case LS_CLOSED:
      if( f->flags & OPT_SILENT ) {
        f->state = LS_STOPPED;
      } else {
        /* Send an initial configure-request */
        fsm_sconfreq(f, 0);
        f->state = LS_REQSENT;
      }
      break;
  
    case LS_CLOSING:
      f->state = LS_STOPPING;
      /* fall through */
    case LS_STOPPED:
    case LS_OPENED:
      if( f->flags & OPT_RESTART ) {
        fsm_lowerdown(f);
        fsm_lowerup(f);
      }
      break;
  }

  FSMDEBUG((LOG_INFO, "%s: open state %d (%s) -> %d (%s)\n",
      PROTO_NAME(f), oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state]));
}


/*
 * fsm_close - Start closing connection.
 *
 * Cancel timeouts and either initiate close or possibly go directly to
 * the LS_CLOSED state.
 */
void
fsm_close(fsm *f, char *reason)
{
  int oldState = f->state;

  LWIP_UNUSED_ARG(oldState);

  f->term_reason = reason;
  f->term_reason_len = (reason == NULL? 0: strlen(reason));
  switch( f->state ) {
    case LS_STARTING:
      f->state = LS_INITIAL;
      break;
    case LS_STOPPED:
      f->state = LS_CLOSED;
      break;
    case LS_STOPPING:
      f->state = LS_CLOSING;
      break;

    case LS_REQSENT:
    case LS_ACKRCVD:
    case LS_ACKSENT:
    case LS_OPENED:
      if( f->state != LS_OPENED ) {
        UNTIMEOUT(fsm_timeout, f);  /* Cancel timeout */
      } else if( f->callbacks->down ) {
        (*f->callbacks->down)(f);  /* Inform upper layers we're down */
      }
      /* 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_CLOSING;
      break;
  }

  FSMDEBUG((LOG_INFO, "%s: close reason=%s state %d (%s) -> %d (%s)\n",
      PROTO_NAME(f), reason, oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state]));
}


/*
 * fsm_sdata - Send some data.
 *
 * Used for all packets sent to our peer by this module.
 */
void
fsm_sdata( fsm *f, u_char code, u_char id, u_char *data, int datalen)
{
  u_char *outp;
  int outlen;

  /* Adjust length to be smaller than MTU */
  outp = outpacket_buf[f->unit];
  if (datalen > peer_mru[f->unit] - (int)HEADERLEN) {
    datalen = peer_mru[f->unit] - HEADERLEN;
  }
  if (datalen && data != outp + PPP_HDRLEN + HEADERLEN) {
    BCOPY(data, outp + PPP_HDRLEN + HEADERLEN, datalen);
  }
  outlen = datalen + HEADERLEN;
  MAKEHEADER(outp, f->protocol);
  PUTCHAR(code, outp);
  PUTCHAR(id, outp);
  PUTSHORT(outlen, outp);
  pppWrite(f->unit, outpacket_buf[f->unit], outlen + PPP_HDRLEN);
  FSMDEBUG((LOG_INFO, "fsm_sdata(%s): Sent code %d,%d,%d.\n",
        PROTO_NAME(f), code, id, outlen));
}


/*
 * fsm_input - Input packet.
 */
void
fsm_input(fsm *f, u_char *inpacket, int l)
{
  u_char *inp = inpacket;
  u_char code, id;
  int len;

  /*
  * Parse header (code, id and length).
  * If packet too short, drop it.
  */
  if (l < HEADERLEN) {
    FSMDEBUG((LOG_WARNING, "fsm_input(%x): Rcvd short header.\n",
          f->protocol));
    return;
  }
  GETCHAR(code, inp);
  GETCHAR(id, inp);
  GETSHORT(len, inp);
  if (len < HEADERLEN) {
    FSMDEBUG((LOG_INFO, "fsm_input(%x): Rcvd illegal length.\n",
        f->protocol));
    return;
  }
  if (len > l) {
    FSMDEBUG((LOG_INFO, "fsm_input(%x): Rcvd short packet.\n",
        f->protocol));
    return;
  }
  len -= HEADERLEN;    /* subtract header length */

  if( f->state == LS_INITIAL || f->state == LS_STARTING ) {
    FSMDEBUG((LOG_INFO, "fsm_input(%x): Rcvd packet in state %d (%s).\n",
        f->protocol, f->state, ppperr_strerr[f->state]));
    return;
  }
  FSMDEBUG((LOG_INFO, "fsm_input(%s):%d,%d,%d\n", PROTO_NAME(f), code, id, l));
  /*
   * Action depends on code.
   */
  switch (code) {
    case CONFREQ:
      fsm_rconfreq(f, id, inp, len);
      break;
    
    case CONFACK:
      fsm_rconfack(f, id, inp, len);
      break;
    
    case CONFNAK:
    case CONFREJ:
      fsm_rconfnakrej(f, code, id, inp, len);
      break;
    
    case TERMREQ:
      fsm_rtermreq(f, id, inp, len);
      break;
    
    case TERMACK:
      fsm_rtermack(f);
      break;
    
    case CODEREJ:
      fsm_rcoderej(f, inp, len);
      break;
    
    default:
      if( !f->callbacks->extcode ||
          !(*f->callbacks->extcode)(f, code, id, inp, len) ) {
        fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN);
      }
      break;
  }
}


/*
 * fsm_protreject - Peer doesn't speak this protocol.
 *
 * Treat this as a catastrophic error (RXJ-).
 */
void
fsm_protreject(fsm *f)
{
  switch( f->state ) {
    case LS_CLOSING:
      UNTIMEOUT(fsm_timeout, f);  /* Cancel timeout */
      /* fall through */
    case LS_CLOSED:
      f->state = LS_CLOSED;
      if( f->callbacks->finished ) {
        (*f->callbacks->finished)(f);
      }
      break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91丝袜在线18| 色哟哟亚洲精品| 91精品福利在线| 久久综合五月天婷婷伊人| 亚洲无线码一区二区三区| 国产98色在线|日韩| 日韩色在线观看| 亚洲激情五月婷婷| 高清av一区二区| 91精品国产综合久久久蜜臀图片| 国产精品不卡一区| 国产激情视频一区二区三区欧美| 欧美狂野另类xxxxoooo| 中文字幕亚洲区| 成人免费av网站| 久久久精品国产免大香伊| 日韩精彩视频在线观看| 欧美天堂亚洲电影院在线播放| 国产性天天综合网| 国内精品久久久久影院色| 欧美日韩久久不卡| 亚洲一区二区三区四区在线免费观看 | 亚洲成人三级小说| 色偷偷成人一区二区三区91| 欧美高清在线视频| 国产一区二区三区蝌蚪| 精品国产乱码久久久久久夜甘婷婷| 亚洲成av人片在线观看无码| 在线观看亚洲a| 亚洲国产美女搞黄色| 欧美三级资源在线| 图片区小说区区亚洲影院| 欧美三级电影精品| 午夜欧美电影在线观看| 欧美一级高清片| 久久99久久久久| 精品国产制服丝袜高跟| 久久99热这里只有精品| 精品国产1区二区| 国产美女精品在线| 中文幕一区二区三区久久蜜桃| 国产成人午夜精品5599| 中文在线一区二区| 色狠狠综合天天综合综合| 亚洲一级片在线观看| 在线播放日韩导航| 国内精品国产成人| 中文字幕一区二区三| 欧美在线短视频| 精品无人区卡一卡二卡三乱码免费卡| 久久在线免费观看| 91日韩在线专区| 日韩精品福利网| 久久综合色一综合色88| 不卡的av在线播放| 视频一区二区国产| 久久精品视频在线免费观看| 一本色道久久综合精品竹菊| 亚洲mv在线观看| 国产日韩亚洲欧美综合| 一本一道久久a久久精品| 日本欧美在线看| 国产精品久久久久久久久免费相片 | 国产精品无遮挡| 欧美综合视频在线观看| 久久aⅴ国产欧美74aaa| 中文字幕在线观看不卡视频| 欧美视频第二页| 国产成人在线视频免费播放| 一区二区三区在线视频观看| 欧美电视剧免费全集观看| 色综合久久六月婷婷中文字幕| 蜜桃在线一区二区三区| 亚洲私人黄色宅男| 久久午夜色播影院免费高清| 色婷婷综合视频在线观看| 国模无码大尺度一区二区三区| 一个色综合网站| 国产午夜亚洲精品羞羞网站| 欧美久久久久久久久中文字幕| 国产精品正在播放| 日韩1区2区3区| 亚洲美女屁股眼交| 国产欧美日本一区视频| 欧美精品自拍偷拍动漫精品| av午夜一区麻豆| 国产久卡久卡久卡久卡视频精品| 婷婷夜色潮精品综合在线| 亚洲色欲色欲www在线观看| 欧美精品一区二区三区在线播放| 欧美三级乱人伦电影| 99久久精品免费精品国产| 国产乱理伦片在线观看夜一区| 免费成人在线影院| 亚洲国产sm捆绑调教视频 | 午夜精品久久久久久久99水蜜桃| 国产精品免费aⅴ片在线观看| 欧美sm美女调教| 欧美一二三在线| 在线成人免费观看| 欧美二区三区的天堂| 欧美日韩在线一区二区| 在线日韩av片| 在线一区二区三区| 在线视频综合导航| 在线视频一区二区三区| 在线精品视频免费播放| 91福利小视频| 欧美日韩你懂的| 欧美三级日韩在线| 欧美精品乱码久久久久久| 欧美日韩久久久一区| 5月丁香婷婷综合| 日韩视频在线一区二区| 日韩精品一区二区三区视频播放| 欧美一级欧美一级在线播放| 91精品国产综合久久精品图片 | 午夜精品成人在线| 婷婷一区二区三区| 蜜臀91精品一区二区三区| 久久av老司机精品网站导航| 黑人精品欧美一区二区蜜桃| 国产精品自拍在线| 大胆欧美人体老妇| 91蜜桃视频在线| 欧美性受极品xxxx喷水| 欧美一区二区三区日韩视频| 日韩欧美国产午夜精品| 久久久91精品国产一区二区精品| 国产精品久久综合| 亚洲综合色成人| 麻豆一区二区三| 成人动漫中文字幕| 一本色道综合亚洲| 日韩无一区二区| 中文字幕精品在线不卡| 亚洲综合无码一区二区| 蜜臀av性久久久久蜜臀av麻豆| 国产一区二区三区美女| 95精品视频在线| 欧美一二三区在线观看| 亚洲国产高清不卡| 亚洲成人综合网站| 国产一区二区福利视频| 91视频com| 欧美一级高清大全免费观看| 欧美激情一区二区三区不卡| 亚洲国产欧美日韩另类综合| 国产一区二区日韩精品| 在线亚洲人成电影网站色www| 欧美va日韩va| 亚洲美腿欧美偷拍| 国产乱码一区二区三区| 欧美日韩国产综合一区二区三区| 精品久久久久久久久久久院品网| 亚洲欧美日韩中文播放 | 日韩黄色免费网站| 成人精品视频一区二区三区 | 欧美性大战久久久| 久久综合色8888| 午夜精品福利久久久| 成人高清在线视频| 日韩欧美中文一区二区| 伊人一区二区三区| 国产一二三精品| 欧美一级片在线看| 亚洲午夜羞羞片| av网站一区二区三区| 精品国产成人在线影院| 日韩中文字幕av电影| 99久久夜色精品国产网站| 精品国产区一区| 午夜av一区二区| 91成人国产精品| 中文字幕一区不卡| 国产激情精品久久久第一区二区| 4438x亚洲最大成人网| 亚洲毛片av在线| 成人午夜精品在线| 久久久久久久久久久久久夜| 日韩综合一区二区| 欧美欧美欧美欧美首页| 亚洲激情图片小说视频| 91美女在线观看| 国产精品免费久久久久| 丁香天五香天堂综合| 26uuu国产电影一区二区| 美女视频一区二区三区| 欧美精品在线观看一区二区| 亚洲综合一区在线| 欧美性猛片xxxx免费看久爱| 亚洲欧美乱综合| 色94色欧美sute亚洲13| 一区二区三区在线观看网站| 91黄视频在线| 亚洲成人手机在线| 欧美妇女性影城| 青青草国产精品97视觉盛宴| 日韩精品一区二区三区四区视频| 老色鬼精品视频在线观看播放|