4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The DHCP4 protocol implementation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef __EFI_DHCP4_IO_H__
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define __EFI_DHCP4_IO_H__
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Uefi.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/ServiceBinding.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/NetLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UdpIoLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BaseMemoryLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/MemoryAllocationLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_WAIT_OFFER 3 // Time to wait the offers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_DEFAULT_LEASE 7 * 24 * 60 * 60 // Seven days as default.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_SERVER_PORT 67
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_CLIENT_PORT 68
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// BOOTP header "op" field
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define BOOTP_REQUEST 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define BOOTP_REPLY 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// DHCP message types
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_MSG_DISCOVER 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_MSG_OFFER 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_MSG_REQUEST 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_MSG_DECLINE 4
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_MSG_ACK 5
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_MSG_NAK 6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_MSG_RELEASE 7
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_MSG_INFORM 8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// DHCP notify user type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_NOTIFY_COMPLETION 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_NOTIFY_RENEWREBIND 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_NOTIFY_ALL 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_IS_BOOTP(Parameter) (((Parameter) == NULL) || ((Parameter)->DhcpType == 0))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_CONNECTED(State) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((State) == Dhcp4Bound) || ((State) == (Dhcp4Renewing)) || ((State) == Dhcp4Rebinding))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set the DHCP state. If CallUser is true, it will try to notify
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the user before change the state by DhcpNotifyUser. It returns
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_ABORTED if the user return EFI_ABORTED, otherwise, it returns
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SUCCESS. If CallUser is FALSE, it isn't necessary to test
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the return value of this function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DhcpSb The DHCP service instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param State The new DHCP state to change to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CallUser Whether we need to call user
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The state is changed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED The user asks to abort the DHCP process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhcpSetState (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT DHCP_SERVICE *DhcpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INTN State,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN CallUser
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Build and transmit a DHCP message according to the current states.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function implement the Table 5. of RFC 2131. Always transits
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the state (as defined in Figure 5. of the same RFC) before sending
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a DHCP message. The table is adjusted accordingly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DhcpSb The DHCP service instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Seed The seed packet which the new packet is based on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Para The DHCP parameter of the Seed packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Type The message type to send
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Msg The human readable message to include in the packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sent.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Failed to allocate resources for the packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED Failed to transmit the packet through UDP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The message is sent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval other Other error occurs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhcpSendMessage (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN DHCP_SERVICE *DhcpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DHCP4_PACKET *Seed,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN DHCP_PARAMETER *Para,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Msg
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Each DHCP service has three timer. Two of them are count down timer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync One for the packet retransmission. The other is to collect the offers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The third timer increaments the lease life which is compared to T1, T2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and lease to determine the time to renew and rebind the lease.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DhcpOnTimerTick will be called once every second.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Event The timer event
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context The context, which is the DHCP service instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhcpOnTimerTick (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle the received DHCP packets. This function drives the DHCP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync state machine.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UdpPacket The UDP packets received.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndPoint The local/remote UDP access point
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param IoStatus The status of the UDP receive
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context The opaque parameter to the function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhcpInput (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_BUF *UdpPacket,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UDP_END_POINT *EndPoint,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS IoStatus,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Send an initial DISCOVER or REQUEST message according to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DHCP service's current state.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DhcpSb The DHCP service instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The request has been sent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval other Some error occurs when sending the request.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhcpInitRequest (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN DHCP_SERVICE *DhcpSb
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Clean up the DHCP related states, IoStatus isn't reset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DhcpSb The DHCP instance service.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhcpCleanLease (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN DHCP_SERVICE *DhcpSb
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Release the net buffer when packet is sent.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UdpPacket The UDP packets received.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndPoint The local/remote UDP access point
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param IoStatus The status of the UDP receive
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context The opaque parameter to the function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhcpOnPacketSent (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_BUF *Packet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UDP_END_POINT *EndPoint,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS IoStatus,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif