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 * $FreeBSD$ 2724732d67SEnji Cooper */ 2824732d67SEnji Cooper 2924732d67SEnji Cooper #include <sys/types.h> 3024732d67SEnji Cooper 3124732d67SEnji Cooper #include <net/ethernet.h> 3224732d67SEnji Cooper 3324732d67SEnji Cooper #include <errno.h> 3424732d67SEnji Cooper #include <stdio.h> 3524732d67SEnji Cooper #include <string.h> 3624732d67SEnji Cooper 3724732d67SEnji Cooper #include <atf-c.h> 3824732d67SEnji Cooper 3924732d67SEnji Cooper static const char *ether_line_string = "01:23:45:67:89:ab ether_line_hostname"; 4024732d67SEnji Cooper static const char *ether_line_hostname = "ether_line_hostname"; 4124732d67SEnji Cooper static const struct ether_addr ether_line_addr = { 4224732d67SEnji Cooper { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab } 4324732d67SEnji Cooper }; 4424732d67SEnji Cooper 4524732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_line); 4624732d67SEnji Cooper ATF_TC_BODY(ether_line, tc) 4724732d67SEnji Cooper { 4824732d67SEnji Cooper struct ether_addr e; 4924732d67SEnji Cooper char hostname[256]; 5024732d67SEnji Cooper 5124732d67SEnji Cooper ATF_REQUIRE_MSG(ether_line(ether_line_string, &e, hostname) == 0, 5224732d67SEnji Cooper "ether_line failed; errno=%d", errno); 5324732d67SEnji Cooper ATF_REQUIRE_MSG(bcmp(&e, ðer_line_addr, ETHER_ADDR_LEN) == 0, 5424732d67SEnji Cooper "bad address"); 5524732d67SEnji Cooper ATF_REQUIRE_MSG(strcmp(hostname, ether_line_hostname) == 0, 5624732d67SEnji Cooper "bad hostname"); 5724732d67SEnji Cooper } 5824732d67SEnji Cooper 5924732d67SEnji Cooper static const char *ether_line_bad_1_string = "x"; 6024732d67SEnji Cooper 6124732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_line_bad_1); 6224732d67SEnji Cooper ATF_TC_BODY(ether_line_bad_1, tc) 6324732d67SEnji Cooper { 6424732d67SEnji Cooper struct ether_addr e; 6524732d67SEnji Cooper char hostname[256]; 6624732d67SEnji Cooper 6724732d67SEnji Cooper ATF_REQUIRE_MSG(ether_line(ether_line_bad_1_string, &e, hostname) != 0, 68*dc5c5b1dSEnji Cooper "ether_line succeeded unexpectedly"); 6924732d67SEnji Cooper } 7024732d67SEnji Cooper 7124732d67SEnji Cooper static const char *ether_line_bad_2_string = "x x"; 7224732d67SEnji Cooper 7324732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_line_bad_2); 7424732d67SEnji Cooper ATF_TC_BODY(ether_line_bad_2, tc) 7524732d67SEnji Cooper { 7624732d67SEnji Cooper struct ether_addr e; 7724732d67SEnji Cooper char hostname[256]; 7824732d67SEnji Cooper 7924732d67SEnji Cooper ATF_REQUIRE_MSG(ether_line(ether_line_bad_2_string, &e, hostname) != 0, 80*dc5c5b1dSEnji Cooper "ether_line succeeded unexpectedly"); 8124732d67SEnji Cooper } 8224732d67SEnji Cooper 8324732d67SEnji Cooper static const char *ether_aton_string = "01:23:45:67:89:ab"; 8424732d67SEnji Cooper static const struct ether_addr ether_aton_addr = { 8524732d67SEnji Cooper { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab } 8624732d67SEnji Cooper }; 8724732d67SEnji Cooper 8824732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_aton_r); 8924732d67SEnji Cooper ATF_TC_BODY(ether_aton_r, tc) 9024732d67SEnji Cooper { 9124732d67SEnji Cooper struct ether_addr e, *ep; 9224732d67SEnji Cooper 9324732d67SEnji Cooper ep = ether_aton_r(ether_aton_string, &e); 9424732d67SEnji Cooper 950fc72683SEnji Cooper ATF_REQUIRE_MSG(ep != NULL, "ether_aton_r failed; errno=%d", errno); 9624732d67SEnji Cooper ATF_REQUIRE_MSG(ep == &e, 9724732d67SEnji Cooper "ether_aton_r returned different pointers; %p != %p", ep, &e); 9824732d67SEnji Cooper } 9924732d67SEnji Cooper 10024732d67SEnji Cooper static const char *ether_aton_bad_string = "x"; 10124732d67SEnji Cooper 10224732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_aton_r_bad); 10324732d67SEnji Cooper ATF_TC_BODY(ether_aton_r_bad, tc) 10424732d67SEnji Cooper { 10524732d67SEnji Cooper struct ether_addr e, *ep; 10624732d67SEnji Cooper 10724732d67SEnji Cooper ep = ether_aton_r(ether_aton_bad_string, &e); 10824732d67SEnji Cooper ATF_REQUIRE_MSG(ep == NULL, "ether_aton_r succeeded unexpectedly"); 10924732d67SEnji Cooper } 11024732d67SEnji Cooper 11124732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_aton); 11224732d67SEnji Cooper ATF_TC_BODY(ether_aton, tc) 11324732d67SEnji Cooper { 11424732d67SEnji Cooper struct ether_addr *ep; 11524732d67SEnji Cooper 11624732d67SEnji Cooper ep = ether_aton(ether_aton_string); 11724732d67SEnji Cooper ATF_REQUIRE_MSG(ep != NULL, "ether_aton failed"); 11824732d67SEnji Cooper ATF_REQUIRE_MSG(bcmp(ep, ðer_aton_addr, ETHER_ADDR_LEN) == 0, 11924732d67SEnji Cooper "bad address"); 12024732d67SEnji Cooper } 12124732d67SEnji Cooper 12224732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_aton_bad); 12324732d67SEnji Cooper ATF_TC_BODY(ether_aton_bad, tc) 12424732d67SEnji Cooper { 12524732d67SEnji Cooper struct ether_addr *ep; 12624732d67SEnji Cooper 12724732d67SEnji Cooper ep = ether_aton(ether_aton_bad_string); 12824732d67SEnji Cooper ATF_REQUIRE_MSG(ep == NULL, "ether_aton succeeded unexpectedly"); 12924732d67SEnji Cooper } 13024732d67SEnji Cooper 13124732d67SEnji Cooper static const char *ether_ntoa_string = "01:23:45:67:89:ab"; 13224732d67SEnji Cooper static const struct ether_addr ether_ntoa_addr = { 13324732d67SEnji Cooper { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab } 13424732d67SEnji Cooper }; 13524732d67SEnji Cooper 13624732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_ntoa_r); 13724732d67SEnji Cooper ATF_TC_BODY(ether_ntoa_r, tc) 13824732d67SEnji Cooper { 13924732d67SEnji Cooper char buf[256], *cp; 14024732d67SEnji Cooper 14124732d67SEnji Cooper cp = ether_ntoa_r(ðer_ntoa_addr, buf); 14224732d67SEnji Cooper ATF_REQUIRE_MSG(cp != NULL, "ether_ntoa_r failed"); 14324732d67SEnji Cooper ATF_REQUIRE_MSG(cp == buf, 14424732d67SEnji Cooper "ether_ntoa_r returned a different pointer; %p != %p", cp, buf); 14524732d67SEnji Cooper ATF_REQUIRE_MSG(strcmp(cp, ether_ntoa_string) == 0, 14624732d67SEnji Cooper "strings did not match (`%s` != `%s`)", cp, ether_ntoa_string); 14724732d67SEnji Cooper } 14824732d67SEnji Cooper 14924732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_ntoa); 15024732d67SEnji Cooper ATF_TC_BODY(ether_ntoa, tc) 15124732d67SEnji Cooper { 15224732d67SEnji Cooper char *cp; 15324732d67SEnji Cooper 15424732d67SEnji Cooper cp = ether_ntoa(ðer_ntoa_addr); 15524732d67SEnji Cooper ATF_REQUIRE_MSG(cp != NULL, "ether_ntoa failed"); 15624732d67SEnji Cooper ATF_REQUIRE_MSG(strcmp(cp, ether_ntoa_string) == 0, 15724732d67SEnji Cooper "strings did not match (`%s` != `%s`)", cp, ether_ntoa_string); 15824732d67SEnji Cooper } 15924732d67SEnji Cooper 16024732d67SEnji Cooper #if 0 16124732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_ntohost); 16224732d67SEnji Cooper ATF_TC_BODY(ether_ntohost, tc) 16324732d67SEnji Cooper { 16424732d67SEnji Cooper 16524732d67SEnji Cooper } 16624732d67SEnji Cooper 16724732d67SEnji Cooper ATF_TC_WITHOUT_HEAD(ether_hostton); 16824732d67SEnji Cooper ATF_TC_BODY(ether_hostton, tc) 16924732d67SEnji Cooper { 17024732d67SEnji Cooper 17124732d67SEnji Cooper } 17224732d67SEnji Cooper #endif 17324732d67SEnji Cooper 17424732d67SEnji Cooper ATF_TP_ADD_TCS(tp) 17524732d67SEnji Cooper { 17624732d67SEnji Cooper 17724732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_line); 17824732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_line_bad_1); 17924732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_line_bad_2); 18024732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_aton_r); 18124732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_aton_r_bad); 18224732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_aton); 18324732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_aton_bad); 18424732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_ntoa_r); 18524732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_ntoa); 18624732d67SEnji Cooper #if 0 18724732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_ntohost); 18824732d67SEnji Cooper ATF_TP_ADD_TC(tp, ether_hostton); 18924732d67SEnji Cooper #endif 19024732d67SEnji Cooper 19124732d67SEnji Cooper return (atf_no_error()); 19224732d67SEnji Cooper } 193