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

📄 ipcp.c

📁 uCOS-II应用举例 关于与OS有关的FAT文件管理系统软件包USB驱动软件包CF卡及其IDE接口软件包 TCP/IP软件包GUI软件包我们已经通过各种途径提供了十分详细的开发资料源码与出 版
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: ipcp.h
**创   建   人: 陈明计
**最后修改日期: 2004年4月23日
**描        述: 端对端协议网间协议控制协议(IPCP)处理程序
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: 0.10b
** 日 期: 2004年4月23日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_IPCP

#include "config.h"

extern uint8 PPPStateTransitionTable[MAX_PPP_EVENT][MAX_PPP_STATE];
extern uint8 PPPActionsTable[MAX_PPP_EVENT][MAX_PPP_STATE];

uint8 IPCPFlag;

uint8 IpcpCfg[] = {
                     PPP_FRAM_TYPE__IPCP / 256, PPP_FRAM_TYPE__IPCP % 256,
                     0x01, 0x00,
                     0x00, 0x04,
                     0x03, 0x06, 0x00, 0x00, 0x00, 0x00
                     };

            void IPCPSendCFG(PppData *ThisPPP)
{
    IpcpCfg[3] = ThisPPP->FramID++;
    SendCfgFram(ThisPPP, IpcpCfg);
}


            void IPCPOpen(PppData *ThisPPP)
{
    IPCPFlag = IPCP_STATE_REQ_SEND;
    IPCPSendCFG(ThisPPP);
}

            void IPCPClose(PppData *ThisPPP)
{
    ThisPPP = ThisPPP;

    IPCPFlag = IPCP_STATE_STOPED;
    IpcpCfg[5] = 0x04;
    IpcpCfg[8] = 0;
    IpcpCfg[9] = 0;
    IpcpCfg[10] = 0;
    IpcpCfg[11] = 0;
    PPPClose();    
}

        uint8 IPCPReviceCfg(uint8 *Frame)
{
    int16 Sum, SendSum; 
    uint8 temp, Ret, err;
    uint8 *cp;
    uint8 *cp2;
    
    cp = Frame + 4;
    
    Sum = cp[0] * 256 + cp[1] - 4;
    cp += 2;
    
    Ret = 0;
    cp2 = cp;
    SendSum = 4;
    while (Sum > 0)
    {
        err = 0;
        Sum -= cp[1];
        switch (*cp)
        {
            case 3:
                if (cp[1] == 0x06)
                {
                    IpcpCfg[5] = 0x0a;
                    IpcpCfg[8] = cp[2];
                    IpcpCfg[9] = cp[3];
                    IpcpCfg[10] = cp[4];
                    IpcpCfg[11] = cp[5];
                }
                else
                {
                    err =1;
                }
                break;
            default:
                err = 1;
                break;
        }
        if (err == 1)
        {
            Ret = 1;
            *cp2++ = *cp++;
            temp = *cp;
            SendSum += temp;
            for (temp--; temp > 0; temp--)
            {
                *cp2++ = *cp++;
            }
        }
        else
        {
            cp += cp[1];
        }
    }
    if (Ret == 1)
    {
        Frame[2] = 0x04;
        Frame[4] = SendSum / 256;
        Frame[5] = SendSum % 256;
    }
    return Ret;
}


        void IPCPGetCfg(PppData *ThisPPP, uint8 *Frame)
{

    if ((Frame[0] == (PPP_FRAM_TYPE__IPCP / 256)) &&
        (Frame[1] == (PPP_FRAM_TYPE__IPCP % 256)))
    {
        switch (Frame[2])
        {
            case LCP_CFG_REQ:
                if (IPCPReviceCfg(Frame) == 1)
                {
                    LCPSendCfgNak(ThisPPP, Frame);
                }
                else
                {
                    LCPSendCfgAck(ThisPPP, Frame);
                    IPCPFlag = IPCP_STATE_ACK_SEND;
                }
                break;
            case LCP_CFG_ACK:
                if (IPCPFlag == IPCP_STATE_ACK_SEND)
                {
                    PPP_zrc(Frame, 0);
                    IPCPFlag = IPCP_STATE_OPENED;
                    
                    IPCPReviceCfg(Frame);
                    
//        PC_DispChar (20, 20, '-', DISP_FGND_WHITE);
                    
//                    IPOpen();
                }
                else
                {
                    IPCPSendCFG(ThisPPP);
                    IPCPFlag = IPCP_STATE_ACK_RCVD;
                }
                break;
            case LCP_CFG_NAK:
                if (Frame[6] == 0x03 && Frame[7] == 0x06)
                {
                    IpcpCfg[5] = 0x0a;
                    IpcpCfg[8] = Frame[8];
                    IpcpCfg[9] = Frame[9];
                    IpcpCfg[10] = Frame[10];
                    IpcpCfg[11] = Frame[11];
                }
                                                    /* 没有break不是错误 */
            case LCP_CFG_REJ:
                IPCPSendCFG(ThisPPP);
                if (IPCPFlag == IPCP_STATE_ACK_SEND)
                {
                    PPP_irc(Frame, 0);
                }
                else
                {
                    IPCPFlag = IPCP_STATE_ACK_RCVD;
                }
                break;
//            case LCP_TERM_REQ:
//                LCPSendTermAck(ThisPPP, Frame);
//                IPCPClose(ThisPPP);
//                break;
//            case LCP_TERM_ACK:
//                IPCPClose(ThisPPP);
//                break;
            default :
                break;
        }
    }
}

            void IPCPGetFrame(PppData *ThisPPP, uint8 *Frame, uint8 Q)
{
   
//PC_DispChar (0, 0, IPCPFlag + '0', DISP_FGND_WHITE);
    if ((IPCPFlag == IPCP_STATE_OPENED) && (Frame[0] == (PPP_FRAM_TYPE__IP / 256)) &&
         (Frame[1] == (PPP_FRAM_TYPE__IP % 256)))
    {
        IPGetFrame(Frame + 2);
//        PC_DispChar (1, 1, '+', DISP_FGND_WHITE);
    }
    else
    {
        switch (Q)
        {
            case PPP_EVENT_TO_R:
                if (IPCPFlag != IPCP_STATE_STOPED && IPCPFlag != IPCP_STATE_OPENED)
                {
                    IPCPSendCFG(ThisPPP);
                }
                break;
            case PPP_EVENT_TO_E:
                IPCPClose(ThisPPP);
                break;
            case PPP_EVENT_UP_LAYER:
                IPCPGetCfg(ThisPPP, Frame);
                break;
            default:
                break;
        }
    }
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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