1/* $NetBSD$ */ 2 3#ifndef _EFI_IP_H 4#define _EFI_IP_H 5 6/*++ 7Copyright (c) 2013 Intel Corporation 8 9--*/ 10 11#define EFI_IP4_SERVICE_BINDING_PROTOCOL \ 12 {0xc51711e7,0xb4bf,0x404a,{0xbf,0xb8,0x0a,0x04, 0x8e,0xf1,0xff,0xe4}} 13 14#define EFI_IP4_PROTOCOL \ 15 {0x41d94cd2,0x35b6,0x455a,{0x82,0x58,0xd4,0xe5,0x13,0x34,0xaa,0xdd}} 16 17#define EFI_IP6_SERVICE_BINDING_PROTOCOL \ 18 {0xec835dd3,0xfe0f,0x617b,{0xa6,0x21,0xb3,0x50,0xc3,0xe1,0x33,0x88}} 19 20#define EFI_IP6_PROTOCOL \ 21 {0x2c8759d5,0x5c2d,0x66ef,{0x92,0x5f,0xb6,0x6c,0x10,0x19,0x57,0xe2}} 22 23INTERFACE_DECL(_EFI_IP4); 24INTERFACE_DECL(_EFI_IP6); 25 26typedef struct { 27 EFI_HANDLE InstanceHandle; 28 EFI_IPv4_ADDRESS Ip4Address; 29 EFI_IPv4_ADDRESS SubnetMask; 30} EFI_IP4_ADDRESS_PAIR; 31 32typedef struct { 33 EFI_HANDLE DriverHandle; 34 UINT32 AddressCount; 35 EFI_IP4_ADDRESS_PAIR AddressPairs[1]; 36} EFI_IP4_VARIABLE_DATA; 37 38typedef struct { 39 UINT8 DefaultProtocol; 40 BOOLEAN AcceptAnyProtocol; 41 BOOLEAN AcceptIcmpErrors; 42 BOOLEAN AcceptBroadcast; 43 BOOLEAN AcceptPromiscuous; 44 BOOLEAN UseDefaultAddress; 45 EFI_IPv4_ADDRESS StationAddress; 46 EFI_IPv4_ADDRESS SubnetMask; 47 UINT8 TypeOfService; 48 UINT8 TimeToLive; 49 BOOLEAN DoNotFragment; 50 BOOLEAN RawData; 51 UINT32 ReceiveTimeout; 52 UINT32 TransmitTimeout; 53} EFI_IP4_CONFIG_DATA; 54 55typedef struct { 56 EFI_IPv4_ADDRESS SubnetAddress; 57 EFI_IPv4_ADDRESS SubnetMask; 58 EFI_IPv4_ADDRESS GatewayAddress; 59} EFI_IP4_ROUTE_TABLE; 60 61typedef struct { 62 UINT8 Type; 63 UINT8 Code; 64} EFI_IP4_ICMP_TYPE; 65 66typedef struct { 67 BOOLEAN IsStarted; 68 UINT32 MaxPacketSize; 69 EFI_IP4_CONFIG_DATA ConfigData; 70 BOOLEAN IsConfigured; 71 UINT32 GroupCount; 72 EFI_IPv4_ADDRESS *GroupTable; 73 UINT32 RouteCount; 74 EFI_IP4_ROUTE_TABLE *RouteTable; 75 UINT32 IcmpTypeCount; 76 EFI_IP4_ICMP_TYPE *IcmpTypeList; 77} EFI_IP4_MODE_DATA; 78 79typedef 80EFI_STATUS 81(EFIAPI *EFI_IP4_GET_MODE_DATA) ( 82 IN struct _EFI_IP4 *This, 83 OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, 84 OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, 85 OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL 86 ); 87 88typedef 89EFI_STATUS 90(EFIAPI *EFI_IP4_CONFIGURE) ( 91 IN struct _EFI_IP4 *This, 92 IN EFI_IP4_CONFIG_DATA *IpConfigData OPTIONAL 93 ); 94 95typedef 96EFI_STATUS 97(EFIAPI *EFI_IP4_GROUPS) ( 98 IN struct _EFI_IP4 *This, 99 IN BOOLEAN JoinFlag, 100 IN EFI_IPv4_ADDRESS *GroupAddress OPTIONAL 101 ); 102 103typedef 104EFI_STATUS 105(EFIAPI *EFI_IP4_ROUTES) ( 106 IN struct _EFI_IP4 *This, 107 IN BOOLEAN DeleteRoute, 108 IN EFI_IPv4_ADDRESS *SubnetAddress, 109 IN EFI_IPv4_ADDRESS *SubnetMask, 110 IN EFI_IPv4_ADDRESS *GatewayAddress 111 ); 112 113#pragma pack(1) 114typedef struct { 115 UINT8 HeaderLength:4; 116 UINT8 Version:4; 117 UINT8 TypeOfService; 118 UINT16 TotalLength; 119 UINT16 Identification; 120 UINT16 Fragmentation; 121 UINT8 TimeToLive; 122 UINT8 Protocol; 123 UINT16 Checksum; 124 EFI_IPv4_ADDRESS SourceAddress; 125 EFI_IPv4_ADDRESS DestinationAddress; 126} EFI_IP4_HEADER; 127#pragma pack() 128 129typedef struct { 130 UINT32 FragmentLength; 131 VOID *FragmentBuffer; 132} EFI_IP4_FRAGMENT_DATA; 133 134typedef struct { 135 EFI_TIME TimeStamp; 136 EFI_EVENT RecycleSignal; 137 UINT32 HeaderLength; 138 EFI_IP4_HEADER *Header; 139 UINT32 OptionsLength; 140 VOID *Options; 141 UINT32 DataLength; 142 UINT32 FragmentCount; 143 EFI_IP4_FRAGMENT_DATA FragmentTable[1]; 144} EFI_IP4_RECEIVE_DATA; 145 146typedef struct { 147 EFI_IPv4_ADDRESS SourceAddress; 148 EFI_IPv4_ADDRESS GatewayAddress; 149 UINT8 Protocol; 150 UINT8 TypeOfService; 151 UINT8 TimeToLive; 152 BOOLEAN DoNotFragment; 153} EFI_IP4_OVERRIDE_DATA; 154 155typedef struct { 156 EFI_IPv4_ADDRESS DestinationAddress; 157 EFI_IP4_OVERRIDE_DATA *OverrideData; 158 UINT32 OptionsLength; 159 VOID *OptionsBuffer; 160 UINT32 TotalDataLength; 161 UINT32 FragmentCount; 162 EFI_IP4_FRAGMENT_DATA FragmentTable[1]; 163} EFI_IP4_TRANSMIT_DATA; 164 165typedef struct { 166 EFI_EVENT Event; 167 EFI_STATUS Status; 168 union { 169 EFI_IP4_RECEIVE_DATA *RxData; 170 EFI_IP4_TRANSMIT_DATA *TxData; 171 } Packet; 172} EFI_IP4_COMPLETION_TOKEN; 173 174typedef 175EFI_STATUS 176(EFIAPI *EFI_IP4_TRANSMIT) ( 177 IN struct _EFI_IP4 *This, 178 IN EFI_IP4_COMPLETION_TOKEN *Token 179 ); 180 181typedef 182EFI_STATUS 183(EFIAPI *EFI_IP4_RECEIVE) ( 184 IN struct _EFI_IP4 *This, 185 IN EFI_IP4_COMPLETION_TOKEN *Token 186 ); 187 188typedef 189EFI_STATUS 190(EFIAPI *EFI_IP4_CANCEL)( 191 IN struct _EFI_IP4 *This, 192 IN EFI_IP4_COMPLETION_TOKEN *Token OPTIONAL 193 ); 194 195typedef 196EFI_STATUS 197(EFIAPI *EFI_IP4_POLL) ( 198 IN struct _EFI_IP4 *This 199 ); 200 201typedef struct _EFI_IP4 { 202 EFI_IP4_GET_MODE_DATA GetModeData; 203 EFI_IP4_CONFIGURE Configure; 204 EFI_IP4_GROUPS Groups; 205 EFI_IP4_ROUTES Routes; 206 EFI_IP4_TRANSMIT Transmit; 207 EFI_IP4_RECEIVE Receive; 208 EFI_IP4_CANCEL Cancel; 209 EFI_IP4_POLL Poll; 210} EFI_IP4; 211 212typedef struct { 213 UINT8 DefaultProtocol; 214 BOOLEAN AcceptAnyProtocol; 215 BOOLEAN AcceptIcmpErrors; 216 BOOLEAN AcceptPromiscuous; 217 EFI_IPv6_ADDRESS DestinationAddress; 218 EFI_IPv6_ADDRESS StationAddress; 219 UINT8 TrafficClass; 220 UINT8 HopLimit; 221 UINT32 FlowLabel; 222 UINT32 ReceiveTimeout; 223 UINT32 TransmitTimeout; 224} EFI_IP6_CONFIG_DATA; 225 226typedef struct { 227 EFI_IPv6_ADDRESS Address; 228 UINT8 PrefixLength; 229} EFI_IP6_ADDRESS_INFO; 230 231typedef struct { 232 EFI_IPv6_ADDRESS Gateway; 233 EFI_IPv6_ADDRESS Destination; 234 UINT8 PrefixLength; 235} EFI_IP6_ROUTE_TABLE; 236 237typedef enum { 238 EfiNeighborInComplete, 239 EfiNeighborReachable, 240 EfiNeighborStale, 241 EfiNeighborDelay, 242 EfiNeighborProbe 243} EFI_IP6_NEIGHBOR_STATE; 244 245typedef struct { 246 EFI_IPv6_ADDRESS Neighbor; 247 EFI_MAC_ADDRESS LinkAddress; 248 EFI_IP6_NEIGHBOR_STATE State; 249} EFI_IP6_NEIGHBOR_CACHE; 250 251typedef struct { 252 UINT8 Type; 253 UINT8 Code; 254} EFI_IP6_ICMP_TYPE; 255 256//*********************************************************** 257// ICMPv6 type definitions for error messages 258//*********************************************************** 259#define ICMP_V6_DEST_UNREACHABLE 0x1 260#define ICMP_V6_PACKET_TOO_BIG 0x2 261#define ICMP_V6_TIME_EXCEEDED 0x3 262#define ICMP_V6_PARAMETER_PROBLEM 0x4 263 264//*********************************************************** 265// ICMPv6 type definition for informational messages 266//*********************************************************** 267#define ICMP_V6_ECHO_REQUEST 0x80 268#define ICMP_V6_ECHO_REPLY 0x81 269#define ICMP_V6_LISTENER_QUERY 0x82 270#define ICMP_V6_LISTENER_REPORT 0x83 271#define ICMP_V6_LISTENER_DONE 0x84 272#define ICMP_V6_ROUTER_SOLICIT 0x85 273#define ICMP_V6_ROUTER_ADVERTISE 0x86 274#define ICMP_V6_NEIGHBOR_SOLICIT 0x87 275#define ICMP_V6_NEIGHBOR_ADVERTISE 0x88 276#define ICMP_V6_REDIRECT 0x89 277#define ICMP_V6_LISTENER_REPORT_2 0x8F 278 279//*********************************************************** 280// ICMPv6 code definitions for ICMP_V6_DEST_UNREACHABLE 281//*********************************************************** 282#define ICMP_V6_NO_ROUTE_TO_DEST 0x0 283#define ICMP_V6_COMM_PROHIBITED 0x1 284#define ICMP_V6_BEYOND_SCOPE 0x2 285#define ICMP_V6_ADDR_UNREACHABLE 0x3 286#define ICMP_V6_PORT_UNREACHABLE 0x4 287#define ICMP_V6_SOURCE_ADDR_FAILED 0x5 288#define ICMP_V6_ROUTE_REJECTED 0x6 289 290//*********************************************************** 291// ICMPv6 code definitions for ICMP_V6_TIME_EXCEEDED 292//*********************************************************** 293#define ICMP_V6_TIMEOUT_HOP_LIMIT 0x0 294#define ICMP_V6_TIMEOUT_REASSEMBLE 0x1 295 296//*********************************************************** 297// ICMPv6 code definitions for ICMP_V6_PARAMETER_PROBLEM 298//*********************************************************** 299#define ICMP_V6_ERRONEOUS_HEADER 0x0 300#define ICMP_V6_UNRECOGNIZE_NEXT_HDR 0x1 301#define ICMP_V6_UNRECOGNIZE_OPTION 0x2 302 303typedef struct { 304 BOOLEAN IsStarted; 305 UINT32 MaxPacketSize; 306 EFI_IP6_CONFIG_DATA ConfigData; 307 BOOLEAN IsConfigured; 308 UINT32 AddressCount; 309 EFI_IP6_ADDRESS_INFO *AddressList; 310 UINT32 GroupCount; 311 EFI_IPv6_ADDRESS *GroupTable; 312 UINT32 RouteCount; 313 EFI_IP6_ROUTE_TABLE *RouteTable; 314 UINT32 NeighborCount; 315 EFI_IP6_NEIGHBOR_CACHE *NeighborCache; 316 UINT32 PrefixCount; 317 EFI_IP6_ADDRESS_INFO *PrefixTable; 318 UINT32 IcmpTypeCount; 319 EFI_IP6_ICMP_TYPE *IcmpTypeList; 320} EFI_IP6_MODE_DATA; 321 322typedef 323EFI_STATUS 324(EFIAPI *EFI_IP6_GET_MODE_DATA) ( 325 IN struct _EFI_IP6 *This, 326 OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL, 327 OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, 328 OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL 329 ); 330 331typedef 332EFI_STATUS 333(EFIAPI *EFI_IP6_CONFIGURE) ( 334 IN struct _EFI_IP6 *This, 335 IN EFI_IP6_CONFIG_DATA *Ip6ConfigData OPTIONAL 336 ); 337typedef 338EFI_STATUS 339(EFIAPI *EFI_IP6_GROUPS) ( 340 IN struct _EFI_IP6 *This, 341 IN BOOLEAN JoinFlag, 342 IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL 343 ); 344 345typedef 346EFI_STATUS 347(EFIAPI *EFI_IP6_ROUTES) ( 348 IN struct _EFI_IP6 *This, 349 IN BOOLEAN DeleteRoute, 350 IN EFI_IPv6_ADDRESS *Destination OPTIONAL, 351 IN UINT8 PrefixLength, 352 IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL 353 ); 354 355typedef 356EFI_STATUS 357(EFIAPI *EFI_IP6_NEIGHBORS) ( 358 IN struct _EFI_IP6 *This, 359 IN BOOLEAN DeleteFlag, 360 IN EFI_IPv6_ADDRESS *TargetIp6Address, 361 IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL, 362 IN UINT32 Timeout, 363 IN BOOLEAN Override 364 ); 365 366typedef struct _EFI_IP6_FRAGMENT_DATA { 367 UINT32 FragmentLength; 368 VOID *FragmentBuffer; 369} EFI_IP6_FRAGMENT_DATA; 370 371typedef struct _EFI_IP6_OVERRIDE_DATA { 372 UINT8 Protocol; 373 UINT8 HopLimit; 374 UINT32 FlowLabel; 375} EFI_IP6_OVERRIDE_DATA; 376 377typedef struct _EFI_IP6_TRANSMIT_DATA { 378 EFI_IPv6_ADDRESS DestinationAddress; 379 EFI_IP6_OVERRIDE_DATA *OverrideData; 380 UINT32 ExtHdrsLength; 381 VOID *ExtHdrs; 382 UINT8 NextHeader; 383 UINT32 DataLength; 384 UINT32 FragmentCount; 385 EFI_IP6_FRAGMENT_DATA FragmentTable[1]; 386} EFI_IP6_TRANSMIT_DATA; 387 388#pragma pack(1) 389typedef struct _EFI_IP6_HEADER { 390 UINT8 TrafficClassH:4; 391 UINT8 Version:4; 392 UINT8 FlowLabelH:4; 393 UINT8 TrafficClassL:4; 394 UINT16 FlowLabelL; 395 UINT16 PayloadLength; 396 UINT8 NextHeader; 397 UINT8 HopLimit; 398 EFI_IPv6_ADDRESS SourceAddress; 399 EFI_IPv6_ADDRESS DestinationAddress; 400} EFI_IP6_HEADER; 401#pragma pack() 402 403typedef struct _EFI_IP6_RECEIVE_DATA { 404 EFI_TIME TimeStamp; 405 EFI_EVENT RecycleSignal; 406 UINT32 HeaderLength; 407 EFI_IP6_HEADER *Header; 408 UINT32 DataLength; 409 UINT32 FragmentCount; 410 EFI_IP6_FRAGMENT_DATA FragmentTable[1]; 411} EFI_IP6_RECEIVE_DATA; 412 413typedef struct { 414 EFI_EVENT Event; 415 EFI_STATUS Status; 416 union { 417 EFI_IP6_RECEIVE_DATA *RxData; 418 EFI_IP6_TRANSMIT_DATA *TxData; 419 } Packet; 420} EFI_IP6_COMPLETION_TOKEN; 421 422typedef 423EFI_STATUS 424(EFIAPI *EFI_IP6_TRANSMIT) ( 425 IN struct _EFI_IP6 *This, 426 IN EFI_IP6_COMPLETION_TOKEN *Token 427 ); 428 429typedef 430EFI_STATUS 431(EFIAPI *EFI_IP6_RECEIVE) ( 432 IN struct _EFI_IP6 *This, 433 IN EFI_IP6_COMPLETION_TOKEN *Token 434 ); 435 436typedef 437EFI_STATUS 438(EFIAPI *EFI_IP6_CANCEL)( 439 IN struct _EFI_IP6 *This, 440 IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL 441 ); 442 443typedef 444EFI_STATUS 445(EFIAPI *EFI_IP6_POLL) ( 446 IN struct _EFI_IP6 *This 447 ); 448 449typedef struct _EFI_IP6 { 450 EFI_IP6_GET_MODE_DATA GetModeData; 451 EFI_IP6_CONFIGURE Configure; 452 EFI_IP6_GROUPS Groups; 453 EFI_IP6_ROUTES Routes; 454 EFI_IP6_NEIGHBORS Neighbors; 455 EFI_IP6_TRANSMIT Transmit; 456 EFI_IP6_RECEIVE Receive; 457 EFI_IP6_CANCEL Cancel; 458 EFI_IP6_POLL Poll; 459} EFI_IP6; 460 461#endif /* _EFI_IP_H */ 462