\r
#include "Mtftp6Impl.h"\r
\r
-\r
/**\r
Build and send a ACK packet for download.\r
\r
**/\r
EFI_STATUS\r
Mtftp6RrqSendAck (\r
- IN MTFTP6_INSTANCE *Instance,\r
- IN UINT16 BlockNum\r
+ IN MTFTP6_INSTANCE *Instance,\r
+ IN UINT16 BlockNum\r
)\r
{\r
- EFI_MTFTP6_PACKET *Ack;\r
- NET_BUF *Packet;\r
- EFI_STATUS Status;\r
+ EFI_MTFTP6_PACKET *Ack;\r
+ NET_BUF *Packet;\r
+ EFI_STATUS Status;\r
\r
Status = EFI_SUCCESS;\r
\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- Ack = (EFI_MTFTP6_PACKET *) NetbufAllocSpace (\r
- Packet,\r
- sizeof (EFI_MTFTP6_ACK_HEADER),\r
- FALSE\r
- );\r
+ Ack = (EFI_MTFTP6_PACKET *)NetbufAllocSpace (\r
+ Packet,\r
+ sizeof (EFI_MTFTP6_ACK_HEADER),\r
+ FALSE\r
+ );\r
ASSERT (Ack != NULL);\r
\r
- Ack->Ack.OpCode = HTONS (EFI_MTFTP6_OPCODE_ACK);\r
- Ack->Ack.Block[0] = HTONS (BlockNum);\r
+ Ack->Ack.OpCode = HTONS (EFI_MTFTP6_OPCODE_ACK);\r
+ Ack->Ack.Block[0] = HTONS (BlockNum);\r
\r
//\r
// Reset current retry count of the instance.\r
//\r
- Instance->CurRetry = 0;\r
+ Instance->CurRetry = 0;\r
Instance->LastPacket = Packet;\r
\r
Status = Mtftp6TransmitPacket (Instance, Packet);\r
return Status;\r
}\r
\r
-\r
/**\r
Deliver the received data block to the user, which can be saved\r
in the user provide buffer or through the CheckPacket callback.\r
**/\r
EFI_STATUS\r
Mtftp6RrqSaveBlock (\r
- IN MTFTP6_INSTANCE *Instance,\r
- IN EFI_MTFTP6_PACKET *Packet,\r
- IN UINT32 Len,\r
- OUT NET_BUF **UdpPacket\r
+ IN MTFTP6_INSTANCE *Instance,\r
+ IN EFI_MTFTP6_PACKET *Packet,\r
+ IN UINT32 Len,\r
+ OUT NET_BUF **UdpPacket\r
)\r
{\r
- EFI_MTFTP6_TOKEN *Token;\r
- EFI_STATUS Status;\r
- UINT16 Block;\r
- UINT64 Start;\r
- UINT32 DataLen;\r
- UINT64 BlockCounter;\r
- BOOLEAN Completed;\r
+ EFI_MTFTP6_TOKEN *Token;\r
+ EFI_STATUS Status;\r
+ UINT16 Block;\r
+ UINT64 Start;\r
+ UINT32 DataLen;\r
+ UINT64 BlockCounter;\r
+ BOOLEAN Completed;\r
\r
Completed = FALSE;\r
Token = Instance->Token;\r
// This is the last block, save the block num\r
//\r
if (DataLen < Instance->BlkSize) {\r
- Completed = TRUE;\r
+ Completed = TRUE;\r
Instance->LastBlk = Block;\r
Mtftp6SetLastBlockNum (&Instance->BlkList, Block);\r
}\r
//\r
// Callback to the check packet routine with the received packet.\r
//\r
- Status = Token->CheckPacket (&Instance->Mtftp6, Token, (UINT16) Len, Packet);\r
+ Status = Token->CheckPacket (&Instance->Mtftp6, Token, (UINT16)Len, Packet);\r
\r
if (EFI_ERROR (Status)) {\r
//\r
Mtftp6SendError (\r
Instance,\r
EFI_MTFTP6_ERRORCODE_ILLEGAL_OPERATION,\r
- (UINT8 *) "User aborted download"\r
+ (UINT8 *)"User aborted download"\r
);\r
\r
return EFI_ABORTED;\r
}\r
\r
if (Token->Buffer != NULL) {\r
-\r
Start = MultU64x32 (BlockCounter - 1, Instance->BlkSize);\r
if (Start + DataLen <= Token->BufferSize) {\r
- CopyMem ((UINT8 *) Token->Buffer + Start, Packet->Data.Data, DataLen);\r
+ CopyMem ((UINT8 *)Token->Buffer + Start, Packet->Data.Data, DataLen);\r
//\r
// Update the file size when received the last block\r
//\r
Mtftp6SendError (\r
Instance,\r
EFI_MTFTP6_ERRORCODE_DISK_FULL,\r
- (UINT8 *) "User provided memory block is too small"\r
+ (UINT8 *)"User provided memory block is too small"\r
);\r
\r
return EFI_BUFFER_TOO_SMALL;\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
Process the received data packets. It will save the block\r
then send back an ACK if it is active.\r
**/\r
EFI_STATUS\r
Mtftp6RrqHandleData (\r
- IN MTFTP6_INSTANCE *Instance,\r
- IN EFI_MTFTP6_PACKET *Packet,\r
- IN UINT32 Len,\r
- OUT NET_BUF **UdpPacket,\r
- OUT BOOLEAN *IsCompleted\r
+ IN MTFTP6_INSTANCE *Instance,\r
+ IN EFI_MTFTP6_PACKET *Packet,\r
+ IN UINT32 Len,\r
+ OUT NET_BUF **UdpPacket,\r
+ OUT BOOLEAN *IsCompleted\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT16 BlockNum;\r
- INTN Expected;\r
+ EFI_STATUS Status;\r
+ UINT16 BlockNum;\r
+ INTN Expected;\r
\r
*IsCompleted = FALSE;\r
Status = EFI_SUCCESS;\r
//\r
// If Expected is 0, (UINT16) (Expected - 1) is also the expected Ack number (65535).\r
//\r
- return Mtftp6RrqSendAck (Instance, (UINT16) (Expected - 1));\r
+ return Mtftp6RrqSendAck (Instance, (UINT16)(Expected - 1));\r
}\r
\r
Status = Mtftp6RrqSaveBlock (Instance, Packet, Len, UdpPacket);\r
//\r
// Record the total received and saved block number.\r
//\r
- Instance->TotalBlock ++;\r
+ Instance->TotalBlock++;\r
\r
//\r
// Reset the passive client's timer whenever it received a valid data packet.\r
//\r
Expected = Mtftp6GetNextBlockNum (&Instance->BlkList);\r
\r
- if (Instance->IsMaster || Expected < 0) {\r
+ if (Instance->IsMaster || (Expected < 0)) {\r
if (Expected < 0) {\r
//\r
// If we are passive client, then the just received Block maybe\r
//\r
BlockNum = Instance->LastBlk;\r
*IsCompleted = TRUE;\r
-\r
} else {\r
- BlockNum = (UINT16) (Expected - 1);\r
+ BlockNum = (UINT16)(Expected - 1);\r
}\r
+\r
//\r
// Free the received packet before send new packet in ReceiveNotify,\r
// since the udpio might need to be reconfigured.\r
NetbufFree (*UdpPacket);\r
*UdpPacket = NULL;\r
\r
- if (Instance->WindowSize == (Instance->TotalBlock - Instance->AckedBlock) || Expected < 0) {\r
+ if ((Instance->WindowSize == (Instance->TotalBlock - Instance->AckedBlock)) || (Expected < 0)) {\r
Status = Mtftp6RrqSendAck (Instance, BlockNum);\r
}\r
}\r
return Status;\r
}\r
\r
-\r
/**\r
Validate whether the options received in the server's OACK packet is valid.\r
The options are valid only if:\r
**/\r
BOOLEAN\r
Mtftp6RrqOackValid (\r
- IN MTFTP6_INSTANCE *Instance,\r
- IN MTFTP6_EXT_OPTION_INFO *ReplyInfo,\r
- IN MTFTP6_EXT_OPTION_INFO *RequestInfo\r
+ IN MTFTP6_INSTANCE *Instance,\r
+ IN MTFTP6_EXT_OPTION_INFO *ReplyInfo,\r
+ IN MTFTP6_EXT_OPTION_INFO *RequestInfo\r
)\r
{\r
//\r
if ((((ReplyInfo->BitMap & MTFTP6_OPT_BLKSIZE_BIT) != 0) && (ReplyInfo->BlkSize > RequestInfo->BlkSize)) ||\r
(((ReplyInfo->BitMap & MTFTP6_OPT_WINDOWSIZE_BIT) != 0) && (ReplyInfo->BlkSize > RequestInfo->BlkSize)) ||\r
(((ReplyInfo->BitMap & MTFTP6_OPT_TIMEOUT_BIT) != 0) && (ReplyInfo->Timeout != RequestInfo->Timeout))\r
- ) {\r
+ )\r
+ {\r
return FALSE;\r
}\r
\r
// change the setting.\r
//\r
if (((ReplyInfo->BitMap & MTFTP6_OPT_MCAST_BIT) != 0) && !NetIp6IsUnspecifiedAddr (&Instance->McastIp)) {\r
-\r
- if (!NetIp6IsUnspecifiedAddr (&ReplyInfo->McastIp) && CompareMem (\r
- &ReplyInfo->McastIp,\r
- &Instance->McastIp,\r
- sizeof (EFI_IPv6_ADDRESS)\r
- ) != 0) {\r
+ if (!NetIp6IsUnspecifiedAddr (&ReplyInfo->McastIp) && (CompareMem (\r
+ &ReplyInfo->McastIp,\r
+ &Instance->McastIp,\r
+ sizeof (EFI_IPv6_ADDRESS)\r
+ ) != 0))\r
+ {\r
return FALSE;\r
}\r
\r
return TRUE;\r
}\r
\r
-\r
/**\r
Configure Udp6Io to receive a packet from a multicast address.\r
\r
EFI_STATUS\r
EFIAPI\r
Mtftp6RrqConfigMcastUdpIo (\r
- IN UDP_IO *McastIo,\r
- IN VOID *Context\r
+ IN UDP_IO *McastIo,\r
+ IN VOID *Context\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_UDP6_PROTOCOL *Udp6;\r
- EFI_UDP6_CONFIG_DATA *Udp6Cfg;\r
- EFI_IPv6_ADDRESS Group;\r
- MTFTP6_INSTANCE *Instance;\r
+ EFI_STATUS Status;\r
+ EFI_UDP6_PROTOCOL *Udp6;\r
+ EFI_UDP6_CONFIG_DATA *Udp6Cfg;\r
+ EFI_IPv6_ADDRESS Group;\r
+ MTFTP6_INSTANCE *Instance;\r
\r
Udp6 = McastIo->Protocol.Udp6;\r
Udp6Cfg = &(McastIo->Config.Udp6);\r
- Instance = (MTFTP6_INSTANCE *) Context;\r
+ Instance = (MTFTP6_INSTANCE *)Context;\r
\r
//\r
// Set the configure data for the mcast Udp6Io.\r
return Udp6->Groups (Udp6, TRUE, &Group);\r
}\r
\r
-\r
/**\r
Process the OACK packet for Rrq.\r
\r
**/\r
EFI_STATUS\r
Mtftp6RrqHandleOack (\r
- IN MTFTP6_INSTANCE *Instance,\r
- IN EFI_MTFTP6_PACKET *Packet,\r
- IN UINT32 Len,\r
- OUT NET_BUF **UdpPacket,\r
- OUT BOOLEAN *IsCompleted\r
+ IN MTFTP6_INSTANCE *Instance,\r
+ IN EFI_MTFTP6_PACKET *Packet,\r
+ IN UINT32 Len,\r
+ OUT NET_BUF **UdpPacket,\r
+ OUT BOOLEAN *IsCompleted\r
)\r
{\r
- EFI_MTFTP6_OPTION *Options;\r
- UINT32 Count;\r
- MTFTP6_EXT_OPTION_INFO ExtInfo;\r
- EFI_STATUS Status;\r
- INTN Expected;\r
- EFI_UDP6_PROTOCOL *Udp6;\r
+ EFI_MTFTP6_OPTION *Options;\r
+ UINT32 Count;\r
+ MTFTP6_EXT_OPTION_INFO ExtInfo;\r
+ EFI_STATUS Status;\r
+ INTN Expected;\r
+ EFI_UDP6_PROTOCOL *Udp6;\r
\r
*IsCompleted = FALSE;\r
- Options = NULL;\r
+ Options = NULL;\r
\r
//\r
// If already started the master download, don't change the\r
Expected = Mtftp6GetNextBlockNum (&Instance->BlkList);\r
ASSERT (Expected != -1);\r
\r
- if (Instance->IsMaster && Expected != 1) {\r
+ if (Instance->IsMaster && (Expected != 1)) {\r
return EFI_SUCCESS;\r
}\r
\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
ASSERT (Options != NULL);\r
\r
//\r
Mtftp6SendError (\r
Instance,\r
EFI_MTFTP6_ERRORCODE_ILLEGAL_OPERATION,\r
- (UINT8 *) "Malformatted OACK packet"\r
+ (UINT8 *)"Malformatted OACK packet"\r
);\r
}\r
\r
}\r
\r
if ((ExtInfo.BitMap & MTFTP6_OPT_MCAST_BIT) != 0) {\r
-\r
//\r
// Save the multicast info. Always update the Master, only update the\r
// multicast IP address, block size, window size, timeoute at the first time. If IP\r
Instance->IsMaster = ExtInfo.IsMaster;\r
\r
if (NetIp6IsUnspecifiedAddr (&Instance->McastIp)) {\r
- if (NetIp6IsUnspecifiedAddr (&ExtInfo.McastIp) || ExtInfo.McastPort == 0) {\r
+ if (NetIp6IsUnspecifiedAddr (&ExtInfo.McastIp) || (ExtInfo.McastPort == 0)) {\r
//\r
// Free the received packet before send new packet in ReceiveNotify,\r
// since the udpio might need to be reconfigured.\r
Mtftp6SendError (\r
Instance,\r
EFI_MTFTP6_ERRORCODE_ILLEGAL_OPERATION,\r
- (UINT8 *) "Illegal multicast setting"\r
+ (UINT8 *)"Illegal multicast setting"\r
);\r
\r
return EFI_TFTP_ERROR;\r
sizeof (EFI_IP_ADDRESS)\r
);\r
\r
- Instance->McastPort = ExtInfo.McastPort;\r
+ Instance->McastPort = ExtInfo.McastPort;\r
if (Instance->McastUdpIo == NULL) {\r
Instance->McastUdpIo = UdpIoCreateIo (\r
Instance->Service->Controller,\r
Status = gBS->OpenProtocol (\r
Instance->McastUdpIo->UdpHandle,\r
&gEfiUdp6ProtocolGuid,\r
- (VOID **) &Udp6,\r
+ (VOID **)&Udp6,\r
Instance->Service->Image,\r
Instance->Handle,\r
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
Mtftp6SendError (\r
Instance,\r
EFI_MTFTP6_ERRORCODE_ACCESS_VIOLATION,\r
- (UINT8 *) "Failed to create socket to receive multicast packet"\r
+ (UINT8 *)"Failed to create socket to receive multicast packet"\r
);\r
\r
return Status;\r
Instance->Timeout = ExtInfo.Timeout;\r
}\r
}\r
-\r
} else {\r
-\r
Instance->IsMaster = TRUE;\r
\r
if (ExtInfo.BlkSize != 0) {\r
// Send an ACK to (Expected - 1) which is 0 for unicast download,\r
// or tell the server we want to receive the Expected block.\r
//\r
- return Mtftp6RrqSendAck (Instance, (UINT16) (Expected - 1));\r
+ return Mtftp6RrqSendAck (Instance, (UINT16)(Expected - 1));\r
}\r
\r
-\r
/**\r
The packet process callback for Mtftp6 download.\r
\r
VOID\r
EFIAPI\r
Mtftp6RrqInput (\r
- IN NET_BUF *UdpPacket,\r
- IN UDP_END_POINT *UdpEpt,\r
- IN EFI_STATUS IoStatus,\r
- IN VOID *Context\r
+ IN NET_BUF *UdpPacket,\r
+ IN UDP_END_POINT *UdpEpt,\r
+ IN EFI_STATUS IoStatus,\r
+ IN VOID *Context\r
)\r
{\r
- MTFTP6_INSTANCE *Instance;\r
- EFI_MTFTP6_PACKET *Packet;\r
- BOOLEAN IsCompleted;\r
- BOOLEAN IsMcast;\r
- EFI_STATUS Status;\r
- UINT16 Opcode;\r
- UINT32 TotalNum;\r
- UINT32 Len;\r
+ MTFTP6_INSTANCE *Instance;\r
+ EFI_MTFTP6_PACKET *Packet;\r
+ BOOLEAN IsCompleted;\r
+ BOOLEAN IsMcast;\r
+ EFI_STATUS Status;\r
+ UINT16 Opcode;\r
+ UINT32 TotalNum;\r
+ UINT32 Len;\r
\r
- Instance = (MTFTP6_INSTANCE *) Context;\r
+ Instance = (MTFTP6_INSTANCE *)Context;\r
\r
NET_CHECK_SIGNATURE (Instance, MTFTP6_INSTANCE_SIGNATURE);\r
\r
Ip6Swap128 (&UdpEpt->LocalAddr.v6),\r
&Instance->McastIp,\r
sizeof (EFI_IPv6_ADDRESS)\r
- ) == 0) {\r
+ ) == 0)\r
+ {\r
IsMcast = TRUE;\r
} else {\r
IsMcast = FALSE;\r
goto ON_EXIT;\r
}\r
\r
- NetbufCopy (UdpPacket, 0, Len, (UINT8 *) Packet);\r
-\r
+ NetbufCopy (UdpPacket, 0, Len, (UINT8 *)Packet);\r
} else {\r
- Packet = (EFI_MTFTP6_PACKET *) NetbufGetByte (UdpPacket, 0, NULL);\r
+ Packet = (EFI_MTFTP6_PACKET *)NetbufGetByte (UdpPacket, 0, NULL);\r
ASSERT (Packet != NULL);\r
}\r
\r
// if CheckPacket returns an EFI_ERROR code.\r
//\r
if ((Instance->Token->CheckPacket != NULL) &&\r
- (Opcode == EFI_MTFTP6_OPCODE_OACK || Opcode == EFI_MTFTP6_OPCODE_ERROR)\r
- ) {\r
-\r
+ ((Opcode == EFI_MTFTP6_OPCODE_OACK) || (Opcode == EFI_MTFTP6_OPCODE_ERROR))\r
+ )\r
+ {\r
Status = Instance->Token->CheckPacket (\r
&Instance->Mtftp6,\r
Instance->Token,\r
- (UINT16) Len,\r
+ (UINT16)Len,\r
Packet\r
);\r
\r
Mtftp6SendError (\r
Instance,\r
EFI_MTFTP6_ERRORCODE_REQUEST_DENIED,\r
- (UINT8 *) "User aborted the transfer"\r
+ (UINT8 *)"User aborted the transfer"\r
);\r
}\r
\r
// Switch the process routines by the operation code.\r
//\r
switch (Opcode) {\r
- case EFI_MTFTP6_OPCODE_DATA:\r
- if ((Len > (UINT32) (MTFTP6_DATA_HEAD_LEN + Instance->BlkSize)) || (Len < (UINT32) MTFTP6_DATA_HEAD_LEN)) {\r
- goto ON_EXIT;\r
- }\r
- //\r
- // Handle the data packet of Rrq.\r
- //\r
- Status = Mtftp6RrqHandleData (\r
- Instance,\r
- Packet,\r
- Len,\r
- &UdpPacket,\r
- &IsCompleted\r
- );\r
- break;\r
-\r
- case EFI_MTFTP6_OPCODE_OACK:\r
- if (IsMcast || Len <= MTFTP6_OPCODE_LEN) {\r
- goto ON_EXIT;\r
- }\r
- //\r
- // Handle the Oack packet of Rrq.\r
- //\r
- Status = Mtftp6RrqHandleOack (\r
- Instance,\r
- Packet,\r
- Len,\r
- &UdpPacket,\r
- &IsCompleted\r
- );\r
- break;\r
-\r
- default:\r
- //\r
- // Drop and return error if received error message.\r
- //\r
- Status = EFI_TFTP_ERROR;\r
- break;\r
+ case EFI_MTFTP6_OPCODE_DATA:\r
+ if ((Len > (UINT32)(MTFTP6_DATA_HEAD_LEN + Instance->BlkSize)) || (Len < (UINT32)MTFTP6_DATA_HEAD_LEN)) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ //\r
+ // Handle the data packet of Rrq.\r
+ //\r
+ Status = Mtftp6RrqHandleData (\r
+ Instance,\r
+ Packet,\r
+ Len,\r
+ &UdpPacket,\r
+ &IsCompleted\r
+ );\r
+ break;\r
+\r
+ case EFI_MTFTP6_OPCODE_OACK:\r
+ if (IsMcast || (Len <= MTFTP6_OPCODE_LEN)) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ //\r
+ // Handle the Oack packet of Rrq.\r
+ //\r
+ Status = Mtftp6RrqHandleOack (\r
+ Instance,\r
+ Packet,\r
+ Len,\r
+ &UdpPacket,\r
+ &IsCompleted\r
+ );\r
+ break;\r
+\r
+ default:\r
+ //\r
+ // Drop and return error if received error message.\r
+ //\r
+ Status = EFI_TFTP_ERROR;\r
+ break;\r
}\r
\r
ON_EXIT:\r
// Free the resources, then if !EFI_ERROR (Status), restart the\r
// receive, otherwise end the session.\r
//\r
- if (Packet != NULL && TotalNum > 1) {\r
+ if ((Packet != NULL) && (TotalNum > 1)) {\r
FreePool (Packet);\r
}\r
+\r
if (UdpPacket != NULL) {\r
NetbufFree (UdpPacket);\r
}\r
+\r
if (!EFI_ERROR (Status) && !IsCompleted) {\r
if (IsMcast) {\r
Status = UdpIoRecvDatagram (\r
);\r
}\r
}\r
+\r
//\r
// Clean up the current session if failed to continue.\r
//\r
}\r
}\r
\r
-\r
/**\r
Start the Mtftp6 instance to download. It first initializes some\r
of the internal states, then builds and sends an RRQ request packet.\r
**/\r
EFI_STATUS\r
Mtftp6RrqStart (\r
- IN MTFTP6_INSTANCE *Instance,\r
- IN UINT16 Operation\r
+ IN MTFTP6_INSTANCE *Instance,\r
+ IN UINT16 Operation\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
//\r
// The valid block number range are [1, 0xffff]. For example:\r
0\r
);\r
}\r
-\r