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