when i say boom boom boom you say bam bam bam
This commit is contained in:
parent
992734c9eb
commit
3a02996a79
4 changed files with 113 additions and 38 deletions
13
protocol
13
protocol
|
@ -3,8 +3,9 @@ PROTOCOL
|
||||||
all numbers are packed unless stated otherwise
|
all numbers are packed unless stated otherwise
|
||||||
packed values are msb
|
packed values are msb
|
||||||
|
|
||||||
strings are predefined sizes and are terminated at either
|
strings are predefined sizes and are terminated at the
|
||||||
the boundary of the region or the first NUL character (0x0)
|
first NUL character (0x0). max string length is the region
|
||||||
|
length minus one, for the required NUL.
|
||||||
|
|
||||||
byte n is b.n
|
byte n is b.n
|
||||||
region n is r.n
|
region n is r.n
|
||||||
|
@ -23,11 +24,11 @@ byte the bytes after the header octet bytes bytes:
|
||||||
|
|
||||||
client -> server
|
client -> server
|
||||||
id 0: registration attempt
|
id 0: registration attempt
|
||||||
r.0 - username - string (max 8b)
|
r.0 - username - string (max 9b)
|
||||||
r.1 - pin - ushort (max 9999)
|
r.1 - pin - ushort (max 9999)
|
||||||
|
|
||||||
id 1: login attempt
|
id 1: login attempt
|
||||||
r.0 - username - string (max 8b)
|
r.0 - username - string (max 9b)
|
||||||
r.1 - pin - ushort (max 9999)
|
r.1 - pin - ushort (max 9999)
|
||||||
|
|
||||||
id 2: ctx change response
|
id 2: ctx change response
|
||||||
|
@ -39,12 +40,12 @@ client -> server
|
||||||
server -> client
|
server -> client
|
||||||
id 0: registration response
|
id 0: registration response
|
||||||
r.0 - succeeded - bool
|
r.0 - succeeded - bool
|
||||||
r.1 - status - string (max 16b)
|
r.1 - status - string (17b)
|
||||||
|
|
||||||
id 1: login response
|
id 1: login response
|
||||||
r.0 - succeeded - bool
|
r.0 - succeeded - bool
|
||||||
r.1 - user id - ushort
|
r.1 - user id - ushort
|
||||||
r.2 - status - string (max 16b)
|
r.2 - status - string (17b)
|
||||||
|
|
||||||
id 2: ctx change request
|
id 2: ctx change request
|
||||||
r.0 - ctx id - ushort
|
r.0 - ctx id - ushort
|
|
@ -6,12 +6,12 @@
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
packet_context_init(2);
|
packet_context_init(2);
|
||||||
|
|
||||||
packet_context_register(PCK_CTX_C2S, PCK_ID_REGISTER, 0, 2, 8, 2);
|
packet_context_register(PCK_CTX_C2S, PCK_ID_REGISTER, 0, 2, 9, 2);
|
||||||
packet_context_register(PCK_CTX_C2S, PCK_ID_LOGIN, 0, 2, 8, 2);
|
packet_context_register(PCK_CTX_C2S, PCK_ID_LOGIN, 0, 2, 9, 2);
|
||||||
packet_context_register(PCK_CTX_C2S, PCK_ID_CHANGE_CTX, 0, 2, 1, 2);
|
packet_context_register(PCK_CTX_C2S, PCK_ID_CHANGE_CTX, 0, 2, 1, 2);
|
||||||
|
|
||||||
packet_context_register(PCK_CTX_S2C, PCK_ID_REGISTER, 0, 2, 1, 16);
|
packet_context_register(PCK_CTX_S2C, PCK_ID_REGISTER, 0, 2, 1, 17);
|
||||||
packet_context_register(PCK_CTX_S2C, PCK_ID_LOGIN, 0, 3, 1, 2, 16);
|
packet_context_register(PCK_CTX_S2C, PCK_ID_LOGIN, 0, 3, 1, 2, 17);
|
||||||
packet_context_register(PCK_CTX_S2C, PCK_ID_CHANGE_CTX, 0, 1, 2);
|
packet_context_register(PCK_CTX_S2C, PCK_ID_CHANGE_CTX, 0, 1, 2);
|
||||||
|
|
||||||
if(argc == 2 && strcmp(argv[1], "server") == 0) {
|
if(argc == 2 && strcmp(argv[1], "server") == 0) {
|
||||||
|
|
113
src/packet.c
113
src/packet.c
|
@ -4,8 +4,12 @@ typedef struct packet_ctx_t packet_ctx_t;
|
||||||
struct packet_ctx_t {
|
struct packet_ctx_t {
|
||||||
uint8_t iter_start;
|
uint8_t iter_start;
|
||||||
uint32_t iter_length;
|
uint32_t iter_length;
|
||||||
|
uint32_t pre_iter_length;
|
||||||
|
|
||||||
uint8_t region_count;
|
uint8_t region_count;
|
||||||
|
uint16_t iter_count;
|
||||||
|
uint16_t pre_iter_count;
|
||||||
|
|
||||||
uint16_t *region_lengths;
|
uint16_t *region_lengths;
|
||||||
uint32_t length;
|
uint32_t length;
|
||||||
};
|
};
|
||||||
|
@ -39,7 +43,11 @@ void packet_context_register(uint8_t direction, uint8_t id, uint8_t iter_pt, uin
|
||||||
direction == PCK_CTX_C2S ? ctx.c2s : ctx.s2c;
|
direction == PCK_CTX_C2S ? ctx.c2s : ctx.s2c;
|
||||||
|
|
||||||
ptr[id].length = 0;
|
ptr[id].length = 0;
|
||||||
|
ptr[id].iter_length = 0;
|
||||||
|
ptr[id].pre_iter_length = 0;
|
||||||
ptr[id].iter_start = iter_pt;
|
ptr[id].iter_start = iter_pt;
|
||||||
|
ptr[id].iter_count = count - iter_pt;
|
||||||
|
ptr[id].pre_iter_count = count - ptr[id].iter_count;
|
||||||
ptr[id].region_count = count;
|
ptr[id].region_count = count;
|
||||||
ptr[id].region_lengths = (uint16_t*)malloc(count * sizeof(uint16_t));
|
ptr[id].region_lengths = (uint16_t*)malloc(count * sizeof(uint16_t));
|
||||||
|
|
||||||
|
@ -48,6 +56,10 @@ void packet_context_register(uint8_t direction, uint8_t id, uint8_t iter_pt, uin
|
||||||
uint16_t length = va_arg(args, int);
|
uint16_t length = va_arg(args, int);
|
||||||
ptr[id].region_lengths[i] = length;
|
ptr[id].region_lengths[i] = length;
|
||||||
ptr[id].length += length;
|
ptr[id].length += length;
|
||||||
|
if(iter_pt == 0 || i < iter_pt)
|
||||||
|
ptr[id].pre_iter_length += length;
|
||||||
|
else
|
||||||
|
ptr[id].iter_length += length;
|
||||||
}
|
}
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
@ -64,13 +76,18 @@ void packet_context_free() {
|
||||||
free(ctx.s2c);
|
free(ctx.s2c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void packet_fill_regions(packet_t *packet) {
|
static void packet_fill_regions(packet_t *packet, packet_ctx_t *ctx) {
|
||||||
uint8_t *ptr = packet->raw;
|
uint8_t *ptr = packet->raw + 7;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
packet->regions = (uint8_t**)malloc(packet->region_count * sizeof(uint8_t*));
|
packet->regions = (uint8_t**)malloc(packet->region_count * sizeof(uint8_t*));
|
||||||
for(i = 0; i < packet->region_count; ++i) {
|
for(i = 0; i < packet->region_count; ++i) {
|
||||||
packet->regions // TOD Ofisnibh THIS
|
packet->regions[i] = ptr;
|
||||||
|
if(ctx->iter_start == 0 || i < ctx->iter_start)
|
||||||
|
ptr += packet->region_lengths[i];
|
||||||
|
else if(ctx->iter_start != 0)
|
||||||
|
ptr += packet->region_lengths[ctx->iter_start + ((i - ctx->iter_start) % ctx->iter_count)];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
packet_t* packet_init_in(uint8_t *raw) {
|
packet_t* packet_init_in(uint8_t *raw) {
|
||||||
|
@ -81,14 +98,16 @@ packet_t* packet_init_in(uint8_t *raw) {
|
||||||
|
|
||||||
packet_ctx_t *in = &(ctx.in[raw[2]]);
|
packet_ctx_t *in = &(ctx.in[raw[2]]);
|
||||||
|
|
||||||
packet_t *packet = (packet_t*)malloc(sizeof(packet_t));
|
packet_t *packet = (packet_t*)malloc(sizeof(packet_t));
|
||||||
packet->id = raw[2];
|
packet->ctx = in;
|
||||||
packet->raw = raw;
|
packet->id = raw[2];
|
||||||
packet->length = ntohl(*((uint32_t*)raw[3]));
|
packet->iterator = 0;
|
||||||
|
packet->next_append = 0xFFFF;
|
||||||
|
packet->raw = raw;
|
||||||
|
packet->length = ntohl(*((uint32_t*)&raw[3]));
|
||||||
packet->region_lengths = in->region_lengths;
|
packet->region_lengths = in->region_lengths;
|
||||||
packet->iterator = 0;
|
packet->region_count = in->pre_iter_count + (packet->length - in->pre_iter_length) / in->iter_length;
|
||||||
packet->next_append = 0xFFFF;
|
packet_fill_regions(packet, in);
|
||||||
packet_fill_regions(packet);
|
|
||||||
|
|
||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
@ -99,20 +118,72 @@ packet_t* packet_init_out(uint8_t id, uint16_t iterations) {
|
||||||
|
|
||||||
packet_ctx_t *out = &(ctx.out[id]);
|
packet_ctx_t *out = &(ctx.out[id]);
|
||||||
int regions = out->region_count;
|
int regions = out->region_count;
|
||||||
int iterable_regions = out->region_count - out->iter_start - 1;
|
|
||||||
if(out->iter_start != 0)
|
if(out->iter_start != 0)
|
||||||
regions = out->iter_start + (iterations * iterable_regions);
|
regions = out->iter_start + (iterations * out->iter_count);
|
||||||
|
|
||||||
packet_t *packet = (packet_t*)malloc(sizeof(packet_t));
|
packet_t *packet = (packet_t*)malloc(sizeof(packet_t));
|
||||||
|
packet->ctx = out;
|
||||||
packet->id = id;
|
packet->id = id;
|
||||||
packet->iterator = 0xFFFF;
|
packet->iterator = 0xFFFF;
|
||||||
packet->next_append = 0;
|
packet->next_append = 0;
|
||||||
packet->region_count = regions;
|
packet->region_count = regions;
|
||||||
packet->region_lengths = out->region_lengths;
|
packet->region_lengths = out->region_lengths;
|
||||||
packet->length = (length - iter_length) + iter_length * iterations;
|
packet->length = out->pre_iter_length + out->iter_length * iterations;
|
||||||
packet->raw = (uint8_t*)malloc(packet->length * sizeof(uint8_t));
|
packet->raw = (uint8_t*)malloc(packet->length * sizeof(uint8_t));
|
||||||
packet_fill_regions(packet);
|
packet_fill_regions(packet, out);
|
||||||
|
|
||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t* packet_get(packet_t *packet, uint16_t region, int *size) {
|
||||||
|
if(region >= packet->region_count)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
packet_ctx_t *ctx;
|
||||||
|
if(size != NULL) {
|
||||||
|
ctx = (packet_ctx_t*)packet->ctx;
|
||||||
|
if(region >= ctx->iter_start && ctx->iter_start != 0)
|
||||||
|
*size = packet->region_lengths[(region - ctx->iter_start) % ctx->iter_count];
|
||||||
|
else
|
||||||
|
*size = packet->region_lengths[region];
|
||||||
|
}
|
||||||
|
|
||||||
|
return packet->regions[region];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t packet_get_uint8(packet_t *packet, uint16_t region) {
|
||||||
|
if(region >= packet->region_count)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return *((uint8_t*)packet->regions[region]);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t packet_get_uint16(packet_t *packet, uint16_t region) {
|
||||||
|
if(region >= packet->region_count)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return *((uint16_t*)packet->regions[region]);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t packet_get_uint32(packet_t *packet, uint16_t region) {
|
||||||
|
if(region >= packet->region_count)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return *((uint32_t*)packet->regions[region]);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t packet_get_uint64(packet_t *packet, uint64_t region) {
|
||||||
|
if(region >= packet->region_count)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return *((uint64_t*)packet->regions[region]);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* packet_get_raw(packet_t *packet, int *size) {
|
||||||
|
if(size != NULL)
|
||||||
|
*size = packet->length;
|
||||||
|
|
||||||
|
return packet->raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t packet_region_length(uint64_t todo_finish_this, void *DO_IT
|
13
src/packet.h
13
src/packet.h
|
@ -24,6 +24,7 @@ struct packet_t {
|
||||||
uint16_t region_count;
|
uint16_t region_count;
|
||||||
uint16_t iterator;
|
uint16_t iterator;
|
||||||
uint16_t next_append;
|
uint16_t next_append;
|
||||||
|
void *ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
void packet_context_init(uint8_t);
|
void packet_context_init(uint8_t);
|
||||||
|
@ -33,13 +34,15 @@ void packet_context_free();
|
||||||
packet_t* packet_init_in(uint8_t*);
|
packet_t* packet_init_in(uint8_t*);
|
||||||
packet_t* packet_init_out(uint8_t, uint16_t);
|
packet_t* packet_init_out(uint8_t, uint16_t);
|
||||||
|
|
||||||
uint8_t* packet_get (packet_t*, uint8_t, int*);
|
uint8_t* packet_get (packet_t*, uint16_t, int*);
|
||||||
uint8_t packet_get_uint8 (packet_t*, uint8_t);
|
uint8_t packet_get_uint8 (packet_t*, uint16_t);
|
||||||
uint16_t packet_get_uint16 (packet_t*, uint8_t);
|
uint16_t packet_get_uint16 (packet_t*, uint16_t);
|
||||||
uint32_t packet_get_uint32 (packet_t*, uint8_t);
|
uint32_t packet_get_uint32 (packet_t*, uint16_t);
|
||||||
uint64_t packet_get_uint64 (packet_t*, uint8_t);
|
uint64_t packet_get_uint64 (packet_t*, uint16_t);
|
||||||
uint8_t* packet_get_raw (packet_t*, int*);
|
uint8_t* packet_get_raw (packet_t*, int*);
|
||||||
|
|
||||||
|
BOOL packet_iter_next (packet_t*);
|
||||||
|
BOOL packet_iter_prev (packet_t*);
|
||||||
uint8_t* packet_iter_get (packet_t*, int*);
|
uint8_t* packet_iter_get (packet_t*, int*);
|
||||||
uint8_t packet_iter_get_uint8 (packet_t*);
|
uint8_t packet_iter_get_uint8 (packet_t*);
|
||||||
uint16_t packet_iter_get_uint16 (packet_t*);
|
uint16_t packet_iter_get_uint16 (packet_t*);
|
||||||
|
|
Loading…
Reference in a new issue