uefi_raw/protocol/network/
dhcp4.rsuse crate::{guid, Char8, Event, Guid, Ipv4Address, MacAddress, Status};
use core::ffi::c_void;
newtype_enum! {
pub enum Dhcp4Event: i32 => {
SEND_DISCOVER = 0x01,
RCVD_OFFER = 0x02,
SELECT_OFFER = 0x03,
SEND_REQUEST = 0x04,
RCVD_ACK = 0x05,
RCVD_NAK = 0x06,
SEND_DECLINE = 0x07,
BOUND_COMPLETED = 0x08,
ENTER_RENEWING = 0x09,
ENTER_REBINDING = 0x0a,
ADDRESS_LOST = 0x0b,
FAIL = 0x0c,
}
}
newtype_enum! {
pub enum Dhcp4State: i32 => {
STOPPED = 0x0,
INIT = 0x1,
SELECTING = 0x2,
REQUESTING = 0x3,
BOUND = 0x4,
RENEWING = 0x5,
REBINDING = 0x6,
INIT_REBOOT = 0x7,
REBOOTING = 0x8,
}
}
#[derive(Debug)]
#[repr(C, packed)]
pub struct Dhcp4Packet {
pub size: u32,
pub length: u32,
pub header: Dhcp4Header,
pub magik: u32,
pub option: [u8; 0],
}
#[derive(Clone, Copy, Debug)]
#[repr(C, packed)]
pub struct Dhcp4Header {
pub op_code: u8,
pub hw_type: u8,
pub hw_addr_len: u8,
pub hops: u8,
pub xid: u32,
pub seconds: u16,
pub reserved: u16,
pub client_addr: Ipv4Address,
pub your_addr: Ipv4Address,
pub server_addr: Ipv4Address,
pub gateway_addr: Ipv4Address,
pub client_hw_addr: [u8; 16],
pub server_name: [Char8; 64],
pub boot_file_name: [Char8; 128],
}
#[derive(Debug)]
#[repr(C, packed)]
pub struct Dhcp4PacketOption {
pub op_code: u8,
pub length: u8,
pub data: [u8; 0],
}
#[derive(Debug)]
#[repr(C)]
pub struct Dhcp4ConfigData {
pub discover_try_count: u32,
pub discover_timeout: *mut u32,
pub request_try_count: u32,
pub request_timeout: *mut u32,
pub client_address: Ipv4Address,
pub callback: Option<
unsafe extern "efiapi" fn(
this: *mut Dhcp4Protocol,
context: *const c_void,
current_state: Dhcp4State,
dhcp4_event: Dhcp4Event,
packet: *const Dhcp4Packet,
new_packet: *mut *const Dhcp4Packet,
) -> Status,
>,
pub callback_context: *mut c_void,
pub option_count: u32,
pub option_list: *mut *const Dhcp4PacketOption,
}
#[derive(Debug)]
#[repr(C)]
pub struct Dhcp4ModeData {
pub state: Dhcp4State,
pub config_data: Dhcp4ConfigData,
pub client_address: Ipv4Address,
pub client_mac_address: MacAddress,
pub server_address: Ipv4Address,
pub router_address: Ipv4Address,
pub subnet_mask: Ipv4Address,
pub lease_time: u32,
pub reply_packet: *const Dhcp4Packet,
}
#[derive(Debug)]
#[repr(C)]
pub struct Dhcp4ListenPoint {
pub listen_address: Ipv4Address,
pub subnet_mask: Ipv4Address,
pub listen_port: u16,
}
#[derive(Debug)]
#[repr(C)]
pub struct Dhcp4TransmitReceiveToken {
pub status: Status,
pub completion_event: Event,
pub remote_address: Ipv4Address,
pub remote_port: u16,
pub gateway_address: Ipv4Address,
pub listen_point_count: u32,
pub listen_points: *mut Dhcp4ListenPoint,
pub timeout_value: u32,
pub packet: *mut Dhcp4Packet,
pub response_count: u32,
pub response_list: *mut Dhcp4Packet,
}
#[derive(Debug)]
#[repr(C)]
pub struct Dhcp4Protocol {
pub get_mode_data:
unsafe extern "efiapi" fn(this: *const Self, mode_data: *mut Dhcp4ModeData) -> Status,
pub configure:
unsafe extern "efiapi" fn(this: *mut Self, cfg_data: *const Dhcp4ConfigData) -> Status,
pub start: unsafe extern "efiapi" fn(this: *mut Self, completion_event: Event) -> Status,
pub renew_rebind: unsafe extern "efiapi" fn(
this: *mut Self,
rebind_request: bool,
completion_event: Event,
) -> Status,
pub release: unsafe extern "efiapi" fn(this: *mut Self) -> Status,
pub stop: unsafe extern "efiapi" fn(this: *mut Self) -> Status,
pub build: unsafe extern "efiapi" fn(
this: *mut Self,
seed_packet: *mut Dhcp4Packet,
delete_count: u32,
delete_list: *mut u8,
append_count: u32,
append_list: *const *const Dhcp4PacketOption,
new_packet: *mut *mut Dhcp4Packet,
) -> Status,
pub transmit_receive:
unsafe extern "efiapi" fn(this: *mut Self, token: *mut Dhcp4TransmitReceiveToken) -> Status,
pub parse: unsafe extern "efiapi" fn(
this: *mut Self,
packet: *mut Dhcp4Packet,
option_count: *mut u32,
packet_option_list: *mut *mut Dhcp4PacketOption,
) -> Status,
}
impl Dhcp4Protocol {
pub const GUID: Guid = guid!("8a219718-4ef5-4761-91c8-c0f04bda9e56");
pub const SERVICE_BINDING_GUID: Guid = guid!("9d9a39d8-bd42-4a73-a4d5-8ee94be11380");
}