From 59f531cffb9c7fdbabf5f8f8e4655cafc6549f09 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Wed, 13 Apr 2022 12:51:56 +0200 Subject: redir: split client and server seqno Both use independent counter. Signed-off-by: Hannes Reinecke --- ider.c | 56 ++++++++++++++++++++++++++------------------------------ redir.c | 17 ++++++++++------- redir.h | 2 +- 3 files changed, 37 insertions(+), 38 deletions(-) diff --git a/ider.c b/ider.c index a9d5826..fe209bd 100644 --- a/ider.c +++ b/ider.c @@ -26,9 +26,9 @@ #include #include "redir.h" -static int ider_data_to_host(struct redir *r, unsigned int seqno, - unsigned char device, unsigned char *data, - unsigned int data_len, bool completed, bool dma) +static int ider_data_to_host(struct redir *r, unsigned char device, + unsigned char *data, unsigned int data_len, + bool completed, bool dma) { unsigned char *request; int ret; @@ -43,7 +43,7 @@ static int ider_data_to_host(struct redir *r, unsigned int seqno, }; memcpy(&msg.transfer_bytes, &data_len, 2); - memcpy(&msg.sequence_number, &seqno, 4); + memcpy(&msg.sequence_number, &r->seqno, 4); if (!dma) { msg.input.mask |= IDER_INTERRUPT_MASK; } else { @@ -65,7 +65,7 @@ static int ider_data_to_host(struct redir *r, unsigned int seqno, return ret; } -static int ider_packet_sense(struct redir *r, unsigned int seqno, +static int ider_packet_sense(struct redir *r, unsigned char device, unsigned char sense, unsigned char asc, unsigned char asq) { @@ -79,7 +79,7 @@ static int ider_packet_sense(struct redir *r, unsigned int seqno, .output.drive_select = device, .output.status = IDER_STATUS_DRDY | IDER_STATUS_DSC, }; - memcpy(&msg.sequence_number, &seqno, 4); + memcpy(&msg.sequence_number, &r->seqno, 4); if (sense) { msg.output.error = (sense << 4); msg.output.mask |= IDER_ERROR_MASK; @@ -91,8 +91,7 @@ static int ider_packet_sense(struct redir *r, unsigned int seqno, return redir_write(r, (const char *)&msg, sizeof(msg)); } -static int ider_read_data(struct redir *r, unsigned int seqno, - unsigned char device, bool use_dma, +static int ider_read_data(struct redir *r, unsigned char device, bool use_dma, unsigned long lba, unsigned int count) { off_t mmap_offset = lba << r->lba_shift; @@ -101,12 +100,11 @@ static int ider_read_data(struct redir *r, unsigned int seqno, (unsigned char *)r->mmap_buf + mmap_offset; if (!count) - return ider_packet_sense(r, seqno, device, 0x00, 0x00, 0x00); + return ider_packet_sense(r, device, 0x00, 0x00, 0x00); if (mmap_offset >= r->mmap_size) - return ider_packet_sense(r, seqno, device, 0x05, 0x21, 0x00); + return ider_packet_sense(r, device, 0x05, 0x21, 0x00); - return ider_data_to_host(r, seqno, device, lba_ptr, - mmap_len, true, use_dma); + return ider_data_to_host(r, device, lba_ptr, mmap_len, true, use_dma); } unsigned char ider_mode_page_01_floppy[] = { @@ -202,27 +200,27 @@ int ider_handle_command(struct redir *r, unsigned int seqno, if (!r->mmap_size || device != r->device) /* NOT READY, MEDIUM NOT PRESENT */ - return ider_packet_sense(r, seqno, device, 0x02, 0x3a, 0x0); + return ider_packet_sense(r, device, 0x02, 0x3a, 0x0); switch (cdb[0]) { case TEST_UNIT_READY: fprintf(stderr, "seqno %u: dev %02x test unit ready\n", seqno, device); - return ider_packet_sense(r, seqno, device, 0, 0, 0); + return ider_packet_sense(r, device, 0, 0, 0); case ALLOW_MEDIUM_REMOVAL: fprintf(stderr, "seqno %u: dev %02x %s medium removal\n", seqno, device, cdb[4] & 1 ? "prevent" : "allow"); - return ider_packet_sense(r, seqno, device, 0, 0, 0); + return ider_packet_sense(r, device, 0, 0, 0); case MODE_SENSE: fprintf(stderr, "seqno %u: dev %02x mode sense pg %02x\n", seqno, device, cdb[2]); if (cdb[2] != 0x3f || cdb[3] != 0x00) - return ider_packet_sense(r, seqno, device, 0x05, 0x24, 0x00); + return ider_packet_sense(r, device, 0x05, 0x24, 0x00); resp[0] = 0; /* Mode data length */ resp[1] = 0x05; /* Medium type: CD-ROM data only */ resp[2] = 0x80; /* device-specific parameters: Write Protect */ resp[3] = 0; /* Block-descriptor length */ - return ider_data_to_host(r, seqno, device, resp, 4, true, use_dma); + return ider_data_to_host(r, device, resp, 4, true, use_dma); case MODE_SENSE_10: mode_len = ((unsigned int)cdb[7] << 8) | (unsigned int)(cdb[8]); lba = (r->mmap_size >> r->lba_shift); @@ -269,11 +267,10 @@ int ider_handle_command(struct redir *r, unsigned int seqno, break; } if (!mode_sense) - return ider_packet_sense(r, seqno, device, 0x05, 0x20, 0x00); + return ider_packet_sense(r, device, 0x05, 0x20, 0x00); if (mode_len > sizeof(mode_sense)) mode_len = sizeof(mode_sense); - return ider_data_to_host(r, seqno, device, - mode_sense, mode_len, true, use_dma); + return ider_data_to_host(r, device, mode_sense, mode_len, true, use_dma); case READ_CAPACITY: lba = (r->mmap_size >> r->lba_shift) - 1; resp[0] = (lba >> 24) & 0xff; @@ -286,11 +283,11 @@ int ider_handle_command(struct redir *r, unsigned int seqno, resp[7] = r->lba_size & 0xff; fprintf(stderr, "seqno %u: read capacity size %u block size %u\n", seqno, lba, r->lba_size); - return ider_data_to_host(r, seqno, device, resp, 8, true, use_dma); + return ider_data_to_host(r, device, resp, 8, true, use_dma); case READ_TOC: if (device == 0xa0) { /* ILLEGAL REQUEST, INVALID COMMAND OPERATION CODE */ - return ider_packet_sense(r, seqno, device, 0x05, 0x20, 0x00); + return ider_packet_sense(r, device, 0x05, 0x20, 0x00); #if 0 } else { unsigned int resp_len; @@ -302,7 +299,7 @@ int ider_handle_command(struct redir *r, unsigned int seqno, msf = cdb[1] & 0x02; if (format != 0 && format != 1) { /* CHECK CONDITION, INVALID FIELD IN CDB */ - return ider_packet_sense(r, seqno, device, 0x05, 0x24, 0x00); + return ider_packet_sense(r, device, 0x05, 0x24, 0x00); } if (format == 0) { memset(resp, 0x0, 0x14); @@ -340,14 +337,13 @@ int ider_handle_command(struct redir *r, unsigned int seqno, resp[5] = 0x14; /* ADR: 0x01, CONTROL: 0x04 */ resp[6] = 0x01; /* First track in last complete session */ } - return ider_data_to_host(r, seqno, device, - resp, resp_len, true, use_dma); + return ider_data_to_host(r, device, resp, resp_len, true, use_dma); #else /* Not supported */ fprintf(stderr, "seqno %u: read toc (not implemented)\n", seqno); /* ILLEGAL REQUEST, INVALID COMMAND OPERATION CODE */ - return ider_packet_sense(r, seqno, device, 0x05, 0x20, 0x00); + return ider_packet_sense(r, device, 0x05, 0x20, 0x00); #endif } break; @@ -355,13 +351,13 @@ int ider_handle_command(struct redir *r, unsigned int seqno, fprintf(stderr, "seqno %u: device %02x get configuration (n/i)\n", seqno, device); /* ILLEGAL REQUEST, INVALID COMMAND OPERATION CODE */ - return ider_packet_sense(r, seqno, device, 0x05, 0x20, 0x00); + return ider_packet_sense(r, device, 0x05, 0x20, 0x00); case 0x51: /* READ DISC INFORMATION, missing from scsi.h */ /* Not supported */ fprintf(stderr, "seqno %u: read disc information (not implemented)\n", seqno); /* ILLEGAL REQUEST, INVALID COMMAND OPERATION CODE */ - return ider_packet_sense(r, seqno, device, 0x05, 0x20, 0x00); + return ider_packet_sense(r, device, 0x05, 0x20, 0x00); case READ_10: lba = (unsigned int)cdb[2] << 24 | (unsigned int)cdb[3] << 16 | @@ -369,11 +365,11 @@ int ider_handle_command(struct redir *r, unsigned int seqno, (unsigned int)cdb[5]; count = (unsigned int)cdb[7] << 8 | (unsigned int)cdb[8]; fprintf(stderr, "seqno %u: read lba %u count %u\n", seqno, lba, count); - return ider_read_data(r, seqno, device, use_dma, lba, count); + return ider_read_data(r, device, use_dma, lba, count); default: break; } fprintf(stderr, "seqno %u: unhandled command %02x\n", seqno, cdb[0]); /* ILLEGAL REQUEST, INVALID COMMAND OPERATION CODE */ - return ider_packet_sense(r, seqno, device, 0x05, 0x20, 0x00); + return ider_packet_sense(r, device, 0x05, 0x20, 0x00); } diff --git a/redir.c b/redir.c index 639036f..02a0984 100644 --- a/redir.c +++ b/redir.c @@ -108,6 +108,7 @@ ssize_t redir_write(struct redir *r, const char *buf, size_t count) rc = sslwrite(r->ctx, buf, count); if (-1 == rc) snprintf(r->err, sizeof(r->err), "write(socket): %s", strerror(errno)); + r->seqno++; return rc; } @@ -417,16 +418,15 @@ int redir_ider_config(struct redir *r) IDER_FEATURE_ENABLE | r->enable_options, 0, 0, 0 }; redir_state(r, REDIR_CFG_IDER); - r->seqno++; return redir_write(r, request, sizeof(request)); } -int redir_ider_reset(struct redir *r, unsigned int seqno) +int redir_ider_reset(struct redir *r) { unsigned char request[IDER_RESET_OCCURED_RESPONSE_LENGTH] = { IDER_RESET_OCCURED_RESPONSE, 0, 0, 0, - seqno & 0xff, (seqno >> 8) & 0xff, - (seqno >> 16) & 0xff, (seqno >> 24) & 0xff, + r->seqno & 0xff, (r->seqno >> 8) & 0xff, + (r->seqno >> 16) & 0xff, (r->seqno >> 24) & 0xff, }; return redir_write(r, request, sizeof(request)); @@ -686,17 +686,20 @@ repeat: bshift = r->blen; if (r->blen < IDER_DISABLE_ENABLE_FEATURES_REPLY_LENGTH) goto again; - if (r->seqno != redir_hdr_seqno(r)) - goto err; redir_state(r, REDIR_RUN_IDER); break; case IDER_RESET_OCCURED: bshift = r->blen; seqno = redir_hdr_seqno(r); fprintf(stderr, "seqno %u: reset, mask %u\n", seqno, r->buf[8]); - if (-1 == redir_ider_reset(r, seqno)) + if (-1 == redir_ider_reset(r)) goto err; break; + case IDER_ERROR_OCCURED: + bshift = r->blen; + seqno = redir_hdr_seqno(r); + fprintf(stderr, "seqno %u: error, mask %u\n", seqno, r->buf[8]); + goto err; case IDER_COMMAND_WRITTEN: bshift = r->blen; if (r->blen < sizeof(struct ider_command_written_message)) diff --git a/redir.h b/redir.h index 4b76e1e..1c53284 100644 --- a/redir.h +++ b/redir.h @@ -136,7 +136,7 @@ int redir_sol_send(struct redir *r, unsigned char *buf, int blen); int redir_sol_recv(struct redir *r); int redir_ider_start(struct redir *r); int redir_ider_config(struct redir *r); -int redir_ider_reset(struct redir *r, unsigned int seqno); +int redir_ider_reset(struct redir *r); int redir_ider_stop(struct redir *r); int redir_ider_send(struct redir *r, unsigned char *buf, int blen); int redir_ider_recv(struct redir *r); -- cgit