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) | 
