UEFIʵս(10) Network (һ)

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

¿ªÊ¼±à³Ì֮ǰ£¬Ê×ÏÈÒªÅäÖúÿª·¢»·¾³¡£·ÖÁ½ÖÖÇé¿ö£¬Ò»ÊÇʹÓÃNt32Ä£Äâ»·¾³£¬¶þÊÇʹÓÃÕæÊµµÄUEFI»·¾³¡£
Nt32ÍøÂçÉèÖÿÉÒԲο¼ UEFI Network Stack for EDK Getting Started Guide£¬ ¼òÂÔ˵Ã÷ÈçÏ£º
1¡£ ÏÂÔØ²¢°²×°Winpcap
2. ÏÂÔØ SnpNt32Io ²¢±àÒë
c:\> cd c:\SnpNt32Io
c:\ SnpNt32Io> nmake TARGET=RELEASE
c:\ SnpNt32Io> copy /y SnpNt32Io.dll c:\edk2\build\Nt32Pkg\vs2008\IA32\
3. Æô¶¯Nt32Ä£ÄâÆ÷
4¡£ ¼ÓÔØÍøÂçЭÒé
Shell > fsnt0:
fsnt0:\> load SnpNt32.efi Mnp.efi Arp.efi Ip4.efi Ip4Config.efi Udp4.efi Dhcp4.efi Mtftp4.efi Tcp4.efi

5 ÅäÖÃÍø¿¨

fsnt0:\> ifconfig ¨Cs eth0 Dhcp
fsnt0:\> ifconfig ¨Cs eth0 static 192.168.0.125 255.255.255.0 192.168.0.1


Èç¹ûʹÓÃÕæÊµµÄUEFI»·¾³£¬Ê×ÏÈÒª¼ÓÔØÍø¿¨Çý¶¯£¬ È»ºó¼ÓÔØÍøÂçЭÒéSnp.efi Mnp.efi Arp.efi Ip4.efi Ip4Config.efi Udp4.efi Dhcp4.efi Mtftp4.efi Tcp4.efi,ÅäÖÃÍø¿¨.
ÍøÂçЭÒéÕ»

\
Snp(EFI_SIMPLE_NETWORK_PROTOCOL) ÓÃÓÚ³õʼ»¯ºÍ¹Ø±ÕÍøÂç½Ó¿Ú£¬·¢ËͺͽÓÊÕÊý¾Ý°ü£¬
Mnp(EFI_MANAGED_NETWORK_PROTOCOL) ÌṩÒì²½ ÍøÂç°üI/O²Ù×÷
Arp(EFI_ARP_PROTOCOL)ÓÃÓÚ½«IPµØÖ·×ª»»ÎªÎïÀíµØÖ·www.2cto.com
IP¡¢TCP¡¢UDPЭÒéÎÒÃǶ¼¶úÊìÄÜÏêÁË¡£
ÏÂÃæÎÒÃǽéÉÜÒ»ÏÂTCP Protocol(EFI_TCP4_PROTOCOL)µÄÓ÷¨¡£Èç¹ûÄãÔø¾­ÓÃSocketд¹ý³ÌÐò£¬ÄÇô»áºÜÈÝÒ×Àí½âEFI_TCP4_PROTOCOLµÄÓ÷¨¡£ ÎÒÃÇÖªµÀSocket ¿Í»§¶ËÐèÒªÕâô¼¸²½£º
1¡£ Create Socket
2¡£ connect
3¡£ Send/Recv
4¡£ Close

EFI_TCP4_PROTOCOLÓëÖ®ÏàËÆ£¬¿Í»§¶ËÐèÒªÈçϼ¸²½£º
1¡£ Create EFI_TCP4_PROTOCOL¶ÔÏó
2¡£ Configure
3¡£ Connect
4¡£ Transmit(send)/Receive(Recv)
5¡£ Close
ÆäʵÎÒÃÇ¿ÉÒÔ°ÑConfigureºÍConnectËã³ÉÒ»²½¡£
ÎÒÃÇ¿ÉÒÔ°ÑEFI_TCP4_PROTOCOL·â×°³ÉÒ»¸öSocketÀà
#define SocketWait(e) \{
UINTN index;\
Status = gBS->WaitForEvent(1, &(e), &index); \
}
typedef EFI_STAUTS SOCKET_STATUS;
class Socket
{
public:
Socket(EFI_HANDLE ImageHandle);
~Socket();
SOCKET_STATUS Config(UINT32 Ip32, UINT16 Port);
SOCKET_STATUS Connect();

SOCKET_STATUS Connect(UINT32 Ip32, UINT16 Port){Config(Ip32, Port); reuturn Connect();};
SOCKET_STATUS Close();
SOCKET_STATUS Send(CHAR8* Data, UINTN Lenth);
SOCKET_STATUS Recv(CHAR8* Buffer, UINTN Lenth);
BOOL Ready(){return (m_pServiceBinding != NULL);}
private:
SOCKET Initialize();

EFI_HANDLE m_SocketHandle;
EFI_TCP4_PROTOCOL* m_pTcp4Protocol;

EFI_SERVICE_BINDING_PROTOCOL* m_pServiceBinding;


EFI_TCP4_CONFIG_DATA* m_pTcp4ConfigData;

EFI_TCP4_TRANSMIT_DATA* m_TransData;
EFI_TCP4_RECEIVE_DATA* m_RecvData;


EFI_TCP4_CONNECTION_TOKEN ConnectToken;
EFI_TCP4_CLOSE_TOKEN CloseToken;
EFI_TCP4_IO_TOKEN SendToken, RecvToken;
};ÏÂÃæÒ»²½²½À´¿´
1. Ê×ÏÈÊDzúÉúÒ»¸öEFI_TCP4_PROTOCOL¶ÔÏó¡£

EFI_TCP4_SERVICE_BINDING_PROTOCOL.CreateChild()ÓÃÓÚ²úÉúÒ»¸öDriver Handle£¬ ´ËdriverÉϹÒÔØÁËEFI_TCP4_PROTOCOL£¬ ÓÃOpenProtocol»òLocateProtocol¿ÉÒÔ»ñµÃ´ËHandleÉϵÄEFI_TCP4_PROTOCOL¶ÔÏó¡£´úÂëÈçÏ£º

Socket::Socket(EFI_HANDLE ImageHandle)
{
EFI_STATUS Status;
memset((void*)this, 0, sizeof(Socket));
m_SocketHandle = NULL;
Status = gBS->LocateProtocol ( &gEfiTcp4ServiceBindingProtocolGuid,
NULL,
(VOID **)&m_pServiceBinding );

if(EFI_ERROR(Status))
return Status;

Status = m_pServiceBinding->CreateChild ( m_pServiceBinding,
&m_SocketHandle );

if(EFI_ERROR(Status))
return Status;

Status = gBS->OpenProtocol ( m_SocketHandle,
&gEfiTcp4ProtocolGuid,
(VOID **)&m_pTcp4Protocol,
ImageHandle,
m_SocketHandle,
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL );
if(EFI_ERROR(Status))
return Status;
this -> Init();