summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--src/libsystemd-dhcp/test-dhcp-client.c80
2 files changed, 82 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am
index 7c155141be..5828ae19a3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3880,6 +3880,8 @@ test_dhcp_client_SOURCES = \
src/libsystemd-dhcp/dhcp-protocol.h \
src/systemd/sd-dhcp-client.h \
src/libsystemd-dhcp/dhcp-client.c \
+ src/libsystemd-dhcp/dhcp-internal.h \
+ src/libsystemd-dhcp/dhcp-option.c \
src/libsystemd-dhcp/test-dhcp-client.c
test_dhcp_client_LDADD = \
diff --git a/src/libsystemd-dhcp/test-dhcp-client.c b/src/libsystemd-dhcp/test-dhcp-client.c
index d097c7d43c..fdcb6b1c49 100644
--- a/src/libsystemd-dhcp/test-dhcp-client.c
+++ b/src/libsystemd-dhcp/test-dhcp-client.c
@@ -24,9 +24,16 @@
#include <errno.h>
#include <stdio.h>
+#include "util.h"
+
#include "dhcp-protocol.h"
+#include "dhcp-internal.h"
#include "sd-dhcp-client.h"
+static struct ether_addr mac_addr = {
+ .ether_addr_octet = {'A', 'B', 'C', '1', '2', '3'}
+};
+
static void test_request_basic(void)
{
sd_dhcp_client *client;
@@ -112,10 +119,83 @@ static void test_checksum(void)
assert(client_checksum(&buf, 20) == *val);
}
+static int check_options(uint8_t code, uint8_t len, const uint8_t *option,
+ void *user_data)
+{
+ return 0;
+}
+
+int dhcp_network_send_raw_packet(int index, 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(packet);
+
+ size = sizeof(DHCPPacket) + 4;
+ assert(len > size);
+
+ discover = memdup(packet, len);
+
+ assert(memcmp(discover->dhcp.chaddr,
+ &mac_addr.ether_addr_octet, 6) == 0);
+ assert(discover->ip.ttl == IPDEFTTL);
+ 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));
+
+ ip_check = discover->ip.check;
+
+ discover->ip.ttl = 0;
+ discover->ip.check = discover->udp.len;
+
+ udp_check = ~client_checksum(&discover->ip.ttl, len - 8);
+ assert(udp_check == 0xffff);
+
+ discover->ip.ttl = IPDEFTTL;
+ discover->ip.check = ip_check;
+
+ ip_check = ~client_checksum(&discover->ip, sizeof(discover->ip));
+ assert(ip_check == 0xffff);
+
+ size = len - sizeof(struct iphdr) - sizeof(struct udphdr);
+
+ res = dhcp_option_parse(&discover->dhcp, size, check_options, NULL);
+ if (res < 0)
+ return res;
+
+ return 575;
+}
+
+static void test_discover_message(void)
+{
+ sd_dhcp_client *client;
+ int res;
+
+ client = sd_dhcp_client_new();
+ assert(client);
+
+ assert(sd_dhcp_client_set_index(client, 42) >= 0);
+ assert(sd_dhcp_client_set_mac(client, &mac_addr) >= 0);
+
+ assert(sd_dhcp_client_set_request_option(client, 248) >= 0);
+
+ res = sd_dhcp_client_start(client);
+
+ assert(res == 0 || res == -EINPROGRESS);
+}
+
int main(int argc, char *argv[])
{
test_request_basic();
test_checksum();
+ test_discover_message();
+
return 0;
}