blob: 4891f3ad34f7eb028fed60831c31e62a15520417 [file] [log] [blame]
Joe Hershberger4c197242015-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 Hershbergerf933a932015-03-22 17:09:20 -050017#include <asm/eth.h>
Joe Hershberger4c197242015-03-22 17:09:15 -050018
19DECLARE_GLOBAL_DATA_PTR;
20
21static int dm_test_eth(struct dm_test_state *dms)
22{
Joe Hershberger5874dec2015-04-08 01:41:01 -050023 net_ping_ip = string_to_ip("1.1.2.2");
Joe Hershberger4c197242015-03-22 17:09:15 -050024
25 setenv("ethact", "eth@10002000");
Joe Hershbergerc80b41b02015-04-08 01:41:21 -050026 ut_assertok(net_loop(PING));
Joe Hershberger4c197242015-03-22 17:09:15 -050027 ut_asserteq_str("eth@10002000", getenv("ethact"));
28
29 setenv("ethact", "eth@10003000");
Joe Hershbergerc80b41b02015-04-08 01:41:21 -050030 ut_assertok(net_loop(PING));
Joe Hershberger4c197242015-03-22 17:09:15 -050031 ut_asserteq_str("eth@10003000", getenv("ethact"));
32
33 setenv("ethact", "eth@10004000");
Joe Hershbergerc80b41b02015-04-08 01:41:21 -050034 ut_assertok(net_loop(PING));
Joe Hershberger4c197242015-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 Hershberger279d2f62015-03-22 17:09:16 -050040
41static int dm_test_eth_alias(struct dm_test_state *dms)
42{
Joe Hershberger5874dec2015-04-08 01:41:01 -050043 net_ping_ip = string_to_ip("1.1.2.2");
Joe Hershberger279d2f62015-03-22 17:09:16 -050044 setenv("ethact", "eth0");
Joe Hershbergerc80b41b02015-04-08 01:41:21 -050045 ut_assertok(net_loop(PING));
Joe Hershberger279d2f62015-03-22 17:09:16 -050046 ut_asserteq_str("eth@10002000", getenv("ethact"));
47
48 setenv("ethact", "eth1");
Joe Hershbergerc80b41b02015-04-08 01:41:21 -050049 ut_assertok(net_loop(PING));
Joe Hershberger279d2f62015-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 Hershbergerc80b41b02015-04-08 01:41:21 -050054 ut_assertok(net_loop(PING));
Joe Hershberger279d2f62015-03-22 17:09:16 -050055 ut_asserteq_str("eth@10002000", getenv("ethact"));
56
57 setenv("ethact", "eth5");
Joe Hershbergerc80b41b02015-04-08 01:41:21 -050058 ut_assertok(net_loop(PING));
Joe Hershberger279d2f62015-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 Hershbergeraa52edd2015-03-22 17:09:17 -050064
65static int dm_test_eth_prime(struct dm_test_state *dms)
66{
Joe Hershberger5874dec2015-04-08 01:41:01 -050067 net_ping_ip = string_to_ip("1.1.2.2");
Joe Hershbergeraa52edd2015-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 Hershbergerc80b41b02015-04-08 01:41:21 -050072 ut_assertok(net_loop(PING));
Joe Hershbergeraa52edd2015-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 Hershbergerc80b41b02015-04-08 01:41:21 -050078 ut_assertok(net_loop(PING));
Joe Hershbergeraa52edd2015-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 Hershbergerf340e542015-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 Hershberger5874dec2015-04-08 01:41:01 -050090 net_ping_ip = string_to_ip("1.1.2.2");
Joe Hershbergerf340e542015-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 Hershbergerc80b41b02015-04-08 01:41:21 -050096 ut_assertok(net_loop(PING));
Joe Hershbergerf340e542015-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 Hershbergerc80b41b02015-04-08 01:41:21 -0500102 ut_asserteq(-EINVAL, net_loop(PING));
Joe Hershbergerf340e542015-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 Hershbergerc80b41b02015-04-08 01:41:21 -0500116 ut_assertok(net_loop(PING));
Joe Hershbergerf340e542015-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 Hershbergerf933a932015-03-22 17:09:20 -0500126
127static int dm_test_net_retry(struct dm_test_state *dms)
128{
Joe Hershberger5874dec2015-04-08 01:41:01 -0500129 net_ping_ip = string_to_ip("1.1.2.2");
Joe Hershbergerf933a932015-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 Hershbergerc80b41b02015-04-08 01:41:21 -0500138 ut_assertok(net_loop(PING));
Joe Hershbergerf933a932015-03-22 17:09:20 -0500139 ut_asserteq_str("eth@10002000", getenv("ethact"));
140
141 /*
142 * eth1 is disabled and netretry is no, so the ping should fail and the
143 * active device should be eth1
144 */
145 setenv("ethact", "eth@10004000");
146 setenv("netretry", "no");
Joe Hershbergerc80b41b02015-04-08 01:41:21 -0500147 ut_asserteq(-ETIMEDOUT, net_loop(PING));
Joe Hershbergerf933a932015-03-22 17:09:20 -0500148 ut_asserteq_str("eth@10004000", getenv("ethact"));
149
150 /* Restore the env */
151 setenv("netretry", NULL);
152 sandbox_eth_disable_response(1, false);
153
154 return 0;
155}
156DM_TEST(dm_test_net_retry, DM_TESTF_SCAN_FDT);