Added code to generate LAA MAC addresses when a port GUID
authorftillier <ftillier@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Fri, 27 May 2005 18:31:10 +0000 (18:31 +0000)
committerftillier <ftillier@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Fri, 27 May 2005 18:31:10 +0000 (18:31 +0000)
does not have a known algorithm for creating a valid
Globally Unique MAC address.

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

ulp/ipoib/kernel/ipoib_driver.c
ulp/ipoib/kernel/ipoib_xfr_mgr.h

index 8628789..72cb514 100644 (file)
@@ -120,6 +120,7 @@ static const unsigned char VENDOR_ID[] = {0x00, 0x06, 0x6A, 0x00};
 \r
 /* Global driver debug level */\r
 uint32_t       g_ipoib_dbg_lvl = IPOIB_DBG_ERROR;\r
+atomic32_t     g_laa_idx = 0;\r
 \r
 \r
 NTSTATUS\r
index cee836b..b7e0fd8 100644 (file)
@@ -88,6 +88,10 @@ extern "C"
 {\r
 #endif\r
 \r
+/* Global counter for generating LAA MACs */\r
+extern atomic32_t              g_laa_idx;\r
+\r
+\r
 /*\r
  * Address accessors\r
  */\r
@@ -125,17 +129,17 @@ ipoib_addr_set_qpn(
 }\r
 \r
 \r
-/****f* IPOIB/ipoib_mac_from_guid\r
+/****f* IPOIB/ipoib_mac_from_sst_guid\r
 * NAME\r
-*      ipoib_mac_from_guid\r
+*      ipoib_mac_from_sst_guid\r
 *\r
 * DESCRIPTION\r
-*      Generates an ethernet MAC address given a port GUID.\r
+*      Generates an ethernet MAC address given a SilverStorm port GUID.\r
 *\r
 * SYNOPSIS\r
 */\r
 static inline ib_api_status_t\r
-ipoib_mac_from_guid(\r
+ipoib_mac_from_sst_guid(\r
        IN              const   net64_t                                         port_guid,\r
                OUT                     mac_addr_t* const                       p_mac_addr )\r
 {\r
@@ -143,8 +147,7 @@ ipoib_mac_from_guid(
        uint32_t                low24;\r
 \r
        /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
-       if( p_guid[0] != 0x00 || p_guid[1] != 0x06 || p_guid[2] != 0x6a )\r
-               return IB_INVALID_GUID;\r
+       ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x06 && p_guid[2] == 0x6a );\r
 \r
        /*\r
         * We end up using only the lower 23-bits of the GUID.  Trap that\r
@@ -191,6 +194,71 @@ ipoib_mac_from_guid(
 *********/\r
 \r
 \r
+/****f* IPOIB/ipoib_mac_from_guid\r
+* NAME\r
+*      ipoib_mac_from_guid\r
+*\r
+* DESCRIPTION\r
+*      Generates an ethernet MAC address given a port GUID.\r
+*\r
+* SYNOPSIS\r
+*/\r
+static inline ib_api_status_t\r
+ipoib_mac_from_guid(\r
+       IN              const   net64_t                                         port_guid,\r
+               OUT                     mac_addr_t* const                       p_mac_addr )\r
+{\r
+       ib_api_status_t status;\r
+       const uint8_t   *p_guid = (const uint8_t*)&port_guid;\r
+       uint32_t                laa;\r
+\r
+       /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
+       if( p_guid[0] == 0x00 && p_guid[1] == 0x06 && p_guid[2] == 0x6a )\r
+       {\r
+               status = ipoib_mac_from_sst_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_laa_idx );\r
+\r
+       if( !laa )\r
+               return IB_INVALID_GUID;\r
+\r
+       p_mac_addr->addr[0] = 2; /* LAA bit */\r
+       p_mac_addr->addr[1] = 0;\r
+       p_mac_addr->addr[2] = (uint8_t)(laa >> 24);\r
+       p_mac_addr->addr[3] = (uint8_t)(laa >> 16);\r
+       p_mac_addr->addr[4] = (uint8_t)(laa >> 8);\r
+       p_mac_addr->addr[5] = (uint8_t)laa;\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
+*      Creates a locally administered address using a global incrementing counter.\r
+*\r
+* SEE ALSO\r
+*      IPOIB\r
+*********/\r
+\r
+\r
 /****f* IPOIB/ipoib_guid_from_mac\r
 * NAME\r
 *      ipoib_guid_from_mac\r