layer2/packet_queue: permit using full queue size
Previously, only PACKET_QUEUE_SIZE - 1 elements could be stored.
This commit is contained in:
parent
10a869d1a2
commit
9845514a46
|
@ -6,6 +6,7 @@ void packet_queue_init(packet_queue_t *q)
|
|||
{
|
||||
q->write_idx = 0;
|
||||
q->read_idx = 0;
|
||||
q->count = 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -23,9 +24,7 @@ bool packet_queue_can_add_packet(const packet_queue_t *q)
|
|||
|
||||
bool packet_queue_add(packet_queue_t *q, const layer2_packet_header_t *header, uint8_t *data, size_t data_len)
|
||||
{
|
||||
size_t next_idx = (q->write_idx + 1) % PACKET_QUEUE_SIZE;
|
||||
|
||||
if(next_idx == q->read_idx) {
|
||||
if (!packet_queue_can_add_packet(q)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -33,7 +32,8 @@ bool packet_queue_add(packet_queue_t *q, const layer2_packet_header_t *header, u
|
|||
q->entries[q->write_idx].data = data;
|
||||
q->entries[q->write_idx].data_len = data_len;
|
||||
|
||||
q->write_idx = next_idx;
|
||||
q->write_idx = (q->write_idx + 1) % PACKET_QUEUE_SIZE;
|
||||
q->count++;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ const packet_queue_entry_t* packet_queue_get(const packet_queue_t *q, size_t ind
|
|||
void packet_queue_delete(packet_queue_t *q, size_t count)
|
||||
{
|
||||
for(size_t i = 0; i < count; i++) {
|
||||
if(q->read_idx == q->write_idx) {
|
||||
if(packet_queue_get_used_space(q) == 0) {
|
||||
// stop early if there are no entries left to delete
|
||||
break;
|
||||
}
|
||||
|
@ -68,19 +68,19 @@ void packet_queue_delete(packet_queue_t *q, size_t count)
|
|||
|
||||
entry->data_len = 0;
|
||||
|
||||
q->read_idx++;
|
||||
q->read_idx %= PACKET_QUEUE_SIZE;
|
||||
q->read_idx = (q->read_idx + 1) % PACKET_QUEUE_SIZE;
|
||||
q->count--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
size_t packet_queue_get_free_space(const packet_queue_t *q)
|
||||
{
|
||||
return (q->read_idx + PACKET_QUEUE_SIZE - 1 - q->write_idx) % PACKET_QUEUE_SIZE;
|
||||
return PACKET_QUEUE_SIZE - q->count;
|
||||
}
|
||||
|
||||
|
||||
size_t packet_queue_get_used_space(const packet_queue_t *q)
|
||||
{
|
||||
return (q->write_idx + PACKET_QUEUE_SIZE - q->read_idx) % PACKET_QUEUE_SIZE;
|
||||
return q->count;
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ typedef struct packet_queue_s {
|
|||
|
||||
size_t write_idx; //!< Write index in \ref entries
|
||||
size_t read_idx; //!< Read index in \ref entries
|
||||
size_t count; //!< Currently used space in queue
|
||||
} packet_queue_t;
|
||||
|
||||
/*!\brief Initialize a packet queue.
|
||||
|
|
|
@ -26,23 +26,23 @@ int main(void)
|
|||
assert(packet_queue_add(&queue, &header, data, data_len));
|
||||
|
||||
assert(packet_queue_get_used_space(&queue) == 1);
|
||||
assert(packet_queue_get_free_space(&queue) == PACKET_QUEUE_SIZE-2);
|
||||
assert(packet_queue_get_free_space(&queue) == PACKET_QUEUE_SIZE-1);
|
||||
|
||||
// add more packets until the queue is / should be full
|
||||
for(size_t i = 0; i < PACKET_QUEUE_SIZE-2; i++) {
|
||||
for(size_t i = 1; i < PACKET_QUEUE_SIZE; i++) {
|
||||
char s[2];
|
||||
s[0] = 'A' + i + 1;
|
||||
s[0] = 'A' + i;
|
||||
s[1] = 0;
|
||||
|
||||
header.tx_seq_nr = i+1;
|
||||
header.tx_seq_nr = i;
|
||||
data_len = 2;
|
||||
data = malloc(data_len);
|
||||
strncpy((char*)data, s, data_len);
|
||||
|
||||
assert(packet_queue_add(&queue, &header, data, data_len));
|
||||
|
||||
assert(packet_queue_get_used_space(&queue) == i+2);
|
||||
assert(packet_queue_get_free_space(&queue) == PACKET_QUEUE_SIZE-3-i);
|
||||
assert(packet_queue_get_used_space(&queue) == i+1);
|
||||
assert(packet_queue_get_free_space(&queue) == PACKET_QUEUE_SIZE-1-i);
|
||||
}
|
||||
|
||||
// adding another packet should fail now
|
||||
|
@ -58,10 +58,10 @@ int main(void)
|
|||
|
||||
assert(entry->header.tx_seq_nr == 5);
|
||||
|
||||
// try to access the 10th and 11th packet, which are the last existing and
|
||||
// try to access the 11th and 12th packet, which are the last existing and
|
||||
// the first nonexisting packets
|
||||
assert(packet_queue_get(&queue, 9) != NULL);
|
||||
assert(packet_queue_get(&queue, 10) == NULL);
|
||||
assert(packet_queue_get(&queue, 10) != NULL);
|
||||
assert(packet_queue_get(&queue, 11) == NULL);
|
||||
|
||||
packet_queue_destroy(&queue);
|
||||
|
||||
|
|
Loading…
Reference in a new issue