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"); 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 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"); 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 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"); 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 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")); 92*73c2bbeeSJoe Hershberger /* Must disable access protection for eth1addr before clearing */ 93*73c2bbeeSJoe Hershberger setenv(".flags", "eth1addr"); 947d104eabSJoe Hershberger setenv("eth1addr", NULL); 957d104eabSJoe Hershberger 967d104eabSJoe Hershberger /* Make sure that the default is to rotate to the next interface */ 977d104eabSJoe Hershberger setenv("ethact", "eth@10004000"); 98bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 997d104eabSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 1007d104eabSJoe Hershberger 1017d104eabSJoe Hershberger /* If ethrotate is no, then we should fail on a bad MAC */ 1027d104eabSJoe Hershberger setenv("ethact", "eth@10004000"); 1037d104eabSJoe Hershberger setenv("ethrotate", "no"); 104bc0571fcSJoe Hershberger ut_asserteq(-EINVAL, net_loop(PING)); 1057d104eabSJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 1067d104eabSJoe Hershberger 1077d104eabSJoe Hershberger /* Restore the env */ 1087d104eabSJoe Hershberger setenv("eth1addr", ethaddr); 1097d104eabSJoe Hershberger setenv("ethrotate", NULL); 1107d104eabSJoe Hershberger 1117d104eabSJoe Hershberger /* Invalidate eth0's MAC address */ 1127d104eabSJoe Hershberger strcpy(ethaddr, getenv("ethaddr")); 113*73c2bbeeSJoe Hershberger /* Must disable access protection for ethaddr before clearing */ 1147d104eabSJoe Hershberger setenv(".flags", "ethaddr"); 1157d104eabSJoe Hershberger setenv("ethaddr", NULL); 1167d104eabSJoe Hershberger 1177d104eabSJoe Hershberger /* Make sure we can skip invalid devices */ 1187d104eabSJoe Hershberger setenv("ethact", "eth@10004000"); 119bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 1207d104eabSJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 1217d104eabSJoe Hershberger 1227d104eabSJoe Hershberger /* Restore the env */ 1237d104eabSJoe Hershberger setenv("ethaddr", ethaddr); 1247d104eabSJoe Hershberger setenv(".flags", NULL); 1257d104eabSJoe Hershberger 1267d104eabSJoe Hershberger return 0; 1277d104eabSJoe Hershberger } 1287d104eabSJoe Hershberger DM_TEST(dm_test_eth_rotate, DM_TESTF_SCAN_FDT); 1297ece1c61SJoe Hershberger 1307ece1c61SJoe Hershberger static int dm_test_net_retry(struct dm_test_state *dms) 1317ece1c61SJoe Hershberger { 132049a95a7SJoe Hershberger net_ping_ip = string_to_ip("1.1.2.2"); 1337ece1c61SJoe Hershberger 1347ece1c61SJoe Hershberger /* 1357ece1c61SJoe Hershberger * eth1 is disabled and netretry is yes, so the ping should succeed and 1367ece1c61SJoe Hershberger * the active device should be eth0 1377ece1c61SJoe Hershberger */ 1387ece1c61SJoe Hershberger sandbox_eth_disable_response(1, true); 1397ece1c61SJoe Hershberger setenv("ethact", "eth@10004000"); 1407ece1c61SJoe Hershberger setenv("netretry", "yes"); 141172a31bfSJoe Hershberger sandbox_eth_skip_timeout(); 142bc0571fcSJoe Hershberger ut_assertok(net_loop(PING)); 1437ece1c61SJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 1447ece1c61SJoe Hershberger 1457ece1c61SJoe Hershberger /* 1467ece1c61SJoe Hershberger * eth1 is disabled and netretry is no, so the ping should fail and the 1477ece1c61SJoe Hershberger * active device should be eth1 1487ece1c61SJoe Hershberger */ 1497ece1c61SJoe Hershberger setenv("ethact", "eth@10004000"); 1507ece1c61SJoe Hershberger setenv("netretry", "no"); 151172a31bfSJoe Hershberger sandbox_eth_skip_timeout(); 152bc0571fcSJoe Hershberger ut_asserteq(-ETIMEDOUT, net_loop(PING)); 1537ece1c61SJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 1547ece1c61SJoe Hershberger 1557ece1c61SJoe Hershberger /* Restore the env */ 1567ece1c61SJoe Hershberger setenv("netretry", NULL); 1577ece1c61SJoe Hershberger sandbox_eth_disable_response(1, false); 1587ece1c61SJoe Hershberger 1597ece1c61SJoe Hershberger return 0; 1607ece1c61SJoe Hershberger } 1617ece1c61SJoe Hershberger DM_TEST(dm_test_net_retry, DM_TESTF_SCAN_FDT); 162