| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384 | 
#include "lwip/mem.h"#include "lwip/memp.h"#include "lwip/dhcp.h"#include "ethernetif.h"#include "common_config.h"#include "netconf.h"#include "tcpip.h"#include "main.h"#include "settings_api.h"#include "parameters.h"#include "web_params_api.h"#include "snmp_api.h"#include "trap_api.h"#include "hal.h"#ifdef PRINTF_STDLIB#include <stdio.h>#endif#ifdef PRINTF_CUSTOM#include "tinystdio.h"#endif#include <string.h>#define MAX_DHCP_TRIES 3#define TIME_COUNTER_10_MIN   600#define TIME_COUNTER_1_MIN    60/**  * @brief  Общая структура настроек  */extern SETTINGS_t sSettings;/**  * @brief  Флаг подтверждения новых сетевых параметров пользователем  */extern bool fConfirmWebParams;/**  * @brief  Network interface structure  */struct netif xnetif;/**  * @brief  Задача получения сетевый параметров по DHCP протоколу  */TaskHandle_t xHandleDHCP = NULL;/**  * @brief  Задача переинициализации сети  */TaskHandle_t xHandleWebReinit = NULL;bool dhcp = false;bool isIpReceived = false;void LwIP_Init(void){    struct ip4_addr ipaddr;    struct ip4_addr netmask;    struct ip4_addr gw;    char str[20];    tcpip_init( NULL, NULL );    /* Если настройки изменили, то используем временные параметры */    if (sSettings.sFlags.netsettingsChanged == true) {        if (sSettings.sWebTempParams.dhcpEnable) {            ipaddr.addr = 0;            netmask.addr = 0;            gw.addr = 0;            netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);            netif_set_default(&xnetif);            netif_set_link_up(&xnetif);            netif_set_up(&xnetif);        } else {            ipaddr.addr = ipaddr_addr(sSettings.sWebTempParams.ip);            netmask.addr = ipaddr_addr(sSettings.sWebTempParams.mask);            gw.addr = ipaddr_addr(sSettings.sWebTempParams.gate);            sprintf(str, " %s\n\r", sSettings.sWebTempParams.ip);            PRINT_USART("\n\rStatic IP address   \n\r");            PRINT_USART(str);            netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);            netif_set_default(&xnetif);            netif_set_link_up(&xnetif);            netif_set_up(&xnetif);            isIpReceived = true;        }        if (sSettings.sWebTempParams.dhcpEnable) {            xTaskCreate(LwIP_DHCP_task, "DHCPClient", configMINIMAL_STACK_SIZE * 2, NULL,                tskIDLE_PRIORITY + 2, &xHandleDHCP);            dhcp = true;        }    }    /* Настройки не менялись, используем обычне настройки из флеш памяти */    else {        if (sSettings.sWebParams.dhcpEnable) {            ipaddr.addr = 0;            netmask.addr = 0;            gw.addr = 0;            netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);            netif_set_default(&xnetif);            netif_set_link_up(&xnetif);            netif_set_up(&xnetif);        } else {            ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);            netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);            gw.addr = ipaddr_addr(sSettings.sWebParams.gate);            /* Обновляем временные настройки */            sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;            strcpy(sSettings.sWebTempParams.ip, sSettings.sWebParams.ip);            strcpy(sSettings.sWebTempParams.mask, sSettings.sWebParams.mask);            strcpy(sSettings.sWebTempParams.gate, sSettings.sWebParams.gate);            sprintf(str, " %s\n\r", sSettings.sWebParams.ip);            PRINT_USART("\n\rStatic IP address   \n\r");            PRINT_USART(str);            netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);            netif_set_default(&xnetif);            netif_set_link_up(&xnetif);            netif_set_up(&xnetif);            isIpReceived = true;        }        if (sSettings.sWebParams.dhcpEnable) {            xTaskCreate(LwIP_DHCP_task, "DHCPClient", configMINIMAL_STACK_SIZE * 2, NULL,                tskIDLE_PRIORITY + 2, &xHandleDHCP);            dhcp = true;        }    }    /* Если настройки изменились, запускаем задачу по отсчету времени реакции пользователя*/    if (sSettings.sFlags.netsettingsChanged == true)        xTaskCreate(vTaskWebReinit, "webReinit", configMINIMAL_STACK_SIZE, NULL,            tskIDLE_PRIORITY, &xHandleWebReinit);}/**  * @brief  LwIP_DHCP_Process_Handle  * @param  None  * @retval None  */void LwIP_DHCP_task(void *pvParameters){    struct ip4_addr ipaddr;    struct ip4_addr netmask;    struct ip4_addr gw;    uint8_t DHCP_state;    DHCP_state = DHCP_START;    for (;;) {        struct dhcp *dhcp = netif_dhcp_data(&xnetif);        switch (DHCP_state) {            case DHCP_START: {                dhcp_start(&xnetif);                DHCP_state = DHCP_WAIT_ADDRESS;                //PRINT_USART("\n\rLooking for DHCP server please wait...\n\r");            }            break;            case DHCP_WAIT_ADDRESS: {                /* Read the new IP address */                ipaddr = xnetif.ip_addr;                netmask = xnetif.netmask;                gw = xnetif.gw;                if (ipaddr.addr != 0) {                    DHCP_state = DHCP_ADDRESS_ASSIGNED;                    /* Сохранение полученных сетевый параметров */                    /* Если настройки изменили, то сохраняем во временные настройки */                    if (sSettings.sFlags.netsettingsChanged == true) {                        sprintf(sSettings.sWebTempParams.ip,   "%s", ipaddr_ntoa(&ipaddr));                        sprintf(sSettings.sWebTempParams.mask, "%s", ipaddr_ntoa(&netmask));                        sprintf(sSettings.sWebTempParams.gate, "%s", ipaddr_ntoa(&gw));                    } else {                        sprintf(sSettings.sWebParams.ip,   "%s", ipaddr_ntoa(&ipaddr));                        sprintf(sSettings.sWebParams.mask, "%s", ipaddr_ntoa(&netmask));                        sprintf(sSettings.sWebParams.gate, "%s", ipaddr_ntoa(&gw));                        /* Обновляем временные настройки */                        sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;                        sprintf(sSettings.sWebTempParams.ip,   "%s", ipaddr_ntoa(&ipaddr));                        sprintf(sSettings.sWebTempParams.mask, "%s", ipaddr_ntoa(&netmask));                        sprintf(sSettings.sWebTempParams.gate, "%s", ipaddr_ntoa(&gw));                    }                    PRINT_USART("Parameters assigned by a DHCP server:\n\r     IP:   ");                    PRINT_USART(ipaddr_ntoa(&ipaddr));                    PRINT_USART("\n\r");                    PRINT_USART("Netmask:   ");                    PRINT_USART(ipaddr_ntoa(&netmask));                    PRINT_USART("\n\r");                    PRINT_USART("Gateway:   ");                    PRINT_USART(ipaddr_ntoa(&gw));                    PRINT_USART("\n\r");                    vTaskDelay(50);                    isIpReceived = true;                    vTaskDelete(xHandleDHCP);                } else {                    /* DHCP timeout */                    //if (xnetif.dhcp->tries > MAX_DHCP_TRIES)                    if (dhcp->tries > MAX_DHCP_TRIES) {                        DHCP_state = DHCP_TIMEOUT;                        /* Stop DHCP */                        dhcp_stop(&xnetif);                        if (sSettings.sFlags.netsettingsChanged == true) {                            ipaddr.addr = ipaddr_addr(sSettings.sWebTempParams.ip);                            netmask.addr = ipaddr_addr(sSettings.sWebTempParams.mask);                            gw.addr = ipaddr_addr(sSettings.sWebTempParams.gate);                        } else {                            ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);                            netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);                            gw.addr = ipaddr_addr(sSettings.sWebParams.gate);                        }                        /* Static address used */                        netif_set_addr(&xnetif, &ipaddr, &netmask, &gw);                        PRINT_USART("DHCP timeout\n\r");                        PRINT_USART("\n\rStatic IP address\n\r");                        PRINT_USART(ipaddr_ntoa(&ipaddr));                        PRINT_USART("\n\r");                        vTaskDelay(50);                        isIpReceived = true;                        vTaskDelete(xHandleDHCP);                    }                }            }            break;            default: break;        }        vTaskDelay(250);    }}/**  * @brief  Запуск задачи переинициализации WEB  */void WEB_StartReinitTask(void){    xTaskCreate(vTaskWebReinit, "ReinitWeb", 2 * configMINIMAL_STACK_SIZE, NULL,        tskIDLE_PRIORITY, &xHandleWebReinit);}/**  * @brief  Переинициализация WEB. Задача положенное время отслеживает флаг  *         fConfirmWebParams.  *           Если флаг устанавливается в положенное время,  *         временные настройки web перезаписываются в постоянные, сбрасывается  *         флаг sSettings.sFlags.netsettingsChanged и вся структура настроек  *         сохраняется в памяти.  *           Если флаг не устанавливается в положенное время, то сбрасывается  *         флаг sSettings.sFlags.netsettingsChanged, сохраняется вся структура  *         настроек в памяти и контроллер перезагружается.  */void vTaskWebReinit(void *pvParameters){    static uint16_t timeCounter = 0;    for (;;) {        /* Контроль времени работы задачи */        if (timeCounter++ > TIME_COUNTER_10_MIN) {            SetWebReinitFlag(false);            HTTP_SaveSettings();            vTaskDelay(1010);            Reboot(OTHER_ACT);        }        if (fConfirmWebParams) {            fConfirmWebParams = false;            /* Сохраняем временные сетевые настройки в постоянные */            sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;            strcpy(sSettings.sWebParams.ip,   sSettings.sWebTempParams.ip);            strcpy(sSettings.sWebParams.gate, sSettings.sWebTempParams.gate);            strcpy(sSettings.sWebParams.mask, sSettings.sWebTempParams.mask);#ifdef WHITELIST_ENABLE            for (uint8_t i = 0; i < MAX_WHITE_LIST; i++) {                strcpy(sSettings.sWhiteList[i].ip_range, sSettings.sWhiteListTemp[i].ip_range);                sSettings.sWhiteList[i].ip = sSettings.sWhiteListTemp[i].ip;                sSettings.sWhiteList[i].mask = sSettings.sWhiteListTemp[i].mask;            }#endif            HTTP_SaveSettings();            vTaskDelete(xHandleWebReinit);        }        vTaskDelay(1000);    }}void SaveWEBparam(void){    sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;    strcpy(sSettings.sWebParams.ip,   sSettings.sWebTempParams.ip);    strcpy(sSettings.sWebParams.gate, sSettings.sWebTempParams.gate);    strcpy(sSettings.sWebParams.mask, sSettings.sWebTempParams.mask);}/**  * @brief  Возвращает true если сетевые параметры изменились  */bool GetStateWebReinit(void){    /* Статус dhcp изменился? */    if (sSettings.sWebParams.dhcpEnable != sSettings.sWebTempParams.dhcpEnable) {        /* Включили dhcp */        if (sSettings.sWebTempParams.dhcpEnable == 1) {            /* Устанавилваем флаг */            SetWebReinitFlag(true);            return true;        }        /* Выключили dhcp */        else {            /* Устанавилваем флаг */            SetWebReinitFlag(true);            return true;        }    }    /* Изменился IP? */    if (strstr(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip) == 0        || strlen(sSettings.sWebParams.ip) != strlen(sSettings.sWebTempParams.ip)) {        /* Устанавилваем флаг */        SetWebReinitFlag(true);        return true;    }    /* Изменился шлюз? */    if (strstr(sSettings.sWebParams.gate, sSettings.sWebTempParams.gate) == 0        || strlen(sSettings.sWebParams.gate) != strlen(sSettings.sWebTempParams.gate)) {        /* Устанавилваем флаг */        SetWebReinitFlag(true);        return true;    }    /* Изменилась маска? */    if (strstr(sSettings.sWebParams.mask, sSettings.sWebTempParams.mask) == 0        || strlen(sSettings.sWebParams.mask) != strlen(sSettings.sWebTempParams.mask)) {        /* Устанавилваем флаг */        SetWebReinitFlag(true);        return true;    }#ifdef WHITELIST_ENABLE    /* Изменился диапазон доверительных хостов? */    for (uint8_t i = 0; i < MAX_WHITE_LIST; i++) {        if (strstr(sSettings.sWhiteList[i].ip_range, sSettings.sWhiteListTemp[i].ip_range) == 0            || strlen(sSettings.sWhiteList[i].ip_range) != strlen(sSettings.sWhiteListTemp[i].ip_range)) {            // Устанавилваем флаг            SetWebReinitFlag(true);            return true;        }    }#endif    return false;}/*********** Portions COPYRIGHT 2012 Embest Tech. Co., Ltd.*****END OF FILE****/
 |