124732d67SEnji Cooper /*-
224732d67SEnji Cooper * Copyright (c) 2007 Robert N. M. Watson
324732d67SEnji Cooper * All rights reserved.
424732d67SEnji Cooper *
524732d67SEnji Cooper * Redistribution and use in source and binary forms, with or without
624732d67SEnji Cooper * modification, are permitted provided that the following conditions
724732d67SEnji Cooper * are met:
824732d67SEnji Cooper * 1. Redistributions of source code must retain the above copyright
924732d67SEnji Cooper * notice, this list of conditions and the following disclaimer.
1024732d67SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright
1124732d67SEnji Cooper * notice, this list of conditions and the following disclaimer in the
1224732d67SEnji Cooper * documentation and/or other materials provided with the distribution.
1324732d67SEnji Cooper *
1424732d67SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1524732d67SEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1624732d67SEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1724732d67SEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1824732d67SEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1924732d67SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2024732d67SEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2124732d67SEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2224732d67SEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2324732d67SEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2424732d67SEnji Cooper * SUCH DAMAGE.
2524732d67SEnji Cooper */
2624732d67SEnji Cooper
2724732d67SEnji Cooper #include <sys/types.h>
2824732d67SEnji Cooper
2924732d67SEnji Cooper #include <net/ethernet.h>
3024732d67SEnji Cooper
3124732d67SEnji Cooper #include <errno.h>
3224732d67SEnji Cooper #include <stdio.h>
3324732d67SEnji Cooper #include <string.h>
3424732d67SEnji Cooper
3524732d67SEnji Cooper #include <atf-c.h>
3624732d67SEnji Cooper
3724732d67SEnji Cooper static const char *ether_line_string = "01:23:45:67:89:ab ether_line_hostname";
3824732d67SEnji Cooper static const char *ether_line_hostname = "ether_line_hostname";
3924732d67SEnji Cooper static const struct ether_addr ether_line_addr = {
4024732d67SEnji Cooper { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab }
4124732d67SEnji Cooper };
4224732d67SEnji Cooper
4324732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_line);
ATF_TC_BODY(ether_line,tc)4424732d67SEnji Cooper ATF_TC_BODY(ether_line, tc)
4524732d67SEnji Cooper {
4624732d67SEnji Cooper struct ether_addr e;
4724732d67SEnji Cooper char hostname[256];
4824732d67SEnji Cooper
4924732d67SEnji Cooper ATF_REQUIRE_MSG(ether_line(ether_line_string, &e, hostname) == 0,
5024732d67SEnji Cooper "ether_line failed; errno=%d", errno);
5124732d67SEnji Cooper ATF_REQUIRE_MSG(bcmp(&e, ðer_line_addr, ETHER_ADDR_LEN) == 0,
5224732d67SEnji Cooper "bad address");
5324732d67SEnji Cooper ATF_REQUIRE_MSG(strcmp(hostname, ether_line_hostname) == 0,
5424732d67SEnji Cooper "bad hostname");
5524732d67SEnji Cooper }
5624732d67SEnji Cooper
5724732d67SEnji Cooper static const char *ether_line_bad_1_string = "x";
5824732d67SEnji Cooper
5924732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_line_bad_1);
ATF_TC_BODY(ether_line_bad_1,tc)6024732d67SEnji Cooper ATF_TC_BODY(ether_line_bad_1, tc)
6124732d67SEnji Cooper {
6224732d67SEnji Cooper struct ether_addr e;
6324732d67SEnji Cooper char hostname[256];
6424732d67SEnji Cooper
6524732d67SEnji Cooper ATF_REQUIRE_MSG(ether_line(ether_line_bad_1_string, &e, hostname) != 0,
66*dc5c5b1dSEnji Cooper "ether_line succeeded unexpectedly");
6724732d67SEnji Cooper }
6824732d67SEnji Cooper
6924732d67SEnji Cooper static const char *ether_line_bad_2_string = "x x";
7024732d67SEnji Cooper
7124732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_line_bad_2);
ATF_TC_BODY(ether_line_bad_2,tc)7224732d67SEnji Cooper ATF_TC_BODY(ether_line_bad_2, tc)
7324732d67SEnji Cooper {
7424732d67SEnji Cooper struct ether_addr e;
7524732d67SEnji Cooper char hostname[256];
7624732d67SEnji Cooper
7724732d67SEnji Cooper ATF_REQUIRE_MSG(ether_line(ether_line_bad_2_string, &e, hostname) != 0,
78*dc5c5b1dSEnji Cooper "ether_line succeeded unexpectedly");
7924732d67SEnji Cooper }
8024732d67SEnji Cooper
8124732d67SEnji Cooper static const char *ether_aton_string = "01:23:45:67:89:ab";
8224732d67SEnji Cooper static const struct ether_addr ether_aton_addr = {
8324732d67SEnji Cooper { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab }
8424732d67SEnji Cooper };
8524732d67SEnji Cooper
8624732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_aton_r);
ATF_TC_BODY(ether_aton_r,tc)8724732d67SEnji Cooper ATF_TC_BODY(ether_aton_r, tc)
8824732d67SEnji Cooper {
8924732d67SEnji Cooper struct ether_addr e, *ep;
9024732d67SEnji Cooper
9124732d67SEnji Cooper ep = ether_aton_r(ether_aton_string, &e);
9224732d67SEnji Cooper
930fc72683SEnji Cooper ATF_REQUIRE_MSG(ep != NULL, "ether_aton_r failed; errno=%d", errno);
9424732d67SEnji Cooper ATF_REQUIRE_MSG(ep == &e,
9524732d67SEnji Cooper "ether_aton_r returned different pointers; %p != %p", ep, &e);
9624732d67SEnji Cooper }
9724732d67SEnji Cooper
9824732d67SEnji Cooper static const char *ether_aton_bad_string = "x";
9924732d67SEnji Cooper
10024732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_aton_r_bad);
ATF_TC_BODY(ether_aton_r_bad,tc)10124732d67SEnji Cooper ATF_TC_BODY(ether_aton_r_bad, tc)
10224732d67SEnji Cooper {
10324732d67SEnji Cooper struct ether_addr e, *ep;
10424732d67SEnji Cooper
10524732d67SEnji Cooper ep = ether_aton_r(ether_aton_bad_string, &e);
10624732d67SEnji Cooper ATF_REQUIRE_MSG(ep == NULL, "ether_aton_r succeeded unexpectedly");
10724732d67SEnji Cooper }
10824732d67SEnji Cooper
10924732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_aton);
ATF_TC_BODY(ether_aton,tc)11024732d67SEnji Cooper ATF_TC_BODY(ether_aton, tc)
11124732d67SEnji Cooper {
11224732d67SEnji Cooper struct ether_addr *ep;
11324732d67SEnji Cooper
11424732d67SEnji Cooper ep = ether_aton(ether_aton_string);
11524732d67SEnji Cooper ATF_REQUIRE_MSG(ep != NULL, "ether_aton failed");
11624732d67SEnji Cooper ATF_REQUIRE_MSG(bcmp(ep, ðer_aton_addr, ETHER_ADDR_LEN) == 0,
11724732d67SEnji Cooper "bad address");
11824732d67SEnji Cooper }
11924732d67SEnji Cooper
12024732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_aton_bad);
ATF_TC_BODY(ether_aton_bad,tc)12124732d67SEnji Cooper ATF_TC_BODY(ether_aton_bad, tc)
12224732d67SEnji Cooper {
12324732d67SEnji Cooper struct ether_addr *ep;
12424732d67SEnji Cooper
12524732d67SEnji Cooper ep = ether_aton(ether_aton_bad_string);
12624732d67SEnji Cooper ATF_REQUIRE_MSG(ep == NULL, "ether_aton succeeded unexpectedly");
12724732d67SEnji Cooper }
12824732d67SEnji Cooper
12924732d67SEnji Cooper static const char *ether_ntoa_string = "01:23:45:67:89:ab";
13024732d67SEnji Cooper static const struct ether_addr ether_ntoa_addr = {
13124732d67SEnji Cooper { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab }
13224732d67SEnji Cooper };
13324732d67SEnji Cooper
13424732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_ntoa_r);
ATF_TC_BODY(ether_ntoa_r,tc)13524732d67SEnji Cooper ATF_TC_BODY(ether_ntoa_r, tc)
13624732d67SEnji Cooper {
13724732d67SEnji Cooper char buf[256], *cp;
13824732d67SEnji Cooper
13924732d67SEnji Cooper cp = ether_ntoa_r(ðer_ntoa_addr, buf);
14024732d67SEnji Cooper ATF_REQUIRE_MSG(cp != NULL, "ether_ntoa_r failed");
14124732d67SEnji Cooper ATF_REQUIRE_MSG(cp == buf,
14224732d67SEnji Cooper "ether_ntoa_r returned a different pointer; %p != %p", cp, buf);
14324732d67SEnji Cooper ATF_REQUIRE_MSG(strcmp(cp, ether_ntoa_string) == 0,
14424732d67SEnji Cooper "strings did not match (`%s` != `%s`)", cp, ether_ntoa_string);
14524732d67SEnji Cooper }
14624732d67SEnji Cooper
14724732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_ntoa);
ATF_TC_BODY(ether_ntoa,tc)14824732d67SEnji Cooper ATF_TC_BODY(ether_ntoa, tc)
14924732d67SEnji Cooper {
15024732d67SEnji Cooper char *cp;
15124732d67SEnji Cooper
15224732d67SEnji Cooper cp = ether_ntoa(ðer_ntoa_addr);
15324732d67SEnji Cooper ATF_REQUIRE_MSG(cp != NULL, "ether_ntoa failed");
15424732d67SEnji Cooper ATF_REQUIRE_MSG(strcmp(cp, ether_ntoa_string) == 0,
15524732d67SEnji Cooper "strings did not match (`%s` != `%s`)", cp, ether_ntoa_string);
15624732d67SEnji Cooper }
15724732d67SEnji Cooper
15824732d67SEnji Cooper #if 0
15924732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_ntohost);
16024732d67SEnji Cooper ATF_TC_BODY(ether_ntohost, tc)
16124732d67SEnji Cooper {
16224732d67SEnji Cooper
16324732d67SEnji Cooper }
16424732d67SEnji Cooper
16524732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_hostton);
16624732d67SEnji Cooper ATF_TC_BODY(ether_hostton, tc)
16724732d67SEnji Cooper {
16824732d67SEnji Cooper
16924732d67SEnji Cooper }
17024732d67SEnji Cooper #endif
17124732d67SEnji Cooper
ATF_TP_ADD_TCS(tp)17224732d67SEnji Cooper ATF_TP_ADD_TCS(tp)
17324732d67SEnji Cooper {
17424732d67SEnji Cooper
17524732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_line);
17624732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_line_bad_1);
17724732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_line_bad_2);
17824732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_aton_r);
17924732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_aton_r_bad);
18024732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_aton);
18124732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_aton_bad);
18224732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_ntoa_r);
18324732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_ntoa);
18424732d67SEnji Cooper #if 0
18524732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_ntohost);
18624732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_hostton);
18724732d67SEnji Cooper #endif
18824732d67SEnji Cooper
18924732d67SEnji Cooper return (atf_no_error());
19024732d67SEnji Cooper }
191