diff --git a/src/Makefile b/src/Makefile index 64e8655..a58af2b 100644 --- a/src/Makefile +++ b/src/Makefile @@ -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) diff --git a/src/main.c b/src/daemon.c similarity index 50% rename from src/main.c rename to src/daemon.c index 42a0d4a..d5e8502 100644 --- a/src/main.c +++ b/src/daemon.c @@ -7,92 +7,87 @@ #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; } @@ -100,36 +95,32 @@ int create_vendor_element_buf() { *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); @@ -143,7 +134,7 @@ static void collect_information(struct uloop_timeout *timeout) { } static int start_daemon() { - struct nw instance; + struct nw instance = {}; uloop_init(); @@ -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(); diff --git a/src/daemon.h b/src/daemon.h index 0b8354e..bacf0d1 100644 --- a/src/daemon.h +++ b/src/daemon.h @@ -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;