#ifndef _EFI_IP_H #define _EFI_IP_H /*++ Copyright (c) 2013 Intel Corporation --*/ #define EFI_IP4_SERVICE_BINDING_PROTOCOL \ {0xc51711e7,0xb4bf,0x404a,{0xbf,0xb8,0x0a,0x04, 0x8e,0xf1,0xff,0xe4}} #define EFI_IP4_PROTOCOL \ {0x41d94cd2,0x35b6,0x455a,{0x82,0x58,0xd4,0xe5,0x13,0x34,0xaa,0xdd}} #define EFI_IP6_SERVICE_BINDING_PROTOCOL \ {0xec835dd3,0xfe0f,0x617b,{0xa6,0x21,0xb3,0x50,0xc3,0xe1,0x33,0x88}} #define EFI_IP6_PROTOCOL \ {0x2c8759d5,0x5c2d,0x66ef,{0x92,0x5f,0xb6,0x6c,0x10,0x19,0x57,0xe2}} INTERFACE_DECL(_EFI_IP4); INTERFACE_DECL(_EFI_IP6); typedef struct { EFI_HANDLE InstanceHandle; EFI_IPv4_ADDRESS Ip4Address; EFI_IPv4_ADDRESS SubnetMask; } EFI_IP4_ADDRESS_PAIR; typedef struct { EFI_HANDLE DriverHandle; UINT32 AddressCount; EFI_IP4_ADDRESS_PAIR AddressPairs[1]; } EFI_IP4_VARIABLE_DATA; typedef struct { UINT8 DefaultProtocol; BOOLEAN AcceptAnyProtocol; BOOLEAN AcceptIcmpErrors; BOOLEAN AcceptBroadcast; BOOLEAN AcceptPromiscuous; BOOLEAN UseDefaultAddress; EFI_IPv4_ADDRESS StationAddress; EFI_IPv4_ADDRESS SubnetMask; UINT8 TypeOfService; UINT8 TimeToLive; BOOLEAN DoNotFragment; BOOLEAN RawData; UINT32 ReceiveTimeout; UINT32 TransmitTimeout; } EFI_IP4_CONFIG_DATA; typedef struct { EFI_IPv4_ADDRESS SubnetAddress; EFI_IPv4_ADDRESS SubnetMask; EFI_IPv4_ADDRESS GatewayAddress; } EFI_IP4_ROUTE_TABLE; typedef struct { UINT8 Type; UINT8 Code; } EFI_IP4_ICMP_TYPE; typedef struct { BOOLEAN IsStarted; UINT32 MaxPacketSize; EFI_IP4_CONFIG_DATA ConfigData; BOOLEAN IsConfigured; UINT32 GroupCount; EFI_IPv4_ADDRESS *GroupTable; UINT32 RouteCount; EFI_IP4_ROUTE_TABLE *RouteTable; UINT32 IcmpTypeCount; EFI_IP4_ICMP_TYPE *IcmpTypeList; } EFI_IP4_MODE_DATA; typedef EFI_STATUS (EFIAPI *EFI_IP4_GET_MODE_DATA) ( IN struct _EFI_IP4 *This, OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP4_CONFIGURE) ( IN struct _EFI_IP4 *This, IN EFI_IP4_CONFIG_DATA *IpConfigData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP4_GROUPS) ( IN struct _EFI_IP4 *This, IN BOOLEAN JoinFlag, IN EFI_IPv4_ADDRESS *GroupAddress OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP4_ROUTES) ( IN struct _EFI_IP4 *This, IN BOOLEAN DeleteRoute, IN EFI_IPv4_ADDRESS *SubnetAddress, IN EFI_IPv4_ADDRESS *SubnetMask, IN EFI_IPv4_ADDRESS *GatewayAddress ); #pragma pack(1) typedef struct { UINT8 HeaderLength:4; UINT8 Version:4; UINT8 TypeOfService; UINT16 TotalLength; UINT16 Identification; UINT16 Fragmentation; UINT8 TimeToLive; UINT8 Protocol; UINT16 Checksum; EFI_IPv4_ADDRESS SourceAddress; EFI_IPv4_ADDRESS DestinationAddress; } EFI_IP4_HEADER; #pragma pack() typedef struct { UINT32 FragmentLength; VOID *FragmentBuffer; } EFI_IP4_FRAGMENT_DATA; typedef struct { EFI_TIME TimeStamp; EFI_EVENT RecycleSignal; UINT32 HeaderLength; EFI_IP4_HEADER *Header; UINT32 OptionsLength; VOID *Options; UINT32 DataLength; UINT32 FragmentCount; EFI_IP4_FRAGMENT_DATA FragmentTable[1]; } EFI_IP4_RECEIVE_DATA; typedef struct { EFI_IPv4_ADDRESS SourceAddress; EFI_IPv4_ADDRESS GatewayAddress; UINT8 Protocol; UINT8 TypeOfService; UINT8 TimeToLive; BOOLEAN DoNotFragment; } EFI_IP4_OVERRIDE_DATA; typedef struct { EFI_IPv4_ADDRESS DestinationAddress; EFI_IP4_OVERRIDE_DATA *OverrideData; UINT32 OptionsLength; VOID *OptionsBuffer; UINT32 TotalDataLength; UINT32 FragmentCount; EFI_IP4_FRAGMENT_DATA FragmentTable[1]; } EFI_IP4_TRANSMIT_DATA; typedef struct { EFI_EVENT Event; EFI_STATUS Status; union { EFI_IP4_RECEIVE_DATA *RxData; EFI_IP4_TRANSMIT_DATA *TxData; } Packet; } EFI_IP4_COMPLETION_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_IP4_TRANSMIT) ( IN struct _EFI_IP4 *This, IN EFI_IP4_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_IP4_RECEIVE) ( IN struct _EFI_IP4 *This, IN EFI_IP4_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_IP4_CANCEL)( IN struct _EFI_IP4 *This, IN EFI_IP4_COMPLETION_TOKEN *Token OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP4_POLL) ( IN struct _EFI_IP4 *This ); typedef struct _EFI_IP4 { EFI_IP4_GET_MODE_DATA GetModeData; EFI_IP4_CONFIGURE Configure; EFI_IP4_GROUPS Groups; EFI_IP4_ROUTES Routes; EFI_IP4_TRANSMIT Transmit; EFI_IP4_RECEIVE Receive; EFI_IP4_CANCEL Cancel; EFI_IP4_POLL Poll; } EFI_IP4; typedef struct { UINT8 DefaultProtocol; BOOLEAN AcceptAnyProtocol; BOOLEAN AcceptIcmpErrors; BOOLEAN AcceptPromiscuous; EFI_IPv6_ADDRESS DestinationAddress; EFI_IPv6_ADDRESS StationAddress; UINT8 TrafficClass; UINT8 HopLimit; UINT32 FlowLabel; UINT32 ReceiveTimeout; UINT32 TransmitTimeout; } EFI_IP6_CONFIG_DATA; typedef struct { EFI_IPv6_ADDRESS Address; UINT8 PrefixLength; } EFI_IP6_ADDRESS_INFO; typedef struct { EFI_IPv6_ADDRESS Gateway; EFI_IPv6_ADDRESS Destination; UINT8 PrefixLength; } EFI_IP6_ROUTE_TABLE; typedef enum { EfiNeighborInComplete, EfiNeighborReachable, EfiNeighborStale, EfiNeighborDelay, EfiNeighborProbe } EFI_IP6_NEIGHBOR_STATE; typedef struct { EFI_IPv6_ADDRESS Neighbor; EFI_MAC_ADDRESS LinkAddress; EFI_IP6_NEIGHBOR_STATE State; } EFI_IP6_NEIGHBOR_CACHE; typedef struct { UINT8 Type; UINT8 Code; } EFI_IP6_ICMP_TYPE; //*********************************************************** // ICMPv6 type definitions for error messages //*********************************************************** #define ICMP_V6_DEST_UNREACHABLE 0x1 #define ICMP_V6_PACKET_TOO_BIG 0x2 #define ICMP_V6_TIME_EXCEEDED 0x3 #define ICMP_V6_PARAMETER_PROBLEM 0x4 //*********************************************************** // ICMPv6 type definition for informational messages //*********************************************************** #define ICMP_V6_ECHO_REQUEST 0x80 #define ICMP_V6_ECHO_REPLY 0x81 #define ICMP_V6_LISTENER_QUERY 0x82 #define ICMP_V6_LISTENER_REPORT 0x83 #define ICMP_V6_LISTENER_DONE 0x84 #define ICMP_V6_ROUTER_SOLICIT 0x85 #define ICMP_V6_ROUTER_ADVERTISE 0x86 #define ICMP_V6_NEIGHBOR_SOLICIT 0x87 #define ICMP_V6_NEIGHBOR_ADVERTISE 0x88 #define ICMP_V6_REDIRECT 0x89 #define ICMP_V6_LISTENER_REPORT_2 0x8F //*********************************************************** // ICMPv6 code definitions for ICMP_V6_DEST_UNREACHABLE //*********************************************************** #define ICMP_V6_NO_ROUTE_TO_DEST 0x0 #define ICMP_V6_COMM_PROHIBITED 0x1 #define ICMP_V6_BEYOND_SCOPE 0x2 #define ICMP_V6_ADDR_UNREACHABLE 0x3 #define ICMP_V6_PORT_UNREACHABLE 0x4 #define ICMP_V6_SOURCE_ADDR_FAILED 0x5 #define ICMP_V6_ROUTE_REJECTED 0x6 //*********************************************************** // ICMPv6 code definitions for ICMP_V6_TIME_EXCEEDED //*********************************************************** #define ICMP_V6_TIMEOUT_HOP_LIMIT 0x0 #define ICMP_V6_TIMEOUT_REASSEMBLE 0x1 //*********************************************************** // ICMPv6 code definitions for ICMP_V6_PARAMETER_PROBLEM //*********************************************************** #define ICMP_V6_ERRONEOUS_HEADER 0x0 #define ICMP_V6_UNRECOGNIZE_NEXT_HDR 0x1 #define ICMP_V6_UNRECOGNIZE_OPTION 0x2 typedef struct { BOOLEAN IsStarted; UINT32 MaxPacketSize; EFI_IP6_CONFIG_DATA ConfigData; BOOLEAN IsConfigured; UINT32 AddressCount; EFI_IP6_ADDRESS_INFO *AddressList; UINT32 GroupCount; EFI_IPv6_ADDRESS *GroupTable; UINT32 RouteCount; EFI_IP6_ROUTE_TABLE *RouteTable; UINT32 NeighborCount; EFI_IP6_NEIGHBOR_CACHE *NeighborCache; UINT32 PrefixCount; EFI_IP6_ADDRESS_INFO *PrefixTable; UINT32 IcmpTypeCount; EFI_IP6_ICMP_TYPE *IcmpTypeList; } EFI_IP6_MODE_DATA; typedef EFI_STATUS (EFIAPI *EFI_IP6_GET_MODE_DATA) ( IN struct _EFI_IP6 *This, OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL, OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP6_CONFIGURE) ( IN struct _EFI_IP6 *This, IN EFI_IP6_CONFIG_DATA *Ip6ConfigData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP6_GROUPS) ( IN struct _EFI_IP6 *This, IN BOOLEAN JoinFlag, IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP6_ROUTES) ( IN struct _EFI_IP6 *This, IN BOOLEAN DeleteRoute, IN EFI_IPv6_ADDRESS *Destination OPTIONAL, IN UINT8 PrefixLength, IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP6_NEIGHBORS) ( IN struct _EFI_IP6 *This, IN BOOLEAN DeleteFlag, IN EFI_IPv6_ADDRESS *TargetIp6Address, IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL, IN UINT32 Timeout, IN BOOLEAN Override ); typedef struct _EFI_IP6_FRAGMENT_DATA { UINT32 FragmentLength; VOID *FragmentBuffer; } EFI_IP6_FRAGMENT_DATA; typedef struct _EFI_IP6_OVERRIDE_DATA { UINT8 Protocol; UINT8 HopLimit; UINT32 FlowLabel; } EFI_IP6_OVERRIDE_DATA; typedef struct _EFI_IP6_TRANSMIT_DATA { EFI_IPv6_ADDRESS DestinationAddress; EFI_IP6_OVERRIDE_DATA *OverrideData; UINT32 ExtHdrsLength; VOID *ExtHdrs; UINT8 NextHeader; UINT32 DataLength; UINT32 FragmentCount; EFI_IP6_FRAGMENT_DATA FragmentTable[1]; } EFI_IP6_TRANSMIT_DATA; #pragma pack(1) typedef struct _EFI_IP6_HEADER { UINT8 TrafficClassH:4; UINT8 Version:4; UINT8 FlowLabelH:4; UINT8 TrafficClassL:4; UINT16 FlowLabelL; UINT16 PayloadLength; UINT8 NextHeader; UINT8 HopLimit; EFI_IPv6_ADDRESS SourceAddress; EFI_IPv6_ADDRESS DestinationAddress; } EFI_IP6_HEADER; #pragma pack() typedef struct _EFI_IP6_RECEIVE_DATA { EFI_TIME TimeStamp; EFI_EVENT RecycleSignal; UINT32 HeaderLength; EFI_IP6_HEADER *Header; UINT32 DataLength; UINT32 FragmentCount; EFI_IP6_FRAGMENT_DATA FragmentTable[1]; } EFI_IP6_RECEIVE_DATA; typedef struct { EFI_EVENT Event; EFI_STATUS Status; union { EFI_IP6_RECEIVE_DATA *RxData; EFI_IP6_TRANSMIT_DATA *TxData; } Packet; } EFI_IP6_COMPLETION_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_IP6_TRANSMIT) ( IN struct _EFI_IP6 *This, IN EFI_IP6_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_IP6_RECEIVE) ( IN struct _EFI_IP6 *This, IN EFI_IP6_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_IP6_CANCEL)( IN struct _EFI_IP6 *This, IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP6_POLL) ( IN struct _EFI_IP6 *This ); typedef struct _EFI_IP6 { EFI_IP6_GET_MODE_DATA GetModeData; EFI_IP6_CONFIGURE Configure; EFI_IP6_GROUPS Groups; EFI_IP6_ROUTES Routes; EFI_IP6_NEIGHBORS Neighbors; EFI_IP6_TRANSMIT Transmit; EFI_IP6_RECEIVE Receive; EFI_IP6_CANCEL Cancel; EFI_IP6_POLL Poll; } EFI_IP6; #endif /* _EFI_IP_H */