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 + -
显示快捷键?