pubdir.c
来自「MPC5200 BSP 支持ATA,USB, I2C,扩展网口」· C语言 代码 · 共 2,219 行 · 第 1/5 页
C
2,219 行
unsigned char ucWorkType, ucOriginWorkType;
unsigned long ulGateway, ulOriginGateway;
/* get the origin config data */
ulIp = getIp();
if (0xFFFFFFFF == ulIp) /* no valid value in flash */
ulIp = 0x0a3e19b4; /* 10.62.25.180 */
ulOriginIp = ulIp;
ulSubnetMask = getSubnetMask();
if (0xFFFFFFFF == ulSubnetMask) /* no valid value in flash */
ulSubnetMask = 0xffff0000; /* 255.255.0.0 */
ulOriginSubnetMask = ulSubnetMask;
getOutBandMac(acMac);
if ((char)-1 == acMac[0]) /* no valid value in flash */
{
acMac[0] = 0x00;
acMac[1] = 0xd0;
acMac[2] = 0xd0;
acMac[3] = 0x12;
acMac[4] = 0x34;
acMac[5] = 0x56; /* 00-D0-D0-12-34-56 */
}
for (i = 0; i < 6; i++)
acOriginMac[i] = acMac[i];
for (i = 0; i < 6; i++)
{
buf[i*2] = _itoc(acMac[i] >> 4);
buf[i*2 +1] = _itoc(acMac[i] & 0x0F);
}
buf[12] = '\0';
ulFtpHostIp = getFtpHostIp();
if (0xFFFFFFFF == ulFtpHostIp)
ulFtpHostIp = DEFAULT_FTP_HOST_IP;
ulOriginFtpHostIp = ulFtpHostIp;
getFtpUser (acUserName);
strcpy (acOriginUserName, acUserName);
getFtpPasswd (acPasswd);
strcpy (acOriginPasswd, acPasswd);
/* get board work type */
ucWorkType = getBoardWorkType();
ucOriginWorkType = ucWorkType;
ulUdpHostIp = s_structCfgPara.UdpHostIp;
ulOriginUdpHostIp = ulUdpHostIp;
/* Jimmy@2006.3 */
ulGateway = s_structCfgPara.ulGateway;
if (0xFFFFFFFF == ulGateway)
ulGateway = 0;
ulOriginGateway = ulGateway;
/* prompt user to provide new value */
Prompt("The IP address: ", PROMPT_IP, &ulIp);
Prompt("The SubnetMask: ", PROMPT_IP, &ulSubnetMask);
Prompt("The MAC address: ", PROMPT_STRING, &buf);
Prompt("The FTP HOST IP address: ", PROMPT_IP, &ulFtpHostIp);
Prompt("The FTP user name: ", PROMPT_STRING, &acUserName[0]);
Prompt("The FTP password: ", PROMPT_STRING, &acPasswd[0]);
Prompt("The Gateway address: ", PROMPT_IP, &ulGateway);
Prompt("The UDP HOST IP address: ", PROMPT_IP, &ulUdpHostIp);
Prompt("The Board WorkType: ", PROMPT_FLAG, &ucWorkType);
/* have user provided vliad MAC? */
/* 即使用户没有提供新的MAC地址,我也转换一下 */
if (12 != strlen(buf))
{
Print("you provided a wrong MAC address, which should contain exactly 12 chars\n");
}
else
{
p = &buf[0];
idx = 0;
bFirstPart = 1; /* 要处理的字符 */
sum = 0;
while(*p != '\0')
{
tmp = _ctoi (*p);
if (0xFF == tmp)
{
Print("The MAC address string has invalid char\n");
break;
}
if (1 == bFirstPart)
{
sum = 16 * tmp;
bFirstPart = 0;
}
else
{
sum += tmp;
acMac[idx++] = sum;
bFirstPart = 1;
}
p++;
}
}
/* 2005.2.19 */
/* 如果用户输入的IP地址,子网掩码不合法,就把它恢复成原来的,效果相当于用户没有输 */
if (!_isValidIfAddr (ulIp))
ulIp = ulOriginIp;
if (!_isValidIfMask (ulSubnetMask))
ulSubnetMask = ulOriginSubnetMask;
/* have user modified the data? */
bChanged = 0;
if (ulOriginIp != ulIp) bChanged = 1;
if (ulOriginSubnetMask != ulSubnetMask) bChanged = 1;
if (ulOriginFtpHostIp != ulFtpHostIp) bChanged = 1;
if (0 != strcmp (acOriginUserName, acUserName)) bChanged = 1;
if (0 != strcmp (acOriginPasswd, acPasswd)) bChanged = 1;
if (ulOriginUdpHostIp != ulUdpHostIp) bChanged = 1;
if (ucWorkType != ucOriginWorkType) bChanged = 1;
if (ulOriginGateway != ulGateway) bChanged = 1;
if (0 == bChanged)
{
for (i = 0; i < 6; i++)
{
if (acOriginMac[i] != acMac[i])
{
bChanged = 1;
break;
}
}
}
/* save new value */
if (1 == bChanged)
{
Print ("Save new value...");
setOutBandMac (acMac);
setIp (ulIp);
setSubnetMask (ulSubnetMask);
setFtpHostIp (ulFtpHostIp);
setFtpUser (acUserName);
setFtpPasswd (acPasswd);
s_structCfgPara.UdpHostIp = ulUdpHostIp;
s_structCfgPara.ulGateway = ulGateway;
ReCalcCheckSum (&s_structCfgPara);
setBoardWorkTypeByShell(ucWorkType);
ReCalcCheckSum((void *)&s_structCfgPara);
WriteBootCfgPara ((char *)(&s_structCfgPara));
buildBootLine( (char *)BOOT_LINE_ADRS, 0); /* 为了版本里ip, mac...的配置 */
Print("parameters saved!\n\n");
/* delay100ms(); */ /* 仅仅是为了视觉上的缓冲 */
}
/* 这里应该,立即就将新的IP地址及子网掩码设置生效 */
/* 如何使MAC地址生效? */
{
char acIfName[16] = {0}; /* cpm由bsp确定 */
char acIfAddr[16] = {0}; /* e.g. 10.62.25.180 */
char acIfMask[16] = {0}; /* e.g. 255.255.252.0 */
char *p;
/* 从boot line里面取出interface name */
/* 名字是BSP里自己定义的,boot line中的要和BSP里面的一致 */
p = strchr (DEFAULT_BOOT_LINE, '(');
if (NULL == p)
{
Print ("etract interface name from DEFAULT_BOOT_LINE failed!\n");
}
else
{
strncpy (acIfName, DEFAULT_BOOT_LINE, (int)p - (int)DEFAULT_BOOT_LINE);
strcat (acIfName, "0"); /* necessary */
/* Print ("acIfName = %s\n", acIfName); */
sprintf (acIfMask, "%ld.%ld.%ld.%ld",
(ulSubnetMask >> 24) & 0xFF,
(ulSubnetMask >> 16) & 0xFF,
(ulSubnetMask >> 8) & 0xFF,
ulSubnetMask & 0xFF);
/* Print ("acIfMask = %s\n", acIfMask); */
sprintf (acIfAddr, "%ld.%ld.%ld.%ld",
(ulIp >> 24) & 0xFF,
(ulIp >> 16) & 0xFF,
(ulIp >> 8) & 0xFF,
ulIp & 0xFF);
/* Print ("acIfAddr = %s\n", acIfAddr); */
/* set MAC */
if (0 != memcmp ((void *)acOriginMac, (void *)acMac, sizeof (acMac)))
{
char macString[16];
sprintf (macString, "%02x%02x%02x%02x%02x%02x",
acMac[0], acMac[1], acMac[2], acMac[3], acMac[4], acMac[5]);
}
if (ulOriginIp != ulIp || ulOriginSubnetMask != ulSubnetMask)
{
if (0 != ifMaskSet (acIfName, ulSubnetMask))
{
Print ("set interface mask failed!\n");
}
if (0 != ifAddrSet (acIfName, acIfAddr))
{
Print ("set interface address failed!\n");
}
}
Print ("set %s, the new ip = %s, new mask = %s\n", acIfName, acIfAddr, acIfMask);
/* 设置新网关 */
if (ulOriginGateway != ulGateway || ulFtpHostIp != ulOriginFtpHostIp)
{
char acGateway[16] = {0};
char acOriginGateway[16] = {0};
char acFtpServer[16] = {0};
char acOriginFtpServer[16] = {0};
unsigned long ul;
ul = ulGateway;
sprintf (acGateway, "%ld.%ld.%ld.%ld",
(ul >> 24) & 0xFF,
(ul >> 16) & 0xFF,
(ul >> 8) & 0xFF,
ul & 0xFF);
ul = ulOriginGateway;
sprintf (acOriginGateway, "%ld.%ld.%ld.%ld",
(ul >> 24) & 0xFF,
(ul >> 16) & 0xFF,
(ul >> 8) & 0xFF,
ul & 0xFF);
ul = ulFtpHostIp;
sprintf (acFtpServer, "%ld.%ld.%ld.%ld",
(ul >> 24) & 0xFF,
(ul >> 16) & 0xFF,
(ul >> 8) & 0xFF,
ul & 0xFF);
ul = ulOriginFtpHostIp;
sprintf (acOriginFtpServer, "%ld.%ld.%ld.%ld",
(ul >> 24) & 0xFF,
(ul >> 16) & 0xFF,
(ul >> 8) & 0xFF,
ul & 0xFF);
if (0 != routeDelete (acOriginFtpServer, acOriginGateway))
{
/*printf ("routeDelete \"%s\" \"%s\" failed\n", acOriginFtpServer, acOriginGateway);*/
}
if (0 != ulGateway)
{
if (0 != routeAdd (acFtpServer, acGateway))
{
printf ("routeAdd \"%s\" \"%s\" failed\n", acFtpServer, acGateway);
}
else
{
/* printf ("route host table entry - destination/%s gateway/%s added\n",
acFtpServer, acGateway);*/
}
}
}
}
}
}
void getOutBandMac(char *pcMac)
{
memmove (pcMac, s_structCfgPara.outBandMac, 6);
}
BYTE getBoardWorkType( void )
{
return 0;
}
void setBoardWorkTypeByShell( BYTE vucType )
{
}
void setOutBandMac(char *pcMac)
{
memmove (s_structCfgPara.outBandMac, pcMac, 6);
ReCalcCheckSum(&s_structCfgPara);
}
void setFtpHostIp(ULONG ulNewHostIp)
{
s_structCfgPara.FtpHostIp = ulNewHostIp;
ReCalcCheckSum(&s_structCfgPara);
}
void setFtpUser(char *pcUserName)
{
if( strlen(pcUserName) > 15 )
pcUserName[15] = '\0';
strcpy (s_structCfgPara.FtpUserName, pcUserName);
ReCalcCheckSum(&s_structCfgPara);
}
void setFtpPasswd(char *pcPasswd)
{
if( strlen(pcPasswd) > 15 )
pcPasswd[15] = '\0';
strcpy (s_structCfgPara.FtpPasswd, pcPasswd);
ReCalcCheckSum(&s_structCfgPara);
}
int _isValidIfAddr (unsigned long ulIfAddr)
{
if (0 == ulIfAddr || 0xffffffff == ulIfAddr)
return 0;
return 1;
}
int _isValidIfMask (unsigned long ulIfMask)
{
unsigned long msb;
msb = ulIfMask & 0x80000000;
if (0 == msb)
return 0;
while (ulIfMask & 0x80000000)
{
ulIfMask <<= 1;
}
if (0 == ulIfMask)
return 1; /* 剩余部分为全0,合法 */
else
return 0;
}
/*
* 字符表示的十六进制数转换成十进制数'a' -> 10, '9' -> 9
* copy from cli_api.c
*/
char _ctoi(char v_HexDigit)
{
if (('0' <= v_HexDigit) && (v_HexDigit <= '9'))
return (v_HexDigit - '0');
if (('a' <= v_HexDigit) && (v_HexDigit <= 'f'))
return (v_HexDigit - 'a' + 10);
if (('A' <= v_HexDigit) && (v_HexDigit <= 'F'))
return (v_HexDigit - 'A' + 10);
return 0xFF;
}
/*
* 0 -> '0', 1 -> '1', 10 -> 'a', 15->'f'
*/
char _itoc(char v_DecDigit)
{
int tmp;
tmp = (int)v_DecDigit;
if ((0 <= tmp) && (tmp <= 9))
return (v_DecDigit + '0');
if ((10 <= tmp) && (tmp <= 15))
return (v_DecDigit + 'A' - 10);
return 0xFF;
}
static
void cmd_p (void)
{
char buf[100];
unsigned long ulIp, ulOriginIp, ulSubnetMask, ulOriginSubnetMask;
ULONG ulFtpHostIp, ulOriginFtpHostIp;
ULONG ulUdpHostIp, ulOriginUdpHostIp;
char acUserName[16], acOriginUserName[16];
char acPasswd[16], acOriginPasswd[16];
char acMac[6], acOriginMac[6];
int i;
unsigned char ucWorkType, ucOriginWorkType;
unsigned long ulGateway;
/* get the origin config data */
ulIp = getIp();
if (0xFFFFFFFF == ulIp) /* no valid value in flash */
ulIp = 0x0a3e19b4; /* 10.62.25.180 */
ulOriginIp = ulIp;
ulSubnetMask = getSubnetMask();
if (0xFFFFFFFF == ulSubnetMask) /* no valid value in flash */
ulSubnetMask = 0xffff0000; /* 255.255.0.0 */
ulOriginSubnetMask = ulSubnetMask;
getOutBandMac(acMac);
if ((char)-1 == acMac[0]) /* no valid value in flash */
{
acMac[0] = 0x00;
acMac[1] = 0xd0;
acMac[2] = 0xd0;
acMac[3] = 0x12;
acMac[4] = 0x34;
acMac[5] = 0x56; /* 00-D0-D0-12-34-56 */
}
for (i = 0; i < 6; i++)
acOriginMac[i] = acMac[i];
for (i = 0; i < 6; i++)
{
buf[i*2] = _itoc(acMac[i] >> 4);
buf[i*2 +1] = _itoc(acMac[i] & 0x0F);
}
buf[12] = '\0';
ulFtpHostIp = getFtpHostIp();
if (0xFFFFFFFF == ulFtpHostIp)
ulFtpHostIp = DEFAULT_FTP_HOST_IP;
ulOriginFtpHostIp = ulFtpHostIp;
getFtpUser (acUserName);
strcpy (acOriginUserName, acUserName);
getFtpPasswd (acPasswd);
strcpy (acOriginPasswd, acPasswd);
/* get board work type */
ucWorkType = getBoardWorkType();
ucOriginWorkType = ucWorkType;
ulUdpHostIp = s_structCfgPara.UdpHostIp;
ulOriginUdpHostIp = ulUdpHostIp;
Print ("The IP address: %ld.%ld.%ld.%ld\n",
(*((ULONG *)&ulIp) >> 24) & 0xFF,
(*((ULONG *)&ulIp) >> 16) & 0xFF,
(*((ULONG *)&ulIp)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?