summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/du_buff.c81
1 files changed, 51 insertions, 30 deletions
diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c
index e530fcb7..4dfc6639 100644
--- a/src/lib/du_buff.c
+++ b/src/lib/du_buff.c
@@ -28,6 +28,10 @@
#define OUROBOROS_PREFIX "du_buff"
+#ifndef DU_BUFF_BLOCKIZE
+#define DU_BUFF_BLOCKSIZE sysconf(_SC_PAGESIZE)
+#endif
+
#include "ouroboros/logs.h"
struct buffer {
@@ -41,7 +45,6 @@ struct du_buff {
size_t size;
size_t du_start;
size_t du_end;
- struct list_head list;
};
void buffer_destroy(struct buffer * buf)
@@ -51,11 +54,9 @@ void buffer_destroy(struct buffer * buf)
return;
}
- list_del(&(buf->list));
-
free (&(buf->data));
- free (buf);
+ /* free (buf); */
}
@@ -76,11 +77,13 @@ void buffer_destroy_list(struct buffer * head)
}
}
-struct buffer * buffer_create (size_t size)
+struct buffer * buffer_create (size_t size, size_t headspace, size_t len)
{
struct buffer * head = NULL;
size_t remaining = size;
- const size_t page_size = sysconf(_SC_PAGESIZE);
+ const size_t page_size = DU_BUFF_BLOCKSIZE;
+ size_t ts = size - (headspace + len);
+ bool head_block = true;;
head = (struct buffer *) malloc(sizeof(struct buffer));
head->size=0;
@@ -90,7 +93,24 @@ struct buffer * buffer_create (size_t size)
while (remaining > 0) {
struct buffer * buf;
- size_t sz = remaining < page_size ? remaining : page_size;
+
+ size_t sz;
+
+ if (size > DU_BUFF_BLOCKSIZE && head_block) {
+ LOG_DBGF("SDU size %lu exceeds DU_BUFF_BLOCKSIZE %lu .",
+ size, DU_BUFF_BLOCKSIZE);
+ sz = headspace;
+ head_block=false;
+
+ } else if (size > DU_BUFF_BLOCKSIZE
+ && remaining - ts <= DU_BUFF_BLOCKSIZE
+ && remaining != ts) {
+ sz = remaining - ts;
+ } else if (size > DU_BUFF_BLOCKSIZE && remaining == ts) {
+ sz = ts;
+ } else {
+ sz = remaining < page_size ? remaining : page_size;
+ }
buf = (struct buffer *) malloc(sizeof(struct buffer));
if (buf == NULL) {
@@ -98,11 +118,15 @@ struct buffer * buffer_create (size_t size)
return NULL;
}
- buf->data = (uint8_t *) malloc(sz);
- if (buf->data == NULL) {
- LOG_WARN("Could not allocate memory block.");
- buffer_destroy_list(head);
- return NULL;
+ if (sz > 0) {
+ buf->data = (uint8_t *) malloc(sz);
+ if (buf->data == NULL) {
+ LOG_WARN("Could not allocate memory block.");
+ buffer_destroy_list(head);
+ return NULL;
+ }
+ } else {
+ buf->data = NULL;
}
buf->size = sz;
@@ -129,7 +153,7 @@ struct buffer * buffer_seek(const struct buffer * head, size_t pos)
struct buffer * tmp = list_entry(ptr, struct buffer, list);
if (tmp == NULL) {
- LOG_WARN("Could not iterate over elements %p", head);
+ LOG_DBGF("Could not iterate over elements %p", head);
return NULL;
}
@@ -187,10 +211,10 @@ int buffer_copy_data(struct buffer * head,
}
buf_start = buffer_seek(head, pos);
- buf_end = buffer_seek(head, pos + len);
+ buf_end = buffer_seek(head, pos + len - 1);
if (buf_start == NULL || buf_end == NULL) {
- LOG_DBGF("Index out of bounds %llu, %llu", pos, pos + len);
+ LOG_DBGF("Index out of bounds %lu, %lu", pos, pos + len);
return -EINVAL;
}
@@ -230,18 +254,11 @@ du_buff_t * du_buff_create(size_t size)
return NULL;
}
- dub->buffer = buffer_create(size);
- if (dub->buffer == NULL) {
- free (dub);
- return NULL;
- }
-
+ dub->buffer = NULL;
dub->size = size;
dub->du_start = 0;
dub->du_end = 0;
- INIT_LIST_HEAD(&(dub->list));
-
return dub;
}
@@ -253,8 +270,6 @@ void du_buff_destroy(du_buff_t * dub)
}
buffer_destroy_list(dub->buffer);
- list_del(&(dub->list));
-
free (dub);
}
@@ -269,10 +284,16 @@ int du_buff_init(du_buff_t * dub,
}
if (start + len > dub->size) {
- LOG_DBGF("Index out of bounds %llu.", start);
+ LOG_DBGF("Index out of bounds %lu.", start);
return -EINVAL;
}
+ dub->buffer = buffer_create(dub->size, start, len);
+ if (dub->buffer == NULL) {
+ free (dub);
+ return -ENOMEM;
+ }
+
dub->du_start = start;
dub->du_end = start + len;
@@ -288,7 +309,7 @@ int du_buff_head_alloc(du_buff_t * dub, size_t size)
if (dub->du_start - size < 0) {
LOG_WARN("Failed to allocate PCI headspace");
- return -1;
+ return -ENOBUFS;
}
dub->du_start -= size;
@@ -305,7 +326,7 @@ int du_buff_tail_alloc(du_buff_t * dub, size_t size)
if (dub->du_end + size >= dub->size) {
LOG_WARN("Failed to allocate PCI tailspace");
- return -1;
+ return -ENOBUFS;
}
dub->du_end += size;
@@ -322,7 +343,7 @@ int du_buff_head_release(du_buff_t * dub, size_t size)
if (size > dub->du_end - dub->du_start) {
LOG_WARN("Tried to release beyond sdu boundary");
- return -1;
+ return -EOVERFLOW;
}
dub->du_start += size;
@@ -341,7 +362,7 @@ int du_buff_tail_release(du_buff_t * dub, size_t size)
if (size > dub->du_end - dub->du_start) {
LOG_WARN("Tried to release beyond sdu boundary");
- return -1;
+ return -EOVERFLOW;
}
dub->du_end -= size;