sysNet.c
上传用户:dqzhongke1
上传日期:2022-06-26
资源大小:667k
文件大小:12k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sysNet.c - system-dependent Network Library */
  2. /*
  3.  * Copyright (c) 2005-2007 Wind River Systems, Inc.
  4.  *
  5.  * The right to copy, distribute, modify, or otherwise make use
  6.  * of this software may be licensed only pursuant to the terms
  7.  * of an applicable Wind River license agreement.
  8.  */
  9. /*
  10. modification history
  11. --------------------
  12. 01h,23may07,b_m  move MAX_MAC_DEVS macro to config.h.
  13. 01g,18aug06,dtr  WIND61530 - Fix array overflow.
  14. 01f,03may06,dtr  SPR#120513 - check status of sysNetMacNVRamAddrGet.
  15. 01e,01may06,dtr  ETSEC now uses motetsec device name. SPR#102448.
  16. 01d,21feb06,dtr  SPR #117719 - Tidy up support for HEND and END.
  17. 01c,03feb06,wap  Add address get routine for HEND ETSEC devices
  18. 01b,27jan06,dtr  Tidy up.
  19. 01a,05jul05,dtr  adopted from sbc8260/sysNet.c/01a
  20. */
  21. /*
  22. DESCRIPTION
  23. This module provides BSP functionality to support the
  24. bootrom 'M' command to modify MAC addresses of on-board
  25. network interfaces.
  26. MAC adddress routines provided by the BSP in this file are:
  27.     sysNetMacNVRamAddrGet()
  28.     sysNetMacAddrGet()
  29.     sysNetMacAddrSet()
  30. This board provides storage in flash for the MAC addresses
  31. of the motfcc and motscc interfaces.  This library also
  32. implements a RAM buffer to represent the contents of the
  33. flash.  The RAM buffer contains eight entries, which is
  34. more than currently needed by this board, but can be
  35. considered as room for expansion in future boards using
  36. a derivative of this BSP.  This RAM buffer is contained
  37. in the array glbEnetAddr[][].
  38. */
  39. #ifdef ETHERNET_MAC_HANDLER
  40. #include <vxWorks.h>
  41. #include "config.h"
  42. /* locals */
  43. /* defines */
  44. #define MAC_OFFSET_MOTTSEC 0
  45. #ifdef INCLUDE_MOT_ETSEC_HEND
  46. const char *sysNetDevName[MAX_MAC_DEVS] = {"motetsec"};
  47. #else
  48. const char *sysNetDevName[MAX_MAC_DEVS] = {"mottsec"};
  49. #endif
  50. /* globals */
  51. IMPORT int dynamicMacAddrGen
  52.     (
  53.     UINT8 * ifName, /* interface name */
  54.     int ifUnit, /* interface unit */
  55.     UINT8 * ifMacAddr, /* address buffer */
  56.     int ifMacAddrLen /* length of buffer */
  57.     );
  58. /* locals */
  59. LOCAL UINT8 glbEnetAddr[MAX_MAC_ADRS][MAC_ADRS_LEN + 2] = {
  60. { BRCM_ENET0, BRCM_ENET1, BRCM_ENET2, CUST_ENET3_0, CUST_ENET4, CUST_ENET5 },
  61. { BRCM_ENET0, BRCM_ENET1, BRCM_ENET2, CUST_ENET3_1, CUST_ENET4, CUST_ENET5 },
  62. { BRCM_ENET0, BRCM_ENET1, BRCM_ENET2, CUST_ENET3_2, CUST_ENET4, CUST_ENET5 },
  63. { BRCM_ENET0, BRCM_ENET1, BRCM_ENET2, CUST_ENET3_3, CUST_ENET4, CUST_ENET5 }
  64. };
  65. LOCAL UINT8 sysInvalidAddr[2][MAC_ADRS_LEN] = {
  66. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  67. { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
  68. };
  69. /***********************************************************
  70. *
  71. * sysMacOffsetGet - Calculate table offset
  72. *
  73. *  This routine calculates which table entry corresponds to
  74. *  the specified interface.
  75. *
  76. *  Two values are calculated and returned in the parameters
  77. *  pointed to by ppEnet and pOffset.
  78. *
  79. * RETURNS: ERROR if the interface is not known; OK otherwise
  80. *
  81. * ERRNO: N/A
  82. */
  83. STATUS sysMacOffsetGet
  84.     (
  85.     char * ifName, /* interface name */
  86.     int ifUnit, /* interface unit */
  87.     char ** ppEnet, /* pointer to glbEnetAddr[][] entry */
  88.     int * pOffset /* offset in NVRAM */
  89.     )
  90.     {
  91.     /*
  92.      * The address offsets into NVRAM and glbEnetAddr[] are:
  93.      *
  94.      * mottsec0 - offset 0
  95.      *
  96.      */
  97.     if ( (strcmp(ifName,"mottsec") == 0) || (strcmp(ifName,"motetsec") == 0) )
  98. {
  99. if ( ifUnit > 3 )
  100.     return(ERROR);
  101. *pOffset = ifUnit * (MAC_ADRS_LEN + 2); /* Round up to 32 bit word */
  102.         *ppEnet  = (char*)glbEnetAddr[ifUnit + MAC_OFFSET_MOTTSEC];
  103. }
  104.     else
  105.      return(ERROR);
  106.     return(OK);
  107.     }
  108. /*
  109.  * Extract MAC address from vxboot string
  110.  */
  111. LOCAL STATUS sysNetBootLineMacAddrGet
  112.     (
  113.     int ifUnit,
  114.     UINT8 * macAddr,
  115.     int ifMacAddrLen
  116.     )
  117.     {
  118.         char* bootLine;
  119.         BOOT_PARAMS params;
  120.         if ((ifUnit > 1) ||(macAddr == NULL) || (ifMacAddrLen < 6)) {
  121.             return(ERROR);
  122.         }
  123.         bootLine = BOOT_LINE_ADRS;
  124.         if (usrBootLineCrack(bootLine, &params) != OK) {
  125.             return (ERROR);
  126.         }
  127.         if (params.other [0] != EOS)
  128.             {
  129.             int intArr[6];
  130.             char *pStr;
  131.             int ix, jx;
  132.             /* extract enet MAC address from 'other' parameter */
  133.             pStr = params.other;
  134.             for(jx = 0; jx <=1; jx++) {
  135.                 if ((pStr = strstr(pStr, ";mac=")) != NULL)
  136.                     {
  137.                     if (sscanf(&pStr[5], "%02x:%02x:%02x:%02x:%02x:%02x",
  138.                                &intArr[0], &intArr[1], &intArr[2], 
  139.                                &intArr[3], &intArr[4], &intArr[5]) == 6)
  140.                         {
  141.                             if (ifUnit == jx) {
  142.                                 for (ix = 0; ix < 6; ix++)
  143.                                 {
  144.                                     macAddr[5 - ix] = intArr[ix];
  145.                                 }
  146.                                 return (OK);
  147.                             } else {
  148.                                 pStr += 5;
  149.                             }
  150.                         }
  151.                     }
  152.                 }
  153.             }
  154.         return(ERROR);
  155.     }
  156. /***********************************************************
  157. *
  158. * sysNetMacNVRamAddrGet - Get interface MAC address
  159. *
  160. *  This routine gets the current MAC address from the
  161. *  Non Volatile RAM, and store it in the ifMacAddr
  162. *  buffer provided by the caller.
  163. *
  164. *  It is not required for the BSP to provide NVRAM to store
  165. *  the MAC address.  Also, some interfaces do not allow
  166. *  the MAC address to be set by software.  In either of
  167. *  these cases, this routine simply returns ERROR.
  168. *
  169. *  Given a MAC address m0:m1:m2:m3:m4:m5, the byte order
  170. *  of ifMacAddr is:
  171. * m0 @ ifMacAddr
  172. * m1 @ ifMacAddr + 1
  173. * m2 @ ifMacAddr + 2
  174. * m3 @ ifMacAddr + 3
  175. * m4 @ ifMacAddr + 4
  176. * m5 @ ifMacAddr + 5
  177. *
  178. * RETURNS: OK, if MAC address available, ERROR otherwise
  179. *
  180. * ERRNO: N/A
  181. */
  182. STATUS sysNetMacNVRamAddrGet
  183.     (
  184.     char * ifName,
  185.     int ifUnit,
  186.     UINT8 * ifMacAddr,
  187.     int ifMacAddrLen
  188.     )
  189.     {
  190.     int   offset;
  191.     char *pEnet;
  192.     /* fetch address line & offset from glbEnetAddr[] table */
  193.     if (sysMacOffsetGet(ifName, ifUnit, &pEnet, &offset) != OK)
  194.         return(ERROR);
  195.     if (sysNetBootLineMacAddrGet(ifUnit, pEnet, ifMacAddrLen) != OK)
  196.     {
  197. #if (NV_RAM_SIZE != NONE)
  198.     /* get MAC address from NvRAM. */
  199.     sysNvRamGet (pEnet, ifMacAddrLen, NV_MAC_ADRS_OFFSET+offset);
  200. #endif /* (NV_RAM_SIZE != NONE) */
  201.     }
  202.     if ( memcmp(pEnet, sysInvalidAddr[0], MAC_ADRS_LEN) == 0 )
  203.         return(ERROR);
  204.     if ( memcmp(pEnet, sysInvalidAddr[1], MAC_ADRS_LEN) == 0 )
  205.         return(ERROR);
  206.     /* mac address in memory only */
  207.     memcpy (ifMacAddr, pEnet, ifMacAddrLen);
  208.     return (OK);
  209.     }
  210. /***********************************************************
  211. *
  212. * sysNetMacAddrGet - Get interface MAC address
  213. *
  214. *  This routine gets the current MAC address from the
  215. *  network interface, and stores it in the ifMacAddr
  216. *  buffer provided by the caller.
  217. *
  218. *  If the network interface cannot be queried about the
  219. *  MAC address, this routine returns ERROR.
  220. *
  221. * RETURNS: OK, if MAC address available, ERROR otherwise
  222. *
  223. * ERRNO: N/A
  224. */
  225. STATUS sysNetMacAddrGet
  226.     (
  227.     char * ifName,
  228.     int ifUnit,
  229.     UINT8 * ifMacAddr,
  230.     int ifMacAddrLen
  231.     )
  232.     {
  233.     /*
  234.      * None of our interfaces can be queried directly.
  235.      * Return ERROR to indicate that we need to use
  236.      * RAM/NVRAM instead.
  237.      */
  238.     return(ERROR);
  239.     }
  240. /***********************************************************
  241. *
  242. * sysNetMacAddrSet - Save interface MAC address
  243. *
  244. *  This routine saves the MAC address specified in
  245. *  ifMacAddr to the appropriate location in NVRam (if
  246. *  possible) and update the specified interface to use
  247. *  the specified MAC address.
  248. *
  249. *  If the network interface MAC address cannot be set,
  250. *  this routine returns ERROR.
  251. *
  252. * RETURNS: OK, if MAC address available, ERROR otherwise
  253. *
  254. * ERRNO: N/A
  255. */
  256. STATUS sysNetMacAddrSet
  257.     (
  258.     char * ifName,
  259.     int ifUnit,
  260.     UINT8 * ifMacAddr,
  261.     int ifMacAddrLen
  262.     )
  263.     {
  264.     int   offset;
  265.     char *pEnet;
  266.     /* fetch address line & offset from glbEnetAddr[] table */
  267.     if (sysMacOffsetGet(ifName, ifUnit, &pEnet, &offset) != OK)
  268.         return(ERROR);
  269. #if (NV_RAM_SIZE != NONE)
  270.     /* check MAC address in NvRAM. */
  271.     sysNvRamGet (pEnet, ifMacAddrLen, NV_MAC_ADRS_OFFSET+offset);
  272.     if (0 == memcmp (ifMacAddr, pEnet, ifMacAddrLen))
  273. {
  274. /* same address so don't erase and rewrite flash */
  275. printf("Address unchangedn");
  276. return (OK);
  277. }
  278.     sysNvRamSet (ifMacAddr, ifMacAddrLen, NV_MAC_ADRS_OFFSET+offset);
  279. #endif /* (NV_RAM_SIZE != NONE) */
  280.     /* mac address in memory only */
  281.     memcpy (ifMacAddr, pEnet, ifMacAddrLen);
  282.     return (OK);
  283.     }
  284. /***********************************************************
  285. *
  286. * sysMacIndex2Unit - convert index range to unit number
  287. *
  288. * This routine converts an index range 0..MAX_MAC_ADRS-1
  289. * to a unit number.
  290. *
  291. * RETURNS: unit number of indexed device
  292. *
  293. * ERRNO: N/A
  294. */
  295. int sysMacIndex2Unit
  296.     (
  297.     int index
  298.     )
  299.     {
  300.     return (index);   /* remaining three are motfcc (0,1,2) */
  301.     }
  302. /***********************************************************
  303. *
  304. * sysMacIndex2Dev - convert index range to device string
  305. *
  306. * This routine converts an index range 0..MAX_MAC_ADRS-1
  307. * to a device string index e.g. motfcc.
  308. *
  309. * RETURNS: index access device name in sysNetDevName
  310. *
  311. * ERRNO: N/A
  312. */
  313. int sysMacIndex2Dev
  314.     (
  315.     int index
  316.     )
  317.     {
  318.     return (0);      /* remaining are motfcc */
  319.     }
  320. #ifdef ENET_MAC_DEBUG
  321. /***********************************************************
  322. *
  323. * sysNetMacAddrClear - clear MAC address in FLASH/NVRAM
  324. *
  325. *  This routine clears the storage locations in NVRAM
  326. *  reserved for the MAC address of the specified interface.
  327. *
  328. *  This is useful for debugging the 'M' command.  To use
  329. *  this, boot vxWorks and run sysNetMacAddrClear() from
  330. *  the shell.  After running this command, you can test
  331. *  the bootrom 'M' command under conditions similar to a
  332. *  new, unprogrammed board.
  333. *
  334. * RETURNS: OK, if MAC address available, ERROR otherwise
  335. */
  336. int sysNetMacAddrClear
  337.     (
  338.     char * ifName,
  339.     int ifUnit
  340.     )
  341.     {
  342.     UINT8  ifMacAddr[MAC_ADRS_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  343.     int   offset;
  344.     char *pEnet;
  345.     if (sysMacOffsetGet(ifName, ifUnit, &pEnet, &offset) != OK)
  346.         return(ERROR);
  347.     sysNvRamSet (ifMacAddr, MAC_ADRS_LEN, NV_MAC_ADRS_OFFSET+offset);
  348.     memcpy (ifMacAddr, pEnet, MAC_ADRS_LEN);
  349.     return(0);
  350.     }
  351. #endif /* ENET_MAC_DEBUG */
  352. #ifdef INCLUDE_MOT_ETSEC_HEND
  353. /***********************************************************************
  354. *
  355. * sysMotEtsecEnetAddrGet - get the hardware Ethernet address
  356. *
  357. * This routine provides the six byte Ethernet hardware address that will be
  358. * used by each individual TSEC device unit.  This routine must copy
  359. * the six byte address to the space provided by <addr>.
  360. *
  361. * RETURNS: OK, or ERROR if the Ethernet address cannot be returned.
  362. */
  363. STATUS sysMotEtsecEnetAddrGet
  364.     (
  365.     int     unit,
  366.     UCHAR * pAddr
  367.     )
  368.     {
  369.     return(sysNetMacNVRamAddrGet ("motetsec",unit,pAddr,MAC_ADRS_LEN));
  370.     }
  371. #else
  372. #ifdef INCLUDE_MOT_TSEC_HEND
  373. IMPORT STATUS    sysEnetAddrGet (UINT32, UCHAR *);
  374. /***********************************************************************
  375. *
  376. * sysEnetAddrGet - get the hardware Ethernet address
  377. *
  378. * This routine provides the six byte Ethernet hardware address that will be
  379. * used by each individual TSEC device unit.  This routine must copy
  380. * the six byte address to the space provided by <addr>.
  381. *
  382. * RETURNS: OK, or ERROR if the Ethernet address cannot be returned.
  383. */
  384. STATUS sysEnetAddrGet
  385.     (
  386.     UINT32     unit,
  387.     UCHAR * pAddr
  388.     )
  389.     {
  390.     return(sysNetMacNVRamAddrGet ("mottsec",unit,pAddr,MAC_ADRS_LEN));
  391.     }
  392. #else
  393. /***********************************************************************
  394. *
  395. * sysMotTsecEnetAddrGet - get the hardware Ethernet address
  396. *
  397. * This routine provides the six byte Ethernet hardware address that will be
  398. * used by each individual TSEC device unit.  This routine must copy
  399. * the six byte address to the space provided by <addr>.
  400. *
  401. * RETURNS: OK, or ERROR if the Ethernet address cannot be returned.
  402. */
  403. STATUS sysMotTsecEnetAddrGet
  404.     (
  405.     int     unit,
  406.     UCHAR * pAddr
  407.     )
  408.     {
  409.     return(sysNetMacNVRamAddrGet ("mottsec",unit,pAddr,MAC_ADRS_LEN));
  410.     }
  411. #endif
  412. #endif
  413. #endif /* ETHERNET_MAC_HANDLER */