亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
一区二区三区国产豹纹内裤在线| 一本大道久久a久久精二百| 午夜精品久久久久久| 亚洲男人的天堂在线aⅴ视频| 欧美国产一区二区在线观看| 久久久国产午夜精品| 久久亚洲免费视频| 久久久99精品免费观看不卡| 久久综合狠狠综合久久激情| 精品久久久网站| 欧美精品一区在线观看| 国产亚洲成aⅴ人片在线观看| 久久奇米777| 日本一区二区三区国色天香| 国产精品污污网站在线观看| 中文字幕精品三区| 亚洲欧洲制服丝袜| 亚洲电影中文字幕在线观看| 三级影片在线观看欧美日韩一区二区| 亚洲图片有声小说| 天天色天天爱天天射综合| 人人超碰91尤物精品国产| 免费成人在线观看| 国产成人亚洲精品青草天美| 成人午夜视频网站| 日本高清无吗v一区| 欧美图片一区二区三区| 91精品国产91久久综合桃花| 亚洲精品在线三区| 国产午夜精品在线观看| 中文字幕不卡在线| 伊人色综合久久天天| 午夜视频在线观看一区二区三区 | 亚洲精品写真福利| 性做久久久久久免费观看| 天天综合日日夜夜精品| 国产精选一区二区三区| 99精品久久免费看蜜臀剧情介绍| 欧美三级电影精品| 日韩精品一区二区三区蜜臀| 亚洲国产精品99久久久久久久久| 亚洲日本免费电影| 老司机免费视频一区二区三区| 国产成人福利片| 在线观看精品一区| 精品国产免费一区二区三区香蕉| 国产精品美女一区二区在线观看| 一区二区三区在线观看视频| 捆绑紧缚一区二区三区视频| 成人黄动漫网站免费app| 日本道色综合久久| 欧美精品一区男女天堂| 亚洲男同1069视频| 久久精品国产精品亚洲精品| 成人手机在线视频| 3d动漫精品啪啪1区2区免费| 中文字幕久久午夜不卡| 日韩国产欧美在线播放| 粉嫩一区二区三区性色av| 欧美日韩一区不卡| 中文字幕欧美日韩一区| 日本午夜一本久久久综合| 不卡的电影网站| 欧美一区二区在线视频| 亚洲欧洲日韩av| 狂野欧美性猛交blacked| 在线中文字幕一区二区| 日本一区二区三区电影| 免费在线观看精品| 91在线一区二区| 国产亚洲一区二区在线观看| 天天综合天天综合色| 色激情天天射综合网| 久久久精品日韩欧美| 免费黄网站欧美| 色婷婷综合激情| 欧美高清在线一区二区| 精品亚洲成a人在线观看| 精品视频在线免费| 亚洲视频 欧洲视频| 国产黄人亚洲片| 欧美一二三四在线| 午夜一区二区三区视频| 在线视频你懂得一区二区三区| 中文字幕乱码日本亚洲一区二区| 久久99这里只有精品| 91精品国产综合久久福利软件| 亚洲精品国产无天堂网2021 | 欧美电影免费观看完整版| 亚洲综合激情另类小说区| bt欧美亚洲午夜电影天堂| 国产日本欧洲亚洲| 精品一区二区三区的国产在线播放 | 国产福利一区在线| 欧美大片国产精品| 日韩影院免费视频| 欧美日韩黄色一区二区| 亚洲综合在线视频| 97久久人人超碰| 国产精品乱人伦| 成人免费看片app下载| 久久久久88色偷偷免费| 国产精品中文字幕日韩精品| 日韩欧美一级在线播放| 伦理电影国产精品| 精品国产乱码久久久久久影片| 免费成人在线视频观看| 日韩欧美专区在线| 久久99国产精品免费网站| 日韩欧美国产wwwww| 麻豆成人免费电影| 欧美精品一区二区三| 国产一区二区影院| 久久久久久夜精品精品免费| 久久99精品久久久久久久久久久久 | 成人美女视频在线看| 欧美激情资源网| 99久久久精品| 亚洲精品视频在线观看网站| 91黄色免费看| 亚洲成人av中文| 日韩欧美综合一区| 国产一区二区三区黄视频 | 久久国产精品99久久久久久老狼| 欧美成人午夜电影| 国产一区二区三区在线看麻豆| 久久久久一区二区三区四区| 成人黄动漫网站免费app| 自拍偷拍亚洲激情| 欧美视频一区二区三区在线观看 | 一本一本大道香蕉久在线精品| 亚洲成人免费在线| 日韩久久久久久| 国产成人福利片| 亚洲综合视频网| 日韩精品中文字幕在线一区| 国产美女av一区二区三区| 国产精品国产三级国产aⅴ无密码| 91女厕偷拍女厕偷拍高清| 日韩综合一区二区| 26uuu亚洲| 色呦呦国产精品| 美日韩一级片在线观看| 国产精品久久久久永久免费观看 | 久久亚洲二区三区| 91丨porny丨中文| 五月综合激情网| 国产日产欧美精品一区二区三区| 9191久久久久久久久久久| 美女视频黄 久久| 国产精品乱码妇女bbbb| 欧美伊人久久大香线蕉综合69| 青青草伊人久久| 亚洲天堂成人在线观看| 这里是久久伊人| 高潮精品一区videoshd| 亚洲成人一区在线| 中文字幕 久热精品 视频在线| 欧美老肥妇做.爰bbww视频| 国产剧情一区二区三区| 亚洲超碰精品一区二区| 国产亚洲欧美一区在线观看| 欧美日韩的一区二区| 成人激情综合网站| 蜜桃视频免费观看一区| 日韩伦理av电影| 欧美成人video| 在线精品国精品国产尤物884a| 韩国欧美国产一区| 一区二区在线观看av| 久久久精品免费网站| 欧美日韩国产首页| av中文字幕一区| 国产乱国产乱300精品| 丝袜国产日韩另类美女| 亚洲男人都懂的| 中文字幕av一区二区三区| 欧美成人免费网站| 欧美老女人在线| 91老师片黄在线观看| 国产精品资源网站| 日本午夜精品视频在线观看| 亚洲一区在线观看免费| 国产精品久久久久婷婷| 久久久精品免费观看| 精品区一区二区| 在线成人免费观看| 91黄色激情网站| 91美女片黄在线| 99久久久精品| 成人精品视频一区| 国产高清成人在线| 国产综合色产在线精品| 麻豆免费精品视频| 视频精品一区二区| 五月天激情小说综合| 亚洲影视资源网| 亚洲影院在线观看| 亚洲高清不卡在线观看| 亚洲综合激情网|