Skip to content

Commit ab7b261

Browse files
authored
Merge pull request systemd#21210 from yuwata/network-dhcp-server-introduce-router-setting
network: dhcp-server: introduce Router= setting to specify router address
2 parents 2f2cdd7 + 32d9733 commit ab7b261

File tree

10 files changed

+41
-24
lines changed

10 files changed

+41
-24
lines changed

man/systemd.network.xml

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2482,12 +2482,16 @@ Token=prefixstable:2002:da8:1::</programlisting></para>
24822482

24832483
<varlistentry>
24842484
<term><varname>EmitRouter=</varname></term>
2485-
2486-
<listitem><para>Similar to the <varname>EmitDNS=</varname>
2487-
setting described above, this setting configures whether the
2488-
DHCP lease should contain the router option. The same syntax,
2489-
propagation semantics and defaults apply as for
2490-
<varname>EmitDNS=</varname>.</para></listitem>
2485+
<term><varname>Router=</varname></term>
2486+
2487+
<listitem><para>The <varname>EmitRouter=</varname> setting takes a boolean value, and configures
2488+
whether the DHCP lease should contain the router option. The <varname>Router=</varname> setting
2489+
takes an IPv4 address, and configures the router address to be emitted. When the
2490+
<varname>Router=</varname> setting is not specified, then the server address will be used for
2491+
the router option. When the <varname>EmitRouter=</varname> setting is disabled, the
2492+
<varname>Router=</varname> setting will be ignored. The <varname>EmitRouter=</varname> setting
2493+
defaults to true, and the <varname>Router=</varname> setting defaults to unset.
2494+
</para></listitem>
24912495
</varlistentry>
24922496

24932497
<varlistentry>

src/libsystemd-network/dhcp-server-internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ struct sd_dhcp_server {
6868
OrderedSet *vendor_options;
6969

7070
bool emit_router;
71+
struct in_addr router_address;
7172

7273
Hashmap *bound_leases_by_client_id;
7374
Hashmap *bound_leases_by_address;

src/libsystemd-network/sd-dhcp-server.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,10 @@ static int server_send_offer_or_ack(
533533

534534
if (server->emit_router) {
535535
r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
536-
SD_DHCP_OPTION_ROUTER, 4, &server->address);
536+
SD_DHCP_OPTION_ROUTER, 4,
537+
in4_addr_is_set(&server->router_address) ?
538+
&server->router_address.s_addr :
539+
&server->address);
537540
if (r < 0)
538541
return r;
539542
}
@@ -1418,15 +1421,18 @@ int sd_dhcp_server_set_lpr(sd_dhcp_server *server, const struct in_addr lpr[], s
14181421
return sd_dhcp_server_set_servers(server, SD_DHCP_LEASE_LPR, lpr, n);
14191422
}
14201423

1421-
int sd_dhcp_server_set_emit_router(sd_dhcp_server *server, int enabled) {
1424+
int sd_dhcp_server_set_router(sd_dhcp_server *server, const struct in_addr *router) {
14221425
assert_return(server, -EINVAL);
14231426

1424-
if (enabled == server->emit_router)
1425-
return 0;
1427+
/* router is NULL: router option will not be appended.
1428+
* router is null address (0.0.0.0): the server address will be used as the router address.
1429+
* otherwise: the specified address will be used as the router address.*/
14261430

1427-
server->emit_router = enabled;
1431+
server->emit_router = router;
1432+
if (router)
1433+
server->router_address = *router;
14281434

1429-
return 1;
1435+
return 0;
14301436
}
14311437

14321438
int sd_dhcp_server_add_option(sd_dhcp_server *server, sd_dhcp_option *v) {

src/network/networkd-dhcp-server.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -448,9 +448,11 @@ static int dhcp4_server_configure(Link *link) {
448448
dhcp_lease_server_type_to_string(type));
449449
}
450450

451-
r = sd_dhcp_server_set_emit_router(link->dhcp_server, link->network->dhcp_server_emit_router);
452-
if (r < 0)
453-
return log_link_error_errno(link, r, "Failed to set router emission for DHCP server: %m");
451+
if (link->network->dhcp_server_emit_router) {
452+
r = sd_dhcp_server_set_router(link->dhcp_server, &link->network->dhcp_server_router);
453+
if (r < 0)
454+
return log_link_error_errno(link, r, "Failed to set router address for DHCP server: %m");
455+
}
454456

455457
r = sd_dhcp_server_set_relay_target(link->dhcp_server, &link->network->dhcp_server_relay_target);
456458
if (r < 0)

src/network/networkd-network-gperf.gperf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ DHCPServer.SMTP, config_parse_dhcp_server_emit,
290290
DHCPServer.EmitLPR, config_parse_bool, 0, offsetof(Network, dhcp_server_emit[SD_DHCP_LEASE_LPR].emit)
291291
DHCPServer.LPR, config_parse_dhcp_server_emit, 0, offsetof(Network, dhcp_server_emit[SD_DHCP_LEASE_LPR])
292292
DHCPServer.EmitRouter, config_parse_bool, 0, offsetof(Network, dhcp_server_emit_router)
293+
DHCPServer.Router, config_parse_in_addr_non_null, AF_INET, offsetof(Network, dhcp_server_router)
293294
DHCPServer.EmitTimezone, config_parse_bool, 0, offsetof(Network, dhcp_server_emit_timezone)
294295
DHCPServer.Timezone, config_parse_timezone, 0, offsetof(Network, dhcp_server_timezone)
295296
DHCPServer.PoolOffset, config_parse_uint32, 0, offsetof(Network, dhcp_server_pool_offset)

src/network/networkd-network.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ struct Network {
202202
char *dhcp_server_relay_agent_remote_id;
203203
NetworkDHCPServerEmitAddress dhcp_server_emit[_SD_DHCP_LEASE_SERVER_TYPE_MAX];
204204
bool dhcp_server_emit_router;
205+
struct in_addr dhcp_server_router;
205206
bool dhcp_server_emit_timezone;
206207
char *dhcp_server_timezone;
207208
usec_t dhcp_server_default_lease_time_usec, dhcp_server_max_lease_time_usec;

src/systemd/sd-dhcp-server.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ int sd_dhcp_server_configure_pool(sd_dhcp_server *server, const struct in_addr *
6060

6161
int sd_dhcp_server_set_bind_to_interface(sd_dhcp_server *server, int enabled);
6262
int sd_dhcp_server_set_timezone(sd_dhcp_server *server, const char *timezone);
63-
int sd_dhcp_server_set_emit_router(sd_dhcp_server *server, int enabled);
63+
int sd_dhcp_server_set_router(sd_dhcp_server *server, const struct in_addr *address);
6464

6565
int sd_dhcp_server_set_servers(
6666
sd_dhcp_server *server,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ SMTP=
379379
EmitLPR=
380380
LPR=
381381
EmitRouter=
382+
Router=
382383
MaxLeaseTimeSec=
383384
DefaultLeaseTimeSec=
384385
EmitTimezone=

test/test-network/conf/dhcp-server.network

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ ServerAddress=192.168.5.1/24
1111
PoolOffset=10
1212
PoolSize=50
1313
UplinkInterface=dummy98
14+
Router=192.168.5.3

test/test-network/systemd-networkd-tests.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3989,10 +3989,10 @@ def test_dhcp_server(self):
39893989

39903990
output = check_output(*networkctl_cmd, '-n', '0', 'status', 'veth99', env=env)
39913991
print(output)
3992-
self.assertRegex(output, '192.168.5.*')
3993-
self.assertRegex(output, 'Gateway: 192.168.5.1')
3994-
self.assertRegex(output, 'DNS: 192.168.5.1')
3995-
self.assertRegex(output, 'NTP: 192.168.5.1')
3992+
self.assertRegex(output, 'Address: 192.168.5.[0-9]* \(DHCP4 via 192.168.5.1\)')
3993+
self.assertIn('Gateway: 192.168.5.3', output)
3994+
self.assertIn('DNS: 192.168.5.1', output)
3995+
self.assertIn('NTP: 192.168.5.1', output)
39963996

39973997
def test_emit_router_timezone(self):
39983998
copy_unit_to_networkd_unit_path('25-veth.netdev', 'dhcp-client-timezone-router.network', 'dhcp-server-timezone-router.network')
@@ -4001,9 +4001,9 @@ def test_emit_router_timezone(self):
40014001

40024002
output = check_output(*networkctl_cmd, '-n', '0', 'status', 'veth99', env=env)
40034003
print(output)
4004-
self.assertRegex(output, 'Gateway: 192.168.5.*')
4005-
self.assertRegex(output, '192.168.5.*')
4006-
self.assertRegex(output, 'Europe/Berlin')
4004+
self.assertRegex(output, 'Address: 192.168.5.[0-9]* \(DHCP4 via 192.168.5.1\)')
4005+
self.assertIn('Gateway: 192.168.5.1', output)
4006+
self.assertIn('Time Zone: Europe/Berlin', output)
40074007

40084008
def test_dhcp_server_static_lease(self):
40094009
copy_unit_to_networkd_unit_path('25-veth.netdev', 'dhcp-client-static-lease.network', 'dhcp-server-static-lease.network')
@@ -4012,7 +4012,7 @@ def test_dhcp_server_static_lease(self):
40124012

40134013
output = check_output(*networkctl_cmd, '-n', '0', 'status', 'veth99', env=env)
40144014
print(output)
4015-
self.assertIn('10.1.1.200 (DHCP4 via 10.1.1.1)', output)
4015+
self.assertIn('Address: 10.1.1.200 (DHCP4 via 10.1.1.1)', output)
40164016

40174017
class NetworkdDHCPServerRelayAgentTests(unittest.TestCase, Utilities):
40184018
links = [

0 commit comments

Comments
 (0)