harden USB telemetry transport
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
#include "trikke_transport.h"
|
||||
|
||||
static bool status_is_valid(trikke_transport_status_t status)
|
||||
{
|
||||
return status >= TRIKKE_TRANSPORT_COMPLETE &&
|
||||
status <= TRIKKE_TRANSPORT_FATAL;
|
||||
}
|
||||
|
||||
void trikke_transport_sender_init(trikke_transport_sender_t *sender)
|
||||
{
|
||||
if (sender != NULL) {
|
||||
sender->pending = false;
|
||||
}
|
||||
}
|
||||
|
||||
trikke_transport_status_t trikke_transport_sender_step(
|
||||
trikke_transport_sender_t *sender,
|
||||
const trikke_transport_t *transport,
|
||||
const uint8_t *packet,
|
||||
size_t packet_size)
|
||||
{
|
||||
if (sender == NULL || transport == NULL || transport->begin == NULL ||
|
||||
transport->poll == NULL || packet == NULL || packet_size == 0) {
|
||||
return TRIKKE_TRANSPORT_FATAL;
|
||||
}
|
||||
|
||||
const trikke_transport_status_t status = sender->pending
|
||||
? transport->poll(transport->context)
|
||||
: transport->begin(transport->context, packet, packet_size);
|
||||
if (!status_is_valid(status)) {
|
||||
sender->pending = false;
|
||||
return TRIKKE_TRANSPORT_FATAL;
|
||||
}
|
||||
|
||||
if (status == TRIKKE_TRANSPORT_PENDING) {
|
||||
sender->pending = true;
|
||||
} else {
|
||||
// RETRY from poll is allowed only when the backend has discarded or
|
||||
// otherwise resolved the old transfer and knows resubmission is safe.
|
||||
sender->pending = false;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
Reference in New Issue
Block a user