Skip to content

Commit

Permalink
daemon: cleanup code
Browse files Browse the repository at this point in the history
  • Loading branch information
blocktrron committed Apr 3, 2024
1 parent 5409f85 commit 1383281
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 56 deletions.
2 changes: 1 addition & 1 deletion src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ LDFLAGS_MONITOR:=$(LDFLAGS_genl) -DBUILD_MONITOR
CFLAGS_MONITOR:=$(CFLAGS_genl)

all:
$(CC) $(CFLAGS) -D_GNU_SOURCE -o node-whisperer main.c util.c information.c log.c ubus.c interface.c batadv.c $(LDFLAGS)
$(CC) $(CFLAGS) -D_GNU_SOURCE -o node-whisperer daemon.c util.c information.c log.c ubus.c interface.c batadv.c $(LDFLAGS)

monitor:
$(CC) $(CFLAGS_MONITOR) -o monitor monitor.c log.c util.c ieee80211.c information.c $(LDFLAGS_MONITOR)
101 changes: 46 additions & 55 deletions src/main.c → src/daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,129 +7,120 @@

#include "node-whisperer.h"
#include "daemon.h"
#include "util.h"

#define UPDATE_INTERVAL (30 * 1000)

#define HOSTNAME_PATH "/home/dbauer/test"
#define BEACON_BUFFER_SIZE 512

struct nw_information {
struct {
uint8_t *buf;
size_t len; /* Content Length*/
size_t size; /* Buffer Size */
} output;
};

struct ubus_context *ubus_ctx;


struct nw_information gbi = {};
extern struct nw_information_source information_sources[];

int create_vendor_element_buf() {
static int nw_daemon_create_vendor_element_buf(struct nw *instance) {
uint8_t *element_length;

/* Free buffer if it exists*/
if (gbi.output.buf) {
free(gbi.output.buf);
if (instance->output.buf) {
free(instance->output.buf);
}

/* Allocate Buffer and Init sizes */
gbi.output.buf = calloc(BEACON_BUFFER_SIZE, 1);
if (!gbi.output.buf) {
instance->output.buf = calloc(BEACON_BUFFER_SIZE, 1);
if (!instance->output.buf) {
return -1;
}
gbi.output.size = BEACON_BUFFER_SIZE;
gbi.output.len = 0;
instance->output.size = BEACON_BUFFER_SIZE;
instance->output.len = 0;

/* Tag-Type(1) + Teg-Length(1) + OUI(3) + type(1) + {data} */
gbi.output.len = 1 + 1 + 3 + 1;
instance->output.len = 1 + 1 + 3 + 1;

/* Header */
gbi.output.buf[0] = 0xDD;
gbi.output.buf[1] = 0x00; /* Set Later! */
instance->output.buf[0] = 0xDD;
instance->output.buf[1] = 0x00; /* Set Later! */
/* OUI */
gbi.output.buf[2] = 0x00;
gbi.output.buf[3] = 0x20;
gbi.output.buf[4] = 0x91;
instance->output.buf[2] = 0x00;
instance->output.buf[3] = 0x20;
instance->output.buf[4] = 0x91;
/* OUI-Type */
gbi.output.buf[5] = 0x04;
instance->output.buf[5] = 0x04;

/* Length now matches content. Make sure to update on each new information! */

/* Loop through all information-sources */
for (int i = 0; information_sources[i].name; i++) {
if (!information_sources[i].enabled) {
log_debug("Information source id=%d name=%s is disabled", information_sources[i].type, information_sources[i].name);
log_debug("Information source id=%d name=%s is disabled",
information_sources[i].type, information_sources[i].name);
continue;
} else {
log_debug("Information source id=%d name=%s is enabled", information_sources[i].type, information_sources[i].name);
log_debug("Information source id=%d name=%s is enabled",
information_sources[i].type, information_sources[i].name);
}

/* Check if we have space for T + L + {data} */
if (gbi.output.len + 3 > gbi.output.size) {
log_error("Buffer too small for id=%d name=%s", information_sources[i].type, information_sources[i].name);
if (instance->output.len + 3 > instance->output.size) {
log_error("Buffer too small for id=%d name=%s",
information_sources[i].type, information_sources[i].name);
break;
}

/* Set T and L placeholder */
gbi.output.buf[gbi.output.len] = information_sources[i].type;
gbi.output.buf[gbi.output.len + 1] = 0x00;
instance->output.buf[instance->output.len] = information_sources[i].type;
instance->output.buf[instance->output.len + 1] = 0x00;

/* Save for later */
element_length = &gbi.output.buf[gbi.output.len + 1];
element_length = &instance->output.buf[instance->output.len + 1];

/* Collect Information */
int ret = information_sources[i].collect(&gbi.output.buf[gbi.output.len + 2], gbi.output.size - gbi.output.len - 2);
int ret = information_sources[i].collect(&instance->output.buf[instance->output.len + 2],
instance->output.size - instance->output.len - 2);
if (ret == 0) {
/* No Information available */
log_error("No Information available for id=%d name=%s", information_sources[i].type, information_sources[i].name);
log_error("No Information available for id=%d name=%s",
information_sources[i].type, information_sources[i].name);
continue;
} else if (ret > 0xff) {
/* Too much Information */
log_error("Too much Information for id=%d name=%s", information_sources[i].type, information_sources[i].name);
log_error("Too much Information for id=%d name=%s",
information_sources[i].type, information_sources[i].name);
return -ENOMEM;
} else if (ret < 0) {
/* Error */
log_error("Error collecting Information for id=%d name=%s code=%d", information_sources[i].type, information_sources[i].name, ret);
log_error("Error collecting Information for id=%d name=%s code=%d",
information_sources[i].type, information_sources[i].name, ret);
continue;
}

/* Update Length of Field*/
*element_length = (uint8_t)ret;

/* Update total Length */
gbi.output.len += ret + 2;
instance->output.len += ret + 2;

log_debug("Add Element to beacon id=%d name=%s element_length=%d total_length=%d", information_sources[i].type, information_sources[i].name, ret, gbi.output.len);
log_debug("Add Element to beacon id=%d name=%s element_length=%d total_length=%d",
information_sources[i].type, information_sources[i].name, ret, instance->output.len);
}

/* Set Length */
gbi.output.buf[1] = gbi.output.len - 2;
log_debug("Set length of beacon element element_length=%u total_length=%d", gbi.output.buf[1], gbi.output.len);

return 0;
}
instance->output.buf[1] = instance->output.len - 2;
log_debug("Set length of beacon element element_length=%u total_length=%d",
instance->output.buf[1], instance->output.len);

int buffer_to_hexstring(uint8_t *buf, size_t len, uint8_t *hexstring) {
for (size_t i = 0; i < len; i++) {
sprintf((char *)&hexstring[i * 2], "%02x", buf[i]);
}
return 0;
}

static void collect_information(struct uloop_timeout *timeout) {
static void nw_daemon_collect_information(struct uloop_timeout *timeout) {
struct nw *instance = container_of(timeout, struct nw, update_timeout);
if (create_vendor_element_buf() < 0) {

if (nw_daemon_create_vendor_element_buf(instance) < 0) {
goto out_free;
}

/* Allocate output buffer */
size_t buf_len = gbi.output.len * 2 + 1;
size_t buf_len = instance->output.len * 2 + 1;
uint8_t *buf_hex = malloc(buf_len);

buffer_to_hexstring(gbi.output.buf, gbi.output.len, buf_hex);
nw_buffer_to_hexstring(instance->output.buf, instance->output.len, buf_hex);

/* Update nodes */
log_debug("Update %s", buf_hex);
Expand All @@ -143,7 +134,7 @@ static void collect_information(struct uloop_timeout *timeout) {
}

static int start_daemon() {
struct nw instance;
struct nw instance = {};

uloop_init();

Expand All @@ -158,7 +149,7 @@ static int start_daemon() {
nw_ubus_init(instance.ubus_ctx);

/* Add Information gathering timer */
instance.update_timeout.cb = collect_information;
instance.update_timeout.cb = nw_daemon_collect_information;
uloop_timeout_set(&instance.update_timeout, 5 * 1000);

uloop_run();
Expand Down
6 changes: 6 additions & 0 deletions src/daemon.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ struct nw {
struct ubus_context *ubus_ctx;
struct uloop_timeout update_timeout;

struct {
uint8_t *buf;
size_t len; /* Content Length*/
size_t size; /* Buffer Size */
} output;

struct {
uint64_t update_count;
} statistics;
Expand Down

0 comments on commit 1383281

Please sign in to comment.