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> 17*7ece1c61SJoe 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 { 23bfacad7dSJoe Hershberger NetPingIP = string_to_ip("1.1.2.2"); 24bfacad7dSJoe Hershberger 25bfacad7dSJoe Hershberger setenv("ethact", "eth@10002000"); 26bfacad7dSJoe Hershberger ut_assertok(NetLoop(PING)); 27bfacad7dSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 28bfacad7dSJoe Hershberger 29bfacad7dSJoe Hershberger setenv("ethact", "eth@10003000"); 30bfacad7dSJoe Hershberger ut_assertok(NetLoop(PING)); 31bfacad7dSJoe Hershberger ut_asserteq_str("eth@10003000", getenv("ethact")); 32bfacad7dSJoe Hershberger 33bfacad7dSJoe Hershberger setenv("ethact", "eth@10004000"); 34bfacad7dSJoe Hershberger ut_assertok(NetLoop(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 { 43e58780dcSJoe Hershberger NetPingIP = string_to_ip("1.1.2.2"); 44e58780dcSJoe Hershberger setenv("ethact", "eth0"); 45e58780dcSJoe Hershberger ut_assertok(NetLoop(PING)); 46e58780dcSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 47e58780dcSJoe Hershberger 48e58780dcSJoe Hershberger setenv("ethact", "eth1"); 49e58780dcSJoe Hershberger ut_assertok(NetLoop(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"); 54e58780dcSJoe Hershberger ut_assertok(NetLoop(PING)); 55e58780dcSJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 56e58780dcSJoe Hershberger 57e58780dcSJoe Hershberger setenv("ethact", "eth5"); 58e58780dcSJoe Hershberger ut_assertok(NetLoop(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 { 676536b9bbSJoe Hershberger NetPingIP = 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"); 726536b9bbSJoe Hershberger ut_assertok(NetLoop(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); 786536b9bbSJoe Hershberger ut_assertok(NetLoop(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 */ 907d104eabSJoe Hershberger NetPingIP = 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"); 967d104eabSJoe Hershberger ut_assertok(NetLoop(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"); 1027d104eabSJoe Hershberger ut_asserteq(-1, NetLoop(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"); 1167d104eabSJoe Hershberger ut_assertok(NetLoop(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); 126*7ece1c61SJoe Hershberger 127*7ece1c61SJoe Hershberger static int dm_test_net_retry(struct dm_test_state *dms) 128*7ece1c61SJoe Hershberger { 129*7ece1c61SJoe Hershberger NetPingIP = string_to_ip("1.1.2.2"); 130*7ece1c61SJoe Hershberger 131*7ece1c61SJoe Hershberger /* 132*7ece1c61SJoe Hershberger * eth1 is disabled and netretry is yes, so the ping should succeed and 133*7ece1c61SJoe Hershberger * the active device should be eth0 134*7ece1c61SJoe Hershberger */ 135*7ece1c61SJoe Hershberger sandbox_eth_disable_response(1, true); 136*7ece1c61SJoe Hershberger setenv("ethact", "eth@10004000"); 137*7ece1c61SJoe Hershberger setenv("netretry", "yes"); 138*7ece1c61SJoe Hershberger ut_assertok(NetLoop(PING)); 139*7ece1c61SJoe Hershberger ut_asserteq_str("eth@10002000", getenv("ethact")); 140*7ece1c61SJoe Hershberger 141*7ece1c61SJoe Hershberger /* 142*7ece1c61SJoe Hershberger * eth1 is disabled and netretry is no, so the ping should fail and the 143*7ece1c61SJoe Hershberger * active device should be eth1 144*7ece1c61SJoe Hershberger */ 145*7ece1c61SJoe Hershberger setenv("ethact", "eth@10004000"); 146*7ece1c61SJoe Hershberger setenv("netretry", "no"); 147*7ece1c61SJoe Hershberger ut_asserteq(-1, NetLoop(PING)); 148*7ece1c61SJoe Hershberger ut_asserteq_str("eth@10004000", getenv("ethact")); 149*7ece1c61SJoe Hershberger 150*7ece1c61SJoe Hershberger /* Restore the env */ 151*7ece1c61SJoe Hershberger setenv("netretry", NULL); 152*7ece1c61SJoe Hershberger sandbox_eth_disable_response(1, false); 153*7ece1c61SJoe Hershberger 154*7ece1c61SJoe Hershberger return 0; 155*7ece1c61SJoe Hershberger } 156*7ece1c61SJoe Hershberger DM_TEST(dm_test_net_retry, DM_TESTF_SCAN_FDT); 157