eth.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*
  2. * Copyright (c) 2015 National Instruments
  3. *
  4. * (C) Copyright 2015
  5. * Joe Hershberger <joe.hershberger@ni.com>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0
  8. */
  9. #include <common.h>
  10. #include <dm.h>
  11. #include <dm/test.h>
  12. #include <dm/ut.h>
  13. #include <fdtdec.h>
  14. #include <malloc.h>
  15. #include <net.h>
  16. #include <asm/eth.h>
  17. DECLARE_GLOBAL_DATA_PTR;
  18. static int dm_test_eth(struct dm_test_state *dms)
  19. {
  20. net_ping_ip = string_to_ip("1.1.2.2");
  21. setenv("ethact", "eth@10002000");
  22. ut_assertok(net_loop(PING));
  23. ut_asserteq_str("eth@10002000", getenv("ethact"));
  24. setenv("ethact", "eth@10003000");
  25. ut_assertok(net_loop(PING));
  26. ut_asserteq_str("eth@10003000", getenv("ethact"));
  27. setenv("ethact", "eth@10004000");
  28. ut_assertok(net_loop(PING));
  29. ut_asserteq_str("eth@10004000", getenv("ethact"));
  30. return 0;
  31. }
  32. DM_TEST(dm_test_eth, DM_TESTF_SCAN_FDT);
  33. static int dm_test_eth_alias(struct dm_test_state *dms)
  34. {
  35. net_ping_ip = string_to_ip("1.1.2.2");
  36. setenv("ethact", "eth0");
  37. ut_assertok(net_loop(PING));
  38. ut_asserteq_str("eth@10002000", getenv("ethact"));
  39. setenv("ethact", "eth1");
  40. ut_assertok(net_loop(PING));
  41. ut_asserteq_str("eth@10004000", getenv("ethact"));
  42. /* Expected to fail since eth2 is not defined in the device tree */
  43. setenv("ethact", "eth2");
  44. ut_assertok(net_loop(PING));
  45. ut_asserteq_str("eth@10002000", getenv("ethact"));
  46. setenv("ethact", "eth5");
  47. ut_assertok(net_loop(PING));
  48. ut_asserteq_str("eth@10003000", getenv("ethact"));
  49. return 0;
  50. }
  51. DM_TEST(dm_test_eth_alias, DM_TESTF_SCAN_FDT);
  52. static int dm_test_eth_prime(struct dm_test_state *dms)
  53. {
  54. net_ping_ip = string_to_ip("1.1.2.2");
  55. /* Expected to be "eth@10003000" because of ethprime variable */
  56. setenv("ethact", NULL);
  57. setenv("ethprime", "eth5");
  58. ut_assertok(net_loop(PING));
  59. ut_asserteq_str("eth@10003000", getenv("ethact"));
  60. /* Expected to be "eth@10002000" because it is first */
  61. setenv("ethact", NULL);
  62. setenv("ethprime", NULL);
  63. ut_assertok(net_loop(PING));
  64. ut_asserteq_str("eth@10002000", getenv("ethact"));
  65. return 0;
  66. }
  67. DM_TEST(dm_test_eth_prime, DM_TESTF_SCAN_FDT);
  68. static int dm_test_eth_rotate(struct dm_test_state *dms)
  69. {
  70. char ethaddr[18];
  71. /* Invalidate eth1's MAC address */
  72. net_ping_ip = string_to_ip("1.1.2.2");
  73. strcpy(ethaddr, getenv("eth1addr"));
  74. setenv("eth1addr", NULL);
  75. /* Make sure that the default is to rotate to the next interface */
  76. setenv("ethact", "eth@10004000");
  77. ut_assertok(net_loop(PING));
  78. ut_asserteq_str("eth@10002000", getenv("ethact"));
  79. /* If ethrotate is no, then we should fail on a bad MAC */
  80. setenv("ethact", "eth@10004000");
  81. setenv("ethrotate", "no");
  82. ut_asserteq(-EINVAL, net_loop(PING));
  83. ut_asserteq_str("eth@10004000", getenv("ethact"));
  84. /* Restore the env */
  85. setenv("eth1addr", ethaddr);
  86. setenv("ethrotate", NULL);
  87. /* Invalidate eth0's MAC address */
  88. strcpy(ethaddr, getenv("ethaddr"));
  89. setenv(".flags", "ethaddr");
  90. setenv("ethaddr", NULL);
  91. /* Make sure we can skip invalid devices */
  92. setenv("ethact", "eth@10004000");
  93. ut_assertok(net_loop(PING));
  94. ut_asserteq_str("eth@10004000", getenv("ethact"));
  95. /* Restore the env */
  96. setenv("ethaddr", ethaddr);
  97. setenv(".flags", NULL);
  98. return 0;
  99. }
  100. DM_TEST(dm_test_eth_rotate, DM_TESTF_SCAN_FDT);
  101. static int dm_test_net_retry(struct dm_test_state *dms)
  102. {
  103. net_ping_ip = string_to_ip("1.1.2.2");
  104. /*
  105. * eth1 is disabled and netretry is yes, so the ping should succeed and
  106. * the active device should be eth0
  107. */
  108. sandbox_eth_disable_response(1, true);
  109. setenv("ethact", "eth@10004000");
  110. setenv("netretry", "yes");
  111. ut_assertok(net_loop(PING));
  112. ut_asserteq_str("eth@10002000", getenv("ethact"));
  113. /*
  114. * eth1 is disabled and netretry is no, so the ping should fail and the
  115. * active device should be eth1
  116. */
  117. setenv("ethact", "eth@10004000");
  118. setenv("netretry", "no");
  119. ut_asserteq(-ETIMEDOUT, net_loop(PING));
  120. ut_asserteq_str("eth@10004000", getenv("ethact"));
  121. /* Restore the env */
  122. setenv("netretry", NULL);
  123. sandbox_eth_disable_response(1, false);
  124. return 0;
  125. }
  126. DM_TEST(dm_test_net_retry, DM_TESTF_SCAN_FDT);