connection: add state checks

This commit is contained in:
Thomas Kolb 2024-08-25 23:27:22 +02:00
parent fc9e5c5229
commit 79c340c20d

View file

@ -29,6 +29,10 @@ result_t connection_init(connection_ctx_t *ctx, const ham64_t *my_addr, const ha
void connection_destroy(connection_ctx_t *ctx) void connection_destroy(connection_ctx_t *ctx)
{ {
if(ctx->conn_state == CONN_STATE_UNINITIALIZED) {
return;
}
ctx->conn_state = CONN_STATE_UNINITIALIZED; ctx->conn_state = CONN_STATE_UNINITIALIZED;
packet_queue_destroy(&ctx->packet_queue); packet_queue_destroy(&ctx->packet_queue);
} }
@ -36,6 +40,20 @@ void connection_destroy(connection_ctx_t *ctx)
result_t connection_handle_packet(connection_ctx_t *ctx, const uint8_t *buf, size_t buf_len) result_t connection_handle_packet(connection_ctx_t *ctx, const uint8_t *buf, size_t buf_len)
{ {
// check the connection state
switch(ctx->conn_state) {
case CONN_STATE_UNINITIALIZED:
case CONN_STATE_INITIALIZED:
case CONN_STATE_CLOSED:
LOG(LVL_ERR, "Trying to pass packet to connection in state %u", ctx->conn_state);
return ERR_INVALID_STATE;
case CONN_STATE_CONNECTING:
case CONN_STATE_ESTABLISHED:
// in these states, packets can be handled
break;
}
// check the CRC // check the CRC
size_t packet_size = buf_len - crc_sizeof_key(PAYLOAD_CRC_SCHEME); size_t packet_size = buf_len - crc_sizeof_key(PAYLOAD_CRC_SCHEME);
@ -142,6 +160,20 @@ uint8_t connection_get_last_acked_seq(const connection_ctx_t *ctx)
result_t connection_enqueue_packet(connection_ctx_t *ctx, uint8_t *buf, size_t buf_len) result_t connection_enqueue_packet(connection_ctx_t *ctx, uint8_t *buf, size_t buf_len)
{ {
// check the connection state
switch(ctx->conn_state) {
case CONN_STATE_UNINITIALIZED:
case CONN_STATE_INITIALIZED:
case CONN_STATE_CLOSED:
case CONN_STATE_CONNECTING:
LOG(LVL_ERR, "Trying to enqueue packet in inactive state %u", ctx->conn_state);
return ERR_INVALID_STATE;
case CONN_STATE_ESTABLISHED:
// in these states, packets can be handled
break;
}
layer2_packet_header_t header; layer2_packet_header_t header;
if(packet_queue_get_free_space(&ctx->packet_queue) == 0) { if(packet_queue_get_free_space(&ctx->packet_queue) == 0) {
@ -179,6 +211,20 @@ result_t connection_enqueue_packet(connection_ctx_t *ctx, uint8_t *buf, size_t b
result_t connection_add_empty_packet(connection_ctx_t *ctx, bool tx_request) result_t connection_add_empty_packet(connection_ctx_t *ctx, bool tx_request)
{ {
// check the connection state
switch(ctx->conn_state) {
case CONN_STATE_UNINITIALIZED:
case CONN_STATE_INITIALIZED:
case CONN_STATE_CLOSED:
case CONN_STATE_CONNECTING:
LOG(LVL_ERR, "Trying to add empty packet in inactive state %u", ctx->conn_state);
return ERR_INVALID_STATE;
case CONN_STATE_ESTABLISHED:
// in these states, packets can be handled
break;
}
layer2_packet_header_t header; layer2_packet_header_t header;
header.dst_addr.addr[0] = 0xFFFF; header.dst_addr.addr[0] = 0xFFFF;
@ -200,6 +246,20 @@ result_t connection_add_empty_packet(connection_ctx_t *ctx, bool tx_request)
size_t connection_encode_next_packet(connection_ctx_t *ctx, uint8_t ack_seq_nr, uint8_t *buf, size_t buf_len) size_t connection_encode_next_packet(connection_ctx_t *ctx, uint8_t ack_seq_nr, uint8_t *buf, size_t buf_len)
{ {
// check the connection state
switch(ctx->conn_state) {
case CONN_STATE_UNINITIALIZED:
case CONN_STATE_INITIALIZED:
case CONN_STATE_CLOSED:
LOG(LVL_ERR, "Trying to encode packet in inactive state %u", ctx->conn_state);
return ERR_INVALID_STATE;
case CONN_STATE_CONNECTING:
case CONN_STATE_ESTABLISHED:
// in these states, packets may be present for transmission
break;
}
const packet_queue_entry_t *entry = packet_queue_get(&ctx->packet_queue, ctx->next_packet_index); const packet_queue_entry_t *entry = packet_queue_get(&ctx->packet_queue, ctx->next_packet_index);
if(!entry) { if(!entry) {
@ -245,6 +305,8 @@ void connection_restart_tx(connection_ctx_t *ctx)
void connection_tx_clean_empty_packet(connection_ctx_t *ctx) void connection_tx_clean_empty_packet(connection_ctx_t *ctx)
{ {
assert(ctx->conn_state != CONN_STATE_UNINITIALIZED);
const packet_queue_entry_t *entry = packet_queue_get(&ctx->packet_queue, 0); const packet_queue_entry_t *entry = packet_queue_get(&ctx->packet_queue, 0);
if(entry && entry->header.msg_type == L2_MSG_TYPE_EMPTY) { if(entry && entry->header.msg_type == L2_MSG_TYPE_EMPTY) {
packet_queue_delete(&ctx->packet_queue, 1); packet_queue_delete(&ctx->packet_queue, 1);
@ -258,6 +320,20 @@ void connection_tx_clean_empty_packet(connection_ctx_t *ctx)
void connection_handle_ack(connection_ctx_t *ctx, uint8_t acked_seq) void connection_handle_ack(connection_ctx_t *ctx, uint8_t acked_seq)
{ {
// check the connection state
switch(ctx->conn_state) {
case CONN_STATE_UNINITIALIZED:
case CONN_STATE_INITIALIZED:
case CONN_STATE_CLOSED:
case CONN_STATE_CONNECTING:
LOG(LVL_ERR, "Trying to call connection_handle_ack() in inactive state %u", ctx->conn_state);
return;
case CONN_STATE_ESTABLISHED:
// in these states, packets may be present for transmission
break;
}
ctx->next_packet_index = 0; ctx->next_packet_index = 0;
size_t packets_to_remove = 0; size_t packets_to_remove = 0;
@ -292,6 +368,8 @@ void connection_handle_ack(connection_ctx_t *ctx, uint8_t acked_seq)
bool connection_can_transmit(const connection_ctx_t *ctx) bool connection_can_transmit(const connection_ctx_t *ctx)
{ {
assert(ctx->conn_state != CONN_STATE_UNINITIALIZED);
return (packet_queue_get_used_space(&ctx->packet_queue) != 0) return (packet_queue_get_used_space(&ctx->packet_queue) != 0)
&& (packet_queue_get(&ctx->packet_queue, ctx->next_packet_index) != NULL); && (packet_queue_get(&ctx->packet_queue, ctx->next_packet_index) != NULL);
} }