chiark / gitweb /
sd-dhcp-server: add support for setting the server address
authorTom Gundersen <teg@jklm.no>
Sat, 24 May 2014 22:29:13 +0000 (00:29 +0200)
committerTom Gundersen <teg@jklm.no>
Fri, 13 Jun 2014 15:07:19 +0000 (17:07 +0200)
src/libsystemd-network/dhcp-server-internal.h
src/libsystemd-network/sd-dhcp-server.c
src/libsystemd-network/test-dhcp-server.c
src/systemd/sd-dhcp-server.h

index 6c2f2b40705685934a3f0df060eda6e1f4aed7d5..58a98772babaf7ff1666f0e065dabf78b6ace912 100644 (file)
@@ -39,6 +39,7 @@ struct sd_dhcp_server {
         int fd_raw;
 
         int index;
+        be32_t address;
 };
 
 typedef struct DHCPClientId {
index ecdc15dff733c1789a7ede402948691941c6b197..37f81588c33c2546dc3e0e2046d1067898b53863 100644 (file)
 #include "dhcp-server-internal.h"
 #include "dhcp-internal.h"
 
+int sd_dhcp_server_set_address(sd_dhcp_server *server, struct in_addr *address) {
+        assert_return(server, -EINVAL);
+        assert_return(address, -EINVAL);
+        assert_return(address->s_addr, -EINVAL);
+        assert_return(server->address == htobe32(INADDR_ANY), -EBUSY);
+
+        server->address = address->s_addr;
+
+        return 0;
+}
+
 sd_dhcp_server *sd_dhcp_server_ref(sd_dhcp_server *server) {
         if (server)
                 assert_se(REFCNT_INC(server->n_ref) >= 2);
@@ -60,6 +71,7 @@ int sd_dhcp_server_new(sd_dhcp_server **ret, int ifindex) {
         server->n_ref = REFCNT_INIT;
         server->fd_raw = -1;
         server->fd = -1;
+        server->address = htobe32(INADDR_ANY);
         server->index = ifindex;
 
         *ret = server;
@@ -281,6 +293,7 @@ int sd_dhcp_server_start(sd_dhcp_server *server) {
         assert_return(!server->receive_message, -EBUSY);
         assert_return(server->fd_raw == -1, -EBUSY);
         assert_return(server->fd == -1, -EBUSY);
+        assert_return(server->address != htobe32(INADDR_ANY), -EUNATCH);
 
         r = socket(AF_PACKET, SOCK_DGRAM | SOCK_NONBLOCK, 0);
         if (r < 0) {
index dd0f29a04ca4ba5566372e49a993c796a5189888..f0f9cfe582b0daf172a64ce1e6ad7c9c3de2df51 100644 (file)
 
 static void test_basic(sd_event *event) {
         _cleanup_dhcp_server_unref_ sd_dhcp_server *server = NULL;
+        struct in_addr address_lo = {
+                .s_addr = htonl(INADDR_LOOPBACK),
+        };
+        struct in_addr address_any = {
+                .s_addr = htonl(INADDR_ANY),
+        };
 
         /* attach to loopback interface */
         assert_se(sd_dhcp_server_new(&server, 1) >= 0);
@@ -48,6 +54,11 @@ static void test_basic(sd_event *event) {
         assert_se(sd_dhcp_server_ref(server) == server);
         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_start(server) >= 0);
         assert_se(sd_dhcp_server_start(server) == -EBUSY);
         assert_se(sd_dhcp_server_stop(server) >= 0);
@@ -74,8 +85,14 @@ static void test_message_handler(void) {
                 .option_type.type = DHCP_DISCOVER,
                 .end = DHCP_OPTION_END,
         };
+        struct in_addr address_lo = {
+                .s_addr = htonl(INADDR_LOOPBACK),
+        };
 
         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_attach_event(server, NULL, 0) >= 0);
+        assert_se(sd_dhcp_server_start(server) >= 0);
 
         assert_se(dhcp_server_handle_message(server, (DHCPMessage*)&test, sizeof(test)) == 1);
 
index ab63294ac595d72bcb8b5ddb60e69d8657843882..5edeffc31c3ca1f9b55591e7959929a27f6a6a36 100644 (file)
@@ -41,4 +41,5 @@ sd_event *sd_dhcp_server_get_event(sd_dhcp_server *client);
 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);
 #endif