xref: /freebsd/lib/libc/tests/net/ether_test.c (revision dc5c5b1da8c61535f50ff7f0e9f140eff551f960)
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, &ether_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, &ether_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(&ether_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(&ether_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