conf: calculate the checksum over the effective configuration
authorFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 2 Jan 2017 14:14:47 +0000 (15:14 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 4 Jan 2017 08:47:11 +0000 (09:47 +0100)
Can be disabled by compiling with 'NOCONFIGCHECKSUM=1'.

We can't simply checksum the olsr_cnf struct because it contains pointers
to other structs that would vary every time.
This is the simplest solution.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
Makefile.inc
src/cfgparser/local.mk
src/cfgparser/olsrd_conf_checksum.c [new file with mode: 0644]
src/cfgparser/olsrd_conf_checksum.h [new file with mode: 0644]
src/cfgparser/oscan.lex
src/main.c

index df0bf11..0554d4e 100644 (file)
@@ -334,6 +334,20 @@ ifeq ($(NO_DEBUG_MESSAGES),1)
 CPPFLAGS +=    -DNODEBUG
 endif
 
+ifeq ($(OS),win32)
+NOCONFIGCHECKSUM = 1
+endif
+
+ifeq ($(OS),android)
+NOCONFIGCHECKSUM = 1
+endif
+
+ifdef NOCONFIGCHECKSUM
+CPPFLAGS += -DNOCONFIGCHECKSUM
+else
+LDFLAGS  += -lcrypto
+endif
+
 # preserve debugging info when NOSTRIP is set
 ifneq ($(NOSTRIP),0)
 CFLAGS +=      -ggdb
index da8fbd5..e767abf 100644 (file)
@@ -45,9 +45,9 @@
 C=$(if $(CFGDIR),$(CFGDIR)/)
 
 # add the variables as we may have others already there
-SRCS += $(foreach file,olsrd_conf oparse oscan cfgfile_gen,$(C)$(file).c)
-OBJS += $(foreach file,olsrd_conf oparse oscan cfgfile_gen,$(C)$(file).o)
-HDRS += $(foreach file,olsrd_conf oparse,$(C)$(file).h)
+SRCS += $(foreach file,olsrd_conf olsrd_conf_checksum oparse oscan cfgfile_gen,$(C)$(file).c)
+OBJS += $(foreach file,olsrd_conf olsrd_conf_checksum oparse oscan cfgfile_gen,$(C)$(file).o)
+HDRS += $(foreach file,olsrd_conf olsrd_conf_checksum oparse,$(C)$(file).h)
 
 $(C)oscan.c: $(C)oscan.lex $(C)Makefile
 ifeq ($(VERBOSE),0)
diff --git a/src/cfgparser/olsrd_conf_checksum.c b/src/cfgparser/olsrd_conf_checksum.c
new file mode 100644 (file)
index 0000000..2a2e50c
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ *
+ * (c) by the OLSR project
+ *
+ * See our Git repository to find out who worked on this file
+ * and thus is a copyright holder on it.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#include "olsrd_conf_checksum.h"
+
+#include "olsrd_conf.h"
+
+#include <stdio.h>
+
+#include <string.h>
+
+#ifdef NOCONFIGCHECKSUM
+#define SHA_DIGEST_LENGTH 1
+#else
+#include <openssl/sha.h>
+static SHA256_CTX ctx;
+#endif /* NOCONFIGCHECKSUM */
+
+static unsigned char configuration_checksum[SHA_DIGEST_LENGTH];
+static char configuration_checksum_str[(sizeof(configuration_checksum) * 2) + 1];
+
+#define CLI_START     "*CLI START*"
+#define CLI_START_LEN (sizeof(CLI_START) - 1)
+#define CLI_END       "*CLI END*"
+#define CLI_END_LEN   (sizeof(CLI_END) - 1)
+
+bool olsrd_config_checksum_init(void) {
+  memset(configuration_checksum, 0, sizeof(configuration_checksum));
+  memset(configuration_checksum_str, 0, sizeof(configuration_checksum_str));
+
+#ifndef NOCONFIGCHECKSUM
+  if (!SHA256_Init(&ctx)) {
+    return false;
+  }
+#endif /* NOCONFIGCHECKSUM */
+
+  return true;
+}
+
+bool olsrd_config_checksum_final(void) {
+  memset(configuration_checksum, 0, sizeof(configuration_checksum));
+  memset(configuration_checksum_str, 0, sizeof(configuration_checksum_str));
+
+#ifndef NOCONFIGCHECKSUM
+  {
+    size_t i;
+
+    if (!SHA256_Final(configuration_checksum, &ctx)) {
+      return false;
+    }
+
+    for (i = 0; i < sizeof(configuration_checksum); i++) {
+      snprintf(&configuration_checksum_str[i * 2], 3, "%02x", configuration_checksum[i]);
+    }
+    configuration_checksum_str[i * 2] = '\0';
+  }
+#endif /* NOCONFIGCHECKSUM */
+
+  return true;
+}
+
+unsigned char *olsrd_config_checksum_get(size_t *len, char ** str) {
+  if (len) {
+    *len = sizeof(configuration_checksum);
+  }
+
+  if (str) {
+    *str = configuration_checksum_str;
+  }
+
+  return configuration_checksum;
+}
+
+bool olsrd_config_checksum_add_cli(int argc, char *argv[]) {
+  int i = 1;
+
+  if (!argc || !argv) {
+    return true;
+  }
+
+  if (!olsrd_config_checksum_add(CLI_START, CLI_START_LEN)) {
+    return false;
+  }
+
+  for (i = 0; i < argc; ++i) {
+    if (!argv[i]) {
+      break;
+    }
+
+    if (!olsrd_config_checksum_add(argv[i], strlen(argv[i]))) {
+      return false;
+    }
+  }
+
+  if (!olsrd_config_checksum_add(CLI_END, CLI_END_LEN)) {
+    return false;
+  }
+
+  return true;
+}
+
+bool olsrd_config_checksum_add(const char *str, size_t len) {
+  if (!str || !len) {
+    return true;
+  }
+
+#ifndef NOCONFIGCHECKSUM
+  if (!SHA256_Update(&ctx, str, len)) {
+    return false;
+  }
+
+  if (!SHA256_Update(&ctx, "\n", 1)) {
+    return false;
+  }
+#endif /* NOCONFIGCHECKSUM */
+
+  return true;
+}
diff --git a/src/cfgparser/olsrd_conf_checksum.h b/src/cfgparser/olsrd_conf_checksum.h
new file mode 100644 (file)
index 0000000..7910755
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ *
+ * (c) by the OLSR project
+ *
+ * See our Git repository to find out who worked on this file
+ * and thus is a copyright holder on it.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#ifndef _OLSRD_CONF_CHECKSUM_H
+#define _OLSRD_CONF_CHECKSUM_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#include "../defs.h"
+
+#define OLSRD_CONFIG_START     "*CONFIG START*"
+#define OLSRD_CONFIG_START_LEN (sizeof(OLSRD_CONFIG_START) - 1)
+#define OLSRD_CONFIG_END       "*CONFIG END*"
+#define OLSRD_CONFIG_END_LEN   (sizeof(OLSRD_CONFIG_END) - 1)
+
+#if (!defined(__linux__) || defined(__ANDROID__)) && !defined(NOCONFIGCHECKSUM)
+#define NOCONFIGCHECKSUM
+#endif /* (!defined(__linux__) || defined(__ANDROID__)) && !defined(NOCONFIGCHECKSUM) */
+
+bool olsrd_config_checksum_init(void);
+
+bool olsrd_config_checksum_add_cli(int argc, char *argv[]);
+
+bool olsrd_config_checksum_add(const char *str, size_t len);
+
+bool olsrd_config_checksum_final(void);
+
+unsigned char *olsrd_config_checksum_get(size_t *len, char ** str);
+
+#endif /* _OLSRD_CONF_CHECKSUM_H */
index 264aea4..3f77e8e 100644 (file)
@@ -56,6 +56,7 @@
 #include <arpa/inet.h>
 
 #include "olsrd_conf.h"
+#include "olsrd_conf_checksum.h"
 
 #include "oparse.h"
  
@@ -171,21 +172,25 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
 }
 
 \/ {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SLASH;
 }
 
 \{ {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_OPEN;
 }
 
 \} {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_CLOSE;
 }
 
 \"[^\"]*\" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = get_string_token(yytext + 1, yyleng - 2);
     if (yylval == NULL) {
         yyterminate();
@@ -194,16 +199,19 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
 }
 
 0x{HEX8}+ {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = get_integer_token(yytext);
     return TOK_INTEGER;
 }
 
 {FLOAT} {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = get_floating_token(yytext);
     return TOK_FLOAT;
 }
 
 {IPV4ADDR} {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = get_string_token(yytext, yyleng + 1);
     if (yylval == NULL) {
         yyterminate();
@@ -211,6 +219,7 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     return TOK_IPV4_ADDR;
 }
 {IPV6ADDR} {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = get_string_token(yytext, yyleng + 1);
     if (yylval == NULL) {
         yyterminate();
@@ -219,459 +228,554 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
 }
 
 "default" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_DEFAULT;
 }
 
 "auto" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_AUTO;
 }
 
 "none" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_NONE;
 }
 
 {DECDIGIT}+ {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = get_integer_token(yytext);
     return TOK_INTEGER;
 }
 
 
 "yes" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = get_boolean_token(true);
     return TOK_BOOLEAN;
 }
 
 "no" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = get_boolean_token(false);
     return TOK_BOOLEAN;
 }
 
 "Host" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_HOSTLABEL;
 }
 
 "Net" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_NETLABEL;
 }
 
 "MaxConnections" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_MAXIPC;
 }
 
 "DebugLevel" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_DEBUGLEVEL;
 }
 
 "IpVersion" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_IPVERSION;
 }
 
 "NicChgsPollInt" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_NICCHGSPOLLRT;
 }
 
 "Hna4" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_HNA4;
 }
 
 "Hna6" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_HNA6;
 }
 
 "LoadPlugin" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_PLUGIN;
 }
 
 "PlParam" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_PLPARAM;
 }
 
 "Interface" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_INTERFACE;
 }
 "InterfaceDefaults" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_INTERFACE_DEFAULTS;
 }
 
 "AllowNoInt" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_NOINT;
 }
 
 "TosValue" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_TOS;
 }
 
 
 "OlsrPort" {
+  olsrd_config_checksum_add(yytext, yyleng);
   yylval = NULL;
   return TOK_OLSRPORT;
 }
 
 "RtProto" {
+  olsrd_config_checksum_add(yytext, yyleng);
   yylval = NULL;
   return TOK_RTPROTO;
 }
 
 "RtTable" {
+  olsrd_config_checksum_add(yytext, yyleng);
   yylval = NULL;
   return TOK_RTTABLE;
 }
 
 "RtTableDefault" {
+  olsrd_config_checksum_add(yytext, yyleng);
   yylval = NULL;
   return TOK_RTTABLE_DEFAULT;
 }
 
 "RtTableTunnel" {
+  olsrd_config_checksum_add(yytext, yyleng);
   yylval = NULL;
   return TOK_RTTABLE_TUNNEL;
 }
 
 "RtTablePriority" {
+  olsrd_config_checksum_add(yytext, yyleng);
   yylval = NULL;
   return TOK_RTTABLE_PRIORITY;
 }
 
 "RtTableDefaultOlsrPriority" {
+  olsrd_config_checksum_add(yytext, yyleng);
   yylval = NULL;
   return TOK_RTTABLE_DEFAULTOLSR_PRIORITY;
 }
 
 "RtTableTunnelPriority" {
+  olsrd_config_checksum_add(yytext, yyleng);
   yylval = NULL;
   return TOK_RTTABLE_TUNNEL_PRIORITY;
 }
 
 "RtTableDefaultPriority" {
+  olsrd_config_checksum_add(yytext, yyleng);
   yylval = NULL;
   return TOK_RTTABLE_DEFAULT_PRIORITY;
 }
 
 "Willingness" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_WILLINGNESS;
 }
 
 "IpcConnect" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_IPCCON;
 }
 
 "FIBMetric" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_FIBMETRIC;
 }
 
 "FIBMetricDefault" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_FIBMETRICDEFAULT;
 }
 
 "UseHysteresis" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_USEHYST;
 }
 
 "HystScaling" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_HYSTSCALE;
 }
 
 "HystThrHigh" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_HYSTUPPER;
 }
 
 "HystThrLow" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_HYSTLOWER;
 }
 
 "Pollrate" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_POLLRATE;
 }
 
 
 "TcRedundancy" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_TCREDUNDANCY;
 }
 
 "MprCoverage" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_MPRCOVERAGE;
 }
 
 "LinkQualityLevel" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_LQ_LEVEL;
 }
 
 "LinkQualityFishEye" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_LQ_FISH;
 }
 
 "LinkQualityAging" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_LQ_AGING;
 }
 
 "LinkQualityAlgorithm" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_LQ_PLUGIN;
 }
 
 "NatThreshold" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_LQ_NAT_THRESH;
 }
 
 "LinkQualityMult" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_LQ_MULT;
 }
 
 "MinTCVTime" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_MIN_TC_VTIME;
 }
 
 "LockFile" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_LOCK_FILE;
 }
 
 "ClearScreen" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_CLEAR_SCREEN;
 }
 
 "UseNiit" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_USE_NIIT;
 }
 
 "SmartGateway" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW;
 }
 
 "SmartGatewayAlwaysRemoveServerTunnel" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL;
 }
 
 "SmartGatewayUseCount" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_USE_COUNT;
 }
 
 "SmartGatewayTakeDownPercentage" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_TAKEDOWN_PERCENTAGE;
 }
 
 "SmartGatewayInstanceId" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_INSTANCE_ID;
 }
 
 "SmartGatewayPolicyRoutingScript" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_POLICYROUTING_SCRIPT;
 }
 
 "SmartGatewayEgressInterfaces" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_EGRESS_IFS;
 }
 
 "SmartGatewayEgressFile" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_EGRESS_FILE;
 }
 
 "SmartGatewayEgressFilePeriod" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_EGRESS_FILE_PERIOD;
 }
 
 "SmartGatewayStatusFile" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_STATUS_FILE;
 }
 
 "SmartGatewayTablesOffset" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_OFFSET_TABLES;
 }
 
 "SmartGatewayRulesOffset" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_OFFSET_RULES;
 }
 
 "SmartGatewayAllowNAT" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_ALLOW_NAT;
 }
 
 "SmartGatewayPeriod" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_PERIOD;
 }
 
 "SmartGatewayStableCount" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_STABLECOUNT;
 }
 
 "SmartGatewayThreshold" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_THRESH;
 }
 
 "SmartGatewayWeightExitLinkUp" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_WEIGHT_EXITLINK_UP;
 }
 
 "SmartGatewayWeightExitLinkDown" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_WEIGHT_EXITLINK_DOWN;
 }
 
 "SmartGatewayWeightEtx" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_WEIGHT_ETX;
 }
 
 "SmartGatewayDividerEtx" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_DIVIDER_ETX;
 }
 
 "SmartGatewayMaxCostMaxEtx" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_MAX_COST_MAX_ETX;
 }
 
 "SmartGatewayUplink" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_UPLINK;
 }
  
 "SmartGatewayUplinkNAT" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_UPLINK_NAT;
 }
  
 "SmartGatewaySpeed" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_SPEED;
 }
 
 "SmartGatewayPrefix" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SMART_GW_PREFIX;
 }
 
 "SrcIpRoutes" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SRC_IP_ROUTES;
 }
 "Weight" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_IFWEIGHT;
 }
 "MainIp" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_MAIN_IP;
 }
 "SetIpForward" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_SET_IPFORWARD;
 }
 "Ip4Broadcast" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_IP4BROADCAST;
 }
 "IPv4Broadcast" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_IPV4BROADCAST;
 }
 "IPv4Multicast" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_IPV4MULTICAST;
 }
 "Mode" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_IFMODE;
 }
 "IPv6Multicast" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_IPV6MULTICAST;
 }
 "IPv4Src" {
+        olsrd_config_checksum_add(yytext, yyleng);
                yylval = NULL;
                return TOK_IPV4SRC;
 }
 "IPv6Src" {
+        olsrd_config_checksum_add(yytext, yyleng);
                yylval = NULL;
                return TOK_IPV6SRC;
 }
 "HelloInterval" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_HELLOINT;
 }
 "HelloValidityTime" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_HELLOVAL;
 }
 "TcInterval" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_TCINT;
 }
 "TcValidityTime" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_TCVAL;
 }
 "MidInterval" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_MIDINT;
 }
 "MidValidityTime" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_MIDVAL;
 }
 "HnaInterval" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_HNAINT;
 }
 "HnaValidityTime" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_HNAVAL;
 }
 "AutoDetectChanges" {
+    olsrd_config_checksum_add(yytext, yyleng);
     yylval = NULL;
     return TOK_AUTODETCHG;
 }
index 325c8de..8ee2568 100644 (file)
@@ -51,6 +51,7 @@
 #include <fcntl.h>
 
 #include "cfgparser/olsrd_conf.h"
+#include "cfgparser/olsrd_conf_checksum.h"
 #include "ipcalc.h"
 #include "defs.h"
 #include "builddata.h"
@@ -409,6 +410,18 @@ int main(int argc, char *argv[]) {
   /* Open syslog */
   olsr_openlog("olsrd");
 
+  if (!olsrd_config_checksum_init()) {
+    olsr_exit("Could not initialise the configuration checksum", EXIT_FAILURE);
+  }
+
+  if (!olsrd_config_checksum_add_cli(argc, argv)) {
+    olsr_exit("Could not checksum the commandline arguments", EXIT_FAILURE);
+  }
+
+  if (!olsrd_config_checksum_add(OLSRD_CONFIG_START, OLSRD_CONFIG_START_LEN)) {
+    olsr_exit("Could not start the configuration file checksum", EXIT_FAILURE);
+  }
+
   /*
    * Initialisation
    */
@@ -495,6 +508,14 @@ int main(int argc, char *argv[]) {
     free(default_ifcnf);
   }
 
+  if (!olsrd_config_checksum_add(OLSRD_CONFIG_END, OLSRD_CONFIG_END_LEN)) {
+    olsr_exit("Could not finish the configuration file checksum", EXIT_FAILURE);
+  }
+
+  if (!olsrd_config_checksum_final()) {
+    olsr_exit("Could not finalise the configuration checksum", EXIT_FAILURE);
+  }
+
   /* Sanity check configuration */
   if (olsrd_sanity_check_cnf(olsr_cnf) < 0) {
     char buf2[1024];