mirror of https://github.com/acidanthera/audk.git
249 lines
5.9 KiB
C
249 lines
5.9 KiB
C
/** @file
|
|
|
|
Copyright (c) 2005 - 2007, Intel Corporation
|
|
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.
|
|
|
|
Module Name:
|
|
|
|
IpIo.h
|
|
|
|
Abstract:
|
|
|
|
|
|
**/
|
|
|
|
#ifndef _IP_IO_H_
|
|
#define _IP_IO_H_
|
|
|
|
#include <PiDxe.h>
|
|
#include <Protocol/Ip4.h>
|
|
#include <Library/IpIoLib.h>
|
|
#include <Library/NetLib.h>
|
|
|
|
//
|
|
// type and code define for ICMP protocol error got
|
|
// from IP
|
|
//
|
|
#define ICMP_TYPE_UNREACH 3
|
|
#define ICMP_TYPE_TIMXCEED 11
|
|
#define ICMP_TYPE_PARAMPROB 12
|
|
#define ICMP_TYPE_SOURCEQUENCH 4
|
|
|
|
#define ICMP_CODE_UNREACH_NET 0
|
|
#define ICMP_CODE_UNREACH_HOST 1
|
|
#define ICMP_CODE_UNREACH_PROTOCOL 2
|
|
#define ICMP_CODE_UNREACH_PORT 3
|
|
#define ICMP_CODE_UNREACH_NEEDFRAG 4
|
|
#define ICMP_CODE_UNREACH_SRCFAIL 5
|
|
#define ICMP_CODE_UNREACH_NET_UNKNOWN 6
|
|
#define ICMP_CODE_UNREACH_HOST_UNKNOWN 7
|
|
#define ICMP_CODE_UNREACH_ISOLATED 8
|
|
#define ICMP_CODE_UNREACH_NET_PROHIB 9
|
|
#define ICMP_CODE_UNREACH_HOST_PROHIB 10
|
|
#define ICMP_CODE_UNREACH_TOSNET 11
|
|
#define ICMP_CODE_UNREACH_TOSHOST 12
|
|
|
|
//
|
|
// this error will be delivered to the
|
|
// listening transportation layer protocol
|
|
// consuming IpIO
|
|
//
|
|
typedef enum {
|
|
ICMP_ERR_UNREACH_NET = 0,
|
|
ICMP_ERR_UNREACH_HOST,
|
|
ICMP_ERR_UNREACH_PROTOCOL,
|
|
ICMP_ERR_UNREACH_PORT,
|
|
ICMP_ERR_MSGSIZE,
|
|
ICMP_ERR_UNREACH_SRCFAIL,
|
|
ICMP_ERR_TIMXCEED_INTRANS,
|
|
ICMP_ERR_TIMXCEED_REASS,
|
|
ICMP_ERR_QUENCH,
|
|
ICMP_ERR_PARAMPROB
|
|
} ICMP_ERROR;
|
|
|
|
typedef struct _ICMP_ERROR_INFO {
|
|
BOOLEAN IsHard;
|
|
BOOLEAN Notify;
|
|
} ICMP_ERROR_INFO;
|
|
|
|
#define EFI_IP4_HEADER_LEN(HdrPtr) ((HdrPtr)->HeaderLength << 2)
|
|
|
|
extern EFI_IP4_CONFIG_DATA mIpIoDefaultIpConfigData;
|
|
|
|
typedef struct _EFI_NET_SESSION_DATA {
|
|
IP4_ADDR Source;
|
|
IP4_ADDR Dest;
|
|
EFI_IP4_HEADER *IpHdr;
|
|
} EFI_NET_SESSION_DATA;
|
|
|
|
typedef
|
|
VOID
|
|
(*PKT_RCVD_NOTIFY) (
|
|
IN EFI_STATUS Status, // rcvd pkt result
|
|
IN ICMP_ERROR IcmpErr, // if Status == EFI_ICMP_ERROR, this
|
|
// field is valid for user
|
|
IN EFI_NET_SESSION_DATA *NetSession, // the communication point
|
|
IN NET_BUF *Pkt, // packet received
|
|
IN VOID *Context // the Context provided by user for recive data
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(*PKT_SENT_NOTIFY) (
|
|
IN EFI_STATUS Status, // sent pkt result
|
|
IN VOID *Context, // the context provided by user for sending data
|
|
IN VOID *Sender, // the sender to be notified
|
|
IN VOID *NotifyData // sent pkt related data to notify
|
|
);
|
|
|
|
typedef struct _IP_IO {
|
|
|
|
//
|
|
// the node used to link this IpIo to the active IpIo list.
|
|
//
|
|
LIST_ENTRY Entry;
|
|
|
|
// the list used to maintain the IP instance for different sending purpose.
|
|
//
|
|
LIST_ENTRY IpList;
|
|
|
|
//
|
|
// the ip instance consumed by this IP IO
|
|
//
|
|
EFI_HANDLE Controller;
|
|
EFI_HANDLE Image;
|
|
EFI_HANDLE ChildHandle;
|
|
EFI_IP4_PROTOCOL *Ip;
|
|
BOOLEAN IsConfigured;
|
|
|
|
//
|
|
// some ip config data can be changed
|
|
//
|
|
UINT8 Protocol;
|
|
|
|
//
|
|
// token and event used to get data from IP
|
|
//
|
|
EFI_IP4_COMPLETION_TOKEN RcvToken;
|
|
|
|
//
|
|
// list entry used to link the token passed to IP_IO
|
|
//
|
|
LIST_ENTRY PendingSndList;
|
|
|
|
//
|
|
// User interface used to get notify from IP_IO
|
|
//
|
|
VOID *RcvdContext;
|
|
VOID *SndContext;
|
|
PKT_RCVD_NOTIFY PktRcvdNotify;
|
|
PKT_SENT_NOTIFY PktSentNotify;
|
|
} IP_IO;
|
|
|
|
typedef struct _IP_IO_OPEN_DATA {
|
|
EFI_IP4_CONFIG_DATA IpConfigData;
|
|
VOID *RcvdContext;
|
|
VOID *SndContext;
|
|
PKT_RCVD_NOTIFY PktRcvdNotify;
|
|
PKT_SENT_NOTIFY PktSentNotify;
|
|
} IP_IO_OPEN_DATA;
|
|
|
|
typedef struct _IP_IO_SEND_ENTRY {
|
|
LIST_ENTRY Entry;
|
|
IP_IO *IpIo;
|
|
VOID *Context;
|
|
VOID *NotifyData;
|
|
EFI_IP4_PROTOCOL *Ip;
|
|
NET_BUF *Pkt;
|
|
EFI_IP4_COMPLETION_TOKEN *SndToken;
|
|
} IP_IO_SEND_ENTRY;
|
|
|
|
typedef EFI_IP4_OVERRIDE_DATA IP_IO_OVERRIDE;
|
|
|
|
typedef struct _IP_IO_IP_INFO {
|
|
IP4_ADDR Addr;
|
|
IP4_ADDR SubnetMask;
|
|
LIST_ENTRY Entry;
|
|
EFI_HANDLE ChildHandle;
|
|
EFI_IP4_PROTOCOL *Ip;
|
|
EFI_IP4_COMPLETION_TOKEN DummyRcvToken;
|
|
INTN RefCnt;
|
|
} IP_IO_IP_INFO;
|
|
|
|
IP_IO *
|
|
IpIoCreate (
|
|
IN EFI_HANDLE Image,
|
|
IN EFI_HANDLE Controller
|
|
);
|
|
|
|
EFI_STATUS
|
|
IpIoDestroy (
|
|
IN IP_IO *IpIo
|
|
);
|
|
|
|
EFI_STATUS
|
|
IpIoStop (
|
|
IN IP_IO *IpIo
|
|
);
|
|
|
|
EFI_STATUS
|
|
IpIoOpen (
|
|
IN IP_IO *IpIo,
|
|
IN IP_IO_OPEN_DATA *OpenData
|
|
);
|
|
|
|
EFI_STATUS
|
|
IpIoSend (
|
|
IN IP_IO *IpIo,
|
|
IN NET_BUF *Pkt,
|
|
IN IP_IO_IP_INFO *Sender,
|
|
IN VOID *Context OPTIONAL,
|
|
IN VOID *NotifyData OPTIONAL,
|
|
IN IP4_ADDR Dest,
|
|
IN IP_IO_OVERRIDE *OverrideData
|
|
);
|
|
|
|
VOID
|
|
IpIoCancelTxToken (
|
|
IN IP_IO *IpIo,
|
|
IN VOID *Packet
|
|
);
|
|
|
|
IP_IO_IP_INFO *
|
|
IpIoAddIp (
|
|
IN IP_IO *IpIo
|
|
);
|
|
|
|
EFI_STATUS
|
|
IpIoConfigIp (
|
|
IN IP_IO_IP_INFO *IpInfo,
|
|
IN OUT EFI_IP4_CONFIG_DATA *Ip4ConfigData OPTIONAL
|
|
);
|
|
|
|
VOID
|
|
IpIoRemoveIp (
|
|
IN IP_IO *IpIo,
|
|
IN IP_IO_IP_INFO *IpInfo
|
|
);
|
|
|
|
IP_IO_IP_INFO *
|
|
IpIoFindSender (
|
|
IN OUT IP_IO **IpIo,
|
|
IN IP4_ADDR Src
|
|
);
|
|
|
|
EFI_STATUS
|
|
IpIoGetIcmpErrStatus (
|
|
IN ICMP_ERROR IcmpError,
|
|
OUT BOOLEAN *IsHard, OPTIONAL
|
|
OUT BOOLEAN *Notify OPTIONAL
|
|
);
|
|
|
|
#endif
|