From 878d24b551e595db611472f5508c729e004eb949 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 14 Dec 2020 02:15:16 +0000 Subject: [PATCH] Add buffered OS read command packet processing. --- aaruremote.h | 21 +++++++++++++++ worker.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/aaruremote.h b/aaruremote.h index 5f555ef..c99972e 100644 --- a/aaruremote.h +++ b/aaruremote.h @@ -65,6 +65,8 @@ #define AARUREMOTE_PACKET_TYPE_MULTI_COMMAND_SDHCI 28 #define AARUREMOTE_PACKET_TYPE_RESPONSE_MULTI_SDHCI 29 #define AARUREMOTE_PACKET_TYPE_COMMAND_REOPEN 30 +#define AARUREMOTE_PACKET_TYPE_COMMAND_OSREAD 31 +#define AARUREMOTE_PACKET_TYPE_RESPONSE_OSREAD 32 #define AARUREMOTE_PROTOCOL_MAX 2 #define AARUREMOTE_PACKET_NOP_REASON_OOO 0 #define AARUREMOTE_PACKET_NOP_REASON_NOT_IMPLEMENTED 1 @@ -505,6 +507,20 @@ typedef struct AaruPacketHeader hdr; } AaruPacketCmdReOpen; +typedef struct +{ + AaruPacketHeader hdr; + uint64_t offset; + uint32_t length; +} AaruPacketCmdOsRead; + +typedef struct +{ + AaruPacketHeader hdr; + int32_t error_no; + uint32_t duration; +} AaruPacketResOsRead; + #pragma pack(pop) typedef struct @@ -616,6 +632,11 @@ int32_t SendMultiSdhciCommand(void* device_ctx, MmcSingleCommand commands[], uint32_t* duration, uint32_t* sense); +int32_t OsRead(void* device_ctx, + char *buffer, + uint64_t offset, + uint32_t length, + uint32_t* duration); AaruPacketHello* GetHello(); int PrintNetworkAddresses(); char* PrintIpv4Address(struct in_addr addr); diff --git a/worker.c b/worker.c index 9c6e2bc..05f825f 100644 --- a/worker.c +++ b/worker.c @@ -71,6 +71,8 @@ void* WorkingLoop(void* arguments) AaruPacketResScsi* pkt_res_scsi; AaruPacketResSdhci* pkt_res_sdhci; AaruPacketMultiResSdhci* pkt_res_multi_sdhci; + AaruPacketCmdOsRead* pkt_cmd_osread; + AaruPacketResOsRead* pkt_res_osread; int skip_next_hdr; int ret; socklen_t cli_len; @@ -1189,10 +1191,10 @@ void* WorkingLoop(void* arguments) off += multi_sdhci_commands->buf_len; } - NetWrite(cli_ctx, pkt_res_sdhci, le32toh(pkt_res_sdhci->hdr.len)); + NetWrite(cli_ctx, pkt_res_multi_sdhci, le32toh(pkt_res_multi_sdhci->hdr.len)); free(multi_sdhci_commands); - free(pkt_cmd_sdhci); - free(pkt_res_sdhci); + free(pkt_cmd_multi_sdhci); + free(pkt_res_multi_sdhci); continue; case AARUREMOTE_PACKET_TYPE_COMMAND_REOPEN: @@ -1230,6 +1232,70 @@ void* WorkingLoop(void* arguments) free(in_buf); + continue; + case AARUREMOTE_PACKET_TYPE_COMMAND_OSREAD: + in_buf = malloc(le32toh(pkt_hdr->len)); + + if(!in_buf) + { + printf("Fatal error %d allocating memory for packet, closing connection...\n", errno); + free(pkt_hdr); + NetClose(cli_ctx); + continue; + } + + NetRecv(cli_ctx, in_buf, le32toh(pkt_hdr->len), 0); + + pkt_cmd_osread = (AaruPacketCmdOsRead*)in_buf; + + buffer = malloc(le32toh(pkt_cmd_osread->length)); + + if(!buffer) + { + printf("Fatal error %d allocating memory for buffer, closing connection...\n", errno); + free(pkt_hdr); + free(in_buf); + NetClose(cli_ctx); + continue; + } + + memset(buffer, 0, le32toh(pkt_cmd_osread->length)); + + ret = OsRead(device_ctx, + buffer, + le64toh(pkt_cmd_osread->offset), + le32toh(pkt_cmd_osread->length), + &duration); + + out_buf = malloc(sizeof(AaruPacketResOsRead) + le32toh(pkt_cmd_osread->length)); + + if(!out_buf) + { + printf("Fatal error %d allocating memory for packet, continuing...\n", errno); + free(buffer); + free(pkt_hdr); + free(in_buf); + NetClose(cli_ctx); + continue; + } + + pkt_res_osread = (AaruPacketResOsRead*)out_buf; + + pkt_res_osread->hdr.len = htole32(sizeof(AaruPacketResOsRead) + le32toh(pkt_cmd_osread->length)); + pkt_res_osread->hdr.packet_type = AARUREMOTE_PACKET_TYPE_RESPONSE_OSREAD; + pkt_res_osread->hdr.version = AARUREMOTE_PACKET_VERSION; + pkt_res_osread->hdr.remote_id = htole32(AARUREMOTE_REMOTE_ID); + pkt_res_osread->hdr.packet_id = htole32(AARUREMOTE_PACKET_ID); + pkt_res_osread->error_no = htole32(ret); + pkt_res_osread->duration = htole32(duration); + + memcpy(out_buf + sizeof(AaruPacketResOsRead), buffer, le32toh(pkt_cmd_osread->length)); + + NetWrite(cli_ctx, pkt_res_osread, le32toh(pkt_res_osread->hdr.len)); + free(buffer); + free(pkt_cmd_osread); + free(pkt_res_osread); + continue; default: pkt_nop->reason_code = AARUREMOTE_PACKET_NOP_REASON_NOT_RECOGNIZED;