X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-network%2Ftest-dhcp-client.c;h=71b06b17a9bd3ee5670010c72a62892dc6f89110;hp=1eb4648012174bb9c2eb3b154eef4d190d0df99e;hb=d47e1de40e410ab2149918c3269038d2c264b01d;hpb=8fc8e3ab98104db40f5674984dd3edb54e62267f diff --git a/src/libsystemd-network/test-dhcp-client.c b/src/libsystemd-network/test-dhcp-client.c index 1eb464801..71b06b17a 100644 --- a/src/libsystemd-network/test-dhcp-client.c +++ b/src/libsystemd-network/test-dhcp-client.c @@ -128,6 +128,17 @@ static void test_checksum(void) static int check_options(uint8_t code, uint8_t len, const uint8_t *option, void *user_data) { + switch(code) { + case DHCP_OPTION_CLIENT_IDENTIFIER: + assert_se(len == 7); + assert_se(option[0] == 0x01); + assert_se(memcmp(&option[1], &mac_addr, ETH_ALEN) == 0); + break; + + default: + break; + } + return 0; } @@ -141,7 +152,7 @@ int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link, assert_se(s >= 0); assert_se(packet); - size = sizeof(DHCPPacket) + 4; + size = sizeof(DHCPPacket); assert_se(len > size); discover = memdup(packet, len); @@ -179,7 +190,7 @@ int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link, return 575; } -int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link) +int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link, uint32_t id) { if (socketpair(AF_UNIX, SOCK_STREAM, 0, test_fd) < 0) return -errno; @@ -242,8 +253,7 @@ static void test_discover_message(sd_event *e) sd_dhcp_client_stop(client); sd_dhcp_client_free(client); - close(test_fd[0]); - close(test_fd[1]); + test_fd[1] = safe_close(test_fd[1]); callback_recv = NULL; } @@ -328,7 +338,7 @@ static uint8_t test_addr_acq_ack[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82, 0x53, 0x63, 0x35, 0x01, 0x05, 0x36, 0x04, 0xc0, 0xa8, 0x02, 0x01, 0x33, 0x04, 0x00, - 0x00, 0x02, 0x58, 0x01, 0x04, 0xff, 0xff, 0xff, + 0x00, 0x02, 0x58, 0x01, 0x04, 0xff, 0xff, 0xff, 0x00, 0x2a, 0x04, 0xc0, 0xa8, 0x02, 0x01, 0x0f, 0x09, 0x6c, 0x61, 0x62, 0x2e, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x03, 0x04, 0xc0, 0xa8, 0x02, 0x01, @@ -337,8 +347,7 @@ static uint8_t test_addr_acq_ack[] = { }; static void test_addr_acq_acquired(sd_dhcp_client *client, int event, - void *userdata) -{ + void *userdata) { sd_event *e = userdata; sd_dhcp_lease *lease; struct in_addr addr; @@ -367,15 +376,17 @@ static void test_addr_acq_acquired(sd_dhcp_client *client, int event, sd_event_exit(e, 0); } -static int test_addr_acq_recv_request(size_t size, DHCPMessage *request) -{ +static int test_addr_acq_recv_request(size_t size, DHCPMessage *request) { uint16_t udp_check = 0; + uint8_t *msg_bytes = (uint8_t *)request; int res; res = dhcp_option_parse(request, size, check_options, NULL); assert_se(res == DHCP_REQUEST); assert_se(xid == request->xid); + assert_se(msg_bytes[size - 1] == DHCP_OPTION_END); + if (verbose) printf(" recv DHCP Request 0x%08x\n", be32toh(xid)); @@ -396,14 +407,16 @@ static int test_addr_acq_recv_request(size_t size, DHCPMessage *request) return 0; }; -static int test_addr_acq_recv_discover(size_t size, DHCPMessage *discover) -{ +static int test_addr_acq_recv_discover(size_t size, DHCPMessage *discover) { uint16_t udp_check = 0; + uint8_t *msg_bytes = (uint8_t *)discover; int res; res = dhcp_option_parse(discover, size, check_options, NULL); assert_se(res == DHCP_DISCOVER); + assert_se(msg_bytes[size - 1] == DHCP_OPTION_END); + xid = discover->xid; if (verbose) @@ -421,13 +434,12 @@ static int test_addr_acq_recv_discover(size_t size, DHCPMessage *discover) assert_se(res == sizeof(test_addr_acq_offer)); if (verbose) - printf(" send DHCP Offer\n"); + printf(" sent DHCP Offer\n"); return 0; } -static void test_addr_acq(sd_event *e) -{ +static void test_addr_acq(sd_event *e) { usec_t time_now = now(CLOCK_MONOTONIC); sd_dhcp_client *client; int res, r; @@ -450,9 +462,10 @@ static void test_addr_acq(sd_event *e) callback_recv = test_addr_acq_recv_discover; - assert_se(sd_event_add_monotonic(e, &test_hangcheck, - time_now + 2 * USEC_PER_SEC, 0, - test_dhcp_hangcheck, NULL) >= 0); + assert_se(sd_event_add_time(e, &test_hangcheck, + CLOCK_MONOTONIC, + time_now + 2 * USEC_PER_SEC, 0, + test_dhcp_hangcheck, NULL) >= 0); res = sd_dhcp_client_start(client); assert_se(res == 0 || res == -EINPROGRESS); @@ -465,15 +478,13 @@ static void test_addr_acq(sd_event *e) sd_dhcp_client_stop(client); sd_dhcp_client_free(client); - close(test_fd[0]); - close(test_fd[1]); + test_fd[1] = safe_close(test_fd[1]); callback_recv = NULL; xid = 0; } -int main(int argc, char *argv[]) -{ +int main(int argc, char *argv[]) { sd_event *e; assert_se(sd_event_new(&e) >= 0);