From e3b4dc5031ac7e27082d0af4b9eea4517a168a28 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Litza Date: Sat, 26 Nov 2016 12:52:23 +0100 Subject: [PATCH] gluon-radv-filterd: Update originators only if one is unknown --- .../src/gluon-radv-filterd.c | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/package/gluon-radv-filterd/src/gluon-radv-filterd.c b/package/gluon-radv-filterd/src/gluon-radv-filterd.c index 91b5dd4a..af1b3207 100644 --- a/package/gluon-radv-filterd/src/gluon-radv-filterd.c +++ b/package/gluon-radv-filterd/src/gluon-radv-filterd.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -300,12 +301,18 @@ static void update_tqs() { char *line = NULL; size_t len = 0; uint8_t tq; + bool update_originators = false; + int i; macaddr_t mac_a, mac_b; - // reset values + // reset TQs foreach(router, G.routers) { router->tq = 0; - memset(router->originator, 0, sizeof(macaddr_t)); + for (i = 0; i < 6; i++) + if (router->originator[i] != 0) + break; + if (i >= 6) + update_originators = true; } // TODO: Currently, we iterate over the whole list of routers all the @@ -314,22 +321,24 @@ static void update_tqs() { // could abort as soon as we hit the first router with the current // information filled in. - // translate all router's MAC addresses to originators simultaneously - snprintf(path, PATH_MAX, TRANSTABLE_GLOBAL, G.mesh_iface); - f = fopen(path, "r"); - while (getline(&line, &len, f) != -1) { - if (sscanf(line, " * " F_MAC " (%*3u) via " F_MAC " (%*3u) (0x%*4x) [%*3c]", - F_MAC_VAR(&mac_a), F_MAC_VAR(&mac_b)) != 12) - continue; + if (update_originators) { + // translate all router's MAC addresses to originators simultaneously + snprintf(path, PATH_MAX, TRANSTABLE_GLOBAL, G.mesh_iface); + f = fopen(path, "r"); + while (getline(&line, &len, f) != -1) { + if (sscanf(line, " * " F_MAC " (%*3u) via " F_MAC " (%*3u) (0x%*4x) [%*3c]", + F_MAC_VAR(&mac_a), F_MAC_VAR(&mac_b)) != 12) + continue; - foreach(router, G.routers) { - if (!memcmp(router->src, mac_a, sizeof(macaddr_t))) { - memcpy(router->originator, mac_b, sizeof(macaddr_t)); - break; // foreach + foreach(router, G.routers) { + if (!memcmp(router->src, mac_a, sizeof(macaddr_t))) { + memcpy(router->originator, mac_b, sizeof(macaddr_t)); + break; // foreach + } } } + fclose(f); } - fclose(f); // look up TQs of originators G.max_tq = 0;