| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675 |
- /*
- DO NOT EDIT THIS FILE!
- This file was automatically generated by the bproto generator.
- */
- #include <stdint.h>
- #include <string.h>
- #include <misc/debug.h>
- #include <misc/byteorder.h>
- #include <bproto/BProto.h>
- #define addr_SIZEtype (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint8_s))
- #define addr_SIZEip_port (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (2))
- #define addr_SIZEipv4_addr (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (4))
- #define addr_SIZEipv6_addr (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (16))
- typedef struct {
- uint8_t *out;
- int used;
- int type_count;
- int ip_port_count;
- int ipv4_addr_count;
- int ipv6_addr_count;
- } addrWriter;
- static void addrWriter_Init (addrWriter *o, uint8_t *out);
- static int addrWriter_Finish (addrWriter *o);
- static void addrWriter_Addtype (addrWriter *o, uint8_t v);
- static uint8_t * addrWriter_Addip_port (addrWriter *o);
- static uint8_t * addrWriter_Addipv4_addr (addrWriter *o);
- static uint8_t * addrWriter_Addipv6_addr (addrWriter *o);
- typedef struct {
- uint8_t *buf;
- int buf_len;
- int type_start;
- int type_span;
- int type_pos;
- int ip_port_start;
- int ip_port_span;
- int ip_port_pos;
- int ipv4_addr_start;
- int ipv4_addr_span;
- int ipv4_addr_pos;
- int ipv6_addr_start;
- int ipv6_addr_span;
- int ipv6_addr_pos;
- } addrParser;
- static int addrParser_Init (addrParser *o, uint8_t *buf, int buf_len);
- static int addrParser_GotEverything (addrParser *o);
- static int addrParser_Gettype (addrParser *o, uint8_t *v);
- static void addrParser_Resettype (addrParser *o);
- static void addrParser_Forwardtype (addrParser *o);
- static int addrParser_Getip_port (addrParser *o, uint8_t **data);
- static void addrParser_Resetip_port (addrParser *o);
- static void addrParser_Forwardip_port (addrParser *o);
- static int addrParser_Getipv4_addr (addrParser *o, uint8_t **data);
- static void addrParser_Resetipv4_addr (addrParser *o);
- static void addrParser_Forwardipv4_addr (addrParser *o);
- static int addrParser_Getipv6_addr (addrParser *o, uint8_t **data);
- static void addrParser_Resetipv6_addr (addrParser *o);
- static void addrParser_Forwardipv6_addr (addrParser *o);
- void addrWriter_Init (addrWriter *o, uint8_t *out)
- {
- o->out = out;
- o->used = 0;
- o->type_count = 0;
- o->ip_port_count = 0;
- o->ipv4_addr_count = 0;
- o->ipv6_addr_count = 0;
- }
- int addrWriter_Finish (addrWriter *o)
- {
- ASSERT(o->used >= 0)
- ASSERT(o->type_count == 1)
- ASSERT(o->ip_port_count >= 0 && o->ip_port_count <= 1)
- ASSERT(o->ipv4_addr_count >= 0 && o->ipv4_addr_count <= 1)
- ASSERT(o->ipv6_addr_count >= 0 && o->ipv6_addr_count <= 1)
- return o->used;
- }
- void addrWriter_Addtype (addrWriter *o, uint8_t v)
- {
- ASSERT(o->used >= 0)
- ASSERT(o->type_count == 0)
-
- struct BProto_header_s header;
- header.id = htol16(1);
- header.type = htol16(BPROTO_TYPE_UINT8);
- memcpy(o->out + o->used, &header, sizeof(header));
- o->used += sizeof(struct BProto_header_s);
- struct BProto_uint8_s data;
- data.v = htol8(v);
- memcpy(o->out + o->used, &data, sizeof(data));
- o->used += sizeof(struct BProto_uint8_s);
- o->type_count++;
- }
- uint8_t * addrWriter_Addip_port (addrWriter *o)
- {
- ASSERT(o->used >= 0)
- ASSERT(o->ip_port_count == 0)
-
- struct BProto_header_s header;
- header.id = htol16(2);
- header.type = htol16(BPROTO_TYPE_CONSTDATA);
- memcpy(o->out + o->used, &header, sizeof(header));
- o->used += sizeof(struct BProto_header_s);
- struct BProto_data_header_s data;
- data.len = htol32(2);
- memcpy(o->out + o->used, &data, sizeof(data));
- o->used += sizeof(struct BProto_data_header_s);
- uint8_t *dest = (o->out + o->used);
- o->used += (2);
- o->ip_port_count++;
- return dest;
- }
- uint8_t * addrWriter_Addipv4_addr (addrWriter *o)
- {
- ASSERT(o->used >= 0)
- ASSERT(o->ipv4_addr_count == 0)
-
- struct BProto_header_s header;
- header.id = htol16(3);
- header.type = htol16(BPROTO_TYPE_CONSTDATA);
- memcpy(o->out + o->used, &header, sizeof(header));
- o->used += sizeof(struct BProto_header_s);
- struct BProto_data_header_s data;
- data.len = htol32(4);
- memcpy(o->out + o->used, &data, sizeof(data));
- o->used += sizeof(struct BProto_data_header_s);
- uint8_t *dest = (o->out + o->used);
- o->used += (4);
- o->ipv4_addr_count++;
- return dest;
- }
- uint8_t * addrWriter_Addipv6_addr (addrWriter *o)
- {
- ASSERT(o->used >= 0)
- ASSERT(o->ipv6_addr_count == 0)
-
- struct BProto_header_s header;
- header.id = htol16(4);
- header.type = htol16(BPROTO_TYPE_CONSTDATA);
- memcpy(o->out + o->used, &header, sizeof(header));
- o->used += sizeof(struct BProto_header_s);
- struct BProto_data_header_s data;
- data.len = htol32(16);
- memcpy(o->out + o->used, &data, sizeof(data));
- o->used += sizeof(struct BProto_data_header_s);
- uint8_t *dest = (o->out + o->used);
- o->used += (16);
- o->ipv6_addr_count++;
- return dest;
- }
- int addrParser_Init (addrParser *o, uint8_t *buf, int buf_len)
- {
- ASSERT(buf_len >= 0)
- o->buf = buf;
- o->buf_len = buf_len;
- o->type_start = o->buf_len;
- o->type_span = 0;
- o->type_pos = 0;
- o->ip_port_start = o->buf_len;
- o->ip_port_span = 0;
- o->ip_port_pos = 0;
- o->ipv4_addr_start = o->buf_len;
- o->ipv4_addr_span = 0;
- o->ipv4_addr_pos = 0;
- o->ipv6_addr_start = o->buf_len;
- o->ipv6_addr_span = 0;
- o->ipv6_addr_pos = 0;
- int type_count = 0;
- int ip_port_count = 0;
- int ipv4_addr_count = 0;
- int ipv6_addr_count = 0;
- int pos = 0;
- int left = o->buf_len;
- while (left > 0) {
- int entry_pos = pos;
- if (!(left >= sizeof(struct BProto_header_s))) {
- return 0;
- }
- struct BProto_header_s header;
- memcpy(&header, o->buf + pos, sizeof(header));
- pos += sizeof(struct BProto_header_s);
- left -= sizeof(struct BProto_header_s);
- uint16_t type = ltoh16(header.type);
- uint16_t id = ltoh16(header.id);
- switch (type) {
- case BPROTO_TYPE_UINT8: {
- if (!(left >= sizeof(struct BProto_uint8_s))) {
- return 0;
- }
- pos += sizeof(struct BProto_uint8_s);
- left -= sizeof(struct BProto_uint8_s);
- switch (id) {
- case 1:
- if (o->type_start == o->buf_len) {
- o->type_start = entry_pos;
- }
- o->type_span = pos - o->type_start;
- type_count++;
- break;
- default:
- return 0;
- }
- } break;
- case BPROTO_TYPE_UINT16: {
- if (!(left >= sizeof(struct BProto_uint16_s))) {
- return 0;
- }
- pos += sizeof(struct BProto_uint16_s);
- left -= sizeof(struct BProto_uint16_s);
- switch (id) {
- default:
- return 0;
- }
- } break;
- case BPROTO_TYPE_UINT32: {
- if (!(left >= sizeof(struct BProto_uint32_s))) {
- return 0;
- }
- pos += sizeof(struct BProto_uint32_s);
- left -= sizeof(struct BProto_uint32_s);
- switch (id) {
- default:
- return 0;
- }
- } break;
- case BPROTO_TYPE_UINT64: {
- if (!(left >= sizeof(struct BProto_uint64_s))) {
- return 0;
- }
- pos += sizeof(struct BProto_uint64_s);
- left -= sizeof(struct BProto_uint64_s);
- switch (id) {
- default:
- return 0;
- }
- } break;
- case BPROTO_TYPE_DATA:
- case BPROTO_TYPE_CONSTDATA:
- {
- if (!(left >= sizeof(struct BProto_data_header_s))) {
- return 0;
- }
- struct BProto_data_header_s val;
- memcpy(&val, o->buf + pos, sizeof(val));
- pos += sizeof(struct BProto_data_header_s);
- left -= sizeof(struct BProto_data_header_s);
- uint32_t payload_len = ltoh32(val.len);
- if (!(left >= payload_len)) {
- return 0;
- }
- pos += payload_len;
- left -= payload_len;
- switch (id) {
- case 2:
- if (!(type == BPROTO_TYPE_CONSTDATA)) {
- return 0;
- }
- if (!(payload_len == (2))) {
- return 0;
- }
- if (o->ip_port_start == o->buf_len) {
- o->ip_port_start = entry_pos;
- }
- o->ip_port_span = pos - o->ip_port_start;
- ip_port_count++;
- break;
- case 3:
- if (!(type == BPROTO_TYPE_CONSTDATA)) {
- return 0;
- }
- if (!(payload_len == (4))) {
- return 0;
- }
- if (o->ipv4_addr_start == o->buf_len) {
- o->ipv4_addr_start = entry_pos;
- }
- o->ipv4_addr_span = pos - o->ipv4_addr_start;
- ipv4_addr_count++;
- break;
- case 4:
- if (!(type == BPROTO_TYPE_CONSTDATA)) {
- return 0;
- }
- if (!(payload_len == (16))) {
- return 0;
- }
- if (o->ipv6_addr_start == o->buf_len) {
- o->ipv6_addr_start = entry_pos;
- }
- o->ipv6_addr_span = pos - o->ipv6_addr_start;
- ipv6_addr_count++;
- break;
- default:
- return 0;
- }
- } break;
- default:
- return 0;
- }
- }
- if (!(type_count == 1)) {
- return 0;
- }
- if (!(ip_port_count <= 1)) {
- return 0;
- }
- if (!(ipv4_addr_count <= 1)) {
- return 0;
- }
- if (!(ipv6_addr_count <= 1)) {
- return 0;
- }
- return 1;
- }
- int addrParser_GotEverything (addrParser *o)
- {
- return (
- o->type_pos == o->type_span
- &&
- o->ip_port_pos == o->ip_port_span
- &&
- o->ipv4_addr_pos == o->ipv4_addr_span
- &&
- o->ipv6_addr_pos == o->ipv6_addr_span
- );
- }
- int addrParser_Gettype (addrParser *o, uint8_t *v)
- {
- ASSERT(o->type_pos >= 0)
- ASSERT(o->type_pos <= o->type_span)
- int left = o->type_span - o->type_pos;
- while (left > 0) {
- ASSERT(left >= sizeof(struct BProto_header_s))
- struct BProto_header_s header;
- memcpy(&header, o->buf + o->type_start + o->type_pos, sizeof(header));
- o->type_pos += sizeof(struct BProto_header_s);
- left -= sizeof(struct BProto_header_s);
- uint16_t type = ltoh16(header.type);
- uint16_t id = ltoh16(header.id);
- switch (type) {
- case BPROTO_TYPE_UINT8: {
- ASSERT(left >= sizeof(struct BProto_uint8_s))
- struct BProto_uint8_s val;
- memcpy(&val, o->buf + o->type_start + o->type_pos, sizeof(val));
- o->type_pos += sizeof(struct BProto_uint8_s);
- left -= sizeof(struct BProto_uint8_s);
- if (id == 1) {
- *v = ltoh8(val.v);
- return 1;
- }
- } break;
- case BPROTO_TYPE_UINT16: {
- ASSERT(left >= sizeof(struct BProto_uint16_s))
- o->type_pos += sizeof(struct BProto_uint16_s);
- left -= sizeof(struct BProto_uint16_s);
- } break;
- case BPROTO_TYPE_UINT32: {
- ASSERT(left >= sizeof(struct BProto_uint32_s))
- o->type_pos += sizeof(struct BProto_uint32_s);
- left -= sizeof(struct BProto_uint32_s);
- } break;
- case BPROTO_TYPE_UINT64: {
- ASSERT(left >= sizeof(struct BProto_uint64_s))
- o->type_pos += sizeof(struct BProto_uint64_s);
- left -= sizeof(struct BProto_uint64_s);
- } break;
- case BPROTO_TYPE_DATA:
- case BPROTO_TYPE_CONSTDATA:
- {
- ASSERT(left >= sizeof(struct BProto_data_header_s))
- struct BProto_data_header_s val;
- memcpy(&val, o->buf + o->type_start + o->type_pos, sizeof(val));
- o->type_pos += sizeof(struct BProto_data_header_s);
- left -= sizeof(struct BProto_data_header_s);
- uint32_t payload_len = ltoh32(val.len);
- ASSERT(left >= payload_len)
- o->type_pos += payload_len;
- left -= payload_len;
- } break;
- default:
- ASSERT(0);
- }
- }
- return 0;
- }
- void addrParser_Resettype (addrParser *o)
- {
- o->type_pos = 0;
- }
- void addrParser_Forwardtype (addrParser *o)
- {
- o->type_pos = o->type_span;
- }
- int addrParser_Getip_port (addrParser *o, uint8_t **data)
- {
- ASSERT(o->ip_port_pos >= 0)
- ASSERT(o->ip_port_pos <= o->ip_port_span)
- int left = o->ip_port_span - o->ip_port_pos;
- while (left > 0) {
- ASSERT(left >= sizeof(struct BProto_header_s))
- struct BProto_header_s header;
- memcpy(&header, o->buf + o->ip_port_start + o->ip_port_pos, sizeof(header));
- o->ip_port_pos += sizeof(struct BProto_header_s);
- left -= sizeof(struct BProto_header_s);
- uint16_t type = ltoh16(header.type);
- uint16_t id = ltoh16(header.id);
- switch (type) {
- case BPROTO_TYPE_UINT8: {
- ASSERT(left >= sizeof(struct BProto_uint8_s))
- o->ip_port_pos += sizeof(struct BProto_uint8_s);
- left -= sizeof(struct BProto_uint8_s);
- } break;
- case BPROTO_TYPE_UINT16: {
- ASSERT(left >= sizeof(struct BProto_uint16_s))
- o->ip_port_pos += sizeof(struct BProto_uint16_s);
- left -= sizeof(struct BProto_uint16_s);
- } break;
- case BPROTO_TYPE_UINT32: {
- ASSERT(left >= sizeof(struct BProto_uint32_s))
- o->ip_port_pos += sizeof(struct BProto_uint32_s);
- left -= sizeof(struct BProto_uint32_s);
- } break;
- case BPROTO_TYPE_UINT64: {
- ASSERT(left >= sizeof(struct BProto_uint64_s))
- o->ip_port_pos += sizeof(struct BProto_uint64_s);
- left -= sizeof(struct BProto_uint64_s);
- } break;
- case BPROTO_TYPE_DATA:
- case BPROTO_TYPE_CONSTDATA:
- {
- ASSERT(left >= sizeof(struct BProto_data_header_s))
- struct BProto_data_header_s val;
- memcpy(&val, o->buf + o->ip_port_start + o->ip_port_pos, sizeof(val));
- o->ip_port_pos += sizeof(struct BProto_data_header_s);
- left -= sizeof(struct BProto_data_header_s);
- uint32_t payload_len = ltoh32(val.len);
- ASSERT(left >= payload_len)
- uint8_t *payload = o->buf + o->ip_port_start + o->ip_port_pos;
- o->ip_port_pos += payload_len;
- left -= payload_len;
- if (type == BPROTO_TYPE_CONSTDATA && id == 2) {
- *data = payload;
- return 1;
- }
- } break;
- default:
- ASSERT(0);
- }
- }
- return 0;
- }
- void addrParser_Resetip_port (addrParser *o)
- {
- o->ip_port_pos = 0;
- }
- void addrParser_Forwardip_port (addrParser *o)
- {
- o->ip_port_pos = o->ip_port_span;
- }
- int addrParser_Getipv4_addr (addrParser *o, uint8_t **data)
- {
- ASSERT(o->ipv4_addr_pos >= 0)
- ASSERT(o->ipv4_addr_pos <= o->ipv4_addr_span)
- int left = o->ipv4_addr_span - o->ipv4_addr_pos;
- while (left > 0) {
- ASSERT(left >= sizeof(struct BProto_header_s))
- struct BProto_header_s header;
- memcpy(&header, o->buf + o->ipv4_addr_start + o->ipv4_addr_pos, sizeof(header));
- o->ipv4_addr_pos += sizeof(struct BProto_header_s);
- left -= sizeof(struct BProto_header_s);
- uint16_t type = ltoh16(header.type);
- uint16_t id = ltoh16(header.id);
- switch (type) {
- case BPROTO_TYPE_UINT8: {
- ASSERT(left >= sizeof(struct BProto_uint8_s))
- o->ipv4_addr_pos += sizeof(struct BProto_uint8_s);
- left -= sizeof(struct BProto_uint8_s);
- } break;
- case BPROTO_TYPE_UINT16: {
- ASSERT(left >= sizeof(struct BProto_uint16_s))
- o->ipv4_addr_pos += sizeof(struct BProto_uint16_s);
- left -= sizeof(struct BProto_uint16_s);
- } break;
- case BPROTO_TYPE_UINT32: {
- ASSERT(left >= sizeof(struct BProto_uint32_s))
- o->ipv4_addr_pos += sizeof(struct BProto_uint32_s);
- left -= sizeof(struct BProto_uint32_s);
- } break;
- case BPROTO_TYPE_UINT64: {
- ASSERT(left >= sizeof(struct BProto_uint64_s))
- o->ipv4_addr_pos += sizeof(struct BProto_uint64_s);
- left -= sizeof(struct BProto_uint64_s);
- } break;
- case BPROTO_TYPE_DATA:
- case BPROTO_TYPE_CONSTDATA:
- {
- ASSERT(left >= sizeof(struct BProto_data_header_s))
- struct BProto_data_header_s val;
- memcpy(&val, o->buf + o->ipv4_addr_start + o->ipv4_addr_pos, sizeof(val));
- o->ipv4_addr_pos += sizeof(struct BProto_data_header_s);
- left -= sizeof(struct BProto_data_header_s);
- uint32_t payload_len = ltoh32(val.len);
- ASSERT(left >= payload_len)
- uint8_t *payload = o->buf + o->ipv4_addr_start + o->ipv4_addr_pos;
- o->ipv4_addr_pos += payload_len;
- left -= payload_len;
- if (type == BPROTO_TYPE_CONSTDATA && id == 3) {
- *data = payload;
- return 1;
- }
- } break;
- default:
- ASSERT(0);
- }
- }
- return 0;
- }
- void addrParser_Resetipv4_addr (addrParser *o)
- {
- o->ipv4_addr_pos = 0;
- }
- void addrParser_Forwardipv4_addr (addrParser *o)
- {
- o->ipv4_addr_pos = o->ipv4_addr_span;
- }
- int addrParser_Getipv6_addr (addrParser *o, uint8_t **data)
- {
- ASSERT(o->ipv6_addr_pos >= 0)
- ASSERT(o->ipv6_addr_pos <= o->ipv6_addr_span)
- int left = o->ipv6_addr_span - o->ipv6_addr_pos;
- while (left > 0) {
- ASSERT(left >= sizeof(struct BProto_header_s))
- struct BProto_header_s header;
- memcpy(&header, o->buf + o->ipv6_addr_start + o->ipv6_addr_pos, sizeof(header));
- o->ipv6_addr_pos += sizeof(struct BProto_header_s);
- left -= sizeof(struct BProto_header_s);
- uint16_t type = ltoh16(header.type);
- uint16_t id = ltoh16(header.id);
- switch (type) {
- case BPROTO_TYPE_UINT8: {
- ASSERT(left >= sizeof(struct BProto_uint8_s))
- o->ipv6_addr_pos += sizeof(struct BProto_uint8_s);
- left -= sizeof(struct BProto_uint8_s);
- } break;
- case BPROTO_TYPE_UINT16: {
- ASSERT(left >= sizeof(struct BProto_uint16_s))
- o->ipv6_addr_pos += sizeof(struct BProto_uint16_s);
- left -= sizeof(struct BProto_uint16_s);
- } break;
- case BPROTO_TYPE_UINT32: {
- ASSERT(left >= sizeof(struct BProto_uint32_s))
- o->ipv6_addr_pos += sizeof(struct BProto_uint32_s);
- left -= sizeof(struct BProto_uint32_s);
- } break;
- case BPROTO_TYPE_UINT64: {
- ASSERT(left >= sizeof(struct BProto_uint64_s))
- o->ipv6_addr_pos += sizeof(struct BProto_uint64_s);
- left -= sizeof(struct BProto_uint64_s);
- } break;
- case BPROTO_TYPE_DATA:
- case BPROTO_TYPE_CONSTDATA:
- {
- ASSERT(left >= sizeof(struct BProto_data_header_s))
- struct BProto_data_header_s val;
- memcpy(&val, o->buf + o->ipv6_addr_start + o->ipv6_addr_pos, sizeof(val));
- o->ipv6_addr_pos += sizeof(struct BProto_data_header_s);
- left -= sizeof(struct BProto_data_header_s);
- uint32_t payload_len = ltoh32(val.len);
- ASSERT(left >= payload_len)
- uint8_t *payload = o->buf + o->ipv6_addr_start + o->ipv6_addr_pos;
- o->ipv6_addr_pos += payload_len;
- left -= payload_len;
- if (type == BPROTO_TYPE_CONSTDATA && id == 4) {
- *data = payload;
- return 1;
- }
- } break;
- default:
- ASSERT(0);
- }
- }
- return 0;
- }
- void addrParser_Resetipv6_addr (addrParser *o)
- {
- o->ipv6_addr_pos = 0;
- }
- void addrParser_Forwardipv6_addr (addrParser *o)
- {
- o->ipv6_addr_pos = o->ipv6_addr_span;
- }
|