#include "dhcp-identifier.h"
#include "netif-util.h"
+#include "network-common.h"
#include "siphash24.h"
#include "sparse-endian.h"
#include "string-table.h"
return 0;
}
-int dhcp_identifier_set_duid_en(bool test_mode, struct duid *ret_duid, size_t *ret_len) {
+int dhcp_identifier_set_duid_en(struct duid *ret_duid, size_t *ret_len) {
sd_id128_t machine_id;
+ bool test_mode;
uint64_t hash;
int r;
assert(ret_duid);
assert(ret_len);
+ test_mode = network_test_mode_enabled();
+
if (!test_mode) {
r = sd_id128_get_machine(&machine_id);
if (r < 0)
uint16_t arp_type,
struct duid *ret_duid,
size_t *ret_len);
-int dhcp_identifier_set_duid_en(bool test_mode, struct duid *ret_duid, size_t *ret_len);
+int dhcp_identifier_set_duid_en(struct duid *ret_duid, size_t *ret_len);
int dhcp_identifier_set_duid_uuid(struct duid *ret_duid, size_t *ret_len);
int dhcp_identifier_set_duid_raw(
DUIDType duid_type,
int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum, uint16_t port);
-void dhcp_client_set_test_mode(sd_dhcp_client *client, bool test_mode);
-
/* If we are invoking callbacks of a dhcp-client, ensure unreffing the
* client from the callback doesn't destroy the object we are working
* on */
sd_dhcp6_client_callback_t state_callback;
void *state_userdata;
bool send_release;
-
- /* Ignore machine-ID when generating DUID. See dhcp_identifier_set_duid_en(). */
- bool test_mode;
};
int dhcp6_network_bind_udp_socket(int ifindex, struct in6_addr *address);
const void *packet, size_t len);
int dhcp6_client_send_message(sd_dhcp6_client *client);
-void dhcp6_client_set_test_mode(sd_dhcp6_client *client, bool test_mode);
int dhcp6_client_set_transaction_id(sd_dhcp6_client *client, uint32_t transaction_id);
#define log_dhcp6_client_errno(client, error, fmt, ...) \
_cleanup_(sd_event_unrefp) sd_event *e = NULL;
int res, r;
+ assert_se(setenv("SYSTEMD_NETWORK_TEST_MODE", "1", 1) >= 0);
+
if (!getenv("SYSTEMD_LOG_LEVEL"))
log_set_max_level(LOG_CRIT);
assert_se(sd_dhcp_client_set_ifindex(client, 42) >= 0);
assert_se(sd_dhcp_client_set_mac(client, mac_addr, bcast_addr, ETH_ALEN, ARPHRD_ETHER) >= 0);
- dhcp_client_set_test_mode(client, true);
res = sd_dhcp_client_start(client);
assert_se(IN_SET(res, 0, -EINPROGRESS));
struct in6_addr hint = { { { 0x3f, 0xfe, 0x05, 0x01, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } };
static const char *v1_data = "hogehoge", *v2_data = "foobar";
+ assert_se(setenv("SYSTEMD_NETWORK_TEST_MODE", "1", 1) >= 0);
+
+ if (!getenv("SYSTEMD_LOG_LEVEL"))
+ log_set_max_level(LOG_CRIT);
+
if (outside_size_range(size, 0, 65536))
return 0;
assert_se(sd_dhcp6_client_attach_event(client, e, 0) >= 0);
assert_se(sd_dhcp6_client_set_ifindex(client, 42) >= 0);
assert_se(sd_dhcp6_client_set_local_address(client, &address) >= 0);
- dhcp6_client_set_test_mode(client, true);
/* Used when sending message. */
assert_se(sd_dhcp6_client_set_fqdn(client, "example.com") == 1);
/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#include "env-util.h"
#include "format-util.h"
#include "network-common.h"
#include "unaligned.h"
return usec_add(base, span);
}
+
+bool network_test_mode_enabled(void) {
+ static int test_mode = -1;
+ int r;
+
+ if (test_mode < 0) {
+ r = getenv_bool("SYSTEMD_NETWORK_TEST_MODE");
+ if (r < 0) {
+ if (r != -ENXIO)
+ log_debug_errno(r, "Failed to parse $SYSTEMD_NETWORK_TEST_MODE environment variable, ignoring: %m");
+
+ test_mode = false;
+ } else
+ test_mode = r;
+ }
+
+ return test_mode;
+}
be32_t usec_to_be32_msec(usec_t t);
be16_t usec_to_be16_sec(usec_t t);
usec_t time_span_to_stamp(usec_t span, usec_t base);
+
+bool network_test_mode_enabled(void);
int ip_service_type;
int socket_priority;
bool socket_priority_set;
-
- /* Ignore machine-ID when generating DUID. See dhcp_identifier_set_duid_en(). */
- bool test_mode;
};
static const uint8_t default_req_opts[] = {
if (r < 0)
return r;
- r = dhcp_identifier_set_duid_en(client->test_mode, &client->client_id.ns.duid, &len);
+ r = dhcp_identifier_set_duid_en(&client->client_id.ns.duid, &len);
if (r < 0)
return log_dhcp_client_errno(client, r, "Failed to set DUID-EN: %m");
return 0;
}
-void dhcp_client_set_test_mode(sd_dhcp_client *client, bool test_mode) {
- assert(client);
-
- client->test_mode = test_mode;
-}
-
int sd_dhcp_client_set_hostname(
sd_dhcp_client *client,
const char *hostname) {
if (client->duid_len != 0)
return 0;
- return dhcp_identifier_set_duid_en(client->test_mode, &client->duid, &client->duid_len);
+ return dhcp_identifier_set_duid_en(&client->duid, &client->duid_len);
}
/**
assert_return(client, -EINVAL);
assert_return(!sd_dhcp6_client_is_running(client), -EBUSY);
- r = dhcp_identifier_set_duid_en(client->test_mode, &client->duid, &client->duid_len);
+ r = dhcp_identifier_set_duid_en(&client->duid, &client->duid_len);
if (r < 0)
return log_dhcp6_client_errno(client, r, "Failed to set DUID-EN: %m");
return 0;
}
-void dhcp6_client_set_test_mode(sd_dhcp6_client *client, bool test_mode) {
- assert(client);
-
- client->test_mode = test_mode;
-}
-
int sd_dhcp6_client_set_fqdn(
sd_dhcp6_client *client,
const char *fqdn) {
int dhcp6_client_set_transaction_id(sd_dhcp6_client *client, uint32_t transaction_id) {
assert(client);
- assert(client->test_mode);
+ assert_se(network_test_mode_enabled());
/* This is for tests or fuzzers. */
struct duid duid;
size_t duid_len;
- assert_se(dhcp_identifier_set_duid_en(/* test_mode = */ true, &duid, &duid_len) >= 0);
+ assert_se(dhcp_identifier_set_duid_en(&duid, &duid_len) >= 0);
assert_se(dhcp_identifier_set_iaid(NULL, &hw_addr, /* legacy = */ true, &iaid) >= 0);
assert_se(len == sizeof(uint8_t) + sizeof(uint32_t) + duid_len);
assert_se(sd_dhcp_client_set_ifindex(client, 42) >= 0);
assert_se(sd_dhcp_client_set_mac(client, hw_addr.bytes, bcast_addr.bytes, hw_addr.length, ARPHRD_ETHER) >= 0);
- dhcp_client_set_test_mode(client, true);
assert_se(sd_dhcp_client_set_request_option(client, 248) >= 0);
assert_se(sd_dhcp_client_set_ifindex(client, 42) >= 0);
assert_se(sd_dhcp_client_set_mac(client, hw_addr.bytes, bcast_addr.bytes, hw_addr.length, ARPHRD_ETHER) >= 0);
- dhcp_client_set_test_mode(client, true);
assert_se(sd_dhcp_client_set_callback(client, test_addr_acq_acquired, e) >= 0);
int main(int argc, char *argv[]) {
_cleanup_(sd_event_unrefp) sd_event *e;
+ assert_se(setenv("SYSTEMD_NETWORK_TEST_MODE", "1", 1) >= 0);
+
test_setup_logging(LOG_DEBUG);
assert_se(sd_event_new(&e) >= 0);
assert_se(sd_dhcp6_client_set_fqdn(client, "host.lab.intra") >= 0);
assert_se(sd_dhcp6_client_set_iaid(client, unaligned_read_be32((uint8_t[]) { IA_ID_BYTES })) >= 0);
assert_se(sd_dhcp6_client_set_send_release(client, true) >= 0);
- dhcp6_client_set_test_mode(client, true);
assert_se(sd_dhcp6_client_set_request_option(client, SD_DHCP6_OPTION_DNS_SERVER) >= 0);
assert_se(sd_dhcp6_client_set_request_option(client, SD_DHCP6_OPTION_DOMAIN) >= 0);
test_fd[1] = safe_close(test_fd[1]);
}
-DEFINE_TEST_MAIN(LOG_DEBUG);
+static int intro(void) {
+ assert_se(setenv("SYSTEMD_NETWORK_TEST_MODE", "1", 1) >= 0);
+ return 0;
+}
+
+DEFINE_TEST_MAIN_WITH_INTRO(LOG_DEBUG, intro);