/** Start the MTFTP session for upload. It will first init some states, then send the WRQ request packet, and start receiving the packet. @param Instance The MTFTP session @param Operation Redundant parameter, which is always EFI_MTFTP4_OPCODE_WRQ here. @retval EFI_SUCCESS The upload process has been started. @retval Others Failed to start the upload. **/ EFI_STATUS Mtftp4WrqStart ( IN MTFTP4_PROTOCOL *Instance, IN UINT16 Operation ) { EFI_STATUS Status; // // The valid block number range are [0, 0xffff]. For example: // the client sends an WRQ request to the server, the server // ACK with an ACK0 to let client start transfer the first // packet. // Status = Mtftp4InitBlockRange (&Instance->Blocks, 0, 0xffff); if (EFI_ERROR (Status)) { return Status; } Status = Mtftp4SendRequest (Instance); if (EFI_ERROR (Status)) { return Status; } return UdpIoRecvDatagram (Instance->UnicastPort, Mtftp4WrqInput, Instance, 0); }
/** Start the MTFTP session to download. It will first initialize some of the internal states then build and send a RRQ reqeuest packet, at last, it will start receive for the downloading. @param Instance The Mtftp session @param Operation The MTFTP opcode, it may be a EFI_MTFTP4_OPCODE_RRQ or EFI_MTFTP4_OPCODE_DIR. @retval EFI_SUCCESS The mtftp download session is started. @retval Others Failed to start downloading. **/ EFI_STATUS Mtftp4RrqStart ( IN MTFTP4_PROTOCOL *Instance, IN UINT16 Operation ) { EFI_STATUS Status; // // The valid block number range are [1, 0xffff]. For example: // the client sends an RRQ request to the server, the server // transfers the DATA1 block. If option negoitation is ongoing, // the server will send back an OACK, then client will send ACK0. // Status = Mtftp4InitBlockRange (&Instance->Blocks, 1, 0xffff); if (EFI_ERROR (Status)) { return Status; } Status = Mtftp4SendRequest (Instance); if (EFI_ERROR (Status)) { return Status; } return UdpIoRecvDatagram (Instance->UnicastPort, Mtftp4RrqInput, Instance, 0); }