1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-23 17:34:00 +03:00

sd-dhcp-server: bind to raw socket for sending

We would like to use the UDP socket, but we cannot as we need to specify
the MAC address manually.
This commit is contained in:
Tom Gundersen 2014-05-24 23:03:49 +02:00
parent 816e2e7af9
commit 8de4a226c7
2 changed files with 12 additions and 0 deletions

View File

@ -36,6 +36,7 @@ struct sd_dhcp_server {
int event_priority;
sd_event_source *receive_message;
int fd;
int fd_raw;
int index;
};

View File

@ -58,6 +58,7 @@ int sd_dhcp_server_new(sd_dhcp_server **ret, int ifindex) {
return -ENOMEM;
server->n_ref = REFCNT_INIT;
server->fd_raw = -1;
server->fd = -1;
server->index = ifindex;
@ -106,6 +107,7 @@ int sd_dhcp_server_stop(sd_dhcp_server *server) {
server->receive_message =
sd_event_source_unref(server->receive_message);
server->fd_raw = safe_close(server->fd_raw);
server->fd = safe_close(server->fd);
log_dhcp_server(server, "STOPPED");
@ -277,8 +279,17 @@ int sd_dhcp_server_start(sd_dhcp_server *server) {
assert_return(server, -EINVAL);
assert_return(server->event, -EINVAL);
assert_return(!server->receive_message, -EBUSY);
assert_return(server->fd_raw == -1, -EBUSY);
assert_return(server->fd == -1, -EBUSY);
r = socket(AF_PACKET, SOCK_DGRAM | SOCK_NONBLOCK, 0);
if (r < 0) {
r = -errno;
sd_dhcp_server_stop(server);
return r;
}
server->fd_raw = r;
r = dhcp_network_bind_udp_socket(INADDR_ANY, DHCP_PORT_SERVER);
if (r < 0) {
sd_dhcp_server_stop(server);