summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2022-04-13 12:51:56 +0200
committerGerd Hoffmann <kraxel@redhat.com>2022-04-22 14:52:30 +0200
commit59f531cffb9c7fdbabf5f8f8e4655cafc6549f09 (patch)
tree1fb681508dc2bbb120df9d4809b6bb734cc50f87
parent4d10e4bfde39110d8119e57730581d391ce6c8e7 (diff)
downloadamtterm-59f531cffb9c7fdbabf5f8f8e4655cafc6549f09.tar.gz
redir: split client and server seqno
Both use independent counter. Signed-off-by: Hannes Reinecke <hare@suse.de>
-rw-r--r--ider.c56
-rw-r--r--redir.c17
-rw-r--r--redir.h2
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 <scsi/scsi.h>
#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);