UEFIʵս(10) Network (ËÄ)

2014-11-24 11:58:40 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 8
EAN Urgent;
UINT32 DataLength;
UINT32 FragmentCount;
EFI_TCP4_FRAGMENT_DATA FragmentTable[1];
} EFI_TCP4_TRANSMIT_DATA;//***************************************************************
// EFI_TCP4_FRAGMENT_DATA
//***************************************************************
typedef struct {
UINT32 FragmentLength;
VOID *FragmentBuffer;
} EFI_TCP4_FRAGMENT_DATA;
´ý·¢ËÍÊý¾Ý¿ÉÄÜÔÚ¼¸¸ö²»Á¬ÐøµÄ»º³åÇøÄÚ£¬ÎÒÃÇ¿ÉÒÔ½«ÕâЩ»º³åÇøÖ¸Õë·Åµ½ FragmentTableÊý×éÄÚ£¬ Êý×éÖÐÿ¸öÔªËØ±íʾһ¸ö»º³åÇø¡£DataLengthÊÇÊý¾Ý×ܳ¤¶È(¸÷¸ö»º³åÇø³¤¶ÈÖ®ºÍ), FragmentCountÊÇ»º³åÇø¸öÊý¡£
ÏÂÃæµÄ´úÂëÖÐÎÒÃÇÖ»Óõ½ÁËÒ»¸ö»º³åÇø¡£ ͬConnectÒ»Ñù£¬ µ÷ÓÃTransmitÖ®ºóҪͨ¹ýWaitForEventµÈ´ý·¢ËÍÍê³É¡£

SOCKET_STAUS Socket::Send(CHAR8* Data, UINTN Lenth)
{
EFI_STATUS Status = EFI_NOT_FOUND;
if(m_pTcp4Protocol == NULL) return Status;
m_TransData->Push = TRUE;
m_TransData->Urgent = TRUE;
m_TransData->DataLength = (UINT32)Lenth;
m_TransData->FragmentCount = 1;
m_TransData->FragmentTable[0].FragmentLength =m_TransData->DataLength;
m_TransData->FragmentTable[0].FragmentBuffer =Data;
SendToken.Packet.TxData= m_TransData;
Status = m_pTcp4Protocol -> Transmit(m_pTcp4Protocol, &SendToken);
if(EFI_ERROR(Status))
return Status;
SocketWait(SendToken.CompletionToken.Event);
return SendToken.CompletionToken.Status;
}
½ÓÊÕÊý¾Ý

½ÓÊÕÓë·¢ËÍÏàËÆ
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_RECEIVE) (
IN EFI_TCP4_PROTOCOL *This,
IN EFI_TCP4_IO_TOKEN *Token
);
//***************************************************************
// EFI_TCP4_RECEIVE_DATA
//***************************************************************
typedef struct {
BOOLEAN UrgentFlag;
UINT32 DataLength;
UINT32 FragmentCount;
EFI_TCP4_FRAGMENT_DATA FragmentTable[1];
} EFI_TCP4_RECEIVE_DATA;Óû§¸ºÔð·ÖÅäºÍÊÍ·Å»º³åÇø£¬DataLengthÊÇ»º³åÇø×ܳ¤¶È£¬½ÓÊÕÍê³Éʱ£¬TokenÖеÄʼþ±»ÉèÖ㬠DataLengthÒ²±»ÉèÖÃΪ½ÓÊÕµ½µÄÊý¾ÝµÄ³¤¶È¡£

SOCKET Socket::Recv(CHAR8* Buffer, UINTN Lenth)
{
EFI_STATUS Status = EFI_NOT_FOUND;
if(m_pTcp4Protocol == NULL) return Status;

m_RecvData->UrgentFlag = TRUE;
m_RecvData->DataLength = (UINT32)Lenth;
m_RecvData->FragmentCount = 1;
m_RecvData->FragmentTable[0].FragmentLength = m_RecvData->DataLength ;
m_RecvData->FragmentTable[0].FragmentBuffer = (void*)Buffer;
RecvToken.Packet.RxData= m_RecvData;
Status = m_pTcp4Protocol -> Receive(m_pTcp4Protocol, &RecvToken);
if(EFI_ERROR(Status))
return Status;
SocketWait(RecvToken.CompletionToken.Event);
return RecvToken.CompletionToken.Status;
}
»ØÍ·¿´Ò»ÏÂToken¼°m_RecvData µÈÏà¹Ø¸¨ÖúÊý¾ÝʱÈçºÎ½¨Á¢µÄ

SOCKET_STATUS Socket::Initialize()
{
EFI_STATUS Status;
// ½¨Á¢Configure Data
m_pTcp4ConfigData = new EFI_TCP4_CONFIG_DATA[1];
// ½¨Á¢ Connect Data
ConnectToken.CompletionToken.Status = EFI_ABORTED;
Status = gBS->CreateEvent(EVT_NOTIFY_SIGNAL, TPL_CALLBACK, (EFI_EVENT_NOTIFY)NopNoify , (VOID*)&ConnectToken, &ConnectToken.CompletionToken.Event );
if(EFI_STATUS(Stauts)) return Status;
// ½¨Á¢ Transmit Data
Status = gBS->CreateEvent(EVT_NOTIFY_SIGNAL, TPL_CALLBACK, (EFI_EVENT_NOTIFY)NopNoify , (VOID*)&SendToken, &SendToken.CompletionToken.Event);
if(EFI_STATUS(Stauts)) return Status;
SendToken.CompletionToken.Status =EFI_ABORTED;
m_TransData = new EFI_TCP4_TRANSMIT_DATA[1];
// ½¨Á¢ Recv Data
Status = gBS->CreateEvent(EVT_NOTIFY_SIGNAL, TPL_CALLBACK, (EFI_EVENT_N