X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-dhcp%2Ftest-dhcp-client.c;h=56a10b3dfc7bb6c8b7fc2a5420275a36f955e595;hb=c61be55d23f7603a986dc2937dd7f9aa390ae79c;hp=b8a448d0dc5c02726f8a32949114f814c52f0390;hpb=d3d8ac2f2bac721d99f893c0a0128d21db636d4c;p=elogind.git diff --git a/src/libsystemd-dhcp/test-dhcp-client.c b/src/libsystemd-dhcp/test-dhcp-client.c index b8a448d0d..56a10b3df 100644 --- a/src/libsystemd-dhcp/test-dhcp-client.c +++ b/src/libsystemd-dhcp/test-dhcp-client.c @@ -23,8 +23,12 @@ #include #include #include +#include +#include +#include #include "util.h" +#include "socket-util.h" #include "dhcp-protocol.h" #include "dhcp-internal.h" @@ -34,14 +38,22 @@ 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) { + int r; + sd_dhcp_client *client; - client = sd_dhcp_client_new(e); + r = sd_dhcp_client_new(&client); + assert(r >= 0); assert(client); + r = sd_dhcp_client_attach_event(client, e, 0); + assert(r >= 0); + assert(sd_dhcp_client_set_request_option(NULL, 0) == -EINVAL); assert(sd_dhcp_client_set_request_address(NULL, NULL) == -EINVAL); assert(sd_dhcp_client_set_index(NULL, 0) == -EINVAL); @@ -79,6 +91,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 +109,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 +126,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 +135,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 +157,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,14 +183,37 @@ 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; - int res; + int res, r; - client = sd_dhcp_client_new(e); + r = sd_dhcp_client_new(&client); + assert(r >= 0); assert(client); + r = sd_dhcp_client_attach_event(client, e, 0); + assert(r >= 0); + assert(sd_dhcp_client_set_index(client, 42) >= 0); assert(sd_dhcp_client_set_mac(client, &mac_addr) >= 0); @@ -188,6 +222,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[])