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

📄 telnet.c.bak

📁 一种操作系统源码核
💻 BAK
字号:
#include "Page1.h"
#define MAX_USERNAME_LEN		8
#define MAX_PASSWORD_LEN		8
#define TELNET_SRAM_INDEX		0x05
#define TELNET_STATE_INIT		0
#define TELNET_STATE_USERNAME	1
#define TELNET_STATE_PASSWORD	2
#define TELNET_STATE_OK			3

#define MAX_RECV_LEN			48
#define MAX_PASSWORD_RETRY		3
#define CHAR_BACKSPACE	0x08
#define CHAR_SPACE		0x20
#define CHAR_STAR		0x2a
static XCHAR OPTIONS_VERSION_HI;	
static XCHAR OPTIONS_VERSION_LO;	
static PXCHAR OPTIONS_USERNAME;	
static PXCHAR OPTIONS_PASSWORD;	

static XCHAR _pTcbData[TCB_LENGTH];
static DCHAR _iCurMsgPos;  //tcp data length
static XCHAR _iMsgFlag;
static XCHAR _pRecvPacket[MAX_RECV_LEN];
static DCHAR _iRecvLen;
static BOOLEAN _bDataAcked;
static XCHAR _iState;
static XCHAR _iRetry;
XCHAR Telnet_pUsername[MAX_USERNAME_LEN];
XCHAR Telnet_pPassword[MAX_PASSWORD_LEN];
//extern	BOOLEAN	Dhcp_bEnable;
//extern PXCHAR pTcpSendPacket;
//extern	XCHAR	Local_pMacAddress[HW_ALEN];
//extern	XCHAR	Local_pIPAddress[IP_ALEN];
//extern	XCHAR	Local_pSubnetMask[IP_ALEN];
//extern	XCHAR	Local_pRouteIP[IP_ALEN];
//extern	BOOLEAN	Udp_bOutputDebug;
//extern	BOOLEAN	Udp_bBroadcastDebug;
extern XCHAR  Serial_Baud;
extern XCHAR Serial_Bits;
extern XCHAR Serial_Stops;
extern XCHAR Serial_Parity;
extern XCHAR SERIAL_SERVER_PORT_HIGH;
extern XCHAR SERIAL_SERVER_PORT_LOW;
extern XCHAR Remote_SERVER_PORT_HIGH;
extern XCHAR  Remote_SERVER_PORT_LOW;
void _SendData();
void _SendEcho(UCHAR iLength, PXCHAR pData)
{
	DCHAR i, iVal;

	for (i = 0; i < iLength; i ++)
	{
		iVal = pData[i];
		if (iVal == CHAR_BACKSPACE)
		{
			if (_iRecvLen > 0)
			{
				_iRecvLen --;
				pTcpSendData[_iCurMsgPos] = CHAR_BACKSPACE;  //p_SendData=6a42
				pTcpSendData[_iCurMsgPos+1] = CHAR_SPACE;
				pTcpSendData[_iCurMsgPos+2] = CHAR_BACKSPACE;
				_iCurMsgPos += 3;
			}
		}
		else	//	if (iVal >= 0x20 && iVal <= 0x7e)
		{
			if (_iState == TELNET_STATE_PASSWORD)
				pTcpSendData[_iCurMsgPos] = CHAR_STAR;
			else
				pTcpSendData[_iCurMsgPos] = iVal;
			_iCurMsgPos ++;
		}
	}
}

void _SendLine(char * pString)
{
	DCHAR iLength;

	iLength = p_strlen_c((PCCHAR)pString);
	if (iLength)
	{
		p_strcpy_c2x((PXCHAR)(pTcpSendData+_iCurMsgPos), (PCCHAR)pString);
		_iCurMsgPos += iLength;
	}
}

void _SendNewLine(char * pString)
{
	p_memcpy_c2x((PXCHAR)(pTcpSendData+_iCurMsgPos), (PCCHAR)"\r\n", 2);
	_iCurMsgPos += 2;
	_SendLine(pString);
}
void _SendString(PXCHAR pString)
{
	DCHAR iLength;

	iLength = p_strlen_x(pString);
	if (iLength)
	{
		p_strcpy_x2x((PXCHAR)(pTcpSendData+_iCurMsgPos), pString);
		_iCurMsgPos += iLength;
	}
}

void _GetAll()
{
	XCHAR pStr[30];
   PXCHAR pStr1;
   DCHAR i;
	DCHAR iTemp;
 	iTemp = _iMsgFlag & 0x0f;
	if (iTemp == 2)
	{
	_SendNewLine("version\t");//15
	pStr[0] =OPTIONS_VERSION_HI + '0';
	pStr[1] = '.';
	pStr[2] = OPTIONS_VERSION_LO + '0';
	pStr[3] = 0;
	_SendString(pStr);
  	_SendNewLine("username\t");  //20
   _SendString(OPTIONS_USERNAME);
   _SendNewLine("password\t");  //20
	_SendString(OPTIONS_PASSWORD);
   _SendNewLine("mac address\t"); //31
	for (i = 0; i < HW_ALEN; i ++)
	{
		p_itoa((PXCHAR)Local_pMacAddress, (PXCHAR)(pStr+i*2), 16);
	}
	for (i = 0; i < HW_ALEN*2; i ++)
	{
		if (pStr[i] == 0)
		{
			pStr[i] = pStr[i-1];
			pStr[i-1] = ' ';
		}
	}
	pStr[i] = 0;

	_SendString(pStr);
   

		_SendNewLine("local ip\t"); //28
		IP2String((PXCHAR)(Local_pIPAddress), pStr);  //Sdram_pDataCache save parameters pointer
		_SendString(pStr);
   _iMsgFlag--;
   }
  else if (iTemp == 1)
  {
		_SendNewLine("subnet mask\t");//31
		IP2String((PXCHAR)(Local_pSubnetMask), pStr);
		_SendString(pStr);
		_SendNewLine("router ip\t");//29
		IP2String((PXCHAR)(Local_pRouteIP), pStr);
		_SendString(pStr);
     	_SendNewLine("SERIAL BAUD\t");//20
        switch (Serial_Baud)
        {
        case '0': 
             pStr1="1200";
             break;
        case '1':
         
             pStr1="2400";
             break;
         case '2': 
             pStr1="4800";
             break;
        case '3':
              pStr1="9600";
             break;
         case '4': 
             pStr1="19200";
             break;
       
         }   
 
       	_SendString(pStr1);
          
      	_SendNewLine("Parity\t"); //21
       if (Serial_Parity==0) 
           pStr1="not Parity";
        
        else if (Serial_Parity==1)
            pStr1="odd Parity";  
        else if (Serial_Parity==2)
           pStr1="even Parity";  
            _SendString(pStr1);
            _iMsgFlag = 0x24;
	       
  }
  	
}




void _SetIpAddress(UCHAR iLength, PXCHAR pData, PXCHAR pIpAddress)
{
	XCHAR pIP[IP_ALEN];

	if (String2IP(iLength, pData, pIP))
	{
		p_memcpy_x2x(pIpAddress, pIP, IP_ALEN);
	}
	else
	{
		_SendNewLine("invalid ip");
	}

}
void _SetMacAddress(UCHAR iLength, PXCHAR pData)
{
	XCHAR pMac[HW_ALEN];

	if (String2MAC(iLength, pData, pMac))
	{
		p_memcpy_x2x(Local_pMacAddress, pMac, HW_ALEN);
	}
	else
	{
		_SendNewLine("invalid mac address");
	}

}

void _Close()
{
	TcpClose(_pTcbData);
	_bDataAcked = TcpSend(_iCurMsgPos);
	_iCurMsgPos = 0;
}

void _Exit()
{
	_SendNewLine("exit without save");
	_SendNewLine("goodbye");
	_Close();
}

void _Write()
{
	_SendNewLine("exit and save the configuration");
	_SendNewLine("being root automatically");
	_SendNewLine("goodbye");
	_Close();

	// Upgrade options here and restart
	OnUpdateOptions();
}

void _SendPrompt()
{
   	DCHAR iTemp;

	iTemp = _iMsgFlag & 0x0f;
   if (iTemp == 4)
	{
	    _SendNewLine("1. Show Configuration");	
        _SendNewLine("2. Mac Address Setup");
	    _SendNewLine("3.Ip Setup");
        _SendNewLine("4.Subnet mask Setup");
	    _SendNewLine("5.Router Setup");
        _SendNewLine("6.Remote IP");
       _iMsgFlag--;
    }
   else  if (iTemp == 3)
   {
        _SendNewLine("7.Peer Port");
        _SendNewLine("8.Com Setup");
        _SendNewLine("9.Debug Setup");
         _SendNewLine("  ");
         _SendNewLine("a. Change password");
        _SendNewLine("b.Exit without Save");
        _SendNewLine("c.Exit With Save");
           
 	    _SendNewLine("Input Choise and Enter(0-9,a-c):");    
	 	
	}
   else if(iTemp == 2)
   {
          _SendNewLine("0.Baud rate");
          _SendNewLine("1.Parity");
          _SendNewLine("2.Listen Port"); 
           _SendNewLine("  ");
	     _SendNewLine("Input Choise and Enter(0-2):");    
	 	
  } 
 
   else if (iTemp == 1)
	{
        _SendNewLine("0. 1200");
        _SendNewLine("1. 2400");
        _SendNewLine("2. 4800");
        _SendNewLine("3. 9600");
        _SendNewLine("4. 19200");  
        _SendNewLine("5. 37500");
      
     	 _SendNewLine("  ");
	     _SendNewLine("Input Choise and Enter(0-7):");    
	 
	}

}



void _HandleCommand()
{
	DCHAR iFirst;
 	DCHAR iTemp,i;
    DSHORT iPort;
  	if (_iRecvLen == 0)
	{
      _iMsgFlag = 0x24;
		_SendPrompt();
		return;
	}
  iFirst = _pRecvPacket[0];
  iTemp = _iMsgFlag & 0xf0;
  if(iTemp==0x20)
  { 
    iTemp = _iMsgFlag & 0x0f;
    if (iTemp == 4 || iTemp == 3 ) //24,23
    {
    	switch (iFirst)
    	{
      case '0':
		    _iMsgFlag = 0x24;
	      	_SendPrompt();
				return;
    	case '1':
        	_iMsgFlag = 0x12;
			_GetAll();
			return;
	 //		_GetVersion();
	   // 	_GetMacAddress();
	

    	case '2':
		_SendNewLine("Please Input  Local Mac Address:xx.xx.xx.xx.xx.xx");
        _iMsgFlag=31;
        return;
        case '3':
       _SendNewLine("Please Input Local Ip:xxx.xxx.xxx.xxx");
        _iMsgFlag=32;
        return;
        case '4':
       _SendNewLine("Please Input New Subnet mask:xxx.xxx.xxx.xxx");
        _iMsgFlag=33;
        return;
        case '5':
       _SendNewLine("Please Input New Router Ip:xxx.xxx.xxx.xxx");
        _iMsgFlag=34;
        return;
        case '6':
       _SendNewLine("Please Input Remote Ip:xxx.xxx.xxx.xxx");
        _iMsgFlag=35;
        return;
        case '7':
       _SendNewLine("Please Input Remote Peer Port:xxxx");
        _iMsgFlag=36;
        return;

        case '8':
         _iMsgFlag=22;
        return;
        case '9':
         _SendNewLine("Please Set Debug Enable/Diaable :y/n");
         _iMsgFlag=39;
         return;
       	case 'a':
		_SendNewLine("Please Input New password:xxxxxx");
        _iMsgFlag=30;
        return;
        case 'b':
         	_Exit();
	    	return;
		case 'c':
	    	_Write();//write into rom 
			return;
     
	     default:
	  	_SendNewLine("bad command");
          break;
        }
     } 
     else if (iTemp == 2)
     {
        switch (iFirst)
    	{
      	case '0':
               _iMsgFlag=21;
             return; 
   
         case '1':
            _SendNewLine("Please Set Parity and Enter:0=null,1=odd,2=even");
           _iMsgFlag=37;
            return;
         case '2':
            _SendNewLine("Please Set Com Listen Port number and Enter:xxxx");
           _iMsgFlag=38;
            return;
         
			 default:
			 	_SendNewLine("bad command");
				break;

         }
       }
      else if (iTemp == 1)
      {
        if (iFirst<'8'&& iFirst>='0')
       {
         Serial_Baud=iFirst;
          ChangeSerialConfig();
        	_iMsgFlag = 0x24;
	     	_SendPrompt();
        }
        else
          _SendNewLine("invalid Baud rate");
      }
    }
  else if (iTemp == 0x30)
  {
       iTemp = _iMsgFlag & 0x0f;
     	switch (iTemp)
    	{
        case 0:
           	p_strcpy_x2x(OPTIONS_PASSWORD, (PXCHAR)(_pRecvPacket + 13));
          
	    	break;
      	case 1: 
             _SetMacAddress(_iRecvLen, (PXCHAR)_pRecvPacket);
			break;
	     case 2:
    		_SetIpAddress(_iRecvLen , (PXCHAR)_pRecvPacket , (PXCHAR)Local_pIPAddress);
			break;
	     case 3:
	    	_SetIpAddress(_iRecvLen , (PXCHAR)_pRecvPacket , (PXCHAR)Local_pSubnetMask);
			break;
	     case 4:
			_SetIpAddress(_iRecvLen, (PXCHAR)_pRecvPacket, (PXCHAR)Local_pRouteIP);
			break;
         case 5:
			_SetIpAddress(_iRecvLen, (PXCHAR)_pRecvPacket, (PXCHAR)Remote_pIPAddress);
	    	break;
         case 6:
		      iPort=Dec_atol(_pRecvPacket);
            if (iPort>9999||iPort<1)
			      _SendNewLine("input Port Number invalid");
            else
				{
		    	  Remote_SERVER_PORT_HIGH=P_HIBYTE(iPort);
              Remote_SERVER_PORT_LOW=P_LOBYTE(iPort);
             }
			 break;
	    
         case  7:
            	i = _pRecvPacket[0] - '0';     
	         	if (_pRecvPacket[0] < '0' ||_pRecvPacket[0] > '9')
		          break;
	           	if (i!= 1 || i!=2 )
                	 i=0;
                Serial_Parity=i;
                ChangeSerialConfig();
               break;
         case  8:
            iPort=Dec_atol(_pRecvPacket);
            if (iPort>9999||iPort<1)
			      _SendNewLine("input Port Number invalid");
            else
				{
		    	  SERIAL_SERVER_PORT_HIGH=P_HIBYTE(iPort);
              SERIAL_SERVER_PORT_LOW=P_LOBYTE(iPort);
             }
				 break;
    	  case 9:
			  if (iFirst=='y')
			  {
			      Udp_bOutputDebug=1;
			      Udp_bBroadcastDebug=1;
				}
				else if (iFirst=='n')
				{
				    Udp_bOutputDebug=0;
					Udp_bBroadcastDebug=0;
				  }
				 break;
	     
        }
         _iMsgFlag = 0x24;
	     _SendPrompt();


      }

}

void _StartTelnet()
{

	_iState = TELNET_STATE_USERNAME;
	_SendLine("Serial TcpLink settings");
	_SendNewLine("username:");
   	
			

}

void _RunTelnet()
{
	DCHAR iIndex;
	PXCHAR pData;
     pData=Adapter_pReceiveTcpData;//point receive tcp packet 
	iIndex = 0;
 
    
	while (iIndex < Adapter_iReceiveLen)
	{
		if ((pData[iIndex] == 0x0d && pData[iIndex+1] == 0x0a) ||
			(pData[iIndex] == 0x0a && pData[iIndex+1] == 0x0d))
		{
			_pRecvPacket[_iRecvLen+iIndex] = 0; //pRecvPacket=0x6371
		    	if (_iState == TELNET_STATE_USERNAME)
			{
				if (_iRecvLen < MAX_USERNAME_LEN)
				{
					p_strcpy_x2x(Telnet_pUsername, _pRecvPacket);
				}
				else
				{
					Telnet_pUsername[0] = 0; 
				}
				_SendNewLine("password:");
				_iState = TELNET_STATE_PASSWORD;
			}
			else if (_iState == TELNET_STATE_PASSWORD)
			{
				if (_iRecvLen < MAX_PASSWORD_LEN)
				{
					p_strcpy_x2x(Telnet_pPassword, _pRecvPacket);
				}
				else
				{
					Telnet_pPassword[0] = 0; 
				}
			//	SdramReadOptions();
				if (p_strcmp_x2x(Telnet_pUsername, OPTIONS_USERNAME) != 0 ||
					p_strcmp_x2x(Telnet_pPassword, OPTIONS_PASSWORD) != 0)
				{
					_iRetry ++;
					if (_iRetry >= MAX_PASSWORD_RETRY)
					{
						_Close();
					}
					else
					{
						_SendNewLine("login error!");
						_SendNewLine("username:");
						_iState = TELNET_STATE_USERNAME;
					}
				}
				else
				{
        
                    _iMsgFlag =24;
					_SendPrompt();
					_iRetry = 0;
					_iState = TELNET_STATE_OK;
				}
			}
             
			if (_iState == TELNET_STATE_OK)
		    	_HandleCommand();
		
			_iRecvLen = 0;
			return;
		}
		else
		{
			if (pData[iIndex] != CHAR_BACKSPACE)
			{
				if ((_iRecvLen + iIndex) < MAX_RECV_LEN)
				{
					_pRecvPacket[_iRecvLen] = pData[iIndex]; //receive packet to pRecvPacket
					_iRecvLen ++;
				}
			}
			iIndex ++;
		}
	}
	_SendEcho(Adapter_iReceiveLen, pData);
}

void TelnetInitialize()
{
	// Tcp init
	_bDataAcked = TcbInit(_pTcbData, TELNET_SERVER_PORT_HIGH, TELNET_SERVER_PORT_LOW);
   OPTIONS_USERNAME="swgs" ;
   OPTIONS_PASSWORD="1111";
  	_iCurMsgPos = 0;
	_iMsgFlag = 0;
	_iRecvLen = 0;
  _iState=TELNET_STATE_INIT;
}

BOOLEAN TelnetRun()
{
	

	SramRead(pTcpSendPacket,TELNET_SRAM_INDEX,1,0);//restore telnet tcp data
	TcbRun(_pTcbData);
//	if (Tcp_bAcceptEvent)
//	{
//		TcpPrepareData(Sdram_pDataCache2);
//		Tcp_bAcceptEvent = FALSE;
//	}
	if (Tcp_bConnectEvent)
	{
		_StartTelnet();
		Tcp_bConnectEvent = FALSE;
	}
    if (Tcp_bDataEvent)
    {
        // Handle h.245 messages here
		_RunTelnet();
		Tcp_bDataEvent = FALSE;
    }
   // if (Tcp_bCloseEvent)
  // {
//		TcpClose(_pTcbData);	// Just call TcpClose to ensure, it is ok to call it repeatly
//		Tcp_bCloseEvent = FALSE;
//	}
	_bDataAcked = TcpSend(_iCurMsgPos);//
	_iCurMsgPos = 0;
	if (_bDataAcked)
	{
		Ne2000WaitPacket();
		_SendData();
	}
	SramWrite(pTcpSendPacket,TELNET_SRAM_INDEX);

    if (Tcp_bCloseEvent)
    {
		Tcp_bCloseEvent = FALSE;
          	TelnetInitialize();	
	}
	return TRUE;
}

void TelnetHandleTimer()
{
	if (_bDataAcked)		return;      //send success

	SramRead(pTcpSendPacket,TELNET_SRAM_INDEX,1,0);
	if (TcbHandleTimer(_pTcbData))
	{
		return;
	}
	// Handle time out failure
	//DebugVal(0x1058)
	_Close();
	TelnetInitialize();	// re-initialize 
}

void _SendData()
{
	DCHAR iTemp;
	
	if ((_iMsgFlag & 0x0f) != 0)
	{
		iTemp = _iMsgFlag & 0xf0;
		if (iTemp == 0x10)
	
			_GetAll();
		else if (iTemp == 0x20)
	
			_SendPrompt();
		else
		_iMsgFlag = 0;
	
	}
	_bDataAcked = TcpSend(_iCurMsgPos);
	_iCurMsgPos = 0;
}






⌨️ 快捷键说明

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