156 lines
4.8 KiB
C
156 lines
4.8 KiB
C
/**
|
|
******************************************************************************
|
|
* @file LwIP/LwIP_HTTP_Server_Netconn_RTOS/Src/app_ethernet.c
|
|
* @author MCD Application Team
|
|
* @brief Ethernet specefic module
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* <h2><center>© Copyright (c) 2017 STMicroelectronics.
|
|
* All rights reserved.</center></h2>
|
|
*
|
|
* This software component is licensed by ST under Ultimate Liberty license
|
|
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at:
|
|
* www.st.com/SLA0044
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "lwip/opt.h"
|
|
#include "main.h"
|
|
#if LWIP_DHCP
|
|
#include "lwip/dhcp.h"
|
|
#endif
|
|
#include "app_ethernet.h"
|
|
#include "ethernetif.h"
|
|
|
|
/* Private typedef -----------------------------------------------------------*/
|
|
/* Private define ------------------------------------------------------------*/
|
|
/* Private macro -------------------------------------------------------------*/
|
|
/* Private variables ---------------------------------------------------------*/
|
|
#if LWIP_DHCP
|
|
#define MAX_DHCP_TRIES 8
|
|
__IO uint8_t DHCP_state = DHCP_OFF;
|
|
#endif
|
|
|
|
/* Private function prototypes -----------------------------------------------*/
|
|
/* Private functions ---------------------------------------------------------*/
|
|
/**
|
|
* @brief Notify the User about the nework interface config status
|
|
* @param netif: the network interface
|
|
* @retval None
|
|
*/
|
|
void ethernet_link_status_updated(struct netif *netif) {
|
|
if (netif_is_up(netif)) {
|
|
#if LWIP_DHCP
|
|
/* Update DHCP state machine */
|
|
DHCP_state = DHCP_START;
|
|
#else
|
|
BSP_LED_On(LED2);
|
|
BSP_LED_Off(LED3);
|
|
#endif /* LWIP_DHCP */
|
|
} else {
|
|
#if LWIP_DHCP
|
|
/* Update DHCP state machine */
|
|
DHCP_state = DHCP_LINK_DOWN;
|
|
#else
|
|
BSP_LED_Off(LED2);
|
|
BSP_LED_On(LED3);
|
|
#endif /* LWIP_DHCP */
|
|
}
|
|
}
|
|
|
|
#if LWIP_DHCP
|
|
/**
|
|
* @brief DHCP Process
|
|
* @param argument: network interface
|
|
* @retval None
|
|
*/
|
|
void DHCP_Thread(void const *argument) {
|
|
struct netif *netif = (struct netif*) argument;
|
|
ip_addr_t ipaddr;
|
|
ip_addr_t netmask;
|
|
ip_addr_t gw;
|
|
struct dhcp *dhcp;
|
|
|
|
/* Static address used */
|
|
// IP_ADDR4(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
|
|
// IP_ADDR4(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2,
|
|
// NETMASK_ADDR3);
|
|
// IP_ADDR4(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
|
// netif_set_addr(netif, ip_2_ip4(&ipaddr), ip_2_ip4(&netmask), ip_2_ip4(&gw));
|
|
for (;;) {
|
|
switch (DHCP_state) {
|
|
case DHCP_START : {
|
|
ip_addr_set_zero_ip4(&netif->ip_addr);
|
|
ip_addr_set_zero_ip4(&netif->netmask);
|
|
ip_addr_set_zero_ip4(&netif->gw);
|
|
DHCP_state = DHCP_WAIT_ADDRESS;
|
|
|
|
BSP_LED_Off(LED2);
|
|
BSP_LED_Off(LED3);
|
|
|
|
dhcp_start(netif);
|
|
}
|
|
break;
|
|
case DHCP_WAIT_ADDRESS : {
|
|
if (dhcp_supplied_address(netif)) {
|
|
DHCP_state = DHCP_ADDRESS_ASSIGNED;
|
|
|
|
BSP_LED_On(LED2);
|
|
BSP_LED_Off(LED3);
|
|
} else {
|
|
dhcp = (struct dhcp*) netif_get_client_data(netif,
|
|
LWIP_NETIF_CLIENT_DATA_INDEX_DHCP);
|
|
|
|
/* DHCP timeout */
|
|
if (dhcp->tries > MAX_DHCP_TRIES) {
|
|
DHCP_state = DHCP_TIMEOUT;
|
|
|
|
/* Static address used */
|
|
IP_ADDR4(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
|
|
IP_ADDR4(&netmask, NETMASK_ADDR0, NETMASK_ADDR1,
|
|
NETMASK_ADDR2, NETMASK_ADDR3);
|
|
IP_ADDR4(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
|
netif_set_addr(netif, ip_2_ip4(&ipaddr), ip_2_ip4(&netmask),
|
|
ip_2_ip4(&gw));
|
|
|
|
BSP_LED_On(LED2);
|
|
BSP_LED_Off(LED3);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case DHCP_LINK_DOWN : {
|
|
dhcp_release_and_stop(netif);
|
|
|
|
BSP_LED_Off(LED2);
|
|
BSP_LED_On(LED3);
|
|
|
|
ip_addr_set_zero_ip4(&netif->ip_addr);
|
|
ip_addr_set_zero_ip4(&netif->netmask);
|
|
ip_addr_set_zero_ip4(&netif->gw);
|
|
|
|
DHCP_state = DHCP_WAIT_LINK_UP;
|
|
}
|
|
break;
|
|
case DHCP_WAIT_LINK_UP : {
|
|
if (netif_is_link_up((netif))) {
|
|
DHCP_state = DHCP_START;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
/* wait 500 ms */
|
|
osDelay(500);
|
|
|
|
}
|
|
}
|
|
#endif /* LWIP_DHCP */
|
|
|
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|