mirror of https://github.com/acidanthera/audk.git
200 lines
6.0 KiB
C
200 lines
6.0 KiB
C
/** @file
|
|
The DHCP4 protocol implementation.
|
|
|
|
Copyright (c) 2006 - 2008, Intel Corporation.<BR>
|
|
All rights reserved. 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 <PiDxe.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
|
|
|
|
typedef enum {
|
|
//
|
|
// BOOTP header "op" field
|
|
//
|
|
BOOTP_REQUEST = 1,
|
|
BOOTP_REPLY = 2
|
|
} DHCP_OP_TYPE;
|
|
|
|
typedef enum {
|
|
//
|
|
// DHCP message types
|
|
//
|
|
DHCP_MSG_DISCOVER = 1,
|
|
DHCP_MSG_OFFER = 2,
|
|
DHCP_MSG_REQUEST = 3,
|
|
DHCP_MSG_DECLINE = 4,
|
|
DHCP_MSG_ACK = 5,
|
|
DHCP_MSG_NAK = 6,
|
|
DHCP_MSG_RELEASE = 7,
|
|
DHCP_MSG_INFORM = 8
|
|
} DHCP_MSG_TYPE;
|
|
|
|
typedef enum {
|
|
//
|
|
// DHCP notify user type
|
|
//
|
|
DHCP_NOTIFY_COMPLETION = 1,
|
|
DHCP_NOTIFY_RENEWREBIND,
|
|
DHCP_NOTIFY_ALL
|
|
} DHCP_NOTIFY_TYPE;
|
|
|
|
#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 Points The local/remote UDP access points
|
|
@param IoStatus The status of the UDP receive
|
|
@param Context The opaque parameter to the function.
|
|
|
|
**/
|
|
VOID
|
|
DhcpInput (
|
|
NET_BUF *UdpPacket,
|
|
UDP_POINTS *Points,
|
|
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 Points The local/remote UDP access points
|
|
@param IoStatus The status of the UDP receive
|
|
@param Context The opaque parameter to the function.
|
|
|
|
**/
|
|
VOID
|
|
DhcpOnPacketSent (
|
|
NET_BUF *Packet,
|
|
UDP_POINTS *Points,
|
|
EFI_STATUS IoStatus,
|
|
VOID *Context
|
|
);
|
|
|
|
#endif
|