summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-02-03 08:59:26 +0100
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-02-17 07:55:37 +0100
commitf1923efccbb8d03ca16e6ee48aedea309ede2c75 (patch)
tree8f57d0b17d953af5b4e7498613791b72a0bcc726 /src
parentnetwork: allow to configure nexthop with null address (diff)
downloadsystemd-f1923efccbb8d03ca16e6ee48aedea309ede2c75.tar.xz
systemd-f1923efccbb8d03ca16e6ee48aedea309ede2c75.zip
network: nexthop: introduce Family= setting in [NextHop] section
This is an alias of `Gateway=0.0.0.0` or `Gateway=::`.
Diffstat (limited to 'src')
-rw-r--r--src/network/networkd-network-gperf.gperf1
-rw-r--r--src/network/networkd-nexthop.c66
-rw-r--r--src/network/networkd-nexthop.h1
-rw-r--r--src/network/networkd-util.c6
-rw-r--r--src/network/networkd-util.h3
5 files changed, 77 insertions, 0 deletions
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index 44d8641572..f7dd21b73d 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -186,6 +186,7 @@ Route.TTLPropagate, config_parse_route_boolean,
Route.MultiPathRoute, config_parse_multipath_route, 0, 0
NextHop.Id, config_parse_nexthop_id, 0, 0
NextHop.Gateway, config_parse_nexthop_gateway, 0, 0
+NextHop.Family, config_parse_nexthop_family, 0, 0
DHCPv4.ClientIdentifier, config_parse_dhcp_client_identifier, 0, offsetof(Network, dhcp_client_identifier)
DHCPv4.UseDNS, config_parse_dhcp_use_dns, 0, 0
DHCPv4.RoutesToDNS, config_parse_bool, 0, offsetof(Network, dhcp_routes_to_dns)
diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c
index fcbb25ba15..bdbb9babe7 100644
--- a/src/network/networkd-nexthop.c
+++ b/src/network/networkd-nexthop.c
@@ -538,3 +538,69 @@ int config_parse_nexthop_gateway(
TAKE_PTR(n);
return 0;
}
+
+int config_parse_nexthop_family(
+ const char *unit,
+ const char *filename,
+ unsigned line,
+ const char *section,
+ unsigned section_line,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ _cleanup_(nexthop_free_or_set_invalidp) NextHop *n = NULL;
+ Network *network = userdata;
+ AddressFamily a;
+ int r;
+
+ assert(filename);
+ assert(section);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ r = nexthop_new_static(network, filename, section_line, &n);
+ if (r < 0)
+ return log_oom();
+
+ if (isempty(rvalue) &&
+ in_addr_is_null(n->family, &n->gw) != 0) {
+ /* Accept an empty string only when Gateway= is null or not specified. */
+ n->family = AF_UNSPEC;
+ TAKE_PTR(n);
+ return 0;
+ }
+
+ a = nexthop_address_family_from_string(rvalue);
+ if (a < 0) {
+ log_syntax(unit, LOG_WARNING, filename, line, 0,
+ "Invalid %s='%s', ignoring assignment: %m", lvalue, rvalue);
+ return 0;
+ }
+
+ if (in_addr_is_null(n->family, &n->gw) == 0 &&
+ ((a == ADDRESS_FAMILY_IPV4 && n->family == AF_INET6) ||
+ (a == ADDRESS_FAMILY_IPV6 && n->family == AF_INET))) {
+ log_syntax(unit, LOG_WARNING, filename, line, 0,
+ "Specified family '%s' conflicts with the family of the previously specified Gateway=, "
+ "ignoring assignment.", rvalue);
+ return 0;
+ }
+
+ switch(a) {
+ case ADDRESS_FAMILY_IPV4:
+ n->family = AF_INET;
+ break;
+ case ADDRESS_FAMILY_IPV6:
+ n->family = AF_INET6;
+ break;
+ default:
+ assert_not_reached("Invalid family.");
+ }
+
+ TAKE_PTR(n);
+ return 0;
+}
diff --git a/src/network/networkd-nexthop.h b/src/network/networkd-nexthop.h
index 75714e7ef5..3e5fbf028f 100644
--- a/src/network/networkd-nexthop.h
+++ b/src/network/networkd-nexthop.h
@@ -39,3 +39,4 @@ int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message,
CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_id);
CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_gateway);
+CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_family);
diff --git a/src/network/networkd-util.c b/src/network/networkd-util.c
index 494b23f9f4..e9fe87ea63 100644
--- a/src/network/networkd-util.c
+++ b/src/network/networkd-util.c
@@ -21,6 +21,11 @@ static const char* const routing_policy_rule_address_family_table[_ADDRESS_FAMIL
[ADDRESS_FAMILY_IPV6] = "ipv6",
};
+static const char* const nexthop_address_family_table[_ADDRESS_FAMILY_MAX] = {
+ [ADDRESS_FAMILY_IPV4] = "ipv4",
+ [ADDRESS_FAMILY_IPV6] = "ipv6",
+};
+
static const char* const duplicate_address_detection_address_family_table[_ADDRESS_FAMILY_MAX] = {
[ADDRESS_FAMILY_NO] = "none",
[ADDRESS_FAMILY_YES] = "both",
@@ -55,6 +60,7 @@ AddressFamily link_local_address_family_from_string(const char *s) {
}
DEFINE_STRING_TABLE_LOOKUP(routing_policy_rule_address_family, AddressFamily);
+DEFINE_STRING_TABLE_LOOKUP(nexthop_address_family, AddressFamily);
DEFINE_STRING_TABLE_LOOKUP(duplicate_address_detection_address_family, AddressFamily);
DEFINE_CONFIG_PARSE_ENUM(config_parse_link_local_address_family, link_local_address_family,
AddressFamily, "Failed to parse option");
diff --git a/src/network/networkd-util.h b/src/network/networkd-util.h
index 1b842a9a4e..fa46c3a3ec 100644
--- a/src/network/networkd-util.h
+++ b/src/network/networkd-util.h
@@ -38,6 +38,9 @@ AddressFamily link_local_address_family_from_string(const char *s) _pure_;
const char *routing_policy_rule_address_family_to_string(AddressFamily b) _const_;
AddressFamily routing_policy_rule_address_family_from_string(const char *s) _pure_;
+const char *nexthop_address_family_to_string(AddressFamily b) _const_;
+AddressFamily nexthop_address_family_from_string(const char *s) _pure_;
+
const char *duplicate_address_detection_address_family_to_string(AddressFamily b) _const_;
AddressFamily duplicate_address_detection_address_family_from_string(const char *s) _pure_;