chiark / gitweb /
sd-dhcp-server: bind to raw socket for sending
authorTom Gundersen <teg@jklm.no>
Sat, 24 May 2014 21:03:49 +0000 (23:03 +0200)
committerTom Gundersen <teg@jklm.no>
Fri, 13 Jun 2014 14:53:13 +0000 (16:53 +0200)
We would like to use the UDP socket, but we cannot as we need to specify
the MAC address manually.

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

index 3d49cba917b2882239ccc255bab62520d2f6c080..6c2f2b40705685934a3f0df060eda6e1f4aed7d5 100644 (file)
@@ -36,6 +36,7 @@ struct sd_dhcp_server {
         int event_priority;
         sd_event_source *receive_message;
         int fd;
+        int fd_raw;
 
         int index;
 };
index b1f2fa063f66ef12f57ae7649d98807afb5ff0ad..ecdc15dff733c1789a7ede402948691941c6b197 100644 (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);