1. Add EFI_COMPONENT_NAME2_PROTOCOL.GetControllerName() support.

2. Fix the driver binding Stop() hang issue in the network stack.
3. Add Ip4 raw data support.
4. Add iSCSI Dhcp option 60 support.

Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>
Reviewed-by: Ouyang Qian <qian.ouyang@intel.com>

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13995 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
sfu5
2012-12-13 06:47:06 +00:00
parent 906e1cb7f7
commit 216f79703b
91 changed files with 3991 additions and 694 deletions

View File

@@ -714,7 +714,7 @@ Ip4PreProcessPacket (
UINT16 Checksum;
//
// Check that the IP4 header is correctly formatted
// Check if the IP4 header is correctly formatted.
//
if ((*Packet)->TotalSize < IP4_MIN_HEADLEN) {
return EFI_INVALID_PARAMETER;
@@ -774,7 +774,7 @@ Ip4PreProcessPacket (
}
//
// Trim the head off, after this point, the packet is headless.
// Trim the head off, after this point, the packet is headless,
// and Packet->TotalLen == Info->Length.
//
NetbufTrim (*Packet, HeadLen, TRUE);
@@ -928,7 +928,7 @@ Ip4AccpetFrame (
break;
default:
Ip4Demultiplex (IpSb, Head, Packet);
Ip4Demultiplex (IpSb, Head, Packet, Option, OptionLen);
}
Packet = NULL;
@@ -1151,8 +1151,8 @@ Ip4OnRecyclePacket (
to the upper layer. Upper layer will signal the recycle event in
it when it is done with the packet.
@param[in] IpInstance The IP4 child to receive the packet
@param[in] Packet The packet to deliver up.
@param[in] IpInstance The IP4 child to receive the packet.
@param[in] Packet The packet to deliver up.
@retval Wrap if warp the packet succeed.
@retval NULL failed to wrap the packet .
@@ -1167,6 +1167,7 @@ Ip4WrapRxData (
IP4_RXDATA_WRAP *Wrap;
EFI_IP4_RECEIVE_DATA *RxData;
EFI_STATUS Status;
BOOLEAN RawData;
Wrap = AllocatePool (IP4_RXDATA_WRAP_SIZE (Packet->BlockOpNum));
@@ -1180,7 +1181,7 @@ Ip4WrapRxData (
Wrap->Packet = Packet;
RxData = &Wrap->RxData;
ZeroMem (&RxData->TimeStamp, sizeof (EFI_TIME));
ZeroMem (RxData, sizeof (EFI_IP4_RECEIVE_DATA));
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
@@ -1197,17 +1198,21 @@ Ip4WrapRxData (
ASSERT (Packet->Ip.Ip4 != NULL);
ASSERT (IpInstance != NULL);
RawData = IpInstance->ConfigData.RawData;
//
// The application expects a network byte order header.
//
RxData->HeaderLength = (Packet->Ip.Ip4->HeadLen << 2);
RxData->Header = (EFI_IP4_HEADER *) Ip4NtohHead (Packet->Ip.Ip4);
if (!RawData) {
RxData->HeaderLength = (Packet->Ip.Ip4->HeadLen << 2);
RxData->Header = (EFI_IP4_HEADER *) Ip4NtohHead (Packet->Ip.Ip4);
RxData->OptionsLength = RxData->HeaderLength - IP4_MIN_HEADLEN;
RxData->Options = NULL;
RxData->OptionsLength = RxData->HeaderLength - IP4_MIN_HEADLEN;
RxData->Options = NULL;
if (RxData->OptionsLength != 0) {
RxData->Options = (VOID *) (RxData->Header + 1);
if (RxData->OptionsLength != 0) {
RxData->Options = (VOID *) (RxData->Header + 1);
}
}
RxData->DataLength = Packet->TotalSize;
@@ -1246,6 +1251,7 @@ Ip4InstanceDeliverPacket (
NET_BUF *Packet;
NET_BUF *Dup;
UINT8 *Head;
UINT32 HeadLen;
//
// Deliver a packet if there are both a packet and a receive token.
@@ -1271,24 +1277,32 @@ Ip4InstanceDeliverPacket (
//
// Create a duplicated packet if this packet is shared
//
Dup = NetbufDuplicate (Packet, NULL, IP4_MAX_HEADLEN);
if (IpInstance->ConfigData.RawData) {
HeadLen = 0;
} else {
HeadLen = IP4_MAX_HEADLEN;
}
Dup = NetbufDuplicate (Packet, NULL, HeadLen);
if (Dup == NULL) {
return EFI_OUT_OF_RESOURCES;
}
//
// Copy the IP head over. The packet to deliver up is
// headless. Trim the head off after copy. The IP head
// may be not continuous before the data.
//
Head = NetbufAllocSpace (Dup, IP4_MAX_HEADLEN, NET_BUF_HEAD);
ASSERT (Head != NULL);
Dup->Ip.Ip4 = (IP4_HEAD *) Head;
if (!IpInstance->ConfigData.RawData) {
//
// Copy the IP head over. The packet to deliver up is
// headless. Trim the head off after copy. The IP head
// may be not continuous before the data.
//
Head = NetbufAllocSpace (Dup, IP4_MAX_HEADLEN, NET_BUF_HEAD);
ASSERT (Head != NULL);
Dup->Ip.Ip4 = (IP4_HEAD *) Head;
CopyMem (Head, Packet->Ip.Ip4, Packet->Ip.Ip4->HeadLen << 2);
NetbufTrim (Dup, IP4_MAX_HEADLEN, TRUE);
CopyMem (Head, Packet->Ip.Ip4, Packet->Ip.Ip4->HeadLen << 2);
NetbufTrim (Dup, IP4_MAX_HEADLEN, TRUE);
}
Wrap = Ip4WrapRxData (IpInstance, Dup);
@@ -1326,10 +1340,12 @@ Ip4InstanceDeliverPacket (
Enqueue a received packet to all the IP children that share
the same interface.
@param[in] IpSb The IP4 service instance that receive the packet
@param[in] Head The header of the received packet
@param[in] Packet The data of the received packet
@param[in] IpIf The interface to enqueue the packet to
@param[in] IpSb The IP4 service instance that receive the packet.
@param[in] Head The header of the received packet.
@param[in] Packet The data of the received packet.
@param[in] Option Point to the IP4 packet header options.
@param[in] OptionLen Length of the IP4 packet header options.
@param[in] IpIf The interface to enqueue the packet to.
@return The number of the IP4 children that accepts the packet
@@ -1339,6 +1355,8 @@ Ip4InterfaceEnquePacket (
IN IP4_SERVICE *IpSb,
IN IP4_HEAD *Head,
IN NET_BUF *Packet,
IN UINT8 *Option,
IN UINT32 OptionLen,
IN IP4_INTERFACE *IpIf
)
{
@@ -1404,6 +1422,13 @@ Ip4InterfaceEnquePacket (
IpInstance = NET_LIST_USER_STRUCT (Entry, IP4_PROTOCOL, AddrLink);
NET_CHECK_SIGNATURE (IpInstance, IP4_PROTOCOL_SIGNATURE);
//
// In RawData mode, add IPv4 headers and options back to packet.
//
if ((IpInstance->ConfigData.RawData) && (Option != NULL) && (OptionLen != 0)){
Ip4PrependHead (Packet, Head, Option, OptionLen);
}
if (Ip4InstanceEnquePacket (IpInstance, Head, Packet) == EFI_SUCCESS) {
Enqueued++;
}
@@ -1450,11 +1475,13 @@ Ip4InterfaceDeliverPacket (
child wants to consume the packet because each IP child needs
its own copy of the packet to make changes.
@param[in] IpSb The IP4 service instance that received the packet
@param[in] Head The header of the received packet
@param[in] Packet The data of the received packet
@param[in] IpSb The IP4 service instance that received the packet.
@param[in] Head The header of the received packet.
@param[in] Packet The data of the received packet.
@param[in] Option Point to the IP4 packet header options.
@param[in] OptionLen Length of the IP4 packet header options.
@retval EFI_NOT_FOUND No IP child accepts the packet
@retval EFI_NOT_FOUND No IP child accepts the packet.
@retval EFI_SUCCESS The packet is enqueued or delivered to some IP
children.
@@ -1463,7 +1490,9 @@ EFI_STATUS
Ip4Demultiplex (
IN IP4_SERVICE *IpSb,
IN IP4_HEAD *Head,
IN NET_BUF *Packet
IN NET_BUF *Packet,
IN UINT8 *Option,
IN UINT32 OptionLen
)
{
LIST_ENTRY *Entry;
@@ -1480,7 +1509,14 @@ Ip4Demultiplex (
IpIf = NET_LIST_USER_STRUCT (Entry, IP4_INTERFACE, Link);
if (IpIf->Configured) {
Enqueued += Ip4InterfaceEnquePacket (IpSb, Head, Packet, IpIf);
Enqueued += Ip4InterfaceEnquePacket (
IpSb,
Head,
Packet,
Option,
OptionLen,
IpIf
);
}
}