1bfacad7dSJoe Hershberger /* 2bfacad7dSJoe Hershberger * Copyright (c) 2015 National Instruments 3bfacad7dSJoe Hershberger * 4bfacad7dSJoe Hershberger * (C) Copyright 2015 5bfacad7dSJoe Hershberger * Joe Hershberger <joe.hershberger@ni.com> 6bfacad7dSJoe Hershberger * 7bfacad7dSJoe Hershberger * SPDX-License-Identifier: GPL-2.0 8bfacad7dSJoe Hershberger */ 9bfacad7dSJoe Hershberger 10bfacad7dSJoe Hershberger #include <common.h> 11bfacad7dSJoe Hershberger #include <dm.h> 12bfacad7dSJoe Hershberger #include <dm/test.h> 13bfacad7dSJoe Hershberger #include <dm/ut.h> 14bfacad7dSJoe Hershberger #include <fdtdec.h> 15bfacad7dSJoe Hershberger #include <malloc.h> 16bfacad7dSJoe Hershberger #include <net.h> 177ece1c61SJoe Hershberger #include <asm/eth.h> 18bfacad7dSJoe Hershberger 19bfacad7dSJoe Hershberger DECLARE_GLOBAL_DATA_PTR; 20bfacad7dSJoe Hershberger 21bfacad7dSJoe Hershberger static int dm_test_eth(struct dm_test_state *dms) 22bfacad7dSJoe Hershberger { 23049a95a7SJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 24bfacad7dSJoe Hershberger 25bfacad7dSJoe Hershberger setenv("ethact", "eth@10002000"); 26*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 27bfacad7dSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 28bfacad7dSJoe Hershberger 29bfacad7dSJoe Hershberger setenv("ethact", "eth@10003000"); 30*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 31bfacad7dSJoe Hershberger ut_asserteq_str("eth@10003000", getenv("ethact")); 32bfacad7dSJoe Hershberger 33bfacad7dSJoe Hershberger setenv("ethact", "eth@10004000"); 34*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 35bfacad7dSJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 36bfacad7dSJoe Hershberger 37bfacad7dSJoe Hershberger return 0; 38bfacad7dSJoe Hershberger } 39bfacad7dSJoe Hershberger DM_TEST(dm_test_eth, DM_TESTF_SCAN_FDT); 40e58780dcSJoe Hershberger 41e58780dcSJoe Hershberger static int dm_test_eth_alias(struct dm_test_state *dms) 42e58780dcSJoe Hershberger { 43049a95a7SJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 44e58780dcSJoe Hershberger setenv("ethact", "eth0"); 45*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 46e58780dcSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 47e58780dcSJoe Hershberger 48e58780dcSJoe Hershberger setenv("ethact", "eth1"); 49*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 50e58780dcSJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 51e58780dcSJoe Hershberger 52e58780dcSJoe Hershberger /* Expected to fail since eth2 is not defined in the device tree */ 53e58780dcSJoe Hershberger setenv("ethact", "eth2"); 54*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 55e58780dcSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 56e58780dcSJoe Hershberger 57e58780dcSJoe Hershberger setenv("ethact", "eth5"); 58*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 59e58780dcSJoe Hershberger ut_asserteq_str("eth@10003000", getenv("ethact")); 60e58780dcSJoe Hershberger 61e58780dcSJoe Hershberger return 0; 62e58780dcSJoe Hershberger } 63e58780dcSJoe Hershberger DM_TEST(dm_test_eth_alias, DM_TESTF_SCAN_FDT); 646536b9bbSJoe Hershberger 656536b9bbSJoe Hershberger static int dm_test_eth_prime(struct dm_test_state *dms) 666536b9bbSJoe Hershberger { 67049a95a7SJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 686536b9bbSJoe Hershberger 696536b9bbSJoe Hershberger /* Expected to be "eth@10003000" because of ethprime variable */ 706536b9bbSJoe Hershberger setenv("ethact", NULL); 716536b9bbSJoe Hershberger setenv("ethprime", "eth5"); 72*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 736536b9bbSJoe Hershberger ut_asserteq_str("eth@10003000", getenv("ethact")); 746536b9bbSJoe Hershberger 756536b9bbSJoe Hershberger /* Expected to be "eth@10002000" because it is first */ 766536b9bbSJoe Hershberger setenv("ethact", NULL); 776536b9bbSJoe Hershberger setenv("ethprime", NULL); 78*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 796536b9bbSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 806536b9bbSJoe Hershberger 816536b9bbSJoe Hershberger return 0; 826536b9bbSJoe Hershberger } 836536b9bbSJoe Hershberger DM_TEST(dm_test_eth_prime, DM_TESTF_SCAN_FDT); 847d104eabSJoe Hershberger 857d104eabSJoe Hershberger static int dm_test_eth_rotate(struct dm_test_state *dms) 867d104eabSJoe Hershberger { 877d104eabSJoe Hershberger char ethaddr[18]; 887d104eabSJoe Hershberger 897d104eabSJoe Hershberger /* Invalidate eth1's MAC address */ 90049a95a7SJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 917d104eabSJoe Hershberger strcpy(ethaddr, getenv("eth1addr")); 927d104eabSJoe Hershberger setenv("eth1addr", NULL); 937d104eabSJoe Hershberger 947d104eabSJoe Hershberger /* Make sure that the default is to rotate to the next interface */ 957d104eabSJoe Hershberger setenv("ethact", "eth@10004000"); 96*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 977d104eabSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 987d104eabSJoe Hershberger 997d104eabSJoe Hershberger /* If ethrotate is no, then we should fail on a bad MAC */ 1007d104eabSJoe Hershberger setenv("ethact", "eth@10004000"); 1017d104eabSJoe Hershberger setenv("ethrotate", "no"); 102*bc0571fcSJoe Hershberger ut_asserteq(-EINVAL, net_loop(PING)); 1037d104eabSJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 1047d104eabSJoe Hershberger 1057d104eabSJoe Hershberger /* Restore the env */ 1067d104eabSJoe Hershberger setenv("eth1addr", ethaddr); 1077d104eabSJoe Hershberger setenv("ethrotate", NULL); 1087d104eabSJoe Hershberger 1097d104eabSJoe Hershberger /* Invalidate eth0's MAC address */ 1107d104eabSJoe Hershberger strcpy(ethaddr, getenv("ethaddr")); 1117d104eabSJoe Hershberger setenv(".flags", "ethaddr"); 1127d104eabSJoe Hershberger setenv("ethaddr", NULL); 1137d104eabSJoe Hershberger 1147d104eabSJoe Hershberger /* Make sure we can skip invalid devices */ 1157d104eabSJoe Hershberger setenv("ethact", "eth@10004000"); 116*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 1177d104eabSJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 1187d104eabSJoe Hershberger 1197d104eabSJoe Hershberger /* Restore the env */ 1207d104eabSJoe Hershberger setenv("ethaddr", ethaddr); 1217d104eabSJoe Hershberger setenv(".flags", NULL); 1227d104eabSJoe Hershberger 1237d104eabSJoe Hershberger return 0; 1247d104eabSJoe Hershberger } 1257d104eabSJoe Hershberger DM_TEST(dm_test_eth_rotate, DM_TESTF_SCAN_FDT); 1267ece1c61SJoe Hershberger 1277ece1c61SJoe Hershberger static int dm_test_net_retry(struct dm_test_state *dms) 1287ece1c61SJoe Hershberger { 129049a95a7SJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 1307ece1c61SJoe Hershberger 1317ece1c61SJoe Hershberger /* 1327ece1c61SJoe Hershberger * eth1 is disabled and netretry is yes, so the ping should succeed and 1337ece1c61SJoe Hershberger * the active device should be eth0 1347ece1c61SJoe Hershberger */ 1357ece1c61SJoe Hershberger sandbox_eth_disable_response(1, true); 1367ece1c61SJoe Hershberger setenv("ethact", "eth@10004000"); 1377ece1c61SJoe Hershberger setenv("netretry", "yes"); 138*bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 1397ece1c61SJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 1407ece1c61SJoe Hershberger 1417ece1c61SJoe Hershberger /* 1427ece1c61SJoe Hershberger * eth1 is disabled and netretry is no, so the ping should fail and the 1437ece1c61SJoe Hershberger * active device should be eth1 1447ece1c61SJoe Hershberger */ 1457ece1c61SJoe Hershberger setenv("ethact", "eth@10004000"); 1467ece1c61SJoe Hershberger setenv("netretry", "no"); 147*bc0571fcSJoe Hershberger ut_asserteq(-ETIMEDOUT, net_loop(PING)); 1487ece1c61SJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 1497ece1c61SJoe Hershberger 1507ece1c61SJoe Hershberger /* Restore the env */ 1517ece1c61SJoe Hershberger setenv("netretry", NULL); 1527ece1c61SJoe Hershberger sandbox_eth_disable_response(1, false); 1537ece1c61SJoe Hershberger 1547ece1c61SJoe Hershberger return 0; 1557ece1c61SJoe Hershberger } 1567ece1c61SJoe Hershberger DM_TEST(dm_test_net_retry, DM_TESTF_SCAN_FDT); 157