From: Stefan Fritsch <stefan_frit...@genua.de> Incoming packets should never need chaining (bChainParamter => 0). If they ever do we will have to fix this later. Zero is still better than an uninitialized value.
Warn if outgoing packets try to use chaining (wLevelParameter != 0). As we are doing APDU level exchanges, the driver should not need to set these bits. Signed-off-by: Stefan Fritsch <stefan_frit...@genua.de> Signed-off-by: Christian Ehrhardt <christian_ehrha...@genua.de> --- hw/usb/dev-smartcard-reader.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-reader.c index bc4dc35d3f..974ecad18d 100644 --- a/hw/usb/dev-smartcard-reader.c +++ b/hw/usb/dev-smartcard-reader.c @@ -826,6 +826,7 @@ static void ccid_write_data_block(USBCCIDState *s, uint8_t slot, uint8_t seq, p->b.hdr.bSeq = seq; p->b.bStatus = ccid_calc_status(s); p->b.bError = s->bError; + p->bChainParameter = 0; if (p->b.bError) { DPRINTF(s, D_VERBOSE, "error %d\n", p->b.bError); } @@ -1027,6 +1028,10 @@ static void ccid_on_apdu_from_guest(USBCCIDState *s, CCID_XferBlock *recv) len = le32_to_cpu(recv->hdr.dwLength); DPRINTF(s, 1, "%s: seq %d, len %d\n", __func__, recv->hdr.bSeq, len); + if (le16_to_cpu(recv->wLevelParameter)) { + DPRINTF(s, D_WARN, "Unsupported non-zero level Parameter %x\n", + __func__, le16_to_cpu(recv->wLevelParameter)); + } ccid_add_pending_answer(s, (CCID_Header *)recv); if (s->card && len <= BULK_OUT_DATA_SIZE) { ccid_card_apdu_from_guest(s->card, recv->abData, len); -- 2.11.0