[IPoIB] Add support for generating globally unique Ethernet MAC addresses
authorftillier <ftillier@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Mon, 5 Dec 2005 17:35:07 +0000 (17:35 +0000)
committerftillier <ftillier@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Mon, 5 Dec 2005 17:35:07 +0000 (17:35 +0000)
from Mellanox GUIDs.

Submitted by Yossi Leybovich (sleybo@mellanox.co.il)

git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@194 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

ulp/ipoib/kernel/ipoib_xfr_mgr.h

index 2b5a3b8..84d3c7c 100644 (file)
@@ -191,6 +191,68 @@ ipoib_mac_from_sst_guid(
 *********/\r
 \r
 \r
+/****f* IPOIB/ipoib_mac_from_mlx_guid\r
+* NAME\r
+*      ipoib_mac_from_sst_guid\r
+*\r
+* DESCRIPTION\r
+*      Generates an ethernet MAC address given a Mellanox port GUID.\r
+*\r
+* SYNOPSIS\r
+*/\r
+static inline ib_api_status_t\r
+ipoib_mac_from_mlx_guid(\r
+       IN              const   net64_t                                         port_guid,\r
+               OUT                     mac_addr_t* const                       p_mac_addr )\r
+{\r
+       const uint8_t   *p_guid = (const uint8_t*)&port_guid;\r
+       uint32_t                low24;\r
+\r
+       /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
+       ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x02 && p_guid[2] == 0xc9 );\r
+\r
+       if( (port_guid & CL_HTON64( 0x000000ffff0000 )) !=\r
+               CL_HTON64(0x00000002000000))\r
+       {\r
+               return IB_INVALID_GUID;\r
+       }\r
+\r
+       low24 = ((uint32_t)cl_ntoh64( port_guid ) & 0x00FFFFFF);\r
+\r
+       p_mac_addr->addr[0] = p_guid[0];\r
+       p_mac_addr->addr[1] = p_guid[1];\r
+       p_mac_addr->addr[2] = p_guid[2];\r
+       p_mac_addr->addr[3] = (uint8_t)(low24 >> 16);\r
+       p_mac_addr->addr[4] = (uint8_t)(low24 >> 8);\r
+       p_mac_addr->addr[5] = (uint8_t)low24;\r
+       \r
+       return IB_SUCCESS;\r
+}\r
+/*\r
+* PARAMETERS\r
+*      port_guid\r
+*              The port GUID, in network byte order, for which to generate a\r
+*              MAC address.\r
+*\r
+*      p_mac_addr\r
+*              Pointer to a mac address in which to store the results.\r
+*\r
+* RETURN VALUES\r
+*      IB_SUCCESS\r
+*              The MAC address was successfully converted.\r
+*\r
+*      IB_INVALID_GUID\r
+*              The port GUID provided was not a known GUID format.\r
+*\r
+* NOTES\r
+*      The algorithm to convert portGuid to MAC address is as per DN0074, and\r
+*      assumes a 2 port HCA.\r
+*\r
+* SEE ALSO\r
+*      IPOIB\r
+*********/\r
+\r
+\r
 /****f* IPOIB/ipoib_mac_from_guid\r
 * NAME\r
 *      ipoib_mac_from_guid\r
@@ -216,7 +278,13 @@ ipoib_mac_from_guid(
                if( status == IB_SUCCESS )\r
                        return IB_SUCCESS;\r
        }\r
-\r
+       if( p_guid[0] == 0x00 && p_guid[1] == 0x02 && p_guid[2] == 0xc9 )\r
+       {\r
+               status = ipoib_mac_from_mlx_guid( port_guid, p_mac_addr );\r
+               if( status == IB_SUCCESS )\r
+                       return IB_SUCCESS;\r
+       }\r
+       \r
        /* Value of zero is reserved. */\r
        laa = cl_atomic_inc( &g_ipoib.laa_idx );\r
 \r
@@ -256,9 +324,9 @@ ipoib_mac_from_guid(
 *********/\r
 \r
 \r
-/****f* IPOIB/ipoib_guid_from_mac\r
+/****f* IPOIB/ipoib_sst_guid_from_mac\r
 * NAME\r
-*      ipoib_guid_from_mac\r
+*      ipoib_sst_guid_from_mac\r
 *\r
 * DESCRIPTION\r
 *      Generates a port GUID given an ethernet MAC address.\r
@@ -266,7 +334,7 @@ ipoib_mac_from_guid(
 * SYNOPSIS\r
 */\r
 static inline ib_api_status_t\r
-ipoib_guid_from_mac(\r
+ipoib_sst_guid_from_mac(\r
        IN              const   mac_addr_t                                      mac,\r
                OUT                     net64_t* const                          p_port_guid )\r
 {\r
@@ -329,6 +397,68 @@ ipoib_guid_from_mac(
 *********/\r
 \r
 \r
+/****f* IPOIB/ipoib_mlx_guid_from_mac\r
+* NAME\r
+*      ipoib_mlx_guid_from_mac\r
+*\r
+* DESCRIPTION\r
+*      Generates a port GUID given an ethernet MAC address.\r
+*\r
+* SYNOPSIS\r
+*/\r
+static inline ib_api_status_t\r
+ipoib_mlx_guid_from_mac(\r
+       IN              const   mac_addr_t                                      mac,\r
+               OUT                     net64_t* const                          p_port_guid )\r
+{\r
+       uint8_t         *p_guid = (uint8_t*)p_port_guid;\r
+       uint32_t        low24;\r
+\r
+       /* MAC address is in network byte order.  OUI is in lower 3 bytes. */\r
+       if( mac.addr[0] != 0x00 || \r
+               mac.addr[1] != 0x02 || \r
+               mac.addr[2] != 0xc9 )\r
+       {\r
+               return IB_INVALID_GUID;\r
+       }\r
+\r
+       low24 = mac.addr[3] << 16 || mac.addr[4] << 8 || mac.addr[5];\r
+\r
+       /* OUI */\r
+       p_guid[0] = mac.addr[0];\r
+       p_guid[1] = mac.addr[1];\r
+       p_guid[2] = mac.addr[2];\r
+       p_guid[3] = 0x02;\r
+       p_guid[4] = 0x00;\r
+       /* Serial Number */\r
+       p_guid[5] = (uint8_t)(low24 >> 16);\r
+       p_guid[6] = (uint8_t)(low24 >> 8);\r
+       p_guid[7] = (uint8_t)low24;\r
+       \r
+       return IB_SUCCESS;\r
+}\r
+/*\r
+* PARAMETERS\r
+*      port_guid\r
+*              The port GUID, in network byte order, for which to generate a\r
+*              MAC address.\r
+*\r
+*      p_mac_addr\r
+*              Pointer to a mac address in which to store the results.\r
+*\r
+* RETURN VALUES\r
+*      IB_SUCCESS\r
+*              The MAC address was successfully converted.\r
+*\r
+*      IB_INVALID_GUID\r
+*              The port GUID provided was not a known GUID format.\r
+*\r
+* NOTES\r
+*      The algorithm to convert portGuid to MAC address is as \r
+*\r
+* SEE ALSO\r
+*      IPOIB\r
+*********/\r
 \r
 \r
 #ifdef __cplusplus\r