diff options
author | Szczepan Zalega <szczepan@nitrokey.com> | 2016-10-17 22:08:59 +0200 |
---|---|---|
committer | Szczepan Zalega <szczepan@nitrokey.com> | 2016-10-19 16:35:22 +0200 |
commit | a47a7bc3c838a37e15e4464be75736cd83573da2 (patch) | |
tree | 6eff6e94f01e656e4d184574bb31009610772053 | |
parent | 62f48fa92db1be555a955328c6654a301cf6f7c8 (diff) | |
download | libnitrokey-a47a7bc3c838a37e15e4464be75736cd83573da2.tar.gz libnitrokey-a47a7bc3c838a37e15e4464be75736cd83573da2.tar.bz2 |
Resend outgoing packet on invalid crc and when used all receiving retries
Signed-off-by: Szczepan Zalega <szczepan@nitrokey.com>
-rw-r--r-- | include/device_proto.h | 117 |
1 files changed, 66 insertions, 51 deletions
diff --git a/include/device_proto.h b/include/device_proto.h index ff8bb67..2d39a04 100644 --- a/include/device_proto.h +++ b/include/device_proto.h @@ -218,61 +218,76 @@ namespace nitrokey { if (!outp.isValid()) throw std::runtime_error("Invalid outgoing packet"); - status = dev.send(&outp); - if (status <= 0) - throw std::runtime_error( - std::string("Device error while sending command ") + - std::to_string((int) (status))); - - std::this_thread::sleep_for(dev.get_send_receive_delay()); - - // FIXME make checks done in device:recv here - int retry = dev.get_retry_count(); - while (retry-- > 0) { - status = dev.recv(&resp); - - if (dev.get_device_model() == DeviceModel::STORAGE && - resp.command_id >= 0x20 && -// resp.command_id <= 0x20 + 26 - resp.command_id < 0x60 - ){ + int retry = 0; + int sending_retry_counter = 3; + while (sending_retry_counter-->0) { + status = dev.send(&outp); + if (status <= 0) + throw std::runtime_error( + std::string("Device error while sending command ") + + std::to_string((int) (status))); + + std::this_thread::sleep_for(dev.get_send_receive_delay()); + + // FIXME make checks done in device:recv here + retry = dev.get_retry_count(); + while (retry-- > 0) { + status = dev.recv(&resp); + + if (dev.get_device_model() == DeviceModel::STORAGE && + resp.command_id >= 0x20 && + // resp.command_id <= 0x20 + 26 + resp.command_id < 0x60 + ) { Log::instance()(std::string("Detected storage device cmd, status: ") + - std::to_string(resp.StorageStatus.Status_u8), Loglevel::DEBUG_L2); - - resp.last_command_status = 0; - switch(resp.StorageStatus.Status_u8){ - case 0: - case 1: - resp.last_command_status = 0; - resp.device_status = 0; - break; - case 2: - resp.last_command_status = 0; - resp.device_status = 1; //pro busy - break; - case 3: - case 4: - resp.last_command_status = 4; - resp.device_status = 0; - break; - }; + std::to_string(resp.StorageStatus.Status_u8), Loglevel::DEBUG_L2); + + resp.last_command_status = 0; + switch (resp.StorageStatus.Status_u8) { + case 0: + case 1: + resp.last_command_status = 0; + resp.device_status = 0; + break; + case 2: + resp.last_command_status = 0; + resp.device_status = 1; //pro busy + break; + case 3: + case 4: + resp.last_command_status = 4; + resp.device_status = 0; + break; + }; + } + + //SENDPASSWORD gives wrong CRC , for now rely on !=0 (TODO report) +// if (resp.device_status == 0 && resp.last_command_crc == outp.crc && resp.isCRCcorrect()) break; + if (resp.device_status == 0 && resp.last_command_crc == outp.crc && resp.isValid()) break; + if (resp.device_status == 1 ) { + retry++; + Log::instance()("Status busy, not decresing retry counter: " + std::to_string(retry), Loglevel::DEBUG_L2); + } + Log::instance()(std::string("Retry status - dev status, equal crc, correct CRC: ") + + std::to_string(resp.device_status) + " " + + std::to_string(resp.last_command_crc == outp.crc) + + " " + std::to_string(resp.isCRCcorrect()), Loglevel::DEBUG_L2); + + Log::instance()( + "Device is not ready or received packet's last CRC is not equal to sent CRC packet, retrying...", + Loglevel::DEBUG); + Log::instance()("Invalid incoming HID packet:", Loglevel::DEBUG_L2); + Log::instance()((std::string) (resp), Loglevel::DEBUG_L2); + std::this_thread::sleep_for(dev.get_retry_timeout()); + continue; } - - dev.set_last_command_status(resp.last_command_status); // FIXME should be handled on device.recv - if (resp.device_status == 0 && resp.last_command_crc == outp.crc) break; - Log::instance()(std::string("Retry status: ") - + std::to_string(resp.device_status) + " " + - std::to_string(resp.last_command_crc==outp.crc), Loglevel::DEBUG_L2); - - Log::instance()( - "Device is not ready or received packet's last CRC is not equal to sent CRC packet, retrying...", - Loglevel::DEBUG); - Log::instance()("Invalid incoming HID packet:", Loglevel::DEBUG_L2); - Log::instance()((std::string) (resp), Loglevel::DEBUG_L2); - std::this_thread::sleep_for(dev.get_retry_timeout()); - continue; + Log::instance()(std::string("Resending (outer loop) "), Loglevel::DEBUG_L2); + Log::instance()(std::string("sending_retry_counter count: ") + std::to_string(sending_retry_counter), Loglevel::DEBUG); } + + dev.set_last_command_status(resp.last_command_status); // FIXME should be handled on device.recv + clear_packet(outp); if (status <= 0) |