chiark / gitweb /
Improve messages about user mode a bit
[elogind.git] / src / libsystemd-dhcp / test-dhcp-client.c
index b8a448d0dc5c02726f8a32949114f814c52f0390..929b869ec331dd853ffd1530c77595d1ef4db7df 100644 (file)
 #include <assert.h>
 #include <errno.h>
 #include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <unistd.h>
 
 #include "util.h"
+#include "socket-util.h"
 
 #include "dhcp-protocol.h"
 #include "dhcp-internal.h"
@@ -34,6 +38,8 @@ static struct ether_addr mac_addr = {
         .ether_addr_octet = {'A', 'B', 'C', '1', '2', '3'}
 };
 
+static int test_fd[2];
+
 static void test_request_basic(sd_event *e)
 {
         sd_dhcp_client *client;
@@ -79,6 +85,7 @@ static void test_request_basic(sd_event *e)
         assert(sd_dhcp_client_set_request_option(client, 33) == 0);
         assert(sd_dhcp_client_set_request_option(client, 33) == -EEXIST);
         assert(sd_dhcp_client_set_request_option(client, 44) == 0);
+        assert(sd_dhcp_client_set_request_option(client, 33) == -EEXIST);
 }
 
 static uint16_t client_checksum(void *buf, int len)
@@ -96,10 +103,13 @@ static uint16_t client_checksum(void *buf, int len)
 
         if (len & 0x01) {
                 odd = buf;
-                sum += odd[len];
+                sum += odd[len - 1];
         }
 
-        return ~((sum & 0xffff) + (sum >> 16));
+        while (sum >> 16)
+                sum = (sum & 0xffff) + (sum >> 16);
+
+        return ~sum;
 }
 
 static void test_checksum(void)
@@ -110,13 +120,7 @@ static void test_checksum(void)
                 0xff, 0xff, 0xff, 0xff
         };
 
-        uint8_t check[2] = {
-                0x78, 0xae
-        };
-
-        uint16_t *val = (uint16_t *)check;
-
-        assert(client_checksum(&buf, 20) == *val);
+        assert(client_checksum(&buf, 20) == be16toh(0x78ae));
 }
 
 static int check_options(uint8_t code, uint8_t len, const uint8_t *option,
@@ -125,14 +129,15 @@ static int check_options(uint8_t code, uint8_t len, const uint8_t *option,
         return 0;
 }
 
-int dhcp_network_send_raw_packet(int index, const void *packet, size_t len)
+int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link,
+                                 const void *packet, size_t len)
 {
         size_t size;
         _cleanup_free_ DHCPPacket *discover;
         uint16_t ip_check, udp_check;
         int res;
 
-        assert(index == 42);
+        assert(s >= 0);
         assert(packet);
 
         size = sizeof(DHCPPacket) + 4;
@@ -146,8 +151,8 @@ int dhcp_network_send_raw_packet(int index, const void *packet, size_t len)
         assert(discover->ip.protocol == IPPROTO_UDP);
         assert(discover->ip.saddr == INADDR_ANY);
         assert(discover->ip.daddr == INADDR_BROADCAST);
-        assert(discover->udp.source == ntohs(DHCP_PORT_CLIENT));
-        assert(discover->udp.dest == ntohs(DHCP_PORT_SERVER));
+        assert(discover->udp.source == be16toh(DHCP_PORT_CLIENT));
+        assert(discover->udp.dest == be16toh(DHCP_PORT_SERVER));
 
         ip_check = discover->ip.check;
 
@@ -172,6 +177,25 @@ int dhcp_network_send_raw_packet(int index, const void *packet, size_t len)
         return 575;
 }
 
+int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link)
+{
+        if (socketpair(AF_UNIX, SOCK_STREAM, 0, test_fd) < 0)
+                return -errno;
+
+        return test_fd[0];
+}
+
+int dhcp_network_bind_udp_socket(int index, be32_t client_address)
+{
+        return 0;
+}
+
+int dhcp_network_send_udp_socket(int s, be32_t server_address,
+                                 const void *packet, size_t len)
+{
+        return 0;
+}
+
 static void test_discover_message(sd_event *e)
 {
         sd_dhcp_client *client;
@@ -188,6 +212,9 @@ static void test_discover_message(sd_event *e)
         res = sd_dhcp_client_start(client);
 
         assert(res == 0 || res == -EINPROGRESS);
+
+        close(test_fd[0]);
+        close(test_fd[1]);
 }
 
 int main(int argc, char *argv[])