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

VxWorks

开发平台:

C/C++

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