blob: 196eba85a2bbc860ce3ded5bf94ed1c7a7f4305b [file] [log] [blame]
Joe Hershbergerbfacad72015-03-22 17:09:15 -05001/*
2 * Copyright (c) 2015 National Instruments
3 *
4 * (C) Copyright 2015
5 * Joe Hershberger <joe.hershberger@ni.com>
6 *
7 * SPDX-License-Identifier: GPL-2.0
8 */
9
10#include <common.h>
11#include <dm.h>
12#include <dm/test.h>
13#include <dm/ut.h>
14#include <fdtdec.h>
15#include <malloc.h>
16#include <net.h>
Joe Hershberger7ece1c62015-03-22 17:09:20 -050017#include <asm/eth.h>
Joe Hershbergerbfacad72015-03-22 17:09:15 -050018
19DECLARE_GLOBAL_DATA_PTR;
20
21static int dm_test_eth(struct dm_test_state *dms)
22{
Joe Hershberger049a95a2015-04-08 01:41:01 -050023 net_ping_ip = string_to_ip("1.1.2.2");
Joe Hershbergerbfacad72015-03-22 17:09:15 -050024
25 setenv("ethact", "eth@10002000");
Joe Hershbergerbc0571f2015-04-08 01:41:21 -050026 ut_assertok(net_loop(PING));
Joe Hershbergerbfacad72015-03-22 17:09:15 -050027 ut_asserteq_str("eth@10002000", getenv("ethact"));
28
29 setenv("ethact", "eth@10003000");
Joe Hershbergerbc0571f2015-04-08 01:41:21 -050030 ut_assertok(net_loop(PING));
Joe Hershbergerbfacad72015-03-22 17:09:15 -050031 ut_asserteq_str("eth@10003000", getenv("ethact"));
32
33 setenv("ethact", "eth@10004000");
Joe Hershbergerbc0571f2015-04-08 01:41:21 -050034 ut_assertok(net_loop(PING));
Joe Hershbergerbfacad72015-03-22 17:09:15 -050035 ut_asserteq_str("eth@10004000", getenv("ethact"));
36
37 return 0;
38}
39DM_TEST(dm_test_eth, DM_TESTF_SCAN_FDT);
Joe Hershbergere58780d2015-03-22 17:09:16 -050040
41static int dm_test_eth_alias(struct dm_test_state *dms)
42{
Joe Hershberger049a95a2015-04-08 01:41:01 -050043 net_ping_ip = string_to_ip("1.1.2.2");
Joe Hershbergere58780d2015-03-22 17:09:16 -050044 setenv("ethact", "eth0");
Joe Hershbergerbc0571f2015-04-08 01:41:21 -050045 ut_assertok(net_loop(PING));
Joe Hershbergere58780d2015-03-22 17:09:16 -050046 ut_asserteq_str("eth@10002000", getenv("ethact"));
47
48 setenv("ethact", "eth1");
Joe Hershbergerbc0571f2015-04-08 01:41:21 -050049 ut_assertok(net_loop(PING));
Joe Hershbergere58780d2015-03-22 17:09:16 -050050 ut_asserteq_str("eth@10004000", getenv("ethact"));
51
52 /* Expected to fail since eth2 is not defined in the device tree */
53 setenv("ethact", "eth2");
Joe Hershbergerbc0571f2015-04-08 01:41:21 -050054 ut_assertok(net_loop(PING));
Joe Hershbergere58780d2015-03-22 17:09:16 -050055 ut_asserteq_str("eth@10002000", getenv("ethact"));
56
57 setenv("ethact", "eth5");
Joe Hershbergerbc0571f2015-04-08 01:41:21 -050058 ut_assertok(net_loop(PING));
Joe Hershbergere58780d2015-03-22 17:09:16 -050059 ut_asserteq_str("eth@10003000", getenv("ethact"));
60
61 return 0;
62}
63DM_TEST(dm_test_eth_alias, DM_TESTF_SCAN_FDT);
Joe Hershberger6536b9b2015-03-22 17:09:17 -050064
65static int dm_test_eth_prime(struct dm_test_state *dms)
66{
Joe Hershberger049a95a2015-04-08 01:41:01 -050067 net_ping_ip = string_to_ip("1.1.2.2");
Joe Hershberger6536b9b2015-03-22 17:09:17 -050068
69 /* Expected to be "eth@10003000" because of ethprime variable */
70 setenv("ethact", NULL);
71 setenv("ethprime", "eth5");
Joe Hershbergerbc0571f2015-04-08 01:41:21 -050072 ut_assertok(net_loop(PING));
Joe Hershberger6536b9b2015-03-22 17:09:17 -050073 ut_asserteq_str("eth@10003000", getenv("ethact"));
74
75 /* Expected to be "eth@10002000" because it is first */
76 setenv("ethact", NULL);
77 setenv("ethprime", NULL);
Joe Hershbergerbc0571f2015-04-08 01:41:21 -050078 ut_assertok(net_loop(PING));
Joe Hershberger6536b9b2015-03-22 17:09:17 -050079 ut_asserteq_str("eth@10002000", getenv("ethact"));
80
81 return 0;
82}
83DM_TEST(dm_test_eth_prime, DM_TESTF_SCAN_FDT);
Joe Hershberger7d104ea2015-03-22 17:09:18 -050084
85static int dm_test_eth_rotate(struct dm_test_state *dms)
86{
87 char ethaddr[18];
88
89 /* Invalidate eth1's MAC address */
Joe Hershberger049a95a2015-04-08 01:41:01 -050090 net_ping_ip = string_to_ip("1.1.2.2");
Joe Hershberger7d104ea2015-03-22 17:09:18 -050091 strcpy(ethaddr, getenv("eth1addr"));
92 setenv("eth1addr", NULL);
93
94 /* Make sure that the default is to rotate to the next interface */
95 setenv("ethact", "eth@10004000");
Joe Hershbergerbc0571f2015-04-08 01:41:21 -050096 ut_assertok(net_loop(PING));
Joe Hershberger7d104ea2015-03-22 17:09:18 -050097 ut_asserteq_str("eth@10002000", getenv("ethact"));
98
99 /* If ethrotate is no, then we should fail on a bad MAC */
100 setenv("ethact", "eth@10004000");
101 setenv("ethrotate", "no");
Joe Hershbergerbc0571f2015-04-08 01:41:21 -0500102 ut_asserteq(-EINVAL, net_loop(PING));
Joe Hershberger7d104ea2015-03-22 17:09:18 -0500103 ut_asserteq_str("eth@10004000", getenv("ethact"));
104
105 /* Restore the env */
106 setenv("eth1addr", ethaddr);
107 setenv("ethrotate", NULL);
108
109 /* Invalidate eth0's MAC address */
110 strcpy(ethaddr, getenv("ethaddr"));
111 setenv(".flags", "ethaddr");
112 setenv("ethaddr", NULL);
113
114 /* Make sure we can skip invalid devices */
115 setenv("ethact", "eth@10004000");
Joe Hershbergerbc0571f2015-04-08 01:41:21 -0500116 ut_assertok(net_loop(PING));
Joe Hershberger7d104ea2015-03-22 17:09:18 -0500117 ut_asserteq_str("eth@10004000", getenv("ethact"));
118
119 /* Restore the env */
120 setenv("ethaddr", ethaddr);
121 setenv(".flags", NULL);
122
123 return 0;
124}
125DM_TEST(dm_test_eth_rotate, DM_TESTF_SCAN_FDT);
Joe Hershberger7ece1c62015-03-22 17:09:20 -0500126
127static int dm_test_net_retry(struct dm_test_state *dms)
128{
Joe Hershberger049a95a2015-04-08 01:41:01 -0500129 net_ping_ip = string_to_ip("1.1.2.2");
Joe Hershberger7ece1c62015-03-22 17:09:20 -0500130
131 /*
132 * eth1 is disabled and netretry is yes, so the ping should succeed and
133 * the active device should be eth0
134 */
135 sandbox_eth_disable_response(1, true);
136 setenv("ethact", "eth@10004000");
137 setenv("netretry", "yes");
Joe Hershberger172a31b2015-04-21 13:57:20 -0500138 sandbox_eth_skip_timeout();
Joe Hershbergerbc0571f2015-04-08 01:41:21 -0500139 ut_assertok(net_loop(PING));
Joe Hershberger7ece1c62015-03-22 17:09:20 -0500140 ut_asserteq_str("eth@10002000", getenv("ethact"));
141
142 /*
143 * eth1 is disabled and netretry is no, so the ping should fail and the
144 * active device should be eth1
145 */
146 setenv("ethact", "eth@10004000");
147 setenv("netretry", "no");
Joe Hershberger172a31b2015-04-21 13:57:20 -0500148 sandbox_eth_skip_timeout();
Joe Hershbergerbc0571f2015-04-08 01:41:21 -0500149 ut_asserteq(-ETIMEDOUT, net_loop(PING));
Joe Hershberger7ece1c62015-03-22 17:09:20 -0500150 ut_asserteq_str("eth@10004000", getenv("ethact"));
151
152 /* Restore the env */
153 setenv("netretry", NULL);
154 sandbox_eth_disable_response(1, false);
155
156 return 0;
157}
158DM_TEST(dm_test_net_retry, DM_TESTF_SCAN_FDT);