Skip to content

Commit f1923ef

Browse files
committed
network: nexthop: introduce Family= setting in [NextHop] section
This is an alias of `Gateway=0.0.0.0` or `Gateway=::`.
1 parent e9c4253 commit f1923ef

File tree

6 files changed

+78
-0
lines changed

6 files changed

+78
-0
lines changed

src/network/networkd-network-gperf.gperf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ Route.TTLPropagate, config_parse_route_boolean,
186186
Route.MultiPathRoute, config_parse_multipath_route, 0, 0
187187
NextHop.Id, config_parse_nexthop_id, 0, 0
188188
NextHop.Gateway, config_parse_nexthop_gateway, 0, 0
189+
NextHop.Family, config_parse_nexthop_family, 0, 0
189190
DHCPv4.ClientIdentifier, config_parse_dhcp_client_identifier, 0, offsetof(Network, dhcp_client_identifier)
190191
DHCPv4.UseDNS, config_parse_dhcp_use_dns, 0, 0
191192
DHCPv4.RoutesToDNS, config_parse_bool, 0, offsetof(Network, dhcp_routes_to_dns)

src/network/networkd-nexthop.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,3 +538,69 @@ int config_parse_nexthop_gateway(
538538
TAKE_PTR(n);
539539
return 0;
540540
}
541+
542+
int config_parse_nexthop_family(
543+
const char *unit,
544+
const char *filename,
545+
unsigned line,
546+
const char *section,
547+
unsigned section_line,
548+
const char *lvalue,
549+
int ltype,
550+
const char *rvalue,
551+
void *data,
552+
void *userdata) {
553+
554+
_cleanup_(nexthop_free_or_set_invalidp) NextHop *n = NULL;
555+
Network *network = userdata;
556+
AddressFamily a;
557+
int r;
558+
559+
assert(filename);
560+
assert(section);
561+
assert(lvalue);
562+
assert(rvalue);
563+
assert(data);
564+
565+
r = nexthop_new_static(network, filename, section_line, &n);
566+
if (r < 0)
567+
return log_oom();
568+
569+
if (isempty(rvalue) &&
570+
in_addr_is_null(n->family, &n->gw) != 0) {
571+
/* Accept an empty string only when Gateway= is null or not specified. */
572+
n->family = AF_UNSPEC;
573+
TAKE_PTR(n);
574+
return 0;
575+
}
576+
577+
a = nexthop_address_family_from_string(rvalue);
578+
if (a < 0) {
579+
log_syntax(unit, LOG_WARNING, filename, line, 0,
580+
"Invalid %s='%s', ignoring assignment: %m", lvalue, rvalue);
581+
return 0;
582+
}
583+
584+
if (in_addr_is_null(n->family, &n->gw) == 0 &&
585+
((a == ADDRESS_FAMILY_IPV4 && n->family == AF_INET6) ||
586+
(a == ADDRESS_FAMILY_IPV6 && n->family == AF_INET))) {
587+
log_syntax(unit, LOG_WARNING, filename, line, 0,
588+
"Specified family '%s' conflicts with the family of the previously specified Gateway=, "
589+
"ignoring assignment.", rvalue);
590+
return 0;
591+
}
592+
593+
switch(a) {
594+
case ADDRESS_FAMILY_IPV4:
595+
n->family = AF_INET;
596+
break;
597+
case ADDRESS_FAMILY_IPV6:
598+
n->family = AF_INET6;
599+
break;
600+
default:
601+
assert_not_reached("Invalid family.");
602+
}
603+
604+
TAKE_PTR(n);
605+
return 0;
606+
}

src/network/networkd-nexthop.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@ int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message,
3939

4040
CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_id);
4141
CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_gateway);
42+
CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_family);

src/network/networkd-util.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ static const char* const routing_policy_rule_address_family_table[_ADDRESS_FAMIL
2121
[ADDRESS_FAMILY_IPV6] = "ipv6",
2222
};
2323

24+
static const char* const nexthop_address_family_table[_ADDRESS_FAMILY_MAX] = {
25+
[ADDRESS_FAMILY_IPV4] = "ipv4",
26+
[ADDRESS_FAMILY_IPV6] = "ipv6",
27+
};
28+
2429
static const char* const duplicate_address_detection_address_family_table[_ADDRESS_FAMILY_MAX] = {
2530
[ADDRESS_FAMILY_NO] = "none",
2631
[ADDRESS_FAMILY_YES] = "both",
@@ -55,6 +60,7 @@ AddressFamily link_local_address_family_from_string(const char *s) {
5560
}
5661

5762
DEFINE_STRING_TABLE_LOOKUP(routing_policy_rule_address_family, AddressFamily);
63+
DEFINE_STRING_TABLE_LOOKUP(nexthop_address_family, AddressFamily);
5864
DEFINE_STRING_TABLE_LOOKUP(duplicate_address_detection_address_family, AddressFamily);
5965
DEFINE_CONFIG_PARSE_ENUM(config_parse_link_local_address_family, link_local_address_family,
6066
AddressFamily, "Failed to parse option");

src/network/networkd-util.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ AddressFamily link_local_address_family_from_string(const char *s) _pure_;
3838
const char *routing_policy_rule_address_family_to_string(AddressFamily b) _const_;
3939
AddressFamily routing_policy_rule_address_family_from_string(const char *s) _pure_;
4040

41+
const char *nexthop_address_family_to_string(AddressFamily b) _const_;
42+
AddressFamily nexthop_address_family_from_string(const char *s) _pure_;
43+
4144
const char *duplicate_address_detection_address_family_to_string(AddressFamily b) _const_;
4245
AddressFamily duplicate_address_detection_address_family_from_string(const char *s) _pure_;
4346

test/fuzz/fuzz-network-parser/directives.network

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ SendVendorOption=
349349
[NextHop]
350350
Id=
351351
Gateway=
352+
Family=
352353
[QDisc]
353354
Parent=
354355
Handle=

0 commit comments

Comments
 (0)