X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=NetworkPkg%2FMtftp6Dxe%2FMtftp6Rrq.c;h=32327de69ec89b3a51b911109116a56c44dc88ef;hb=d1050b9dff1cace252aff86630bfdb59dff5f507;hp=4935933f23125339a648e9b2d952efd43871d1f4;hpb=2f88bd3a1296c522317f1c21377876de63de5be7;p=mirror_edk2.git 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 ); } -