test-dhcp6-client.c revision 44481a8b537839cd9ffead4d261491641f5b5260
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering/***
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering This file is part of systemd.
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering Copyright (C) 2014 Intel Corporation. All rights reserved.
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering systemd is free software; you can redistribute it and/or modify it
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering under the terms of the GNU Lesser General Public License as published by
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering (at your option) any later version.
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering systemd is distributed in the hope that it will be useful, but
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering Lesser General Public License for more details.
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering You should have received a copy of the GNU Lesser General Public License
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering***/
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include <stdbool.h>
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include <stdio.h>
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include <sys/types.h>
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include <sys/socket.h>
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include <unistd.h>
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include <net/ethernet.h>
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include "socket-util.h"
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include "macro.h"
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include "sd-event.h"
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include "event-util.h"
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include "virt.h"
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include "sd-dhcp6-client.h"
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include "dhcp6-protocol.h"
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include "dhcp6-internal.h"
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering#include "dhcp6-lease-internal.h"
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic struct ether_addr mac_addr = {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering .ether_addr_octet = {'A', 'B', 'C', '1', '2', '3'}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering};
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic bool verbose = false;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic sd_event_source *hangcheck;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic int test_dhcp_fd[2];
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic int test_index = 42;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic int test_client_message_num;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic be32_t test_iaid = 0;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic uint8_t test_duid[14] = { };
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic int test_client_basic(sd_event *e) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering sd_dhcp6_client *client;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering if (verbose)
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering printf("* %s\n", __FUNCTION__);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_new(&client) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(client);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_attach_event(client, e, 0) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_index(client, 15) == 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_index(client, -42) == -EINVAL);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_index(client, -1) == 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_index(client, 42) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_mac(client, &mac_addr) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_CLIENTID) == -EINVAL);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_DNS_SERVERS) == -EEXIST);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_NTP_SERVER) == -EEXIST);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_SNTP_SERVERS) == 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_DOMAIN_LIST) == -EEXIST);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_request_option(client, 10) == -EINVAL);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_callback(client, NULL, NULL) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_detach_event(client) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!sd_dhcp6_client_unref(client));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 0;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic int test_option(sd_event *e) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint8_t packet[] = {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 'F', 'O', 'O',
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, DHCP6_OPTION_ORO, 0x00, 0x07,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 'A', 'B', 'C', 'D', 'E', 'F', 'G',
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, DHCP6_OPTION_VENDOR_CLASS, 0x00, 0x09,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering '1', '2', '3', '4', '5', '6', '7', '8', '9',
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 'B', 'A', 'R',
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering };
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint8_t result[] = {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 'F', 'O', 'O',
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 'B', 'A', 'R',
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering };
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint16_t optcode;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering size_t optlen;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint8_t *optval, *buf, *out;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering size_t zero = 0, pos = 3;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering size_t buflen = sizeof(packet), outlen = sizeof(result);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering if (verbose)
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering printf("* %s\n", __FUNCTION__);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(buflen == outlen);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_option_parse(&buf, &zero, &optcode, &optlen,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &optval) == -ENOMSG);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering buflen -= 3;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering buf = &packet[3];
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering outlen -= 3;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering out = &result[3];
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_option_parse(&buf, &buflen, &optcode, &optlen,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &optval) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering pos += 4 + optlen;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(buf == &packet[pos]);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optcode == DHCP6_OPTION_ORO);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optlen == 7);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(buflen + pos == sizeof(packet));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_option_append(&out, &outlen, optcode, optlen,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering optval) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(out == &result[pos]);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(*out == 0x00);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_option_parse(&buf, &buflen, &optcode, &optlen,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &optval) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering pos += 4 + optlen;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(buf == &packet[pos]);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optcode == DHCP6_OPTION_VENDOR_CLASS);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optlen == 9);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(buflen + pos == sizeof(packet));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_option_append(&out, &outlen, optcode, optlen,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering optval) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(out == &result[pos]);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(*out == 'B');
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(memcmp(packet, result, sizeof(packet)) == 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 0;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic uint8_t msg_advertise[198] = {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x02, 0x0f, 0xb4, 0xe5, 0x00, 0x01, 0x00, 0x0e,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x01, 0x00, 0x01, 0x1a, 0x6b, 0xf3, 0x30,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x3c, 0x97, 0x0e, 0xcf, 0xa3, 0x7d, 0x00, 0x03,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x5e, 0x0e, 0xcf, 0xa3, 0x7d, 0x00, 0x00,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x50, 0x00, 0x00, 0x00, 0x78, 0x00, 0x05,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x18, 0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0xbe, 0xef, 0x78, 0xee, 0x1c, 0xf3, 0x09, 0x3c,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x55, 0xad, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0xb4, 0x00, 0x0d, 0x00, 0x32, 0x00, 0x00,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x65, 0x73, 0x29, 0x20, 0x72, 0x65, 0x6e, 0x65,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x77, 0x65, 0x64, 0x2e, 0x20, 0x47, 0x72, 0x65,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x65, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x66,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x6c, 0x61, 0x6e,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x65, 0x74, 0x20, 0x45, 0x61, 0x72, 0x74, 0x68,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x17, 0x00, 0x10, 0x20, 0x01, 0x0d, 0xb8,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0xde, 0xad, 0xbe, 0xef, 0x00, 0x00, 0x00, 0x00,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x0b,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x03, 0x6c, 0x61, 0x62, 0x05, 0x69, 0x6e, 0x74,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x72, 0x61, 0x00, 0x00, 0x1f, 0x00, 0x10, 0x20,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x01, 0x0d, 0xb8, 0xde, 0xad, 0xbe, 0xef, 0x00,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x19,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x40, 0x5c, 0x53, 0x78, 0x2b, 0xcb, 0xb3, 0x6d,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x53, 0x00, 0x07, 0x00, 0x01, 0x00
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering};
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic uint8_t msg_reply[173] = {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x07, 0xf7, 0x4e, 0x57, 0x00, 0x02, 0x00, 0x0e,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x01, 0x00, 0x01, 0x19, 0x40, 0x5c, 0x53,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x78, 0x2b, 0xcb, 0xb3, 0x6d, 0x53, 0x00, 0x01,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x1a, 0x6b,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0xf3, 0x30, 0x3c, 0x97, 0x0e, 0xcf, 0xa3, 0x7d,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x03, 0x00, 0x4a, 0x0e, 0xcf, 0xa3, 0x7d,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x78,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x05, 0x00, 0x18, 0x20, 0x01, 0x0d, 0xb8,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0xde, 0xad, 0xbe, 0xef, 0x78, 0xee, 0x1c, 0xf3,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x09, 0x3c, 0x55, 0xad, 0x00, 0x00, 0x00, 0x96,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x00, 0x00, 0xb4, 0x00, 0x0d, 0x00, 0x1e,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x00, 0x41, 0x6c, 0x6c, 0x20, 0x61, 0x64,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x77, 0x65, 0x72, 0x65, 0x20, 0x61, 0x73, 0x73,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2e, 0x00, 0x17,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x10, 0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0xbe, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x01, 0x00, 0x18, 0x00, 0x0b, 0x03, 0x6c,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x61, 0x62, 0x05, 0x69, 0x6e, 0x74, 0x72, 0x61,
16ac401407959cbc62312e61c2dd76dbc3a0793bLennart Poettering 0x00, 0x00, 0x1f, 0x00, 0x10, 0x20, 0x01, 0x0d,
16ac401407959cbc62312e61c2dd76dbc3a0793bLennart Poettering 0xb8, 0xde, 0xad, 0xbe, 0xef, 0x00, 0x00, 0x00,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x00, 0x00, 0x00, 0x00, 0x01
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering};
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic int test_advertise_option(sd_event *e) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering _cleanup_dhcp6_lease_free_ sd_dhcp6_lease *lease = NULL;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering DHCP6Message *advertise = (DHCP6Message *)msg_advertise;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint8_t *optval, *opt = msg_advertise + sizeof(DHCP6Message);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint16_t optcode;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering size_t optlen, len = sizeof(msg_advertise) - sizeof(DHCP6Message);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering be32_t val;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint8_t preference = 255;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering struct in6_addr addr;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint32_t lt_pref, lt_valid;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering int r;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering bool opt_clientid = false;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering if (verbose)
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering printf("* %s\n", __FUNCTION__);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_lease_new(&lease) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(advertise->type == DHCP6_ADVERTISE);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se((be32toh(advertise->transaction_id) & 0x00ffffff) ==
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering 0x0fb4e5);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering while ((r = dhcp6_option_parse(&opt, &len, &optcode, &optlen,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &optval)) >= 0) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering switch(optcode) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering case DHCP6_OPTION_CLIENTID:
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optlen == 14);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering opt_clientid = true;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering break;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering case DHCP6_OPTION_IA_NA:
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optlen == 94);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(optval, &msg_advertise[26], optlen));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering val = htobe32(0x0ecfa37d);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(optval, &val, sizeof(val)));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering val = htobe32(80);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(optval + 4, &val, sizeof(val)));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering val = htobe32(120);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(optval + 8, &val, sizeof(val)));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_option_parse_ia(&optval, &optlen,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering optcode,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &lease->ia) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering break;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering case DHCP6_OPTION_SERVERID:
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optlen == 14);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(optval, &msg_advertise[179], optlen));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_lease_set_serverid(lease, optval,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering optlen) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering break;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering case DHCP6_OPTION_PREFERENCE:
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optlen == 1);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!*optval);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_lease_set_preference(lease,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering *optval) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering break;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering default:
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering break;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering }
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering }
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(r == -ENOMSG);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(opt_clientid);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_lease_get_first_address(lease, &addr, &lt_pref,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &lt_valid) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(&addr, &msg_advertise[42], sizeof(addr)));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(lt_pref == 150);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(lt_valid == 180);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_lease_get_next_address(lease, &addr, &lt_pref,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &lt_valid) == -ENOMSG);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_lease_get_first_address(lease, &addr, &lt_pref,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &lt_valid) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(&addr, &msg_advertise[42], sizeof(addr)));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_lease_get_next_address(lease, &addr, &lt_pref,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &lt_valid) == -ENOMSG);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_lease_get_next_address(lease, &addr, &lt_pref,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &lt_valid) == -ENOMSG);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_lease_get_first_address(lease, &addr, &lt_pref,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &lt_valid) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(&addr, &msg_advertise[42], sizeof(addr)));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_lease_get_next_address(lease, &addr, &lt_pref,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &lt_valid) == -ENOMSG);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_lease_get_serverid(lease, &opt, &len) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(len == 14);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(opt, &msg_advertise[179], len));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_lease_get_preference(lease, &preference) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(preference == 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 0;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic int test_hangcheck(sd_event_source *s, uint64_t usec, void *userdata) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_not_reached("Test case should have completed in 2 seconds");
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 0;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringint detect_vm(const char **id) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 1;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringint detect_container(const char **id) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 1;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringint detect_virtualization(const char **id) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 1;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringint dhcp6_network_bind_udp_socket(int index, struct in6_addr *local_address) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(index == test_index);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering if (socketpair(AF_UNIX, SOCK_STREAM, 0, test_dhcp_fd) < 0)
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return -errno;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return test_dhcp_fd[0];
16ac401407959cbc62312e61c2dd76dbc3a0793bLennart Poettering}
16ac401407959cbc62312e61c2dd76dbc3a0793bLennart Poettering
ff975efb2e88dcd5221a2f0d76c4c87e85b821a8Lennart Poetteringstatic int test_client_send_reply(DHCP6Message *request) {
16ac401407959cbc62312e61c2dd76dbc3a0793bLennart Poettering DHCP6Message reply;
16ac401407959cbc62312e61c2dd76dbc3a0793bLennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering reply.transaction_id = request->transaction_id;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering reply.type = DHCP6_REPLY;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering memcpy(msg_reply, &reply.transaction_id, 4);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering memcpy(&msg_reply[26], test_duid, sizeof(test_duid));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering memcpy(&msg_reply[44], &test_iaid, sizeof(test_iaid));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(write(test_dhcp_fd[1], msg_reply, sizeof(msg_reply))
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering == sizeof(msg_reply));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 0;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic int test_client_verify_request(DHCP6Message *request, uint8_t *option,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering size_t len) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering _cleanup_dhcp6_lease_free_ sd_dhcp6_lease *lease = NULL;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint8_t *optval;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint16_t optcode;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering size_t optlen;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering bool found_clientid = false, found_iana = false, found_serverid = false;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering int r;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering struct in6_addr addr;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering be32_t val;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint32_t lt_pref, lt_valid;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(request->type == DHCP6_REQUEST);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(dhcp6_lease_new(&lease) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering while ((r = dhcp6_option_parse(&option, &len,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &optcode, &optlen, &optval)) >= 0) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering switch(optcode) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering case DHCP6_OPTION_CLIENTID:
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!found_clientid);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering found_clientid = true;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(optval, &test_duid,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering sizeof(test_duid)));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering break;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering case DHCP6_OPTION_IA_NA:
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!found_iana);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering found_iana = true;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optlen == 40);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(optval, &test_iaid, sizeof(test_iaid)));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering val = htobe32(80);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(optval + 4, &val, sizeof(val)));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering val = htobe32(120);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(optval + 8, &val, sizeof(val)));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!dhcp6_option_parse_ia(&optval, &optlen,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering optcode, &lease->ia));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering break;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering case DHCP6_OPTION_SERVERID:
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!found_serverid);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering found_serverid = true;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optlen == 14);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(&msg_advertise[179], optval, optlen));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering break;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering }
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering }
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(r == -ENOMSG);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(found_clientid && found_iana && found_serverid);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_lease_get_first_address(lease, &addr, &lt_pref,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &lt_valid) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!memcmp(&addr, &msg_advertise[42], sizeof(addr)));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(lt_pref == 150);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(lt_valid == 180);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_lease_get_next_address(lease, &addr, &lt_pref,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &lt_valid) == -ENOMSG);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 0;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic int test_client_send_advertise(DHCP6Message *solicit)
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering{
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering DHCP6Message advertise;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering advertise.transaction_id = solicit->transaction_id;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering advertise.type = DHCP6_ADVERTISE;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering memcpy(msg_advertise, &advertise.transaction_id, 4);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering memcpy(&msg_advertise[8], test_duid, sizeof(test_duid));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering memcpy(&msg_advertise[26], &test_iaid, sizeof(test_iaid));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(write(test_dhcp_fd[1], msg_advertise, sizeof(msg_advertise))
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering == sizeof(msg_advertise));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 0;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic int test_client_verify_solicit(DHCP6Message *solicit, uint8_t *option,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering size_t len) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint8_t *optval;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint16_t optcode;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering size_t optlen;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering bool found_clientid = false, found_iana = false;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering int r;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(solicit->type == DHCP6_SOLICIT);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering while ((r = dhcp6_option_parse(&option, &len,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering &optcode, &optlen, &optval)) >= 0) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering switch(optcode) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering case DHCP6_OPTION_CLIENTID:
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!found_clientid);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering found_clientid = true;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optlen == sizeof(test_duid));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering memcpy(&test_duid, optval, sizeof(test_duid));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering break;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering case DHCP6_OPTION_IA_NA:
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!found_iana);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering found_iana = true;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(optlen == 12);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering memcpy(&test_iaid, optval, sizeof(test_iaid));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering break;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering }
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering }
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(r == -ENOMSG);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(found_clientid && found_iana);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 0;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringint dhcp6_network_send_udp_socket(int s, struct in6_addr *server_address,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering const void *packet, size_t len) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering struct in6_addr mcast =
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering IN6ADDR_ALL_DHCP6_RELAY_AGENTS_AND_SERVERS_INIT;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering DHCP6Message *message;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering uint8_t *option;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(s == test_dhcp_fd[0]);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(server_address);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(packet);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(len > sizeof(DHCP6Message) + 4);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(IN6_ARE_ADDR_EQUAL(server_address, &mcast));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering message = (DHCP6Message *)packet;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering option = (uint8_t *)(message + 1);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering len -= sizeof(DHCP6Message);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(message->transaction_id & 0x00ffffff);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering if (test_client_message_num == 0) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_client_verify_solicit(message, option, len);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_client_send_advertise(message);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_client_message_num++;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering } else if (test_client_message_num == 1) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_client_verify_request(message, option, len);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_client_send_reply(message);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_client_message_num++;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering }
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return len;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic void test_client_solicit_cb(sd_dhcp6_client *client, int event,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering void *userdata) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering sd_event *e = userdata;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(e);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(event == DHCP6_EVENT_IP_ACQUIRE);
2f671520ebade4877cbf6aca3572a5f8c4e1871dLennart Poettering
2f671520ebade4877cbf6aca3572a5f8c4e1871dLennart Poettering assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_DNS_SERVERS) == -EBUSY);
2f671520ebade4877cbf6aca3572a5f8c4e1871dLennart Poettering
2f671520ebade4877cbf6aca3572a5f8c4e1871dLennart Poettering if (verbose)
2f671520ebade4877cbf6aca3572a5f8c4e1871dLennart Poettering printf(" got DHCPv6 event %d\n", event);
2f671520ebade4877cbf6aca3572a5f8c4e1871dLennart Poettering
2f671520ebade4877cbf6aca3572a5f8c4e1871dLennart Poettering sd_event_exit(e, 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringstatic int test_client_solicit(sd_event *e) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering sd_dhcp6_client *client;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering usec_t time_now = now(clock_boottime_or_monotonic());
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering if (verbose)
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering printf("* %s\n", __FUNCTION__);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_new(&client) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(client);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_attach_event(client, e, 0) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_index(client, test_index) == 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_mac(client, &mac_addr) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_set_callback(client,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_client_solicit_cb, e) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_event_add_time(e, &hangcheck, clock_boottime_or_monotonic(),
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering time_now + 2 * USEC_PER_SEC, 0,
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_hangcheck, NULL) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_dhcp6_client_start(client) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering sd_event_loop(e);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering hangcheck = sd_event_source_unref(hangcheck);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!sd_dhcp6_client_unref(client));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_dhcp_fd[1] = safe_close(test_dhcp_fd[1]);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 0;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poetteringint main(int argc, char *argv[]) {
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering _cleanup_event_unref_ sd_event *e;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(sd_event_new(&e) >= 0);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering log_set_max_level(LOG_DEBUG);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering log_parse_environment();
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering log_open();
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_client_basic(e);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_option(e);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_advertise_option(e);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering test_client_solicit(e);
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering assert_se(!sd_event_unref(e));
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering return 0;
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering}
e821075a23fdfa3ca7738fc30bb2d4c430fe10c0Lennart Poettering