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