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 <fdtdec.h> 13bfacad7dSJoe Hershberger #include <malloc.h> 14bfacad7dSJoe Hershberger #include <net.h> 15e721b882SJoe Hershberger #include <dm/test.h> 167ece1c61SJoe Hershberger #include <asm/eth.h> 17e721b882SJoe Hershberger #include <test/ut.h> 18bfacad7dSJoe Hershberger 19bfacad7dSJoe Hershberger DECLARE_GLOBAL_DATA_PTR; 20bfacad7dSJoe Hershberger 21e721b882SJoe Hershberger static int dm_test_eth(struct unit_test_state *uts) 22bfacad7dSJoe Hershberger { 23049a95a7SJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 24bfacad7dSJoe Hershberger 25bfacad7dSJoe Hershberger setenv("ethact", "eth@10002000"); 26bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 27bfacad7dSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 28bfacad7dSJoe Hershberger 29bfacad7dSJoe Hershberger setenv("ethact", "eth@10003000"); 30bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 31bfacad7dSJoe Hershberger ut_asserteq_str("eth@10003000", getenv("ethact")); 32bfacad7dSJoe Hershberger 33bfacad7dSJoe Hershberger setenv("ethact", "eth@10004000"); 34bc0571fcSJoe 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 41e721b882SJoe Hershberger static int dm_test_eth_alias(struct unit_test_state *uts) 42e58780dcSJoe Hershberger { 43049a95a7SJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 44e58780dcSJoe Hershberger setenv("ethact", "eth0"); 45bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 46e58780dcSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 47e58780dcSJoe Hershberger 48e58780dcSJoe Hershberger setenv("ethact", "eth1"); 49bc0571fcSJoe 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"); 54bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 55e58780dcSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 56e58780dcSJoe Hershberger 57e58780dcSJoe Hershberger setenv("ethact", "eth5"); 58bc0571fcSJoe 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 65e721b882SJoe Hershberger static int dm_test_eth_prime(struct unit_test_state *uts) 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"); 72bc0571fcSJoe 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); 78bc0571fcSJoe 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 8509129becSJoe Hershberger /* The asserts include a return on fail; cleanup in the caller */ 8609129becSJoe Hershberger static int _dm_test_eth_rotate1(struct unit_test_state *uts) 877d104eabSJoe Hershberger { 887d104eabSJoe Hershberger /* Make sure that the default is to rotate to the next interface */ 897d104eabSJoe Hershberger setenv("ethact", "eth@10004000"); 90bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 917d104eabSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 927d104eabSJoe Hershberger 937d104eabSJoe Hershberger /* If ethrotate is no, then we should fail on a bad MAC */ 947d104eabSJoe Hershberger setenv("ethact", "eth@10004000"); 957d104eabSJoe Hershberger setenv("ethrotate", "no"); 96bc0571fcSJoe Hershberger ut_asserteq(-EINVAL, net_loop(PING)); 977d104eabSJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 987d104eabSJoe Hershberger 9909129becSJoe Hershberger return 0; 10009129becSJoe Hershberger } 10109129becSJoe Hershberger 10209129becSJoe Hershberger static int _dm_test_eth_rotate2(struct unit_test_state *uts) 10309129becSJoe Hershberger { 10409129becSJoe Hershberger /* Make sure we can skip invalid devices */ 10509129becSJoe Hershberger setenv("ethact", "eth@10004000"); 10609129becSJoe Hershberger ut_assertok(net_loop(PING)); 10709129becSJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 10809129becSJoe Hershberger 109*71d7971fSBin Meng /* Make sure we can handle device name which is not eth# */ 110*71d7971fSBin Meng setenv("ethact", "sbe5"); 111*71d7971fSBin Meng ut_assertok(net_loop(PING)); 112*71d7971fSBin Meng ut_asserteq_str("sbe5", getenv("ethact")); 113*71d7971fSBin Meng 11409129becSJoe Hershberger return 0; 11509129becSJoe Hershberger } 11609129becSJoe Hershberger 11709129becSJoe Hershberger static int dm_test_eth_rotate(struct unit_test_state *uts) 11809129becSJoe Hershberger { 11909129becSJoe Hershberger char ethaddr[18]; 12009129becSJoe Hershberger int retval; 12109129becSJoe Hershberger 12209129becSJoe Hershberger /* Set target IP to mock ping */ 12309129becSJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 12409129becSJoe Hershberger 12509129becSJoe Hershberger /* Invalidate eth1's MAC address */ 12609129becSJoe Hershberger strcpy(ethaddr, getenv("eth1addr")); 12709129becSJoe Hershberger /* Must disable access protection for eth1addr before clearing */ 12809129becSJoe Hershberger setenv(".flags", "eth1addr"); 12909129becSJoe Hershberger setenv("eth1addr", NULL); 13009129becSJoe Hershberger 13109129becSJoe Hershberger retval = _dm_test_eth_rotate1(uts); 13209129becSJoe Hershberger 1337d104eabSJoe Hershberger /* Restore the env */ 1347d104eabSJoe Hershberger setenv("eth1addr", ethaddr); 1357d104eabSJoe Hershberger setenv("ethrotate", NULL); 1367d104eabSJoe Hershberger 13709129becSJoe Hershberger if (!retval) { 1387d104eabSJoe Hershberger /* Invalidate eth0's MAC address */ 1397d104eabSJoe Hershberger strcpy(ethaddr, getenv("ethaddr")); 14073c2bbeeSJoe Hershberger /* Must disable access protection for ethaddr before clearing */ 1417d104eabSJoe Hershberger setenv(".flags", "ethaddr"); 1427d104eabSJoe Hershberger setenv("ethaddr", NULL); 1437d104eabSJoe Hershberger 14409129becSJoe Hershberger retval = _dm_test_eth_rotate2(uts); 1457d104eabSJoe Hershberger 1467d104eabSJoe Hershberger /* Restore the env */ 1477d104eabSJoe Hershberger setenv("ethaddr", ethaddr); 14809129becSJoe Hershberger } 14909129becSJoe Hershberger /* Restore the env */ 1507d104eabSJoe Hershberger setenv(".flags", NULL); 1517d104eabSJoe Hershberger 15209129becSJoe Hershberger return retval; 1537d104eabSJoe Hershberger } 1547d104eabSJoe Hershberger DM_TEST(dm_test_eth_rotate, DM_TESTF_SCAN_FDT); 1557ece1c61SJoe Hershberger 15609129becSJoe Hershberger /* The asserts include a return on fail; cleanup in the caller */ 15709129becSJoe Hershberger static int _dm_test_net_retry(struct unit_test_state *uts) 1587ece1c61SJoe Hershberger { 1597ece1c61SJoe Hershberger /* 1607ece1c61SJoe Hershberger * eth1 is disabled and netretry is yes, so the ping should succeed and 1617ece1c61SJoe Hershberger * the active device should be eth0 1627ece1c61SJoe Hershberger */ 1637ece1c61SJoe Hershberger sandbox_eth_disable_response(1, true); 1647ece1c61SJoe Hershberger setenv("ethact", "eth@10004000"); 1657ece1c61SJoe Hershberger setenv("netretry", "yes"); 166172a31bfSJoe Hershberger sandbox_eth_skip_timeout(); 167bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 1687ece1c61SJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 1697ece1c61SJoe Hershberger 1707ece1c61SJoe Hershberger /* 1717ece1c61SJoe Hershberger * eth1 is disabled and netretry is no, so the ping should fail and the 1727ece1c61SJoe Hershberger * active device should be eth1 1737ece1c61SJoe Hershberger */ 1747ece1c61SJoe Hershberger setenv("ethact", "eth@10004000"); 1757ece1c61SJoe Hershberger setenv("netretry", "no"); 176172a31bfSJoe Hershberger sandbox_eth_skip_timeout(); 177bc0571fcSJoe Hershberger ut_asserteq(-ETIMEDOUT, net_loop(PING)); 1787ece1c61SJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 1797ece1c61SJoe Hershberger 18009129becSJoe Hershberger return 0; 18109129becSJoe Hershberger } 18209129becSJoe Hershberger 18309129becSJoe Hershberger static int dm_test_net_retry(struct unit_test_state *uts) 18409129becSJoe Hershberger { 18509129becSJoe Hershberger int retval; 18609129becSJoe Hershberger 18709129becSJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 18809129becSJoe Hershberger 18909129becSJoe Hershberger retval = _dm_test_net_retry(uts); 19009129becSJoe Hershberger 1917ece1c61SJoe Hershberger /* Restore the env */ 1927ece1c61SJoe Hershberger setenv("netretry", NULL); 1937ece1c61SJoe Hershberger sandbox_eth_disable_response(1, false); 1947ece1c61SJoe Hershberger 19509129becSJoe Hershberger return retval; 1967ece1c61SJoe Hershberger } 1977ece1c61SJoe Hershberger DM_TEST(dm_test_net_retry, DM_TESTF_SCAN_FDT); 198