mirror of
https://github.com/systemd/systemd.git
synced 2025-02-03 17:47:28 +03:00
sd-dhcp-server: always send out ROUTER and SUBNET_MASK
For now we simply take these values from the server's address.
This commit is contained in:
parent
72d314c8d8
commit
59b8f6b628
@ -55,6 +55,7 @@ struct sd_dhcp_server {
|
||||
|
||||
int index;
|
||||
be32_t address;
|
||||
be32_t netmask;
|
||||
be32_t pool_start;
|
||||
size_t pool_size;
|
||||
size_t next_offer;
|
||||
|
@ -51,13 +51,16 @@ int sd_dhcp_server_set_lease_pool(sd_dhcp_server *server, struct in_addr *addres
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sd_dhcp_server_set_address(sd_dhcp_server *server, struct in_addr *address) {
|
||||
int sd_dhcp_server_set_address(sd_dhcp_server *server, struct in_addr *address, unsigned char prefixlen) {
|
||||
assert_return(server, -EINVAL);
|
||||
assert_return(address, -EINVAL);
|
||||
assert_return(address->s_addr, -EINVAL);
|
||||
assert_return(prefixlen <= 32, -ERANGE);
|
||||
assert_return(server->address == htobe32(INADDR_ANY), -EBUSY);
|
||||
assert_return(server->netmask == htobe32(INADDR_ANY), -EBUSY);
|
||||
|
||||
server->address = address->s_addr;
|
||||
server->netmask = htobe32(0xfffffffflu << (32 - prefixlen));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -150,6 +153,7 @@ int sd_dhcp_server_new(sd_dhcp_server **ret, int ifindex) {
|
||||
server->fd_raw = -1;
|
||||
server->fd = -1;
|
||||
server->address = htobe32(INADDR_ANY);
|
||||
server->netmask = htobe32(INADDR_ANY);
|
||||
server->index = ifindex;
|
||||
server->leases_by_client_id = hashmap_new(client_id_hash_func, client_id_compare_func);
|
||||
|
||||
@ -408,6 +412,16 @@ static int server_send_offer(sd_dhcp_server *server, DHCPRequest *req, be32_t ad
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
|
||||
DHCP_OPTION_SUBNET_MASK, 4, &server->netmask);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
|
||||
DHCP_OPTION_ROUTER, 4, &server->address);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = dhcp_server_send_packet(server, req, packet, DHCP_OFFER, offset);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -433,6 +447,16 @@ static int server_send_ack(sd_dhcp_server *server, DHCPRequest *req, be32_t addr
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
|
||||
DHCP_OPTION_SUBNET_MASK, 4, &server->netmask);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
|
||||
DHCP_OPTION_ROUTER, 4, &server->address);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = dhcp_server_send_packet(server, req, packet, DHCP_ACK, offset);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
@ -56,9 +56,10 @@ static int test_basic(sd_event *event) {
|
||||
assert_se(!sd_dhcp_server_unref(server));
|
||||
|
||||
assert_se(sd_dhcp_server_start(server) == -EUNATCH);
|
||||
assert_se(sd_dhcp_server_set_address(server, &address_any) == -EINVAL);
|
||||
assert_se(sd_dhcp_server_set_address(server, &address_lo) >= 0);
|
||||
assert_se(sd_dhcp_server_set_address(server, &address_lo) == -EBUSY);
|
||||
assert_se(sd_dhcp_server_set_address(server, &address_any, 28) == -EINVAL);
|
||||
assert_se(sd_dhcp_server_set_address(server, &address_any, 38) == -ERANGE);
|
||||
assert_se(sd_dhcp_server_set_address(server, &address_lo, 8) >= 0);
|
||||
assert_se(sd_dhcp_server_set_address(server, &address_lo, 8) == -EBUSY);
|
||||
|
||||
assert_se(sd_dhcp_server_set_lease_pool(server, &address_any, 1) == -EINVAL);
|
||||
assert_se(sd_dhcp_server_set_lease_pool(server, &address_lo, 0) == -EINVAL);
|
||||
@ -120,7 +121,7 @@ static void test_message_handler(void) {
|
||||
};
|
||||
|
||||
assert_se(sd_dhcp_server_new(&server, 1) >= 0);
|
||||
assert_se(sd_dhcp_server_set_address(server, &address_lo) >= 0);
|
||||
assert_se(sd_dhcp_server_set_address(server, &address_lo, 8) >= 0);
|
||||
assert_se(sd_dhcp_server_attach_event(server, NULL, 0) >= 0);
|
||||
assert_se(sd_dhcp_server_start(server) >= 0);
|
||||
|
||||
|
@ -311,7 +311,7 @@ static int link_enter_configured(Link *link) {
|
||||
|
||||
log_debug_link(link, "offering DHCPv4 leases");
|
||||
|
||||
r = sd_dhcp_server_set_address(link->dhcp_server, &address->in_addr.in);
|
||||
r = sd_dhcp_server_set_address(link->dhcp_server, &address->in_addr.in, address->prefixlen);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
@ -44,7 +44,7 @@ bool sd_dhcp_server_is_running(sd_dhcp_server *server);
|
||||
int sd_dhcp_server_start(sd_dhcp_server *server);
|
||||
int sd_dhcp_server_stop(sd_dhcp_server *server);
|
||||
|
||||
int sd_dhcp_server_set_address(sd_dhcp_server *server, struct in_addr *address);
|
||||
int sd_dhcp_server_set_address(sd_dhcp_server *server, struct in_addr *address, unsigned char prefixlen);
|
||||
int sd_dhcp_server_set_lease_pool(sd_dhcp_server *server, struct in_addr *start, size_t size);
|
||||
|
||||
int sd_dhcp_server_forcerenew(sd_dhcp_server *server);
|
||||
|
Loading…
x
Reference in New Issue
Block a user