+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006 - 2007, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
- PxeDhcp4Setup.c\r
- \r
-Abstract:\r
-\r
---*/\r
-\r
-\r
-#include "PxeDhcp4.h"\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4Setup (\r
- IN EFI_PXE_DHCP4_PROTOCOL *This,\r
- IN EFI_PXE_DHCP4_DATA *Data\r
- )\r
-{\r
- PXE_DHCP4_PRIVATE_DATA *Private;\r
- DHCP4_HEADER *Packet;\r
- EFI_STATUS EfiStatus;\r
- UINT8 *OpLen;\r
- UINT8 *OpPtr;\r
-\r
- //\r
- // Return error if parameters are invalid.\r
- //\r
- if (This == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (This);\r
-\r
- if (Private == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (This->Data != NULL) {\r
- return EFI_ALREADY_STARTED;\r
- }\r
-\r
- if (Private->PxeBc == NULL) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
- //\r
- // Check contents of provided Data structure.\r
- //\r
- if (Data != NULL) {\r
- //\r
- // Do protocol state checks first.\r
- //\r
- if (Data->SelectCompleted) {\r
- if (!Data->InitCompleted || !Data->SetupCompleted) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (Data->IsBootp && !Data->IsAck) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- } else if (Data->InitCompleted) {\r
- if (!Data->SetupCompleted || Data->IsBootp || Data->IsAck) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- } else if (Data->SetupCompleted) {\r
- if (Data->IsBootp || Data->IsAck) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- }\r
- //\r
- // Do packet content checks.\r
- //\r
- if (Data->SetupCompleted) {\r
- //\r
- // %%TBD - check discover packet\r
- //\r
- }\r
-\r
- if (Data->SelectCompleted) {\r
- if (Data->IsBootp) {\r
- //\r
- // %%TBD - check offer packet\r
- //\r
- if (CompareMem (\r
- &Data->Discover,\r
- &Data->Request,\r
- sizeof (DHCP4_PACKET)\r
- )) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (CompareMem (\r
- &Data->Offer,\r
- &Data->AckNak,\r
- sizeof (DHCP4_PACKET)\r
- )) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- } else {\r
- //\r
- // %%TBD - check offer, request & acknak packets\r
- //\r
- }\r
- }\r
- }\r
- //\r
- // Allocate data structure. Return error\r
- // if there is not enough available memory.\r
- //\r
- This->Data = AllocatePool (sizeof (EFI_PXE_DHCP4_DATA));\r
- if (This->Data == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // Start PxeBc because we want to use its UdpWrite, UdpRead and\r
- // SetFilter calls.\r
- //\r
- EfiStatus = Private->PxeBc->Start (Private->PxeBc, FALSE);\r
-\r
- if (EFI_ERROR (EfiStatus)) {\r
- if (EfiStatus != EFI_ALREADY_STARTED) {\r
- FreePool (This->Data);\r
- This->Data = NULL;\r
- Private->PxeBc->Stop (Private->PxeBc);\r
- return EfiStatus;\r
- }\r
-\r
- Private->StopPxeBc = FALSE;\r
- } else {\r
- Private->StopPxeBc = TRUE;\r
- }\r
- //\r
- // Use new data.\r
- //\r
- if (Data != NULL) {\r
- CopyMem (This->Data, Data, sizeof (EFI_PXE_DHCP4_DATA));\r
- return EFI_SUCCESS;\r
- }\r
- //\r
- // Initialize new public data structure.\r
- //\r
- ZeroMem (This->Data, sizeof (EFI_PXE_DHCP4_DATA));\r
-\r
- //\r
- // Fill in default DHCP discover packet.\r
- // Check for MAC addresses of strange lengths, just in case.\r
- //\r
- Packet = &This->Data->Discover.dhcp4;\r
-\r
- Packet->op = BOOTP_REQUEST;\r
-\r
- Packet->htype = Private->Snp->Mode->IfType;\r
-\r
- if (Private->Snp->Mode->HwAddressSize > 16) {\r
- Packet->hlen = 16;\r
- } else {\r
- Packet->hlen = (UINT8) Private->Snp->Mode->HwAddressSize;\r
- }\r
-\r
- Packet->hops = 0; /* Set to zero per RFC 2131. */\r
-\r
- if (Packet->hlen < sizeof Packet->xid) {\r
- if (Packet->hlen != 0) {\r
- CopyMem (\r
- &Packet->xid,\r
- &Private->Snp->Mode->CurrentAddress,\r
- Packet->hlen\r
- );\r
- }\r
- } else {\r
- CopyMem (\r
- &Packet->xid,\r
- &Private->Snp->Mode->CurrentAddress.Addr[Packet->hlen - sizeof Packet->xid],\r
- sizeof Packet->xid\r
- );\r
- }\r
- //\r
- // %%TBD - xid should be randomized\r
- //\r
- Packet->secs = htons (DHCP4_INITIAL_SECONDS);\r
-\r
- Packet->flags = htons (DHCP4_BROADCAST_FLAG);\r
-\r
- if (Packet->hlen != 0) {\r
- CopyMem (Packet->chaddr, &Private->Snp->Mode->CurrentAddress, Packet->hlen);\r
- }\r
-\r
- Packet->magik = htonl (DHCP4_MAGIK_NUMBER);\r
-\r
- OpPtr = Packet->options;\r
-\r
- *OpPtr++ = DHCP4_MESSAGE_TYPE;\r
- *OpPtr++ = 1;\r
- *OpPtr++ = DHCP4_MESSAGE_TYPE_DISCOVER;\r
-\r
- *OpPtr++ = DHCP4_MAX_MESSAGE_SIZE;\r
- *OpPtr++ = 2;\r
- *OpPtr++ = (UINT8) ((DHCP4_DEFAULT_MAX_MESSAGE_SIZE >> 8) & 0xFF);\r
- *OpPtr++ = (UINT8) (DHCP4_DEFAULT_MAX_MESSAGE_SIZE & 0xFF);\r
-\r
- *OpPtr++ = DHCP4_PARAMETER_REQUEST_LIST;\r
- OpLen = OpPtr;\r
- *OpPtr++ = 0;\r
- *OpPtr++ = DHCP4_SUBNET_MASK;\r
- *OpPtr++ = DHCP4_TIME_OFFSET;\r
- *OpPtr++ = DHCP4_ROUTER_LIST;\r
- *OpPtr++ = DHCP4_TIME_SERVERS;\r
- *OpPtr++ = DHCP4_NAME_SERVERS;\r
- *OpPtr++ = DHCP4_DNS_SERVERS;\r
- *OpPtr++ = DHCP4_HOST_NAME;\r
- *OpPtr++ = DHCP4_BOOT_FILE_SIZE;\r
- *OpPtr++ = DHCP4_MESSAGE_TYPE;\r
- *OpPtr++ = DHCP4_DOMAIN_NAME;\r
- *OpPtr++ = DHCP4_ROOT_PATH;\r
- *OpPtr++ = DHCP4_EXTENSION_PATH;\r
- *OpPtr++ = DHCP4_MAX_DATAGRAM_SIZE;\r
- *OpPtr++ = DHCP4_DEFAULT_TTL;\r
- *OpPtr++ = DHCP4_BROADCAST_ADDRESS;\r
- *OpPtr++ = DHCP4_NIS_DOMAIN_NAME;\r
- *OpPtr++ = DHCP4_NIS_SERVERS;\r
- *OpPtr++ = DHCP4_NTP_SERVERS;\r
- *OpPtr++ = DHCP4_VENDOR_SPECIFIC;\r
- *OpPtr++ = DHCP4_REQUESTED_IP_ADDRESS;\r
- *OpPtr++ = DHCP4_LEASE_TIME;\r
- *OpPtr++ = DHCP4_SERVER_IDENTIFIER;\r
- *OpPtr++ = DHCP4_RENEWAL_TIME;\r
- *OpPtr++ = DHCP4_REBINDING_TIME;\r
- *OpPtr++ = DHCP4_CLASS_IDENTIFIER;\r
- *OpPtr++ = DHCP4_TFTP_SERVER_NAME;\r
- *OpPtr++ = DHCP4_BOOTFILE;\r
- *OpPtr++ = 128;\r
- *OpPtr++ = 129;\r
- *OpPtr++ = 130;\r
- *OpPtr++ = 131;\r
- *OpPtr++ = 132;\r
- *OpPtr++ = 133;\r
- *OpPtr++ = 134;\r
- *OpPtr++ = 135;\r
- *OpLen = (UINT8) ((OpPtr - OpLen) - 1);\r
-\r
- *OpPtr++ = DHCP4_END;\r
-\r
- This->Data->SetupCompleted = TRUE;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/* eof - PxeDhcp4Setup.c */\r