summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2019-07-07 01:43:33 +0200
committerYu Watanabe <watanabe.yu+github@gmail.com>2019-07-12 02:39:43 +0200
commit7a22312d6876290ede6576a9793ab9a654fe173d (patch)
treeae313ce472368bc2635db265395ebb32fe5cfcd2
parenttest-network: test more bridge properties (diff)
downloadsystemd-7a22312d6876290ede6576a9793ab9a654fe173d.tar.xz
systemd-7a22312d6876290ede6576a9793ab9a654fe173d.zip
network: use string table to parse route type
-rw-r--r--src/network/networkd-route.c31
-rw-r--r--src/network/networkd-route.h3
2 files changed, 21 insertions, 13 deletions
diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c
index f79d5b2057..618d250899 100644
--- a/src/network/networkd-route.c
+++ b/src/network/networkd-route.c
@@ -12,6 +12,7 @@
#include "networkd-route.h"
#include "parse-util.h"
#include "set.h"
+#include "string-table.h"
#include "string-util.h"
#include "sysctl-util.h"
#include "util.h"
@@ -749,6 +750,17 @@ int network_add_default_route_on_device(Network *network) {
return 0;
}
+static const char * const route_type_table[__RTN_MAX] = {
+ [RTN_UNICAST] = "unicast",
+ [RTN_BLACKHOLE] = "blackhole",
+ [RTN_UNREACHABLE] = "unreachable",
+ [RTN_PROHIBIT] = "prohibit",
+ [RTN_THROW] = "throw",
+};
+
+assert_cc(__RTN_MAX <= UCHAR_MAX);
+DEFINE_STRING_TABLE_LOOKUP(route_type, int);
+
int config_parse_gateway(
const char *unit,
const char *filename,
@@ -1127,28 +1139,21 @@ int config_parse_route_type(
Network *network = userdata;
_cleanup_(route_free_or_set_invalidp) Route *n = NULL;
- int r;
+ int t, r;
r = route_new_static(network, filename, section_line, &n);
if (r < 0)
return r;
- if (streq(rvalue, "unicast"))
- n->type = RTN_UNICAST;
- else if (streq(rvalue, "blackhole"))
- n->type = RTN_BLACKHOLE;
- else if (streq(rvalue, "unreachable"))
- n->type = RTN_UNREACHABLE;
- else if (streq(rvalue, "prohibit"))
- n->type = RTN_PROHIBIT;
- else if (streq(rvalue, "throw"))
- n->type = RTN_THROW;
- else {
- log_syntax(unit, LOG_ERR, filename, line, r,
+ t = route_type_from_string(rvalue);
+ if (t < 0) {
+ log_syntax(unit, LOG_ERR, filename, line, 0,
"Could not parse route type \"%s\", ignoring assignment: %m", rvalue);
return 0;
}
+ n->type = (unsigned char) t;
+
TAKE_PTR(n);
return 0;
}
diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h
index 3c0ac896ae..e7bd61eb9e 100644
--- a/src/network/networkd-route.h
+++ b/src/network/networkd-route.h
@@ -65,6 +65,9 @@ DEFINE_NETWORK_SECTION_FUNCTIONS(Route, route_free);
int network_add_ipv4ll_route(Network *network);
int network_add_default_route_on_device(Network *network);
+const char* route_type_to_string(int t) _const_;
+int route_type_from_string(const char *s) _pure_;
+
CONFIG_PARSER_PROTOTYPE(config_parse_gateway);
CONFIG_PARSER_PROTOTYPE(config_parse_preferred_src);
CONFIG_PARSER_PROTOTYPE(config_parse_destination);