This is an alias of `Gateway=0.0.0.0` or `Gateway=::`.
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)
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;
+}
CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_id);
CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_gateway);
+CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_family);
[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",
}
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");
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_;
[NextHop]
Id=
Gateway=
+Family=
[QDisc]
Parent=
Handle=