4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI DHCP protocol implementation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RFCs supported are:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RFC 2131: Dynamic Host Configuration Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RFC 2132: DHCP Options and BOOTP Vendor Extensions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RFC 1534: Interoperation Between DHCP and BOOTP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RFC 3396: Encoding Long Options in DHCP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2006 - 2011, 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_IMPL_H__
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define __EFI_DHCP4_IMPL_H__
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Uefi.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/Dhcp4.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/Udp4.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DebugLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiDriverEntryPoint.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiBootServicesTableLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BaseLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/NetLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct _DHCP_SERVICE DHCP_SERVICE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct _DHCP_PROTOCOL DHCP_PROTOCOL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Dhcp4Option.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Dhcp4Io.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_SERVICE_SIGNATURE SIGNATURE_32 ('D', 'H', 'C', 'P')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_PROTOCOL_SIGNATURE SIGNATURE_32 ('d', 'h', 'c', 'p')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// The state of the DHCP service. It starts as UNCONFIGED. If
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// and active child configures the service successfully, it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// goes to CONFIGED. If the active child configures NULL, it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// goes back to UNCONFIGED. It becomes DESTORY if it is (partly)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// destoried.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_UNCONFIGED 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_CONFIGED 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_DESTORY 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct _DHCP_PROTOCOL {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Signature;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP4_PROTOCOL Dhcp4Protocol;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DHCP_SERVICE *Service;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN InDestory;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EVENT CompletionEvent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EVENT RenewRebindEvent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UDP_IO *UdpIo; // The UDP IO used for TransmitReceive.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Timeout;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 ElaspedTime;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_BUF_QUEUE ResponseQueue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// DHCP driver is specical in that it is a singleton. Although it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// has a service binding, there can be only one active child.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct _DHCP_SERVICE {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Signature;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN ServiceState; // CONFIGED, UNCONFIGED, and DESTORY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN InDestory;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE Controller;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE Image;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY Children;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NumChildren;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN DhcpState;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS IoStatus; // the result of last user operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Xid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP4_ADDR ClientAddr; // lease IP or configured client address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP4_ADDR Netmask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP4_ADDR ServerAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP4_PACKET *LastOffer; // The last received offer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP4_PACKET *Selected;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DHCP_PARAMETER *Para;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Lease;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 T1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 T2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN ExtraRefresh; // This refresh is reqested by user
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UDP_IO *UdpIo; // Udp child receiving all DHCP message
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UDP_IO *LeaseIoPort; // Udp child with lease IP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP4_PACKET *LastPacket; // The last sent packet for retransmission
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_MAC_ADDRESS Mac;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 HwType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 HwLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 ClientAddressSendOut[16];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DHCP_PROTOCOL *ActiveChild;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP4_CONFIG_DATA ActiveConfig;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 UserOptionLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Timer event and various timer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EVENT Timer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 PacketToLive; // Retransmission timer for our packets
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 LastTimeout; // Record the init value of PacketToLive every time
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN CurRetry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN MaxRetries;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 LeaseLife;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP4_PACKET_OPTION **Option;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 OptionCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} DHCP_PARSE_CONTEXT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_INSTANCE_FROM_THIS(Proto) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CR ((Proto), DHCP_PROTOCOL, Dhcp4Protocol, DHCP_PROTOCOL_SIGNATURE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DHCP_SERVICE_FROM_THIS(Sb) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CR ((Sb), DHCP_SERVICE, ServiceBinding, DHCP_SERVICE_SIGNATURE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern EFI_DHCP4_PROTOCOL mDhcp4ProtocolTemplate;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Give up the control of the DHCP service to let other child
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync resume. Don't change the service's DHCP state and the Client
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync address and option list configure as required by RFC2131.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DhcpSb The DHCP service instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhcpYieldControl (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN DHCP_SERVICE *DhcpSb
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Complete a Dhcp4 transaction and signal the upper layer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Instance Dhcp4 instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPxeDhcpDone (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN DHCP_PROTOCOL *Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Free the resource related to the configure parameters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DHCP driver will make a copy of the user's configure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync such as the time out value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Config The DHCP configure data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhcpCleanConfigure (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_DHCP4_CONFIG_DATA *Config
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set the elapsed time based on the given instance and the pointer to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elapsed time option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Elapsed The pointer to the position to append.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance The pointer to the Dhcp4 instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSetElapsedTime (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 *Elapsed,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN DHCP_PROTOCOL *Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif