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

📄 pppchar.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * FILENAME: pppchar.c
 *
 * Copyright  2001 By InterNiche Technologies Inc. All rights reserved
 *
 *  Single character (i.e. UART) input and output handlers for PPP.
 *
 * MODULE: PPP
 *
 * ROUTINES: pppfcs(), ppp_inchar(), ppp_sendchars
 *
 * PORTABLE: yes
 */


#include "ipport.h"

#ifdef USE_PPP          /* whole file can be ifdeffed out */

#include "ppp_port.h"
#include "mppp.h"

#include "minip.h"      /* (yaxon add) */

#define PPPCHAR_DEBUG    0
void Printu( const char *format, ... );


#ifdef PPP_CHARIO       /* whole file ifdefs on this too */


#define  DEFBUFSIZE  50    /* default buffer size */

int flushed;      /* Number of bytes flushed; for debug only */


/* HDLC-ish stuffing constants and definitions */

#define  HDLC_HDRLEN    4  /* HDLC header size */
#define  HDLC_FCS_LEN   2  /* octets for FCS */

#define  PPP_ALLSTATIONS   0xff     /* All-Stations broadcast address */
#define  PPP_UI      0x03  /* Unnumbered Information */
#define  PPP_FLAG    0x7e  /* Flag Sequence */
#define  PPP_ESCAPE  0x7d  /* Asynchronous Control Escape */
#define  PPP_TRANS   0x20  /* Asynchronous transparency modifier */

/* Important FCS values. */
#define  PPP_INITFCS 0xffff   /* Initial FCS value */
#define  PPP_GOODFCS 0xf0b8   /* Good final FCS value */
#define  PPP_FCS(fcs, c)      (((fcs) >> 8)^ fcstab[((fcs)^(c))&0xff])

#define  PPP_FCS_LEN    2  /* octets for FCS */

/* Macro to test if char c needs to be escaped? */

#define ESCAPE_P(c)   (((c) == PPP_FLAG) || ((c) == PPP_ESCAPE) || \
          (c) < 0x20 && (mppp->his_asyncmap & ((u_long)1 << (c))))


/* FCS lookup table as calculated by genfcstab */

static u_short fcstab[256] = 
{
   0x0000,   0x1189,   0x2312,   0x329b,   0x4624,   0x57ad,   0x6536,   0x74bf,
   0x8c48,   0x9dc1,   0xaf5a,   0xbed3,   0xca6c,   0xdbe5,   0xe97e,   0xf8f7,
   0x1081,   0x0108,   0x3393,   0x221a,   0x56a5,   0x472c,   0x75b7,   0x643e,
   0x9cc9,   0x8d40,   0xbfdb,   0xae52,   0xdaed,   0xcb64,   0xf9ff,   0xe876,
   0x2102,   0x308b,   0x0210,   0x1399,   0x6726,   0x76af,   0x4434,   0x55bd,
   0xad4a,   0xbcc3,   0x8e58,   0x9fd1,   0xeb6e,   0xfae7,   0xc87c,   0xd9f5,
   0x3183,   0x200a,   0x1291,   0x0318,   0x77a7,   0x662e,   0x54b5,   0x453c,
   0xbdcb,   0xac42,   0x9ed9,   0x8f50,   0xfbef,   0xea66,   0xd8fd,   0xc974,
   0x4204,   0x538d,   0x6116,   0x709f,   0x0420,   0x15a9,   0x2732,   0x36bb,
   0xce4c,   0xdfc5,   0xed5e,   0xfcd7,   0x8868,   0x99e1,   0xab7a,   0xbaf3,
   0x5285,   0x430c,   0x7197,   0x601e,   0x14a1,   0x0528,   0x37b3,   0x263a,
   0xdecd,   0xcf44,   0xfddf,   0xec56,   0x98e9,   0x8960,   0xbbfb,   0xaa72,
   0x6306,   0x728f,   0x4014,   0x519d,   0x2522,   0x34ab,   0x0630,   0x17b9,
   0xef4e,   0xfec7,   0xcc5c,   0xddd5,   0xa96a,   0xb8e3,   0x8a78,   0x9bf1,
   0x7387,   0x620e,   0x5095,   0x411c,   0x35a3,   0x242a,   0x16b1,   0x0738,
   0xffcf,   0xee46,   0xdcdd,   0xcd54,   0xb9eb,   0xa862,   0x9af9,   0x8b70,
   0x8408,   0x9581,   0xa71a,   0xb693,   0xc22c,   0xd3a5,   0xe13e,   0xf0b7,
   0x0840,   0x19c9,   0x2b52,   0x3adb,   0x4e64,   0x5fed,   0x6d76,   0x7cff,
   0x9489,   0x8500,   0xb79b,   0xa612,   0xd2ad,   0xc324,   0xf1bf,   0xe036,
   0x18c1,   0x0948,   0x3bd3,   0x2a5a,   0x5ee5,   0x4f6c,   0x7df7,   0x6c7e,
   0xa50a,   0xb483,   0x8618,   0x9791,   0xe32e,   0xf2a7,   0xc03c,   0xd1b5,
   0x2942,   0x38cb,   0x0a50,   0x1bd9,   0x6f66,   0x7eef,   0x4c74,   0x5dfd,
   0xb58b,   0xa402,   0x9699,   0x8710,   0xf3af,   0xe226,   0xd0bd,   0xc134,
   0x39c3,   0x284a,   0x1ad1,   0x0b58,   0x7fe7,   0x6e6e,   0x5cf5,   0x4d7c,
   0xc60c,   0xd785,   0xe51e,   0xf497,   0x8028,   0x91a1,   0xa33a,   0xb2b3,
   0x4a44,   0x5bcd,   0x6956,   0x78df,   0x0c60,   0x1de9,   0x2f72,   0x3efb,
   0xd68d,   0xc704,   0xf59f,   0xe416,   0x90a9,   0x8120,   0xb3bb,   0xa232,
   0x5ac5,   0x4b4c,   0x79d7,   0x685e,   0x1ce1,   0x0d68,   0x3ff3,   0x2e7a,
   0xe70e,   0xf687,   0xc41c,   0xd595,   0xa12a,   0xb0a3,   0x8238,   0x93b1,
   0x6b46,   0x7acf,   0x4854,   0x59dd,   0x2d62,   0x3ceb,   0x0e70,   0x1ff9,
   0xf78f,   0xe606,   0xd49d,   0xc514,   0xb1ab,   0xa022,   0x92b9,   0x8330,
   0x7bc7,   0x6a4e,   0x58d5,   0x495c,   0x3de3,   0x2c6a,   0x1ef1,   0x0f78
};

/* FUNCTION: pppfcs()
 *
 * Calculate a new FCS given the current FCS and the new data.
 *
 * PARAM1: u_short fcs
 * PARAM2: u_char *cp
 * PARAM3: int len
 *
 * RETURNS: the new FCS value
 */

u_short
pppfcs(u_short fcs, u_char * cp, int len)
{
   while (len--)
      fcs = PPP_FCS(fcs, *cp++);
   return (fcs);
}


/* FUNCTION: ppp_inchar()
 * 
 * pppinchar(unit, chr) - Called via the mppp->line->ln_getc() callback. Uart drivers
 * and similar line drivers use this to pass a single data char to PPP.
 *
 * PARAM1: M_PPP mppp   - line which got char
 * PARAM2: int c        - input character
 *
 * RETURNS: void
 */

void
ppp_inchar(M_PPP mppp, int c)
{
   PACKET   pkt;

   
   c &= 0xff;
   #if PPPCHAR_DEBUG
   Printu("%x  ",c);
   #endif
   /* If we are receiveing chars then we should have a receive buffer
    * for them. If we don;t then allocate one now, and exit if we fail to
    * get one. We get a small buffer by default and replace it with a
    * big one of this turns out to be too small.
    */
   if(mppp->inpkt == NULL)
   {
      LOCK_NET_RESOURCE(FREEQ_RESID);
      mppp->inpkt = pk_alloc(DEFBUFSIZE);
      UNLOCK_NET_RESOURCE(FREEQ_RESID);
      if(mppp->inpkt == NULL)
      {
        // ConPrintf("ppp_inchar: no little buffer\n");
         #if PPPCHAR_DEBUG
	 Printu("\r\nppp_inchar: no little buffer\r\n");
         #endif
         return;
      }
#ifdef NPDEBUG
      if(mppp->inpkt->nb_plen != 0){
         panic("ppp_inchar buf");
         #if PPPCHAR_DEBUG
         Printu("\r\n<ppp_inchar buf>\r\n");
	 #endif
      }
#endif
   }

   pkt = mppp->inpkt;   /* pktp to local var for efficiency */

   /* see if we are about to overflow the buffer (and we are not already
    * flushing this frames data) then get a bigger pkt.
    */
   if(((pkt->nb_prot + 1) >= (pkt->nb_buff + pkt->nb_blen)) &&
      ((mppp->sc_flags & SC_FLUSH) == 0))
   {
      /* get next bigger size buffer */
      LOCK_NET_RESOURCE(FREEQ_RESID);
      pkt = pk_alloc(mppp->inpkt->nb_blen + 1);			  
      UNLOCK_NET_RESOURCE(FREEQ_RESID);
      if(pkt == NULL)
      {
         //ConPrintf("ppp_inchar: no bigger buffer, size %d\n",  
            //mppp->inpkt->nb_blen + 1);
        #if PPPCHAR_DEBUG
	 Printu("ppp_inchar: no bigger buffer, size %d\r\n",  
            mppp->inpkt->nb_blen + 1);
	 #endif
         /* leave existing full buffer in the mppp and let the flush flag
          * cause the code below to punt further received data.
          */
         mppp->sc_flags |= SC_FLUSH;
      }
      else
      {
         /* copy data to new bigger pkt and install it in mppp */
         MEMCPY(pkt->nb_prot, mppp->inpkt->nb_buff + MaxLnh,  mppp->inpkt->nb_plen);
         pkt->nb_plen = mppp->inpkt->nb_plen;
         pkt->nb_prot += pkt->nb_plen;
         LOCK_NET_RESOURCE(FREEQ_RESID);
         pk_free(mppp->inpkt);
         UNLOCK_NET_RESOURCE(FREEQ_RESID);
         mppp->inpkt = pkt;
      }
   }


   if (c == PPP_FLAG) 
   {
      //ConPrintf("ppp_inchar: got PPP_FLAG ");
      
      /* PPP_FLAG signals beginning or end of packet. If we have a partially 
       * received packet buffered, then we need to flush it. We detect this by 
       * a nonzero pkt->nb_plen AND a bad FCS. If we were already flushing 
       * then just reset for another packet.
       */
      if((mppp->sc_flags & SC_FLUSH) ||
            ((mppp->inpkt->nb_plen > 0) &&
             (mppp->sc_fcs != PPP_GOODFCS)))
      {
#ifdef PPP_VJC
         /*
          * If we've missed a packet, we must toss subsequent
          * compressed packets which don't have an explicit
          * connection ID.
          */
         vj_uncompress_tcp(NULL, 0, TYPE_ERROR, &mppp->sc_comp);
#endif   /* PPP_VJC */
         if (mppp->sc_flags & SC_FLUSH)   /* end of flushing */
         {
           // ConPrintf("ppp_inchar: flushed, ppp:%p, flushed=%d\n",
              // mppp, flushed);
            flushed = 0;
            mppp->sc_flags &= ~SC_FLUSH;
         }
         else  /* got data & flag, but fcs is bad */
         {
#ifndef NO_CONPRINTF
            int i;
            int text = TRUE;
            u_char * data;

            data = (u_char*)pkt->nb_buff + MaxLnh;
           // ConPrintf("ppp_inchar: bad fcs, ppp:%p, len %d, data:\n", mppp, pkt->nb_plen);
            ppp_hexdump(data, pkt->nb_plen);
            /* See if it appears to be a text message from other side */
            for(i = 0; i < (int)pkt->nb_plen; i++)
            {
               if(*(data + i) & 0x80)  /* high bit set? */
               {
                  text = FALSE;
                  break;
               }
            }
            if(text) 
            ;//   ConPrintf("text: %s\n", data);
#endif
            mppp->bad_fcs++;
         }
         /* reset input buffers data pointer and length */
         if(mppp->inpkt)
         {
            mppp->inpkt->nb_prot = mppp->inpkt->nb_buff + MaxLnh; 
            mppp->inpkt->nb_plen = 0;
         }
         return;
      }

      /* ...else the  PPP_FLAG indicates end of packet. Check for runt: */

⌨️ 快捷键说明

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