2 #include <aura/private.h>
4 #include <aura/packetizer.h>
12 enum packetizer_state {
18 int aura_packetizer_max_overhead()
20 return sizeof(
struct aura_packet8);
23 struct aura_packetizer *aura_packetizer_create(
struct aura_node *node)
25 struct aura_packetizer *pkt = malloc(
sizeof(*pkt));
28 BUG(node,
"packetizer allocation failed");
40 void aura_packetizer_destroy(
struct aura_packetizer *pkt)
47 void aura_packetizer_set_receive_cb(
48 struct aura_packetizer *pkt,
56 int aura_packetizer_verify_header(
struct aura_packetizer *pkt,
struct aura_packet8 *packet)
58 if (packet->start != PACKET_START)
60 if (packet->datalen != ((~packet->invdatalen) & 0xff))
62 if (packet->cont != pkt->expect_cont)
67 int aura_packetizer_verify_data(
struct aura_packetizer *pkt,
struct aura_packet8 *packet)
69 uint8_t crc = crc8(0, (
unsigned char *)packet->data, packet->datalen);
70 return !(packet->crc8 == crc);
73 void aura_packetizer_encapsulate(
struct aura_packetizer * pkt,
74 struct aura_packet8 * packet,
78 BUG(pkt->node,
"Packet is too big");
80 packet->start = PACKET_START;
81 packet->cont = (pkt->cont++ & 0xff);
82 pkt->expect_cont = packet->cont;
83 packet->datalen = len;
84 packet->invdatalen = ~packet->datalen;
85 packet->crc8 = crc8(0, (
unsigned char *)packet->data, packet->datalen);
88 void aura_packetizer_reset(
struct aura_packetizer *pkt)
90 pkt->state = STATE_SEARCH_START;
98 static void packetizer_dispatch_packet(
struct aura_packetizer *pkt)
100 slog(4, SLOG_DEBUG,
"packetizer: dispatching packet");
103 pkt->recvcb(pkt->curbuf, pkt->recvarg);
107 aura_packetizer_reset(pkt);
117 int aura_packetizer_feed_once(
struct aura_packetizer *pkt,
const char *data,
size_t len)
121 struct aura_packet8 *hdr = &pkt->headerbuf;
122 switch (pkt->state) {
123 case STATE_SEARCH_START:
124 while ((pos < len) && data[pos] != PACKET_START)
127 pkt->state = STATE_READ_HEADER;
129 slog(4, SLOG_DEBUG,
"packetizer: Found start at %d", pos);
132 case STATE_READ_HEADER:
134 int tocopy = min_t(
int,
sizeof(
struct aura_packet8) - pkt->copied, len);
135 char *dest = (
char *)&pkt->headerbuf;
136 memmove(&dest[pkt->copied], &data[pos], tocopy);
137 pkt->copied += tocopy;
139 if ((
sizeof(
struct aura_packet8) == pkt->copied)) {
140 ret = aura_packetizer_verify_header(pkt, &pkt->headerbuf);
142 pkt->state = STATE_READ_DATA;
145 BUG(pkt->node,
"Internal packetizer bug");
148 BUG(pkt->node,
"Packetizer failed to alloc buffer");
152 sizeof(pkt->headerbuf)
155 aura_packetizer_reset(pkt);
156 aura_packetizer_feed(pkt, &dest[1],
157 sizeof(
struct aura_packet8) - 1);
162 case STATE_READ_DATA:
164 int tocopy = min_t(
int, hdr->datalen - pkt->copied, len);
167 pkt->copied += tocopy;
168 if (pkt->copied == hdr->datalen) {
169 aura_hexdump(
"out", pkt->curbuf->data, pkt->curbuf->pos);;
170 ret = aura_packetizer_verify_data(pkt,
171 (
struct aura_packet8 *) pkt->curbuf->data);
173 packetizer_dispatch_packet(pkt);
176 int torefeed = pkt->copied;
179 aura_packetizer_reset(pkt);
197 void aura_packetizer_feed(
struct aura_packetizer *pkt,
const char *data,
size_t len)
201 pos+= aura_packetizer_feed_once(pkt, &data[pos], len-pos);
struct aura_buffer * aura_buffer_request(struct aura_node *nd, int size)
void aura_buffer_put_bin(struct aura_buffer *buf, const void *data, int len)
Copy data of len bytes to aura buffer from a buffer pointed by data.
static void aura_buffer_rewind(struct aura_buffer *buf)
const void * aura_buffer_get_bin(struct aura_buffer *buf, int len)
Get a pointer to the binary data block within buffer and advance internal pointer by len bytes...
void aura_buffer_release(struct aura_buffer *buf)