📄 telnet.c.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 + -