diff options
author | Daniel Wang <wonderfly@users.noreply.github.com> | 2017-05-13 07:19:32 -0700 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2017-05-13 10:19:32 -0400 |
commit | b85bc551c3cbd26b03c79c8d416389e7ac501760 (patch) | |
tree | a5b129384f9606bc612d5d23c91a59cf5f8b6350 /src/libsystemd-network/test-sd-dhcp-lease.c | |
parent | 6e4177315f632e03afea43b6d99100bd434f3403 (diff) | |
download | systemd-b85bc551c3cbd26b03c79c8d416389e7ac501760.tar.gz |
network: Implement DHCP Option 119 (Domain Search List) (#5932)
This adds a modified version of dhcp6_option_parse_domainname() that is
able to parse compressed domain names, borrowing the idea from
dns_packet_read_name(). It also adds pieces in networkd-link and
networkd-manager to properly save/load the added option field.
Resolves #2710.
Diffstat (limited to 'src/libsystemd-network/test-sd-dhcp-lease.c')
-rw-r--r-- | src/libsystemd-network/test-sd-dhcp-lease.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/libsystemd-network/test-sd-dhcp-lease.c b/src/libsystemd-network/test-sd-dhcp-lease.c new file mode 100644 index 0000000000..0f881809ab --- /dev/null +++ b/src/libsystemd-network/test-sd-dhcp-lease.c @@ -0,0 +1,90 @@ +#include <errno.h> + +#include "dhcp-lease-internal.h" +#include "macro.h" +#include "string-util.h" +#include "strv.h" + +/* According to RFC1035 section 4.1.4, a domain name in a message can be either: + * - a sequence of labels ending in a zero octet + * - a pointer + * - a sequence of labels ending with a pointer + */ +static void test_dhcp_lease_parse_search_domains_basic(void) { + int r; + _cleanup_strv_free_ char **domains = NULL; + static const uint8_t optionbuf[] = { + 0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00, + 0x04, 'A', 'B', 'C', 'D', 0x03, 'E', 'F', 'G', 0x00, + }; + + r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains); + assert_se(r == 2); + assert_se(streq(domains[0], "FOO.BAR")); + assert_se(streq(domains[1], "ABCD.EFG")); +} + +static void test_dhcp_lease_parse_search_domains_ptr(void) { + int r; + _cleanup_strv_free_ char **domains = NULL; + static const uint8_t optionbuf[] = { + 0x03, 'F', 'O', 'O', 0x00, 0xC0, 0x00, + }; + + r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains); + assert_se(r == 2); + assert_se(streq(domains[0], "FOO")); + assert_se(streq(domains[1], "FOO")); +} + +static void test_dhcp_lease_parse_search_domains_labels_and_ptr(void) { + int r; + _cleanup_strv_free_ char **domains = NULL; + static const uint8_t optionbuf[] = { + 0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00, + 0x03, 'A', 'B', 'C', 0xC0, 0x04, + }; + + r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains); + assert_se(r == 2); + assert_se(streq(domains[0], "FOO.BAR")); + assert_se(streq(domains[1], "ABC.BAR")); +} + +/* Tests for exceptions. */ + +static void test_dhcp_lease_parse_search_domains_no_data(void) { + _cleanup_strv_free_ char **domains = NULL; + static const uint8_t optionbuf[3] = {0, 0, 0}; + + assert_se(dhcp_lease_parse_search_domains(NULL, 0, &domains) == -ENODATA); + assert_se(dhcp_lease_parse_search_domains(optionbuf, 0, &domains) == -ENODATA); +} + +static void test_dhcp_lease_parse_search_domains_loops(void) { + _cleanup_strv_free_ char **domains = NULL; + static const uint8_t optionbuf[] = { + 0x03, 'F', 'O', 'O', 0x00, 0x03, 'B', 'A', 'R', 0xC0, 0x06, + }; + + assert_se(dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains) == -EBADMSG); +} + +static void test_dhcp_lease_parse_search_domains_wrong_len(void) { + _cleanup_strv_free_ char **domains = NULL; + static const uint8_t optionbuf[] = { + 0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00, + 0x04, 'A', 'B', 'C', 'D', 0x03, 'E', 'F', 'G', 0x00, + }; + + assert_se(dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf) - 5, &domains) == -EBADMSG); +} + +int main(int argc, char *argv[]) { + test_dhcp_lease_parse_search_domains_basic(); + test_dhcp_lease_parse_search_domains_ptr(); + test_dhcp_lease_parse_search_domains_labels_and_ptr(); + test_dhcp_lease_parse_search_domains_no_data(); + test_dhcp_lease_parse_search_domains_loops(); + test_dhcp_lease_parse_search_domains_wrong_len(); +} |