📄 tftpupgrade.c
字号:
#include <time.h>
#include <vxworks.h>
#include <msgQLib.h>
#include <taskLib.h>
#include <inetLib.h>
#include <stdio.h>
#include<string.h>
#include <resolvLib.h>
#include <hostLib.h>
#include <tftplib.h>
#include <errnolib.h>
#include "define.h"
#include "democfg.h"
#include "tftpup.h"
#include "aes.h"
#include <rebootLib.h>
#include "config.h"
#include <drv/mem/flashDev.h>
#include "agrflash.h"
#include "flashup.h"
#include "biosapi.h"
#include "flashbase.h"
#include "local_log.h"
#include "syslog.h"
#include "aplocal.h"
#define TFTPLOG printf
#define FLASH_SECTOR_BYTES 65536
#define TFTP_CONFIGFILE_MAX 32*1024
#define TFTP_PACKET_BYTES 512
#define TFTP_DOWNLOADFILE_QUEUE_LEN 2
#define TFTP_DOWNLOADFILE_MSG_LEN sizeof(int)
#define TFTP_BIN_IMAGE_ADDR 0x500000
#define TFTP_COMPRESS_IMAGE_ADDR 0x580000
#define TFTP_CONFIG_ITEMS_MAX 300
#define TFTP_RETRY_NONE 0
#define TFTP_RETRY_CONFIG 1
#define TFTP_RETRY_FIRMWARE 2
#define TFTP_LOG_CONFIGFILE 1
#define TFTP_LOG_FIRMWAREFILE 2
//#define
typedef struct
{
int iPort;
int iAvail;
}TFTP_PORT_S;
typedef struct
{
char* pConfigSrvFQDN;
char* pConfigFileName;
char* pEncreptionKey;
char* pFirmwareSrvFQDN;
char* pFirmwareFilePath;
char* pFirmwareFileName;
int cProto; /* 0-tftp 1-http */
int cHttpPort;
int fProto;
int fHttpPort;
}TFTP_LOCATION_S;
typedef struct
{
char arKeyName[128+1];
char arKeyValue[128+1];
}
LOCT_TXT_S;
static BOOLEAN isDisplayChar(char c);
static char *SkipEnterChars(char *pTxtSrc);
static char *getKeyName(char *pTxtSrc);
static char *getKeyValue(char *pTxtSrc);
static char * TGetCurLine(char *pTxtSrc,LOCT_TXT_S *pTxtDest);
static BOOLEAN isMMIInIdle();
static BOOLEAN isMMIInPowerOff();
static BOOLEAN TFirmwareIsChanged();
VOID TFTP_Main(VOID);
void TFTPDownloadFileTask(int iParam);
STATUS TFTPUpgradeProc();
VOID TFTPDownloadFile(int iFileType);
STATUS TFTPConfigUpgradeProc(BOOLEAN *pConfigChanged);
STATUS TFTPFirmwareUpgradeProc();
STATUS TftpCodeGet(char *host, char *ipAddr,char *filename,int fileType/*0-bin 1-compress*/);
int TFTPCreateTask(char *taskId, FUNCPTR taskProc,
int priority, int stackSize,int iParam);
UINT32 TftpGetCompressedFileSize();
UINT32 TftpGetMagicNumber();
STATUS TftpTxtParse(char *pTxtSrc, CFG_ITEM_S *pBinDest,int *pBinDestLen);
BOOLEAN TftpTxtIsValid(char *pTxtSrc,int iStrLen);
STATUS TftpDefaultValueReset();
STATUS TGetCurLoctParams();
char *TGetCfgFileName();
VOID setCurTFTPPort(int iPort);
int getCurTFTPPort();
int getNextTFTPPort(int iPort);
/* external protype*/
extern void hwFeedWDT(void);
extern void TFTP_Send_MMIMsg(unsigned char ntype);
extern STATUS sysStartImage(UINT32 address);
extern STATUS WLOwnMACAddressGet( int unit, unsigned char *szMACAddress );
IMPORT STATUS flashEraseImage( int flashDev, int startSector, int endSector );
IMPORT void flashupReboot(int programMagic);
IMPORT FLASH_DEF* flashSectorAddr( UINT32 dev, UINT32 sector );
IMPORT UINT32 flashSectorNum( FLASH_DEF * pFlash );
IMPORT UINT32 flashSectorSize( UINT32 dev, UINT32 sector );
IMPORT STATUS flashupProgramEx( int flashDev, int sector, FLASH_DEF * pData,
int len, int offset );
extern VOID TftpFlashupReboot(UINT32 totalFileBytes);
extern void Exit_Sleep(int nsleepstate);
extern void Enter_Sleep(int nsleepstate);
extern time_t TftpGetRetryTime();
extern STATUS TftpSetRetryTime(time_t tRetry );
int g_bTFTPRetry;
/*
TFTP_PORT_S g_TFTPPorts[3] =
{
{69,0},
{21,0},
{2400,0}
};
*/
int g_iTftpCurPort;
BOOLEAN g_bTFTPNeedCancel;
BOOLEAN g_bTFTPXferInProcess;
TFTP_LOCATION_S g_TFTPLocationParams;
MSG_Q_ID MsgQTFTP_DOWNLOADFILE;
int Task_TFTP_Main_ID;
int Task_TFTP_Upgrade_ID;
int Task_TFTP_DOWNLOADFILE_ID;
CFG_ITEM_S g_TFTPBinLoct[TFTP_CONFIG_ITEMS_MAX];
BOOLEAN g_TftpManualUp;
BOOLEAN g_TftpConfigUp;
BOOLEAN g_TftpFirmwareUp;
int g_TftpDhcpStatus;
time_t g_TftpErrTime;
//unsigned char g_test_data1[65536];
//unsigned char g_test_data2[65536];
/* This function has not been used, just for compiler*/
VOID TftpMmiSetAnswer(BOOLEAN bAccept)
{
return;
}
VOID TftpMmiSetCancel()
{
if ((TRUE == g_TftpFirmwareUp) || (TRUE == g_TftpManualUp))
{
g_bTFTPNeedCancel = TRUE;
}
}
static STATUS Init_TFTPMsgQue()
{
MsgQTFTP_DOWNLOADFILE = msgQCreate(TFTP_DOWNLOADFILE_QUEUE_LEN,TFTP_DOWNLOADFILE_MSG_LEN,MSG_Q_FIFO);
if(NULL == MsgQTFTP_DOWNLOADFILE)
{
TFTPLOG(" TFTP Init_TFTPMsgQue Failed\n");
return ERROR;
}
return OK;
}
VOID TFTPDhcpSetStatus(int iStatus) /*0: DHCP_OK -1: DHCP_ERR*/
{
g_TftpDhcpStatus = iStatus;
}
int TFTPDhcpGetStatus()
{
return g_TftpDhcpStatus;
}
int TFTPWriteLog(int iLogType)
{
char temp[400];
TFTPLOG("TFTP begain Writing TFTP log \n");
if (TFTP_LOG_CONFIGFILE == iLogType)
{
strcpy(temp,"TFTP Start Configuration file upgrade: ");
strcat(temp,g_TFTPLocationParams.pConfigSrvFQDN);
strcat(temp,g_TFTPLocationParams.pConfigFileName);
}
else if (TFTP_LOG_FIRMWAREFILE == iLogType)
{
strcpy(temp,"TFTP Start Firmware file upgrade: ");
strcat(temp,g_TFTPLocationParams.pFirmwareSrvFQDN);
strcat(temp,g_TFTPLocationParams.pFirmwareFilePath);
strcat(temp,g_TFTPLocationParams.pFirmwareFileName);
}
local_log(2,temp);
syslog(6,temp);
TFTPLOG("TFTP finish Writing TFTP log \n");
return OK;
}
void TftpRetryRemainder()
{
time_t tTime1,tTime2;
tTime1 = time(NULL);
tTime2 = TftpGetRetryTime();
if (0xFFFFFFFF == tTime2)
{
printf("There's no retry time in flash\n");
return;
}
printf("Current time:%ld\n",tTime1);
printf("Retry time:%ld,size:%ld\n",tTime2,sizeof(time_t));
if (tTime1 < tTime2)
{
printf("Current time less than retry time\n");
return;
}
printf("Remainder time(.min):%d\n",(int)(tTime1-tTime2)/60);
}
STATUS TftpCleanRetryTimer()
{
g_bTFTPRetry = TFTP_RETRY_NONE;
g_TftpErrTime = 0;
if (0xFFFFFFFF == TftpGetRetryTime())
{
return OK;
}
TFTPLOG("TFTP clean the retry timer\n");
return TftpSetRetryTime((time_t)0xFFFFFFFF);
}
void TftpShowLoctParam()
{
printf("TftpShowLoctParam: \n");
printf("config server:%s\n",g_TFTPLocationParams.pConfigSrvFQDN);
printf("config file name:%s\n",g_TFTPLocationParams.pConfigFileName);
printf("config file key:%s\n",g_TFTPLocationParams.pEncreptionKey);
printf("firmware server:%s\n",g_TFTPLocationParams.pFirmwareSrvFQDN);
printf("firmware path:%s\n",g_TFTPLocationParams.pFirmwareFilePath);
printf("firmware name:%s\n",g_TFTPLocationParams.pFirmwareFileName);
printf("config update protocol:%s\n",g_TFTPLocationParams.cProto?"http":"tftp");
printf("firmware update protocol:%s\n",g_TFTPLocationParams.fProto?"http":"tftp");
printf("config server port:%d\n",g_TFTPLocationParams.cHttpPort);
printf("firmware server port:%d\n",g_TFTPLocationParams.fHttpPort);
}
VOID TFTP_init()
{
TFTPLOG(" TFTP TFTP_init \n");
if (ERROR == Init_TFTPMsgQue())
return;
g_TftpDhcpStatus = -1;
Task_TFTP_DOWNLOADFILE_ID = TFTPCreateTask("Tftp download file",(FUNCPTR)TFTPDownloadFileTask,192,0x5000,0);
Task_TFTP_Main_ID = TFTPCreateTask("Tftp Main",(FUNCPTR)TFTP_Main,195,0x1000,0);
return;
}
VOID TFTP_Main()
{
time_t tOldTime1,tNewTime1;
time_t tNewTime2;
time_t tOldTime3,tNewTime3;
BOOLEAN bTftpFirstTime=TRUE;
int iInterval;
BOOLEAN bAfterTenMins=FALSE;
#if 1
setCurTFTPPort(69);
if (ERROR == TGetCurLoctParams())
{
TFTPLOG("TFTP TGetCurLoctParams error \n");
return ;
}
tOldTime3 = tOldTime1 = time(NULL);
g_TftpErrTime = TftpGetRetryTime();
if (0xFFFFFFFF != g_TftpErrTime)
{
TFTPLOG("TFTP found there's firmware downloading error time:%d\n",(unsigned int)g_TftpErrTime);
g_bTFTPRetry = TFTP_RETRY_FIRMWARE;
}
while (1)
{
taskDelay(100);
tNewTime1 = time(NULL);
if (protocol_config_get(&iInterval,LOCT_Provisioning_ResyncPeriod))
iInterval = 30;
iInterval *= 60;
if ((tNewTime1 >= tOldTime1) && ((tNewTime1-tOldTime1) >= iInterval))
{
if (0 == TFTPDhcpGetStatus())
{
TFTPLOG("TFTP resync timer arrival\n");
bTftpFirstTime = FALSE;
TFTPDownloadFile(TFTP_GET_CONFIGFILE);
tOldTime1 = time(NULL);
}
continue;
}
else if (tNewTime1 < tOldTime1)
{
TFTPLOG("TFTP_Main resync new time < old time \n");
tOldTime1 = time(NULL);
continue;
}
if (TRUE == bTftpFirstTime)
{
if (0 == TFTPDhcpGetStatus())
{
TFTPLOG("TFTP first timer arrival\n");
bTftpFirstTime = FALSE;
TFTPDownloadFile(TFTP_GET_CONFIGFILE);
}
continue;
}
if (g_bTFTPRetry != TFTP_RETRY_FIRMWARE)
continue;
tNewTime3 = time(NULL);
if ((tNewTime3>=tOldTime3) && ((tNewTime3-tOldTime3)>600) && ((tNewTime3-tOldTime3)<=1200))
{
bAfterTenMins = TRUE;
}
else if((tNewTime3>=tOldTime3) && ((tNewTime3-tOldTime3)>1200))
{
TFTPLOG("TFTP_Main 10 minutes new time - old time > 20 minutes\n");
tOldTime3 = time(NULL);
continue;
}
else if (tNewTime3 < tOldTime3)
{
TFTPLOG("TFTP_Main 10 minutes new time < old time \n");
tOldTime3 = time(NULL);
continue;
}
if (bAfterTenMins != TRUE)
continue;
if (protocol_config_get(&iInterval,LOCT_Provisioning_RetryDelay))
iInterval = 10;
iInterval *= 60;
tNewTime2 = time(NULL);
if ((tNewTime2>=g_TftpErrTime) &&((tNewTime2-g_TftpErrTime)>iInterval))
{
if (0 == TFTPDhcpGetStatus())
{
TftpCleanRetryTimer();
TFTPDownloadFile(TFTP_GET_FIRMWAREFILE);
}
continue;
}
}
#endif
}
void TFTPUpgradeTask()
{
//int status;
g_bTFTPNeedCancel = FALSE;
g_TftpManualUp = TRUE;
TFTPUpgradeProc();
g_TftpManualUp = FALSE;
TFTP_Send_MMIMsg(TFTP_MMI_OVER);
TFTPLOG("TFTPUpgradeTask exit \n");
Enter_Sleep(SLEEP_TFTP);
}
void TFTPDownloadFileTask(int iParam)
{
int newMsg;
BOOLEAN bReboot=FALSE;
BOOLEAN bChanged;
while (1)
{
if (ERROR == msgQReceive (MsgQTFTP_DOWNLOADFILE, (char *) &newMsg, sizeof(int), WAIT_FOREVER))
{
TFTPLOG("TFTPDownloadFileTask msgQReceive error \n");
continue;
}
if (TRUE == isMMIInPowerOff())
continue;
if (TRUE == g_TftpManualUp)
continue;
if (TFTP_GET_CONFIGFILE == newMsg)
{
//Exit_Sleep(SLEEP_TFTP);
g_TftpConfigUp = TRUE;
TFTPLOG("TFTPDownloadFileTask start config upgrade \n");
TFTPConfigUpgradeProc(&bChanged);
g_TftpConfigUp = FALSE;
TFTPLOG("TFTPDownloadFileTask finish download the config file \n");
if (TRUE == bChanged)
{
bReboot =TRUE;
}
if (FALSE == isMMIInIdle())
{
TFTPLOG("TFTPDownloadFileTask for download Firmware file,but MMI is not in IDLE state \n");
}
else
{
if ((TRUE == TFirmwareIsChanged()) && (TFTP_RETRY_FIRMWARE != g_bTFTPRetry))
{
TFTPLOG("TFTPDownloadFileTask firmware should be upgraded, so send firmware signal\n");
TFTPDownloadFile(TFTP_GET_FIRMWAREFILE);
}
else if (TRUE == bReboot)
{
TFTPLOG("TFTPDownloadFileTask firmware need not be upgraded, so reboot \n");
taskDelay(5);
reboot(0);
return;
}
}
Enter_Sleep(SLEEP_TFTP);
continue;
}
else if (TFTP_GET_FIRMWAREFILE == newMsg)
{
if (FALSE == isMMIInIdle())
{
TFTPLOG("TFTPDownloadFileTask for download firmware file,but MMI is not in IDLE state \n");
continue;
}
if (FALSE == TFirmwareIsChanged())
{
TFTPLOG("TFTPDownloadFileTask for download firmware file,but firmware's version is same with the parameter \n");
continue;
}
Exit_Sleep(SLEEP_TFTP);
g_bTFTPNeedCancel = FALSE;
g_TftpFirmwareUp = TRUE;
TFTP_Send_MMIMsg(TFTP_MMI_RETRY);
taskDelay(200);
Enter_Sleep(SLEEP_TFTP);
TFTPLOG("TFTPDownloadFileTask start firmware upgrade \n");
TFTPFirmwareUpgradeProc();
TFTP_Send_MMIMsg(TFTP_MMI_OVER);
g_TftpFirmwareUp = FALSE;
TFTPLOG("TFTPDownloadFileTask failed download the firmware file \n");
g_TftpErrTime = time(NULL);
TftpSetRetryTime(g_TftpErrTime);
g_bTFTPRetry = TFTP_RETRY_FIRMWARE;
if ((TRUE == bReboot) && (isMMIInPowerOff() == FALSE))
{
TFTPLOG("TFTPDownloadFileTask phone's parameter changed, so reboot phone \n");
taskDelay(5);
reboot(0);
}
Enter_Sleep(SLEEP_TFTP);
}
else
{
TFTPLOG("TFTPDownloadFileTask msgQReceive undefined message:%d \n",newMsg);
continue;
}
}
}
STATUS TFTPUpgrade()
{
if (TRUE == g_TftpConfigUp)
{
TFTPLOG("TFTP In auto config upgrade, so can't do manual upgrade\n");
TFTP_Send_MMIMsg(TFTP_MMI_FAIL_OTHER);
return ERROR;
}
Exit_Sleep(SLEEP_TFTP);
TFTPLOG("TFTP upgrade start ...\n");
Task_TFTP_Upgrade_ID = TFTPCreateTask("TFTP upgrade",(FUNCPTR)TFTPUpgradeTask,190,0x5000,0);
return OK;
}
STATUS TFTPRetry()
{
return OK;
}
VOID TFTPDownloadFile(int iFileType)
{
int dMsgCount;
TFTPLOG("TFTPDownloadFile send a signal to start a find file process, file type:%d\n",iFileType);
if (ERROR == msgQSend( MsgQTFTP_DOWNLOADFILE, (char*)&iFileType,
sizeof(int), NO_WAIT,MSG_PRI_NORMAL ))
{
dMsgCount = msgQNumMsgs(MsgQTFTP_DOWNLOADFILE);
if(TFTP_DOWNLOADFILE_QUEUE_LEN <= dMsgCount)
{
TFTPLOG("MsgQTFTP_DOWNLOADFILE message queue is full \n");
if ((taskIdVerify(Task_TFTP_DOWNLOADFILE_ID) == OK) && (taskIsSuspended(Task_TFTP_DOWNLOADFILE_ID)))
{
TFTPLOG("I think TFTP download file task was dead now,restart it\n");
taskDelete(Task_TFTP_DOWNLOADFILE_ID);
Task_TFTP_DOWNLOADFILE_ID = TFTPCreateTask("Tftp download file",(FUNCPTR)TFTPDownloadFileTask,192,0x5000,0);
}
}
}
}
int TFTPCreateTask(char *taskId, FUNCPTR taskProc,
int priority, int stackSize,int iParam)
{
return taskSpawn(taskId,priority,(int)NULL,stackSize,(FUNCPTR)taskProc,
(int)iParam, (int)NULL, (int)NULL, (int)NULL, (int)NULL,
(int)NULL, (int)NULL, (int)NULL, (int)NULL, (int)NULL);
}
VOID test_getaddr(char* pSrvName)
{
struct addrinfo serverHints;
struct addrinfo * pServerResults = NULL;
struct addrinfo * pServerResult1;
struct sockaddr_in sockAddr;
bzero ((char *) &serverHints, sizeof (struct addrinfo));
bzero ((char *) &sockAddr, sizeof (struct sockaddr_in));
serverHints.ai_family = AF_INET;
serverHints.ai_flags = AI_CANONNAME ;
if (getaddrinfo (pSrvName, "tftp", &serverHints, &pServerResults))
{
TFTPLOG("tftpPeerSet %s: unknown host.", pSrvName);
}
pServerResult1 = pServerResults;
do
{
if (pServerResults->ai_family == AF_INET)
{
bcopy ((char *) (struct sockaddr_in *) (pServerResults->ai_addr),
(char *) (struct sockaddr_in *) &(sockAddr),
sizeof (struct sockaddr_in));
break;
}
pServerResults = pServerResults->ai_next;
} while (pServerResults);
freeaddrinfo (pServerResult1);
TFTPLOG("!!!!!!getaddrinfo %s\n",inet_ntoa(sockAddr.sin_addr));
}
STATUS TFTPResolv(char* pHostName,char* pIpAddr)
{
unsigned long int addr;
struct hostent *hp=NULL;
char *pbuf=NULL;
if ((NULL == pHostName) ||(NULL == pIpAddr))
return ERROR;
if (*pHostName == '\0')
{
TFTPLOG("TFTPResolv pHostName == ""\n");
return ERROR;
}
if ((int) (addr = inet_addr (pHostName)) != -1)
{
strcpy(pIpAddr,pHostName);
return OK;
}
pbuf = malloc(513);
if (NULL == pbuf)
return ERROR;
memset(pbuf,0,513);
hp = resolvGetHostByName (pHostName, pbuf, 512);
if (NULL == hp)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -