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 85*09129becSJoe Hershberger /* The asserts include a return on fail; cleanup in the caller */ 86*09129becSJoe 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 99*09129becSJoe Hershberger return 0; 100*09129becSJoe Hershberger } 101*09129becSJoe Hershberger 102*09129becSJoe Hershberger static int _dm_test_eth_rotate2(struct unit_test_state *uts) 103*09129becSJoe Hershberger { 104*09129becSJoe Hershberger /* Make sure we can skip invalid devices */ 105*09129becSJoe Hershberger setenv("ethact", "eth@10004000"); 106*09129becSJoe Hershberger ut_assertok(net_loop(PING)); 107*09129becSJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 108*09129becSJoe Hershberger 109*09129becSJoe Hershberger return 0; 110*09129becSJoe Hershberger } 111*09129becSJoe Hershberger 112*09129becSJoe Hershberger static int dm_test_eth_rotate(struct unit_test_state *uts) 113*09129becSJoe Hershberger { 114*09129becSJoe Hershberger char ethaddr[18]; 115*09129becSJoe Hershberger int retval; 116*09129becSJoe Hershberger 117*09129becSJoe Hershberger /* Set target IP to mock ping */ 118*09129becSJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 119*09129becSJoe Hershberger 120*09129becSJoe Hershberger /* Invalidate eth1's MAC address */ 121*09129becSJoe Hershberger strcpy(ethaddr, getenv("eth1addr")); 122*09129becSJoe Hershberger /* Must disable access protection for eth1addr before clearing */ 123*09129becSJoe Hershberger setenv(".flags", "eth1addr"); 124*09129becSJoe Hershberger setenv("eth1addr", NULL); 125*09129becSJoe Hershberger 126*09129becSJoe Hershberger retval = _dm_test_eth_rotate1(uts); 127*09129becSJoe Hershberger 1287d104eabSJoe Hershberger /* Restore the env */ 1297d104eabSJoe Hershberger setenv("eth1addr", ethaddr); 1307d104eabSJoe Hershberger setenv("ethrotate", NULL); 1317d104eabSJoe Hershberger 132*09129becSJoe Hershberger if (!retval) { 1337d104eabSJoe Hershberger /* Invalidate eth0's MAC address */ 1347d104eabSJoe Hershberger strcpy(ethaddr, getenv("ethaddr")); 13573c2bbeeSJoe Hershberger /* Must disable access protection for ethaddr before clearing */ 1367d104eabSJoe Hershberger setenv(".flags", "ethaddr"); 1377d104eabSJoe Hershberger setenv("ethaddr", NULL); 1387d104eabSJoe Hershberger 139*09129becSJoe Hershberger retval = _dm_test_eth_rotate2(uts); 1407d104eabSJoe Hershberger 1417d104eabSJoe Hershberger /* Restore the env */ 1427d104eabSJoe Hershberger setenv("ethaddr", ethaddr); 143*09129becSJoe Hershberger } 144*09129becSJoe Hershberger /* Restore the env */ 1457d104eabSJoe Hershberger setenv(".flags", NULL); 1467d104eabSJoe Hershberger 147*09129becSJoe Hershberger return retval; 1487d104eabSJoe Hershberger } 1497d104eabSJoe Hershberger DM_TEST(dm_test_eth_rotate, DM_TESTF_SCAN_FDT); 1507ece1c61SJoe Hershberger 151*09129becSJoe Hershberger /* The asserts include a return on fail; cleanup in the caller */ 152*09129becSJoe Hershberger static int _dm_test_net_retry(struct unit_test_state *uts) 1537ece1c61SJoe Hershberger { 1547ece1c61SJoe Hershberger /* 1557ece1c61SJoe Hershberger * eth1 is disabled and netretry is yes, so the ping should succeed and 1567ece1c61SJoe Hershberger * the active device should be eth0 1577ece1c61SJoe Hershberger */ 1587ece1c61SJoe Hershberger sandbox_eth_disable_response(1, true); 1597ece1c61SJoe Hershberger setenv("ethact", "eth@10004000"); 1607ece1c61SJoe Hershberger setenv("netretry", "yes"); 161172a31bfSJoe Hershberger sandbox_eth_skip_timeout(); 162bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 1637ece1c61SJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 1647ece1c61SJoe Hershberger 1657ece1c61SJoe Hershberger /* 1667ece1c61SJoe Hershberger * eth1 is disabled and netretry is no, so the ping should fail and the 1677ece1c61SJoe Hershberger * active device should be eth1 1687ece1c61SJoe Hershberger */ 1697ece1c61SJoe Hershberger setenv("ethact", "eth@10004000"); 1707ece1c61SJoe Hershberger setenv("netretry", "no"); 171172a31bfSJoe Hershberger sandbox_eth_skip_timeout(); 172bc0571fcSJoe Hershberger ut_asserteq(-ETIMEDOUT, net_loop(PING)); 1737ece1c61SJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 1747ece1c61SJoe Hershberger 175*09129becSJoe Hershberger return 0; 176*09129becSJoe Hershberger } 177*09129becSJoe Hershberger 178*09129becSJoe Hershberger static int dm_test_net_retry(struct unit_test_state *uts) 179*09129becSJoe Hershberger { 180*09129becSJoe Hershberger int retval; 181*09129becSJoe Hershberger 182*09129becSJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 183*09129becSJoe Hershberger 184*09129becSJoe Hershberger retval = _dm_test_net_retry(uts); 185*09129becSJoe Hershberger 1867ece1c61SJoe Hershberger /* Restore the env */ 1877ece1c61SJoe Hershberger setenv("netretry", NULL); 1887ece1c61SJoe Hershberger sandbox_eth_disable_response(1, false); 1897ece1c61SJoe Hershberger 190*09129becSJoe Hershberger return retval; 1917ece1c61SJoe Hershberger } 1927ece1c61SJoe Hershberger DM_TEST(dm_test_net_retry, DM_TESTF_SCAN_FDT); 193