diff --git a/server/Makefile b/server/Makefile index 05024afc4..e1b27265e 100644 --- a/server/Makefile +++ b/server/Makefile @@ -18,7 +18,7 @@ RM = rm -f DOXY = doxygen # Debug level (if not set via 'make V=?') -V ?= 6 +V ?= 5 # Some details about the compiled version GIT_TAG = $(shell git describe --tags --abbrev=0) diff --git a/server/include/node.h b/server/include/node.h index 953c6198c..672e8cb56 100644 --- a/server/include/node.h +++ b/server/include/node.h @@ -18,6 +18,7 @@ #include #include +#include "msg.h" #include "tc.h" /** The type of a node. @@ -26,7 +27,7 @@ */ enum node_type { - NODE_INVALID, + NODE_UNKNOWN, NODE_SERVER, NODE_WORKSTATION, NODE_SIM_OPAL, diff --git a/server/src/cfg.c b/server/src/cfg.c index 55bd34da5..68eb6ba2f 100644 --- a/server/src/cfg.c +++ b/server/src/cfg.c @@ -105,11 +105,8 @@ int config_parse_path(config_setting_t *cfg, config_setting_lookup_bool(cfg, "enabled", &enabled); config_setting_lookup_bool(cfg, "reverse", &reverse); config_setting_lookup_float(cfg, "rate", &path->rate); - path->cfg = cfg; - debug(3, "Loaded path from '%s' to '%s'", path->in->name, path->out->name); - if (enabled) { list_add(*paths, path); @@ -199,8 +196,6 @@ int config_parse_node(config_setting_t *cfg, list_add(*nodes, node); - debug(3, "Loaded %s node '%s'", type_str, node->name); - return 0; } diff --git a/server/src/if.c b/server/src/if.c index b93c8719e..47e0b3bc4 100644 --- a/server/src/if.c +++ b/server/src/if.c @@ -26,7 +26,8 @@ int if_getegress(struct sockaddr_in *sa) snprintf(cmd, sizeof(cmd), "ip route get %s", inet_ntoa(sa->sin_addr)); - debug(6, "system: %s", cmd); + debug(8, "System: %s", cmd); + FILE *p = popen(cmd, "r"); if (!p) return -1; @@ -57,12 +58,14 @@ int if_getirqs(struct interface *i) int n = 0; struct dirent *entry; - while((entry = readdir(dir)) && n < IF_IRQ_MAX) { + while ((entry = readdir(dir)) && n < IF_IRQ_MAX) { if (entry->d_type & DT_REG) { i->irqs[n++] = atoi(entry->d_name); } } + debug(7, "Found %u interrupts for interface '%s'", n, i->name); + closedir(dir); return 0; } @@ -76,15 +79,13 @@ int if_setaffinity(struct interface *i, int affinity) snprintf(filename, sizeof(filename), "/proc/irq/%u/smp_affinity", i->irqs[n]); file = fopen(filename, "w"); - if (!file) - continue; + if (file) { + if (fprintf(file, "%8x", affinity) < 0) + error("Failed to set affinity for IRQ %u", i->irqs[n]); - if (fprintf(file, "%8x", affinity) < 0) - error("Failed to set affinity for IRQ %u", i->irqs[n]); - else - debug(3, "Set affinity of MSI IRQ %u (%s) to %#x", i->irqs[n], i->name, affinity); - - fclose(file); + fclose(file); + debug(5, "Set affinity of IRQ %u for interface '%s' to %#x", i->irqs[n], i->name, affinity); + } } return 0; diff --git a/server/src/msg.c b/server/src/msg.c index 81f39aa46..3f03c5e35 100644 --- a/server/src/msg.c +++ b/server/src/msg.c @@ -56,7 +56,9 @@ int msg_send(struct msg *m, struct node *n) sizeof(struct sockaddr_in)) < 0) perror("Failed sendto"); - debug(10, "Message sent to node %s (%s:%u)", n->name, inet_ntoa(n->remote.sin_addr), ntohs(n->remote.sin_port)); + debug(10, "Message sent to node %s (%s:%u)", n->name, + inet_ntoa(n->remote.sin_addr), + ntohs(n->remote.sin_port)); return 0; } diff --git a/server/src/node.c b/server/src/node.c index 391483b15..1d05db9d8 100644 --- a/server/src/node.c +++ b/server/src/node.c @@ -67,7 +67,7 @@ enum node_type node_lookup_type(const char *str) else if (!strcmp(str, "dsp")) return NODE_SIM_DSP; else - return NODE_INVALID; + return NODE_UNKNOWN; } struct node* node_lookup_name(const char *str, struct node *nodes) diff --git a/server/src/server.c b/server/src/server.c index a6342fdd3..09c90b872 100644 --- a/server/src/server.c +++ b/server/src/server.c @@ -116,17 +116,6 @@ static void quit() int main(int argc, char *argv[]) { - /* Setup signals */ - struct sigaction sa_quit = { - .sa_flags = SA_SIGINFO, - .sa_sigaction = quit - }; - - sigemptyset(&sa_quit.sa_mask); - sigaction(SIGTERM, &sa_quit, NULL); - sigaction(SIGINT, &sa_quit, NULL); - atexit(&quit); - /* Check arguments */ if (argc != 2) { printf("Usage: %s CONFIG\n", argv[0]); @@ -140,13 +129,25 @@ int main(int argc, char *argv[]) info("This is %s %s", BLU("s2ss"), BLU(VERSION)); debug(1, "Running with debug level: %u", V); + /* Check priviledges */ + if (getuid() != 0) + error("The server requires superuser privileges!"); + + /* Setup signals */ + struct sigaction sa_quit = { + .sa_flags = SA_SIGINFO, + .sa_sigaction = quit + }; + + sigemptyset(&sa_quit.sa_mask); + sigaction(SIGTERM, &sa_quit, NULL); + sigaction(SIGINT, &sa_quit, NULL); + atexit(&quit); + /* Parse configuration file */ config_init(&config); config_parse(argv[1], &config, &settings, &nodes, &paths, &interfaces); - if (!paths) - error("No paths found. Terminating..."); - /* Check for realtime kernel patch */ struct stat st; if (stat("/sys/kernel/realtime", &st)) diff --git a/server/src/tc.c b/server/src/tc.c index a5210305b..5c8b6ff3e 100644 --- a/server/src/tc.c +++ b/server/src/tc.c @@ -19,7 +19,9 @@ int tc_reset(struct interface *i) char cmd[128]; snprintf(cmd, sizeof(cmd), "tc qdisc del dev %s root", i->name); - debug(6, "system: %s", cmd); + debug(6, "Reset traffic control for interface '%s'", i->name); + debug(8, "System: %s", cmd); + return system(cmd); } @@ -36,7 +38,9 @@ int tc_prio(struct interface *i, tc_hdl_t handle, int bands) for (int i = 0; i < 16; i++) len += snprintf(cmd+len, sizeof(cmd)-len, " %u", priomap[i] + bands); - debug(6, "system: %s", cmd); + debug(6, "Replace master qdisc for interface '%s'", i->name); + debug(8, "System: %s", cmd); + return system(cmd); } @@ -64,7 +68,9 @@ int tc_netem(struct interface *i, tc_hdl_t parent, struct netem *em) if (em->valid & TC_NETEM_CORRUPT) len += snprintf(cmd+len, sizeof(cmd)-len, " corrupt %u", em->corrupt); - debug(6, "system: %s", cmd); + debug(6, "Setup netem qdisc for interface '%s'", i->name); + debug(8, "System: %s", cmd); + return system(cmd); } @@ -75,7 +81,9 @@ int tc_mark(struct interface *i, tc_hdl_t flowid, int mark) "tc filter add dev %s protocol ip handle %u fw flowid %u:%u", i->name, mark, TC_HDL_MAJ(flowid), TC_HDL_MIN(flowid)); - debug(6, "system: %s", cmd); + debug(7, "Add traffic filter to interface '%s': fwmark %u => flowid %u", i->name, mark, flowid); + debug(8, "System: %s", cmd); + return system(cmd); }