summaryrefslogtreecommitdiffstats
path: root/NetworkPkg/Mtftp6Dxe/Mtftp6Rrq.c
diff options
context:
space:
mode:
Diffstat (limited to 'NetworkPkg/Mtftp6Dxe/Mtftp6Rrq.c')
-rw-r--r--NetworkPkg/Mtftp6Dxe/Mtftp6Rrq.c310
1 files changed, 152 insertions, 158 deletions
diff --git a/NetworkPkg/Mtftp6Dxe/Mtftp6Rrq.c b/NetworkPkg/Mtftp6Dxe/Mtftp6Rrq.c
index 4935933f23..32327de69e 100644
--- a/NetworkPkg/Mtftp6Dxe/Mtftp6Rrq.c
+++ b/NetworkPkg/Mtftp6Dxe/Mtftp6Rrq.c
@@ -9,7 +9,6 @@
#include "Mtftp6Impl.h"
-
/**
Build and send a ACK packet for download.
@@ -23,13 +22,13 @@
**/
EFI_STATUS
Mtftp6RrqSendAck (
- IN MTFTP6_INSTANCE *Instance,
- IN UINT16 BlockNum
+ IN MTFTP6_INSTANCE *Instance,
+ IN UINT16 BlockNum
)
{
- EFI_MTFTP6_PACKET *Ack;
- NET_BUF *Packet;
- EFI_STATUS Status;
+ EFI_MTFTP6_PACKET *Ack;
+ NET_BUF *Packet;
+ EFI_STATUS Status;
Status = EFI_SUCCESS;
@@ -42,20 +41,20 @@ Mtftp6RrqSendAck (
return EFI_OUT_OF_RESOURCES;
}
- Ack = (EFI_MTFTP6_PACKET *) NetbufAllocSpace (
- Packet,
- sizeof (EFI_MTFTP6_ACK_HEADER),
- FALSE
- );
+ Ack = (EFI_MTFTP6_PACKET *)NetbufAllocSpace (
+ Packet,
+ sizeof (EFI_MTFTP6_ACK_HEADER),
+ FALSE
+ );
ASSERT (Ack != NULL);
- Ack->Ack.OpCode = HTONS (EFI_MTFTP6_OPCODE_ACK);
- Ack->Ack.Block[0] = HTONS (BlockNum);
+ Ack->Ack.OpCode = HTONS (EFI_MTFTP6_OPCODE_ACK);
+ Ack->Ack.Block[0] = HTONS (BlockNum);
//
// Reset current retry count of the instance.
//
- Instance->CurRetry = 0;
+ Instance->CurRetry = 0;
Instance->LastPacket = Packet;
Status = Mtftp6TransmitPacket (Instance, Packet);
@@ -66,7 +65,6 @@ Mtftp6RrqSendAck (
return Status;
}
-
/**
Deliver the received data block to the user, which can be saved
in the user provide buffer or through the CheckPacket callback.
@@ -85,19 +83,19 @@ Mtftp6RrqSendAck (
**/
EFI_STATUS
Mtftp6RrqSaveBlock (
- IN MTFTP6_INSTANCE *Instance,
- IN EFI_MTFTP6_PACKET *Packet,
- IN UINT32 Len,
- OUT NET_BUF **UdpPacket
+ IN MTFTP6_INSTANCE *Instance,
+ IN EFI_MTFTP6_PACKET *Packet,
+ IN UINT32 Len,
+ OUT NET_BUF **UdpPacket
)
{
- EFI_MTFTP6_TOKEN *Token;
- EFI_STATUS Status;
- UINT16 Block;
- UINT64 Start;
- UINT32 DataLen;
- UINT64 BlockCounter;
- BOOLEAN Completed;
+ EFI_MTFTP6_TOKEN *Token;
+ EFI_STATUS Status;
+ UINT16 Block;
+ UINT64 Start;
+ UINT32 DataLen;
+ UINT64 BlockCounter;
+ BOOLEAN Completed;
Completed = FALSE;
Token = Instance->Token;
@@ -108,7 +106,7 @@ Mtftp6RrqSaveBlock (
// This is the last block, save the block num
//
if (DataLen < Instance->BlkSize) {
- Completed = TRUE;
+ Completed = TRUE;
Instance->LastBlk = Block;
Mtftp6SetLastBlockNum (&Instance->BlkList, Block);
}
@@ -132,7 +130,7 @@ Mtftp6RrqSaveBlock (
//
// Callback to the check packet routine with the received packet.
//
- Status = Token->CheckPacket (&Instance->Mtftp6, Token, (UINT16) Len, Packet);
+ Status = Token->CheckPacket (&Instance->Mtftp6, Token, (UINT16)Len, Packet);
if (EFI_ERROR (Status)) {
//
@@ -147,7 +145,7 @@ Mtftp6RrqSaveBlock (
Mtftp6SendError (
Instance,
EFI_MTFTP6_ERRORCODE_ILLEGAL_OPERATION,
- (UINT8 *) "User aborted download"
+ (UINT8 *)"User aborted download"
);
return EFI_ABORTED;
@@ -155,10 +153,9 @@ Mtftp6RrqSaveBlock (
}
if (Token->Buffer != NULL) {
-
Start = MultU64x32 (BlockCounter - 1, Instance->BlkSize);
if (Start + DataLen <= Token->BufferSize) {
- CopyMem ((UINT8 *) Token->Buffer + Start, Packet->Data.Data, DataLen);
+ CopyMem ((UINT8 *)Token->Buffer + Start, Packet->Data.Data, DataLen);
//
// Update the file size when received the last block
//
@@ -185,7 +182,7 @@ Mtftp6RrqSaveBlock (
Mtftp6SendError (
Instance,
EFI_MTFTP6_ERRORCODE_DISK_FULL,
- (UINT8 *) "User provided memory block is too small"
+ (UINT8 *)"User provided memory block is too small"
);
return EFI_BUFFER_TOO_SMALL;
@@ -195,7 +192,6 @@ Mtftp6RrqSaveBlock (
return EFI_SUCCESS;
}
-
/**
Process the received data packets. It will save the block
then send back an ACK if it is active.
@@ -214,16 +210,16 @@ Mtftp6RrqSaveBlock (
**/
EFI_STATUS
Mtftp6RrqHandleData (
- IN MTFTP6_INSTANCE *Instance,
- IN EFI_MTFTP6_PACKET *Packet,
- IN UINT32 Len,
- OUT NET_BUF **UdpPacket,
- OUT BOOLEAN *IsCompleted
+ IN MTFTP6_INSTANCE *Instance,
+ IN EFI_MTFTP6_PACKET *Packet,
+ IN UINT32 Len,
+ OUT NET_BUF **UdpPacket,
+ OUT BOOLEAN *IsCompleted
)
{
- EFI_STATUS Status;
- UINT16 BlockNum;
- INTN Expected;
+ EFI_STATUS Status;
+ UINT16 BlockNum;
+ INTN Expected;
*IsCompleted = FALSE;
Status = EFI_SUCCESS;
@@ -248,7 +244,7 @@ Mtftp6RrqHandleData (
//
// If Expected is 0, (UINT16) (Expected - 1) is also the expected Ack number (65535).
//
- return Mtftp6RrqSendAck (Instance, (UINT16) (Expected - 1));
+ return Mtftp6RrqSendAck (Instance, (UINT16)(Expected - 1));
}
Status = Mtftp6RrqSaveBlock (Instance, Packet, Len, UdpPacket);
@@ -260,7 +256,7 @@ Mtftp6RrqHandleData (
//
// Record the total received and saved block number.
//
- Instance->TotalBlock ++;
+ Instance->TotalBlock++;
//
// Reset the passive client's timer whenever it received a valid data packet.
@@ -277,7 +273,7 @@ Mtftp6RrqHandleData (
//
Expected = Mtftp6GetNextBlockNum (&Instance->BlkList);
- if (Instance->IsMaster || Expected < 0) {
+ if (Instance->IsMaster || (Expected < 0)) {
if (Expected < 0) {
//
// If we are passive client, then the just received Block maybe
@@ -287,10 +283,10 @@ Mtftp6RrqHandleData (
//
BlockNum = Instance->LastBlk;
*IsCompleted = TRUE;
-
} else {
- BlockNum = (UINT16) (Expected - 1);
+ BlockNum = (UINT16)(Expected - 1);
}
+
//
// Free the received packet before send new packet in ReceiveNotify,
// since the udpio might need to be reconfigured.
@@ -298,7 +294,7 @@ Mtftp6RrqHandleData (
NetbufFree (*UdpPacket);
*UdpPacket = NULL;
- if (Instance->WindowSize == (Instance->TotalBlock - Instance->AckedBlock) || Expected < 0) {
+ if ((Instance->WindowSize == (Instance->TotalBlock - Instance->AckedBlock)) || (Expected < 0)) {
Status = Mtftp6RrqSendAck (Instance, BlockNum);
}
}
@@ -306,7 +302,6 @@ Mtftp6RrqHandleData (
return Status;
}
-
/**
Validate whether the options received in the server's OACK packet is valid.
The options are valid only if:
@@ -325,9 +320,9 @@ Mtftp6RrqHandleData (
**/
BOOLEAN
Mtftp6RrqOackValid (
- IN MTFTP6_INSTANCE *Instance,
- IN MTFTP6_EXT_OPTION_INFO *ReplyInfo,
- IN MTFTP6_EXT_OPTION_INFO *RequestInfo
+ IN MTFTP6_INSTANCE *Instance,
+ IN MTFTP6_EXT_OPTION_INFO *ReplyInfo,
+ IN MTFTP6_EXT_OPTION_INFO *RequestInfo
)
{
//
@@ -344,7 +339,8 @@ Mtftp6RrqOackValid (
if ((((ReplyInfo->BitMap & MTFTP6_OPT_BLKSIZE_BIT) != 0) && (ReplyInfo->BlkSize > RequestInfo->BlkSize)) ||
(((ReplyInfo->BitMap & MTFTP6_OPT_WINDOWSIZE_BIT) != 0) && (ReplyInfo->BlkSize > RequestInfo->BlkSize)) ||
(((ReplyInfo->BitMap & MTFTP6_OPT_TIMEOUT_BIT) != 0) && (ReplyInfo->Timeout != RequestInfo->Timeout))
- ) {
+ )
+ {
return FALSE;
}
@@ -354,12 +350,12 @@ Mtftp6RrqOackValid (
// change the setting.
//
if (((ReplyInfo->BitMap & MTFTP6_OPT_MCAST_BIT) != 0) && !NetIp6IsUnspecifiedAddr (&Instance->McastIp)) {
-
- if (!NetIp6IsUnspecifiedAddr (&ReplyInfo->McastIp) && CompareMem (
- &ReplyInfo->McastIp,
- &Instance->McastIp,
- sizeof (EFI_IPv6_ADDRESS)
- ) != 0) {
+ if (!NetIp6IsUnspecifiedAddr (&ReplyInfo->McastIp) && (CompareMem (
+ &ReplyInfo->McastIp,
+ &Instance->McastIp,
+ sizeof (EFI_IPv6_ADDRESS)
+ ) != 0))
+ {
return FALSE;
}
@@ -371,7 +367,6 @@ Mtftp6RrqOackValid (
return TRUE;
}
-
/**
Configure Udp6Io to receive a packet from a multicast address.
@@ -385,19 +380,19 @@ Mtftp6RrqOackValid (
EFI_STATUS
EFIAPI
Mtftp6RrqConfigMcastUdpIo (
- IN UDP_IO *McastIo,
- IN VOID *Context
+ IN UDP_IO *McastIo,
+ IN VOID *Context
)
{
- EFI_STATUS Status;
- EFI_UDP6_PROTOCOL *Udp6;
- EFI_UDP6_CONFIG_DATA *Udp6Cfg;
- EFI_IPv6_ADDRESS Group;
- MTFTP6_INSTANCE *Instance;
+ EFI_STATUS Status;
+ EFI_UDP6_PROTOCOL *Udp6;
+ EFI_UDP6_CONFIG_DATA *Udp6Cfg;
+ EFI_IPv6_ADDRESS Group;
+ MTFTP6_INSTANCE *Instance;
Udp6 = McastIo->Protocol.Udp6;
Udp6Cfg = &(McastIo->Config.Udp6);
- Instance = (MTFTP6_INSTANCE *) Context;
+ Instance = (MTFTP6_INSTANCE *)Context;
//
// Set the configure data for the mcast Udp6Io.
@@ -437,7 +432,6 @@ Mtftp6RrqConfigMcastUdpIo (
return Udp6->Groups (Udp6, TRUE, &Group);
}
-
/**
Process the OACK packet for Rrq.
@@ -455,22 +449,22 @@ Mtftp6RrqConfigMcastUdpIo (
**/
EFI_STATUS
Mtftp6RrqHandleOack (
- IN MTFTP6_INSTANCE *Instance,
- IN EFI_MTFTP6_PACKET *Packet,
- IN UINT32 Len,
- OUT NET_BUF **UdpPacket,
- OUT BOOLEAN *IsCompleted
+ IN MTFTP6_INSTANCE *Instance,
+ IN EFI_MTFTP6_PACKET *Packet,
+ IN UINT32 Len,
+ OUT NET_BUF **UdpPacket,
+ OUT BOOLEAN *IsCompleted
)
{
- EFI_MTFTP6_OPTION *Options;
- UINT32 Count;
- MTFTP6_EXT_OPTION_INFO ExtInfo;
- EFI_STATUS Status;
- INTN Expected;
- EFI_UDP6_PROTOCOL *Udp6;
+ EFI_MTFTP6_OPTION *Options;
+ UINT32 Count;
+ MTFTP6_EXT_OPTION_INFO ExtInfo;
+ EFI_STATUS Status;
+ INTN Expected;
+ EFI_UDP6_PROTOCOL *Udp6;
*IsCompleted = FALSE;
- Options = NULL;
+ Options = NULL;
//
// If already started the master download, don't change the
@@ -479,7 +473,7 @@ Mtftp6RrqHandleOack (
Expected = Mtftp6GetNextBlockNum (&Instance->BlkList);
ASSERT (Expected != -1);
- if (Instance->IsMaster && Expected != 1) {
+ if (Instance->IsMaster && (Expected != 1)) {
return EFI_SUCCESS;
}
@@ -493,6 +487,7 @@ Mtftp6RrqHandleOack (
if (EFI_ERROR (Status)) {
return Status;
}
+
ASSERT (Options != NULL);
//
@@ -517,7 +512,7 @@ Mtftp6RrqHandleOack (
Mtftp6SendError (
Instance,
EFI_MTFTP6_ERRORCODE_ILLEGAL_OPERATION,
- (UINT8 *) "Malformatted OACK packet"
+ (UINT8 *)"Malformatted OACK packet"
);
}
@@ -525,7 +520,6 @@ Mtftp6RrqHandleOack (
}
if ((ExtInfo.BitMap & MTFTP6_OPT_MCAST_BIT) != 0) {
-
//
// Save the multicast info. Always update the Master, only update the
// multicast IP address, block size, window size, timeoute at the first time. If IP
@@ -534,7 +528,7 @@ Mtftp6RrqHandleOack (
Instance->IsMaster = ExtInfo.IsMaster;
if (NetIp6IsUnspecifiedAddr (&Instance->McastIp)) {
- if (NetIp6IsUnspecifiedAddr (&ExtInfo.McastIp) || ExtInfo.McastPort == 0) {
+ if (NetIp6IsUnspecifiedAddr (&ExtInfo.McastIp) || (ExtInfo.McastPort == 0)) {
//
// Free the received packet before send new packet in ReceiveNotify,
// since the udpio might need to be reconfigured.
@@ -547,7 +541,7 @@ Mtftp6RrqHandleOack (
Mtftp6SendError (
Instance,
EFI_MTFTP6_ERRORCODE_ILLEGAL_OPERATION,
- (UINT8 *) "Illegal multicast setting"
+ (UINT8 *)"Illegal multicast setting"
);
return EFI_TFTP_ERROR;
@@ -562,7 +556,7 @@ Mtftp6RrqHandleOack (
sizeof (EFI_IP_ADDRESS)
);
- Instance->McastPort = ExtInfo.McastPort;
+ Instance->McastPort = ExtInfo.McastPort;
if (Instance->McastUdpIo == NULL) {
Instance->McastUdpIo = UdpIoCreateIo (
Instance->Service->Controller,
@@ -575,7 +569,7 @@ Mtftp6RrqHandleOack (
Status = gBS->OpenProtocol (
Instance->McastUdpIo->UdpHandle,
&gEfiUdp6ProtocolGuid,
- (VOID **) &Udp6,
+ (VOID **)&Udp6,
Instance->Service->Image,
Instance->Handle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
@@ -612,7 +606,7 @@ Mtftp6RrqHandleOack (
Mtftp6SendError (
Instance,
EFI_MTFTP6_ERRORCODE_ACCESS_VIOLATION,
- (UINT8 *) "Failed to create socket to receive multicast packet"
+ (UINT8 *)"Failed to create socket to receive multicast packet"
);
return Status;
@@ -633,9 +627,7 @@ Mtftp6RrqHandleOack (
Instance->Timeout = ExtInfo.Timeout;
}
}
-
} else {
-
Instance->IsMaster = TRUE;
if (ExtInfo.BlkSize != 0) {
@@ -661,10 +653,9 @@ Mtftp6RrqHandleOack (
// Send an ACK to (Expected - 1) which is 0 for unicast download,
// or tell the server we want to receive the Expected block.
//
- return Mtftp6RrqSendAck (Instance, (UINT16) (Expected - 1));
+ return Mtftp6RrqSendAck (Instance, (UINT16)(Expected - 1));
}
-
/**
The packet process callback for Mtftp6 download.
@@ -677,22 +668,22 @@ Mtftp6RrqHandleOack (
VOID
EFIAPI
Mtftp6RrqInput (
- IN NET_BUF *UdpPacket,
- IN UDP_END_POINT *UdpEpt,
- IN EFI_STATUS IoStatus,
- IN VOID *Context
+ IN NET_BUF *UdpPacket,
+ IN UDP_END_POINT *UdpEpt,
+ IN EFI_STATUS IoStatus,
+ IN VOID *Context
)
{
- MTFTP6_INSTANCE *Instance;
- EFI_MTFTP6_PACKET *Packet;
- BOOLEAN IsCompleted;
- BOOLEAN IsMcast;
- EFI_STATUS Status;
- UINT16 Opcode;
- UINT32 TotalNum;
- UINT32 Len;
+ MTFTP6_INSTANCE *Instance;
+ EFI_MTFTP6_PACKET *Packet;
+ BOOLEAN IsCompleted;
+ BOOLEAN IsMcast;
+ EFI_STATUS Status;
+ UINT16 Opcode;
+ UINT32 TotalNum;
+ UINT32 Len;
- Instance = (MTFTP6_INSTANCE *) Context;
+ Instance = (MTFTP6_INSTANCE *)Context;
NET_CHECK_SIGNATURE (Instance, MTFTP6_INSTANCE_SIGNATURE);
@@ -723,7 +714,8 @@ Mtftp6RrqInput (
Ip6Swap128 (&UdpEpt->LocalAddr.v6),
&Instance->McastIp,
sizeof (EFI_IPv6_ADDRESS)
- ) == 0) {
+ ) == 0)
+ {
IsMcast = TRUE;
} else {
IsMcast = FALSE;
@@ -763,10 +755,9 @@ Mtftp6RrqInput (
goto ON_EXIT;
}
- NetbufCopy (UdpPacket, 0, Len, (UINT8 *) Packet);
-
+ NetbufCopy (UdpPacket, 0, Len, (UINT8 *)Packet);
} else {
- Packet = (EFI_MTFTP6_PACKET *) NetbufGetByte (UdpPacket, 0, NULL);
+ Packet = (EFI_MTFTP6_PACKET *)NetbufGetByte (UdpPacket, 0, NULL);
ASSERT (Packet != NULL);
}
@@ -777,13 +768,13 @@ Mtftp6RrqInput (
// if CheckPacket returns an EFI_ERROR code.
//
if ((Instance->Token->CheckPacket != NULL) &&
- (Opcode == EFI_MTFTP6_OPCODE_OACK || Opcode == EFI_MTFTP6_OPCODE_ERROR)
- ) {
-
+ ((Opcode == EFI_MTFTP6_OPCODE_OACK) || (Opcode == EFI_MTFTP6_OPCODE_ERROR))
+ )
+ {
Status = Instance->Token->CheckPacket (
&Instance->Mtftp6,
Instance->Token,
- (UINT16) Len,
+ (UINT16)Len,
Packet
);
@@ -804,7 +795,7 @@ Mtftp6RrqInput (
Mtftp6SendError (
Instance,
EFI_MTFTP6_ERRORCODE_REQUEST_DENIED,
- (UINT8 *) "User aborted the transfer"
+ (UINT8 *)"User aborted the transfer"
);
}
@@ -817,44 +808,46 @@ Mtftp6RrqInput (
// Switch the process routines by the operation code.
//
switch (Opcode) {
- case EFI_MTFTP6_OPCODE_DATA:
- if ((Len > (UINT32) (MTFTP6_DATA_HEAD_LEN + Instance->BlkSize)) || (Len < (UINT32) MTFTP6_DATA_HEAD_LEN)) {
- goto ON_EXIT;
- }
- //
- // Handle the data packet of Rrq.
- //
- Status = Mtftp6RrqHandleData (
- Instance,
- Packet,
- Len,
- &UdpPacket,
- &IsCompleted
- );
- break;
-
- case EFI_MTFTP6_OPCODE_OACK:
- if (IsMcast || Len <= MTFTP6_OPCODE_LEN) {
- goto ON_EXIT;
- }
- //
- // Handle the Oack packet of Rrq.
- //
- Status = Mtftp6RrqHandleOack (
- Instance,
- Packet,
- Len,
- &UdpPacket,
- &IsCompleted
- );
- break;
-
- default:
- //
- // Drop and return error if received error message.
- //
- Status = EFI_TFTP_ERROR;
- break;
+ case EFI_MTFTP6_OPCODE_DATA:
+ if ((Len > (UINT32)(MTFTP6_DATA_HEAD_LEN + Instance->BlkSize)) || (Len < (UINT32)MTFTP6_DATA_HEAD_LEN)) {
+ goto ON_EXIT;
+ }
+
+ //
+ // Handle the data packet of Rrq.
+ //
+ Status = Mtftp6RrqHandleData (
+ Instance,
+ Packet,
+ Len,
+ &UdpPacket,
+ &IsCompleted
+ );
+ break;
+
+ case EFI_MTFTP6_OPCODE_OACK:
+ if (IsMcast || (Len <= MTFTP6_OPCODE_LEN)) {
+ goto ON_EXIT;
+ }
+
+ //
+ // Handle the Oack packet of Rrq.
+ //
+ Status = Mtftp6RrqHandleOack (
+ Instance,
+ Packet,
+ Len,
+ &UdpPacket,
+ &IsCompleted
+ );
+ break;
+
+ default:
+ //
+ // Drop and return error if received error message.
+ //
+ Status = EFI_TFTP_ERROR;
+ break;
}
ON_EXIT:
@@ -862,12 +855,14 @@ ON_EXIT:
// Free the resources, then if !EFI_ERROR (Status), restart the
// receive, otherwise end the session.
//
- if (Packet != NULL && TotalNum > 1) {
+ if ((Packet != NULL) && (TotalNum > 1)) {
FreePool (Packet);
}
+
if (UdpPacket != NULL) {
NetbufFree (UdpPacket);
}
+
if (!EFI_ERROR (Status) && !IsCompleted) {
if (IsMcast) {
Status = UdpIoRecvDatagram (
@@ -885,6 +880,7 @@ ON_EXIT:
);
}
}
+
//
// Clean up the current session if failed to continue.
//
@@ -893,7 +889,6 @@ ON_EXIT:
}
}
-
/**
Start the Mtftp6 instance to download. It first initializes some
of the internal states, then builds and sends an RRQ request packet.
@@ -908,11 +903,11 @@ ON_EXIT:
**/
EFI_STATUS
Mtftp6RrqStart (
- IN MTFTP6_INSTANCE *Instance,
- IN UINT16 Operation
+ IN MTFTP6_INSTANCE *Instance,
+ IN UINT16 Operation
)
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
//
// The valid block number range are [1, 0xffff]. For example:
@@ -939,4 +934,3 @@ Mtftp6RrqStart (
0
);
}
-