summaryrefslogtreecommitdiff
path: root/src/common/pio_packet_queue.cpp
blob: ef8bf4cf892947ce038b494350836546b4c25c24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
**********************************************************************************************
*	File: pio_packet_queue.cpp
*   Description:
*	Authors: Liu WenTan <[email protected]>
*	Date:    2022-07-15
*   Copyright: (c) 2018-2022 Geedge Networks, Inc. All rights reserved.
***********************************************************************************************
*/

#include <string.h>

#include "../../sdk/include/utils.h"
#include "pio_packet_queue.h"

static int packet_copy_data_offset(uint8_t *ptr, uint32_t offset, const uint8_t *data, uint32_t data_len)
{
	memcpy(ptr + offset, data, data_len);
	
	return 0;
}

int packet_copy_data(uint8_t *ptr, const uint8_t *pkt_data, uint32_t pkt_len)
{   
	return packet_copy_data_offset(ptr, 0, pkt_data, pkt_len);
}

void pio_packet_enqueue(struct pio_packet_queue *q, struct pio_packet *p)
{
    if (nullptr == p)
        return;

    /* more packets in queue */
    if (q->top != nullptr) {
        p->prev = nullptr;
        p->next = q->top;
        q->top->prev = p;
        q->top = p;
    /* only packet */
    } else {
        p->prev = nullptr;
        p->next = nullptr;
        q->top = p;
        q->bot = p;
    }
    q->len++;
}

struct pio_packet *pio_packet_dequeue(struct pio_packet_queue *q)
{
    struct pio_packet *p = nullptr;

    /* if the queue is empty there are no packets left. */
    if (q->len == 0) {
        return nullptr;
    }

    q->len--;

    /* pull the bottom packet from the queue */
    p = q->bot;

    /* more packets in queue */
    if (q->bot->prev != nullptr) {
        q->bot = q->bot->prev;
        q->bot->next = nullptr;
    /* just the one we remove, so now empty */
    } else {
        q->top = nullptr;
        q->bot = nullptr;
    }

    p->next = nullptr;
    p->prev = nullptr;

    return p;
}

void release_pio_packet_queue(struct pio_packet_queue *q)
{
    if (nullptr == q) {
        return;
    }

    while (q->len != 0) {
        struct pio_packet *p = pio_packet_dequeue(q);
        q->len--;
        FREE(p);
    }
}