#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"
.ether_addr_octet = {'A', 'B', 'C', '1', '2', '3'}
};
-static void test_request_basic(void)
+static int test_fd[2];
+
+static void test_request_basic(sd_event *e)
{
sd_dhcp_client *client;
- client = sd_dhcp_client_new();
+ client = sd_dhcp_client_new(e);
assert(client);
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)
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,
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;
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;
return 575;
}
-static void test_discover_message(void)
+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;
int res;
- client = sd_dhcp_client_new();
+ client = sd_dhcp_client_new(e);
assert(client);
assert(sd_dhcp_client_set_index(client, 42) >= 0);
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[])
{
- test_request_basic();
+ sd_event *e;
+
+ assert(sd_event_new(&e) >= 0);
+
+ test_request_basic(e);
test_checksum();
- test_discover_message();
+ test_discover_message(e);
+ sd_event_run(e, (uint64_t) -1);
return 0;
}