Use a bigger packet queue

This commit is contained in:
angt
2016-03-07 16:32:55 +00:00
parent 994f0e61c9
commit d3811a9a9b

33
mud.c
View File

@@ -22,6 +22,10 @@
#define MUD_ASSERT(X) (void)sizeof(char[(X)?1:-1]) #define MUD_ASSERT(X) (void)sizeof(char[(X)?1:-1])
#define MUD_PACKET_MASK (0x1FF)
#define MUD_PACKET_COUNT (MUD_PACKET_MASK+1)
#define MUD_PACKET_NEXT(X) (((X)+1)&MUD_PACKET_MASK)
struct path_info { struct path_info {
uint64_t dt; uint64_t dt;
uint64_t time; uint64_t time;
@@ -61,8 +65,8 @@ struct packet {
struct queue { struct queue {
struct packet *packet; struct packet *packet;
unsigned char start; unsigned start;
unsigned char end; unsigned end;
}; };
struct crypto { struct crypto {
@@ -491,6 +495,17 @@ int mud_create_socket (const char *port)
return fd; return fd;
} }
static
int mud_create_queue (struct queue *queue)
{
queue->packet = calloc(MUD_PACKET_COUNT, sizeof(struct packet));
if (!queue->packet)
return -1;
return 0;
}
struct mud *mud_create (const char *port) struct mud *mud_create (const char *port)
{ {
struct mud *mud = calloc(1, sizeof(struct mud)); struct mud *mud = calloc(1, sizeof(struct mud));
@@ -505,10 +520,8 @@ struct mud *mud_create (const char *port)
return NULL; return NULL;
} }
mud->tx.packet = calloc(256, sizeof(struct packet)); if (mud_create_queue(&mud->tx) ||
mud->rx.packet = calloc(256, sizeof(struct packet)); mud_create_queue(&mud->rx)) {
if (!mud->tx.packet || !mud->rx.packet) {
mud_delete(mud); mud_delete(mud);
return NULL; return NULL;
} }
@@ -624,7 +637,7 @@ int mud_pull (struct mud *mud)
unsigned char ctrl[1024]; unsigned char ctrl[1024];
for (int i = 0; i < 16; i++) { for (int i = 0; i < 16; i++) {
unsigned char next = mud->rx.end+1; unsigned next = MUD_PACKET_NEXT(mud->rx.end);
if (mud->rx.start == next) { if (mud->rx.start == next) {
errno = ENOBUFS; errno = ENOBUFS;
@@ -783,7 +796,7 @@ int mud_recv (struct mud *mud, void *data, size_t size)
int ret = mud_decrypt(mud, NULL, data, size, int ret = mud_decrypt(mud, NULL, data, size,
packet->data, packet->size, 4); packet->data, packet->size, 4);
mud->rx.start++; mud->rx.start = MUD_PACKET_NEXT(mud->rx.start);
if (ret == -1) { if (ret == -1) {
errno = EINVAL; errno = EINVAL;
@@ -848,7 +861,7 @@ int mud_push (struct mud *mud)
ssize_t ret = mud_send_path(mud, path_min, now, packet->data, packet->size); ssize_t ret = mud_send_path(mud, path_min, now, packet->data, packet->size);
mud->tx.start++; mud->tx.start = MUD_PACKET_NEXT(mud->tx.start);
if (ret != packet->size) if (ret != packet->size)
break; break;
@@ -864,7 +877,7 @@ int mud_send (struct mud *mud, const void *data, size_t size)
if (!size) if (!size)
return 0; return 0;
unsigned char next = mud->tx.end+1; unsigned next = MUD_PACKET_NEXT(mud->tx.end);
if (mud->tx.start == next) { if (mud->tx.start == next) {
errno = ENOBUFS; errno = ENOBUFS;