123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- #define INCLUDE_FROM_DHCPCLIENTAPP_C
- #include "DHCPClientApp.h"
- #if defined(ENABLE_DHCP_CLIENT) || defined(__DOXYGEN__)
- void DHCPClientApp_Init(void)
- {
-
- struct uip_udp_conn* Connection = uip_udp_new(&uip_broadcast_addr, HTONS(DHCP_SERVER_PORT));
-
- if (Connection != NULL)
- {
- uip_udp_appstate_t* const AppState = &Connection->appstate;
- uip_udp_bind(Connection, HTONS(DHCP_CLIENT_PORT));
-
- AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover;
-
- timer_set(&AppState->DHCPClient.Timeout, CLOCK_SECOND / 2);
- }
- }
- void DHCPClientApp_Callback(void)
- {
- uip_udp_appstate_t* const AppState = &uip_udp_conn->appstate;
- DHCP_Header_t* const AppData = (DHCP_Header_t*)uip_appdata;
- uint16_t AppDataSize = 0;
- switch (AppState->DHCPClient.CurrentState)
- {
- case DHCP_STATE_SendDiscover:
-
- memset(&AppState->DHCPClient.DHCPOffer_Data, 0x00, sizeof(AppState->DHCPClient.DHCPOffer_Data));
- uip_sethostaddr((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.AllocatedIP);
-
- AppDataSize += DHCPClientApp_FillDHCPHeader(AppData, DHCP_DISCOVER, AppState);
-
- uint8_t RequiredOptionList[] = {DHCP_OPTION_SUBNET_MASK, DHCP_OPTION_ROUTER, DHCP_OPTION_DNS_SERVER};
- AppDataSize += DHCPCommon_SetOption(AppData->Options, DHCP_OPTION_REQ_LIST, sizeof(RequiredOptionList),
- RequiredOptionList);
-
- uip_udp_send(AppDataSize);
-
- timer_reset(&AppState->DHCPClient.Timeout);
- AppState->DHCPClient.CurrentState = DHCP_STATE_WaitForOffer;
- break;
- case DHCP_STATE_WaitForOffer:
- if (!(uip_newdata()))
- {
-
- if (timer_expired(&AppState->DHCPClient.Timeout))
- AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover;
- break;
- }
- uint8_t OfferResponse_MessageType;
- if ((AppData->TransactionID == DHCP_TRANSACTION_ID) &&
- DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &OfferResponse_MessageType) &&
- (OfferResponse_MessageType == DHCP_OFFER))
- {
-
- memcpy(&AppState->DHCPClient.DHCPOffer_Data.AllocatedIP, &AppData->YourIP, sizeof(uip_ipaddr_t));
- DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_SUBNET_MASK, &AppState->DHCPClient.DHCPOffer_Data.Netmask);
- DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_ROUTER, &AppState->DHCPClient.DHCPOffer_Data.GatewayIP);
- DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_SERVER_ID, &AppState->DHCPClient.DHCPOffer_Data.ServerIP);
- timer_reset(&AppState->DHCPClient.Timeout);
- AppState->DHCPClient.CurrentState = DHCP_STATE_SendRequest;
- }
- break;
- case DHCP_STATE_SendRequest:
-
- AppDataSize += DHCPClientApp_FillDHCPHeader(AppData, DHCP_REQUEST, AppState);
-
- AppDataSize += DHCPCommon_SetOption(AppData->Options, DHCP_OPTION_REQ_IPADDR, sizeof(uip_ipaddr_t),
- &AppState->DHCPClient.DHCPOffer_Data.AllocatedIP);
-
- AppDataSize += DHCPCommon_SetOption(AppData->Options, DHCP_OPTION_SERVER_ID, sizeof(uip_ipaddr_t),
- &AppState->DHCPClient.DHCPOffer_Data.ServerIP);
-
- uip_udp_send(AppDataSize);
-
- timer_reset(&AppState->DHCPClient.Timeout);
- AppState->DHCPClient.CurrentState = DHCP_STATE_WaitForACK;
- break;
- case DHCP_STATE_WaitForACK:
- if (!(uip_newdata()))
- {
-
- if (timer_expired(&AppState->DHCPClient.Timeout))
- AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover;
- break;
- }
- uint8_t RequestResponse_MessageType;
- if ((AppData->TransactionID == DHCP_TRANSACTION_ID) &&
- DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &RequestResponse_MessageType) &&
- (RequestResponse_MessageType == DHCP_ACK))
- {
-
- uip_sethostaddr((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.AllocatedIP);
- uip_setnetmask((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.Netmask);
- uip_setdraddr((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.GatewayIP);
- AppState->DHCPClient.CurrentState = DHCP_STATE_AddressLeased;
- }
- break;
- }
- }
- static uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* const DHCPHeader,
- const uint8_t DHCPMessageType,
- uip_udp_appstate_t* const AppState)
- {
-
- memset(DHCPHeader, 0, sizeof(DHCP_Header_t));
-
- DHCPHeader->Operation = DHCP_OP_BOOTREQUEST;
- DHCPHeader->HardwareType = DHCP_HTYPE_ETHERNET;
- DHCPHeader->HardwareAddressLength = sizeof(MACAddress);
- DHCPHeader->Hops = 0;
- DHCPHeader->TransactionID = DHCP_TRANSACTION_ID;
- DHCPHeader->ElapsedSeconds = 0;
- DHCPHeader->Flags = HTONS(BOOTP_BROADCAST);
- memcpy(&DHCPHeader->ClientIP, &uip_hostaddr, sizeof(uip_ipaddr_t));
- memcpy(&DHCPHeader->YourIP, &AppState->DHCPClient.DHCPOffer_Data.AllocatedIP, sizeof(uip_ipaddr_t));
- memcpy(&DHCPHeader->NextServerIP, &AppState->DHCPClient.DHCPOffer_Data.ServerIP, sizeof(uip_ipaddr_t));
- memcpy(&DHCPHeader->ClientHardwareAddress, &MACAddress, sizeof(struct uip_eth_addr));
- DHCPHeader->Cookie = DHCP_MAGIC_COOKIE;
-
- DHCPHeader->Options[0] = DHCP_OPTION_MSG_TYPE;
- DHCPHeader->Options[1] = 1;
- DHCPHeader->Options[2] = DHCPMessageType;
- DHCPHeader->Options[3] = DHCP_OPTION_END;
-
- return (sizeof(DHCP_Header_t) + 4);
- }
- #endif
|