X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/071e02c6b6b4837fa9cf0b6d4c749994e02638d7..a8b66f318dda3cc18dfcedaa3af3d01ab68b82e8:/Projects/Webserver/Lib/DHCPClientApp.c?ds=sidebyside diff --git a/Projects/Webserver/Lib/DHCPClientApp.c b/Projects/Webserver/Lib/DHCPClientApp.c index 7f822538e..27fc83936 100644 --- a/Projects/Webserver/Lib/DHCPClientApp.c +++ b/Projects/Webserver/Lib/DHCPClientApp.c @@ -1,21 +1,21 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com + www.lufa-lib.org */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -44,13 +44,13 @@ void DHCPClientApp_Init(void) { /* Create a new UDP connection to the DHCP server port for the DHCP solicitation */ struct uip_udp_conn* Connection = uip_udp_new(&uip_broadcast_addr, HTONS(DHCPC_SERVER_PORT)); - + /* If the connection was successfully created, bind it to the local DHCP client port */ if (Connection != NULL) { uip_udp_appstate_t* const AppState = &Connection->appstate; uip_udp_bind(Connection, HTONS(DHCPC_CLIENT_PORT)); - + /* Set the initial client state */ AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover; @@ -58,8 +58,8 @@ void DHCPClientApp_Init(void) timer_set(&AppState->DHCPClient.Timeout, CLOCK_SECOND / 2); } } - -/** uIP stack application callback for the DHCP client. This function must be called each time the TCP/IP stack + +/** uIP stack application callback for the DHCP client. This function must be called each time the TCP/IP stack * needs a UDP packet to be processed. */ void DHCPClientApp_Callback(void) @@ -67,7 +67,7 @@ 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: @@ -77,19 +77,19 @@ void DHCPClientApp_Callback(void) /* Fill out the DHCP response header */ AppDataSize += DHCPClientApp_FillDHCPHeader(AppData, DHCP_DISCOVER, AppState); - + /* Add the required DHCP options list to the packet */ uint8_t RequiredOptionList[] = {DHCP_OPTION_SUBNET_MASK, DHCP_OPTION_ROUTER, DHCP_OPTION_DNS_SERVER}; AppDataSize += DHCPClientApp_SetOption(AppData->Options, DHCP_OPTION_REQ_LIST, sizeof(RequiredOptionList), - RequiredOptionList); - + RequiredOptionList); + /* Send the DHCP DISCOVER packet */ uip_udp_send(AppDataSize); /* Reset the timeout timer, progress to next state */ timer_reset(&AppState->DHCPClient.Timeout); - AppState->DHCPClient.CurrentState = DHCP_STATE_WaitForOffer; - + AppState->DHCPClient.CurrentState = DHCP_STATE_WaitForOffer; + break; case DHCP_STATE_WaitForOffer: if (!(uip_newdata())) @@ -97,10 +97,10 @@ void DHCPClientApp_Callback(void) /* Check if the DHCP timeout period has expired while waiting for a response */ if (timer_expired(&AppState->DHCPClient.Timeout)) AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover; - + break; } - + uint8_t OfferResponse_MessageType; if ((AppData->TransactionID == DHCP_TRANSACTION_ID) && DHCPClientApp_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &OfferResponse_MessageType) && @@ -111,7 +111,7 @@ void DHCPClientApp_Callback(void) DHCPClientApp_GetOption(AppData->Options, DHCP_OPTION_SUBNET_MASK, &AppState->DHCPClient.DHCPOffer_Data.Netmask); DHCPClientApp_GetOption(AppData->Options, DHCP_OPTION_ROUTER, &AppState->DHCPClient.DHCPOffer_Data.GatewayIP); DHCPClientApp_GetOption(AppData->Options, DHCP_OPTION_SERVER_ID, &AppState->DHCPClient.DHCPOffer_Data.ServerIP); - + timer_reset(&AppState->DHCPClient.Timeout); AppState->DHCPClient.CurrentState = DHCP_STATE_SendRequest; } @@ -131,7 +131,7 @@ void DHCPClientApp_Callback(void) /* Send the DHCP REQUEST packet */ uip_udp_send(AppDataSize); - + /* Reset the timeout timer, progress to next state */ timer_reset(&AppState->DHCPClient.Timeout); AppState->DHCPClient.CurrentState = DHCP_STATE_WaitForACK; @@ -143,10 +143,10 @@ void DHCPClientApp_Callback(void) /* Check if the DHCP timeout period has expired while waiting for a response */ if (timer_expired(&AppState->DHCPClient.Timeout)) AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover; - + break; } - + uint8_t RequestResponse_MessageType; if ((AppData->TransactionID == DHCP_TRANSACTION_ID) && DHCPClientApp_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &RequestResponse_MessageType) && @@ -156,13 +156,13 @@ void DHCPClientApp_Callback(void) 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); - + /* Indicate to the user that we now have a valid IP configuration */ HaveIPConfiguration = true; - AppState->DHCPClient.CurrentState = DHCP_STATE_AddressLeased; + AppState->DHCPClient.CurrentState = DHCP_STATE_AddressLeased; } - + break; } } @@ -170,13 +170,15 @@ void DHCPClientApp_Callback(void) /** Fills the DHCP packet response with the appropriate BOOTP header for DHCP. This fills out all the required * fields, leaving only the additional DHCP options to be added to the packet before it is sent to the DHCP server. * - * \param[out] DHCPHeader Location in the packet buffer where the BOOTP header should be written to + * \param[out] DHCPHeader Location in the packet buffer where the BOOTP header should be written to * \param[in] DHCPMessageType DHCP Message type, such as DHCP_DISCOVER - * \param[in] AppState Application state of the current UDP connection + * \param[in] AppState Application state of the current UDP connection * * \return Size in bytes of the created DHCP packet */ -static uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* const DHCPHeader, const uint8_t DHCPMessageType, uip_udp_appstate_t* AppState) +static uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* const DHCPHeader, + const uint8_t DHCPMessageType, + uip_udp_appstate_t* const AppState) { /* Erase existing packet data so that we start will all 0x00 DHCP header data */ memset(DHCPHeader, 0, sizeof(DHCP_Header_t)); @@ -194,13 +196,13 @@ static uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* const DHCPHeader, co 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; - + /* Add a DHCP message type and terminator options to the start of the DHCP options field */ DHCPHeader->Options[0] = DHCP_OPTION_MSG_TYPE; DHCPHeader->Options[1] = 1; DHCPHeader->Options[2] = DHCPMessageType; DHCPHeader->Options[3] = DHCP_OPTION_END; - + /* Calculate the total number of bytes added to the outgoing packet */ return (sizeof(DHCP_Header_t) + 4); } @@ -215,7 +217,10 @@ static uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* const DHCPHeader, co * * \return Number of bytes added to the DHCP packet */ -static uint8_t DHCPClientApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, uint8_t DataLen, void* OptionData) +static uint8_t DHCPClientApp_SetOption(uint8_t* DHCPOptionList, + const uint8_t Option, + const uint8_t DataLen, + void* const OptionData) { /* Skip through the DHCP options list until the terminator option is found */ while (*DHCPOptionList != DHCP_OPTION_END) @@ -226,7 +231,7 @@ static uint8_t DHCPClientApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, DHCPOptionList[1] = DataLen; memcpy(&DHCPOptionList[2], OptionData, DataLen); DHCPOptionList[2 + DataLen] = DHCP_OPTION_END; - + /* Calculate the total number of bytes added to the outgoing packet */ return (2 + DataLen); } @@ -239,7 +244,9 @@ static uint8_t DHCPClientApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, * * \return Boolean true if the option was found in the DHCP packet's options list, false otherwise */ -static bool DHCPClientApp_GetOption(const uint8_t* DHCPOptionList, const uint8_t Option, void* const Destination) +static bool DHCPClientApp_GetOption(const uint8_t* DHCPOptionList, + const uint8_t Option, + void* const Destination) { /* Look through the incoming DHCP packet's options list for the requested option */ while (*DHCPOptionList != DHCP_OPTION_END) @@ -249,16 +256,17 @@ static bool DHCPClientApp_GetOption(const uint8_t* DHCPOptionList, const uint8_t { /* Copy request option's data to the destination buffer */ memcpy(Destination, &DHCPOptionList[2], DHCPOptionList[1]); - + /* Indicate that the requested option data was successfully retrieved */ return true; } - + /* Skip to next DHCP option in the options list */ DHCPOptionList += (DHCPOptionList[1] + 2); } - + /* Requested option not found in the incoming packet's DHCP options list */ return false; } #endif +