Interleave sending and receiving of packets to reduce rx latency (#515)
* Interleave sending and receiving of packets to reduce latency in receiving of packets * Add patch to CtapUsbSyscallDriver * Minor tweaks from review * Log when overwritting an existing reply * Only log when 'debug_ctap' is enabled * Make ctap mod public, as per review * Rename send_or_recv to send_and_maybe_recv * fix typo * Don't process packets on other transport while doing keepalive * Don't process packets on other transport while doing keepalive * More accurately determine if reply has finished * Move comment closer to appropriate location * Add tests for canceling keepalive packets * Added a TODO for kaczmarczyck re ctap module being public * remove the unnecessary sleep()s * undo messed up commit * address pylint warnings * Fix merge mess up, and patch fido2 Usage Page * Fix up completely borked merge * Remove patch to FIDO usage, after #523. * remove obsolete aspects to diff Co-authored-by: kaczmarczyck <43844792+kaczmarczyck@users.noreply.github.com>
This commit is contained in:
@@ -83,6 +83,7 @@ use crypto::hmac::hmac_256;
|
||||
use crypto::sha256::Sha256;
|
||||
use crypto::{ecdsa, Hash256};
|
||||
use embedded_time::duration::Milliseconds;
|
||||
use libtock_drivers::usb_ctap_hid::UsbEndpoint;
|
||||
use rng256::Rng256;
|
||||
use sk_cbor as cbor;
|
||||
use sk_cbor::cbor_map_options;
|
||||
@@ -274,7 +275,7 @@ fn send_keepalive_up_needed(
|
||||
let keepalive_msg = CtapHid::keepalive(cid, KeepaliveStatus::UpNeeded);
|
||||
for mut pkt in keepalive_msg {
|
||||
let ctap_hid_connection = transport.hid_connection(env);
|
||||
match ctap_hid_connection.send_or_recv_with_timeout(&mut pkt, timeout) {
|
||||
match ctap_hid_connection.send_and_maybe_recv(&mut pkt, timeout) {
|
||||
Ok(SendOrRecvStatus::Timeout) => {
|
||||
debug_ctap!(env, "Sending a KEEPALIVE packet timed out");
|
||||
// TODO: abort user presence test?
|
||||
@@ -283,7 +284,23 @@ fn send_keepalive_up_needed(
|
||||
Ok(SendOrRecvStatus::Sent) => {
|
||||
debug_ctap!(env, "Sent KEEPALIVE packet");
|
||||
}
|
||||
Ok(SendOrRecvStatus::Received) => {
|
||||
Ok(SendOrRecvStatus::Received(endpoint)) => {
|
||||
let rx_transport = match endpoint {
|
||||
UsbEndpoint::MainHid => Transport::MainHid,
|
||||
#[cfg(feature = "vendor_hid")]
|
||||
UsbEndpoint::VendorHid => Transport::VendorHid,
|
||||
};
|
||||
if rx_transport != transport {
|
||||
debug_ctap!(
|
||||
env,
|
||||
"Received a packet on transport {:?} while sending a KEEPALIVE packet on transport {:?}",
|
||||
rx_transport, transport
|
||||
);
|
||||
// Ignore this packet.
|
||||
// TODO(liamjm): Support receiving packets on both interfaces.
|
||||
continue;
|
||||
}
|
||||
|
||||
// We only parse one packet, because we only care about CANCEL.
|
||||
let (received_cid, processed_packet) = CtapHid::process_single_packet(&pkt);
|
||||
if received_cid != &cid {
|
||||
|
||||
Reference in New Issue
Block a user