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