UEFIʵս(10) Network (¶þ)

2014-11-24 11:58:40 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 1

}
2. µÚ¶þ²½£¬ Configure£¬ÓÃÓÚÉèÖ÷þÎñ¶ËIPºÍ¶Ë¿Ú£¬±¾µØ¶ËIPºÍ¶Ë¿Ú£¬ÐèҪעÒâµÄÊÇConfigureÍê³ÉÖ®ºó£¬Á¬½Ó»¹Ã»Óн¨Á¢
SOCKET_STATUS Socket::Config(UINT32 Ip32, UINT16 Port)
{
EFI_STATUS Status = EFI_NOT_FOUND;
if(m_pTcp4ConfigData == NULL) return Status;
m_pTcp4ConfigData->TypeOfService = 0;
m_pTcp4ConfigData->TimeToLive = 0;
*(UINT*)(m_pTcp4ConfigData->AccessPoint.RemoteAddress.Addr) = Ip32;
m_pTcp4ConfigData->AccessPoint.RemotePort = Port;
*(UINT32*)(m_pTcp4ConfigData->AccessPoint.SubnetMask.Addr) = (255 | 255 << 8 | 255 << 16 | 0 << 24) ;

m_pTcp4ConfigData->AccessPoint.UseDefaultAddress = TRUE;
/// Èç¹ûUseDefaultAddress ΪFALSE£¬ StationAddress ÒªÉèÖÃ
//*(UINT32*)(m_pTcp4ConfigData->AccessPoint.StationAddress.Addr) = LocalIp;
m_pTcp4ConfigData->AccessPoint.StationPort = 61558;
m_pTcp4ConfigData->AccessPoint.ActiveFlag = TRUE;
m_pTcp4ConfigData->ControlOption = NULL;
Status = m_pTcp4Protocol ->Configure(m_pTcp4Protocol, m_pTcp4ConfigData);
return Status;
}

EFI_TCP4_CONFIG_DATA* m_pTcp4ConfigData ¶¨ÒåÈçÏÂ
//
***************************************************************
// EFI_TCP4_CONFIG_DATA
//
***************************************************************
typedef struct {
// Receiving Filters
// I/O parameters
UINT8 TypeOfService;
UINT8 TimeToLive;
// Access Point
EFI_TCP4_ACCESS_POINT AccessPoint;
// TCP Control Options
EFI_TCP4_OPTION * ControlOption;
} EFI_TCP4_CONFIG_DATA;typedef struct {
BOOLEAN UseDefaultAddress; //True ±íʾʹÓñ¾»úĬÈÏIP¡£FalseÔòÒªÖ¸¶¨StationAddress
// ±¾µØIPºÍ¶Ë¿Ú
EFI_IPv4_ADDRESS StationAddress;
EFI_IPv4_ADDRESS SubnetMask;
UINT16 StationPort;
// ·þÎñ¶ËIPºÍ¶Ë¿Ú
EFI_IPv4_ADDRESS RemoteAddress;
UINT16 RemotePort;
BOOLEAN ActiveFlag; // TRUE: Active Open; False: Passive Open£¨Server¶Ë£©
} EFI_TCP4_ACCESS_POINT
µÚÈý²½£¬ ½¨Á¢Á¬½Ó

EFI_STAUS Socket::Connect()
{
EFI_STATUS Status = EFI_NOT_FOUND;
if(m_pTcp4Protocol == NULL) return Status;
Status = m_pTcp4Protocol -> Connect(m_pTcp4Protocol, &ConnectToken);
if(EFI_ERROR(Status))
return Status;
SocketWait(ConnectToken.CompletionToken.Event);
return Status;
}¿´º¯ÊýÔ­ÐÍ
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_CONNECT) (
IN EFI_TCP4_PROTOCOL *This,
IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken,
);typedef struct {
EFI_EVENT Event;
EFI_STATUS Status;
} EFI_TCP4_COMPLETION_TOKEN;
typedef struct {
EFI_TCP4_COMPLETION_TOKEN CompletionToken;
} EFI_TCP4_CONNECTION_TOKEN;

ConnectÊÇ·Ç×èÈûº¯Êý£¬µ÷ÓúóÁ¢¼´·µ»Ø¡£Á¬½ÓÍê³É(³É¹¦»òʧ°Ü)ºó£¬ÏµÍ³»áÉèÖÃConnectionTokenÖеÄʼþÒÔ¼°×´Ì¬£¬ËùÒÔÎÒÃÇÒªÔÚÊʵ±µÄʱ»ú²éѯ»òµÈ´ý¸Ãʼþ¡£ºóÃæµÄ¼¸¸öº¯ÊýÒ²²ÉÓÃÀàËÆµÄ»úÖÆ¡£
3¡£ ÏÂÃæÎÒÃÇ¿ÉÒÔ·¢ËÍ»ò½ÓÊÕÊý¾ÝÁË
ÏÈÀ´¿´·¢ËÍÊý¾Ý
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_TRANSMIT) (
IN EFI_TCP4_PROTOCOL *This,
IN EFI_TCP4_IO_TOKEN *Token
);
EFI_TCP4_IO_TOKEN ±ÈEFI_TCP4_CONNECTION_TOKEN ¸´ÔӺܶ࣬·¢ËÍÊý¾ÝҪͨ¹ýEFI_TCP4_IO_TOKEN ´«µÝ¸øEFI_TCP4_PROTOCOL¡£
//***************************************************************
// EFI_TCP4_IO_TOKEN
//***************************************************************
typedef struct {
EFI_TCP4_COMPLETION_TOKEN CompletionToken;
union {
EFI_TCP4_RECEIVE_DATA *RxData;
EFI_TCP4_TRANSMIT_DATA *TxData;
} Packet;
} EFI_TCP4_IO_TOKEN;//**************************************************************
// EFI_TCP4_TRANSMIT_DATA
//**************************************************************
typedef struct {
BOOLEAN Push;
BOOL