README.enetaddr 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. ---------------------------------
  2. Ethernet Address (MAC) Handling
  3. ---------------------------------
  4. There are a variety of places in U-Boot where the MAC address is used, parsed,
  5. and stored. This document covers proper usage of each location and the moving
  6. of data between them.
  7. -----------
  8. Locations
  9. -----------
  10. Here are the places where MAC addresses might be stored:
  11. - board-specific location (eeprom, dedicated flash, ...)
  12. Note: only used when mandatory due to hardware design etc...
  13. - environment ("ethaddr", "eth1addr", ...) (see CONFIG_ETHADDR)
  14. Note: this is the preferred way to permanently store MAC addresses
  15. - ethernet data (struct eth_device -> enetaddr)
  16. Note: these are temporary copies of the MAC address which exist only
  17. after the respective init steps have run and only to make usage
  18. in other places easier (to avoid constant env lookup/parsing)
  19. - struct bd_info and/or device tree
  20. Note: these are temporary copies of the MAC address only for the
  21. purpose of passing this information to an OS kernel we are about
  22. to boot
  23. -------
  24. Usage
  25. -------
  26. If the hardware design mandates that the MAC address is stored in some special
  27. place (like EEPROM etc...), then the board specific init code (such as the
  28. board-specific misc_init_r() function) is responsible for locating the MAC
  29. address(es) and initializing the respective environment variable(s) from it.
  30. Note that this shall be done if, and only if, the environment does not already
  31. contain these environment variables, i.e. existing variable definitions must
  32. not be overwritten.
  33. During runtime, the ethernet layer will use the environment variables to sync
  34. the MAC addresses to the ethernet structures. All ethernet driver code should
  35. then only use the enetaddr member of the eth_device structure. This is done
  36. on every network command, so the ethernet copies will stay in sync.
  37. Any other code that wishes to access the MAC address should query the
  38. environment directly. The helper functions documented below should make
  39. working with this storage much smoother.
  40. ---------
  41. Helpers
  42. ---------
  43. To assist in the management of these layers, a few helper functions exist. You
  44. should use these rather than attempt to do any kind of parsing/manipulation
  45. yourself as many common errors have arisen in the past.
  46. * void eth_parse_enetaddr(const char *addr, uchar *enetaddr);
  47. Convert a string representation of a MAC address to the binary version.
  48. char *addr = "00:11:22:33:44:55";
  49. uchar enetaddr[6];
  50. eth_parse_enetaddr(addr, enetaddr);
  51. /* enetaddr now equals { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 } */
  52. * int eth_getenv_enetaddr(char *name, uchar *enetaddr);
  53. Look up an environment variable and convert the stored address. If the address
  54. is valid, then the function returns 1. Otherwise, the function returns 0. In
  55. all cases, the enetaddr memory is initialized. If the env var is not found,
  56. then it is set to all zeros. The common function is_valid_ether_addr() is used
  57. to determine address validity.
  58. uchar enetaddr[6];
  59. if (!eth_getenv_enetaddr("ethaddr", enetaddr)) {
  60. /* "ethaddr" is not set in the environment */
  61. ... try and setup "ethaddr" in the env ...
  62. }
  63. /* enetaddr is now set to the value stored in the ethaddr env var */
  64. * int eth_setenv_enetaddr(char *name, const uchar *enetaddr);
  65. Store the MAC address into the named environment variable. The return value is
  66. the same as the setenv() function.
  67. uchar enetaddr[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
  68. eth_setenv_enetaddr("ethaddr", enetaddr);
  69. /* the "ethaddr" env var should now be set to "00:11:22:33:44:55" */
  70. * the %pM format modifier
  71. The %pM format modifier can be used with any standard printf function to format
  72. the binary 6 byte array representation of a MAC address.
  73. uchar enetaddr[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
  74. printf("The MAC is %pM\n", enetaddr);
  75. char buf[20];
  76. sprintf(buf, "%pM", enetaddr);
  77. /* the buf variable is now set to "00:11:22:33:44:55" */