Generally, we don't keep ulp/opensm/user/include/iba/ib_types.h synchronized with inc/iba/ib_types.h and ib_types_extended.h You're right - files are now quite different and a lot of changes weren't inserted there. Anyway, this change can theoretically help in the future - there were talks about merging all the files into one.
XaleX -----Original Message----- From: Hal Rosenstock [mailto:[EMAIL PROTECTED] Sent: Friday, September 19, 2008 3:27 PM To: Alex Naslednikov Cc: [email protected]; Tzachi Dar; Yevgeny Kliteynik Subject: Re: [ofw] [patch] [IPoIB] Adding support to dell guid and user-define mask for guid generation On Fri, Sep 19, 2008 at 7:42 AM, Alex Naslednikov <[EMAIL PROTECTED]> wrote: > > This patch adds support for dell guid and also enables user-defined > MAC address generation according to predefined GUID bitwise mask IPoIB > GUID patch Signed-off by: Alexander Naslednikov (xalex at > mellanox.co.il) > Index: inc/iba/ib_types.h > =================================================================== > --- inc/iba/ib_types.h (revision 3193) > +++ inc/iba/ib_types.h (working copy) > @@ -8696,6 +8696,7 @@ > IB_INVALID_GID, > IB_INVALID_LID, > IB_INVALID_GUID, > + IB_INVALID_GUID_MASK, > IB_INVALID_CA_HANDLE, > IB_INVALID_AV_HANDLE, > IB_INVALID_CQ_HANDLE, > Index: ulp/ipoib/kernel/ipoib_adapter.c > =================================================================== > --- ulp/ipoib/kernel/ipoib_adapter.c (revision 3193) > +++ ulp/ipoib/kernel/ipoib_adapter.c (working copy) > @@ -343,8 +343,8 @@ > > > /* Validate the port GUID and generate the MAC address. */ > - status = > - ipoib_mac_from_guid( p_adapter->guids.port_guid.guid, > &p_adapter->mac ); > + status = > + ipoib_mac_from_guid( p_adapter->guids.port_guid.guid, > p_adapter->params.guid_mask, &p_adapter->mac); > if( status != IB_SUCCESS ) > { > IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, > Index: ulp/ipoib/kernel/ipoib_adapter.h > =================================================================== > --- ulp/ipoib/kernel/ipoib_adapter.h (revision 3193) > +++ ulp/ipoib/kernel/ipoib_adapter.h (working copy) > @@ -77,6 +77,7 @@ > uint32_t xfer_block_size; > mac_addr_t conf_mac; > uint32_t mc_leave_rescan; > + uint64_t guid_mask; > } ipoib_params_t; > /* > * FIELDS > Index: ulp/ipoib/kernel/ipoib_driver.c > =================================================================== > --- ulp/ipoib/kernel/ipoib_driver.c (revision 3193) > +++ ulp/ipoib/kernel/ipoib_driver.c (working copy) > @@ -128,7 +128,10 @@ > > #define IB_INFINITE_SERVICE_LEASE 0xFFFFFFFF > > +//The mask is 8 bit and can't contain more than 6 non-zero bits > +#define MAX_GUID_MAX 0xFC > > + > /* Global driver debug level */ > uint32_t g_ipoib_dbg_level = TRACE_LEVEL_ERROR; uint32_t > g_ipoib_dbg_flags = 0x00000fff; @@ -157,7 +160,10 @@ > {NDIS_STRING_CONST("RecvRatio"), 1, > IPOIB_OFFSET(recv_pool_ratio), IPOIB_SIZE(recv_pool_ratio), > 1, 1, 10}, > {NDIS_STRING_CONST("PayloadMtu"), 1, > IPOIB_OFFSET(payload_mtu), IPOIB_SIZE(payload_mtu), > 2044, 60, 4092}, > {NDIS_STRING_CONST("lso"), 0, > IPOIB_OFFSET(lso), IPOIB_SIZE(lso), > 0, 0, 1}, > - {NDIS_STRING_CONST("MCLeaveRescan"), 1, > IPOIB_OFFSET(mc_leave_rescan), IPOIB_SIZE(mc_leave_rescan), > 260, 1, 3600} > + {NDIS_STRING_CONST("MCLeaveRescan"), 1, > IPOIB_OFFSET(mc_leave_rescan), IPOIB_SIZE(mc_leave_rescan), > 260, 1, 3600}, > + {NDIS_STRING_CONST("GUIDMask"), 1, > IPOIB_OFFSET(guid_mask), IPOIB_SIZE(guid_mask), > 0, 0, MAX_GUID_MAX} > + > + > }; > > #define IPOIB_NUM_REG_PARAMS (sizeof (HCARegTable) / > sizeof(IPOIB_REG_ENTRY)) > Index: ulp/ipoib/kernel/ipoib_port.c > =================================================================== > --- ulp/ipoib/kernel/ipoib_port.c (revision 3193) > +++ ulp/ipoib/kernel/ipoib_port.c (working copy) > @@ -1819,9 +1819,9 @@ > { > status = ipoib_mac_from_guid( > #if IPOIB_INLINE_RECV > - p_desc->buf.ib.grh.src_gid.unicast.interface_id, &mac ); > + p_desc->buf.ib.grh.src_gid.unicast.interface_id, > p_port->p_adapter->params.guid_mask, &mac ); #else /* > IPOIB_INLINE_RECV */ > - p_desc->p_buf->ib.grh.src_gid.unicast.interface_id, &mac ); > + p_desc->p_buf->ib.grh.src_gid.unicast.interface_id, > p_port->p_adapter->params.guid_mask,&mac ); #endif /* > IPOIB_INLINE_RECV */ > if( status != IB_SUCCESS ) > { > @@ -2315,7 +2315,7 @@ > cl_memcpy( &gid, &p_cid[7], sizeof(ib_gid_t) ); > p_cid[1] = HW_ADDR_LEN +1;// CID length > p_cid[2] = DHCP_HW_TYPE_ETH;// CID type > - status = ipoib_mac_from_guid( gid.unicast.interface_id, > (mac_addr_t*)&p_cid[3] ); > + status = ipoib_mac_from_guid( gid.unicast.interface_id, > p_port->p_adapter->params.guid_mask,(mac_addr_t*)&p_cid[3] ); > p_cid[HW_ADDR_LEN + 3] = DHCP_OPT_END; //terminate tag > } > IPOIB_EXIT( IPOIB_DBG_RECV ); > @@ -2425,7 +2425,7 @@ > { > /* Copy the src GID to allow aligned access */ > cl_memcpy( &gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) ); > - status = ipoib_mac_from_guid( gid.unicast.interface_id, &mac ); > + status = ipoib_mac_from_guid( gid.unicast.interface_id, > p_port->p_adapter->params.guid_mask,&mac ); > if( status != IB_SUCCESS ) > { > IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, > Index: ulp/ipoib/kernel/ipoib_xfr_mgr.h > =================================================================== > --- ulp/ipoib/kernel/ipoib_xfr_mgr.h (revision 3193) > +++ ulp/ipoib/kernel/ipoib_xfr_mgr.h (working copy) > @@ -231,6 +231,77 @@ > > return IB_SUCCESS; > } > + > +/****f* IPOIB/ipoib_mac_from_dell_guid > +* NAME > +* ipoib_mac_from_dell_guid > +* > +* DESCRIPTION > +* Generates an ethernet MAC address given a DELL port GUID. > +* > +* SYNOPSIS > +*/ > +static inline ib_api_status_t > +ipoib_mac_from_dell_guid( > + IN const net64_t port_guid, > + OUT mac_addr_t* const p_mac_addr ) > +{ > + const uint8_t *p_guid = (const uint8_t*)&port_guid; uint32_t > +low24; > + net16_t guid_middle; > + > + /* Port guid is in network byte order. OUI is in lower 3 bytes. */ > + ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x18 && p_guid[2] == 0x8b > + ); > + > + low24 = ((uint32_t)cl_ntoh64( port_guid ) & 0x00FFFFFF); > + > + p_mac_addr->addr[0] = p_guid[0]; > + p_mac_addr->addr[1] = p_guid[1]; > + p_mac_addr->addr[2] = p_guid[2]; > + p_mac_addr->addr[3] = (uint8_t)(low24 >> 16); p_mac_addr->addr[4] = > + (uint8_t)(low24 >> 8); p_mac_addr->addr[5] = (uint8_t)low24; > + > + return IB_SUCCESS; > +} > + > +/****f* IPOIB/ipoib_mac_from_general_guid > +* NAME > +* ipoib_mac_from_general_guid > +* > +* DESCRIPTION > +* Generates an ethernet MAC address given a general port GUID and a > +bitwise > mask > +* > +* SYNOPSIS > +*/ > +static inline ib_api_status_t > +ipoib_mac_from_general_guid( > + IN const net64_t port_guid, > + IN uint8_t guid_mask, > + OUT mac_addr_t* const p_mac_addr ) > +{ > +#define MAC_ADDR_SIZE 6 > + uint8_t i; > + const uint8_t *p_guid = (const uint8_t*)&port_guid; int dig_counter > += 0; > + > + //All non-zero bits of guid_mask indicates the number of an > + appropriate > byte in > + // port_guid, that will be used in MAC address construction for (i = > + 7; guid_mask; guid_mask >>= 1, --i) { if (guid_mask & 1 ) { > + p_mac_addr->addr[MAC_ADDR_SIZE - dig_counter] = p_guid [i]; > + ++dig_counter; > + } > + } > + // check for the mask validity: it can't have more than 6 non-zero > + bits if (dig_counter != MAC_ADDR_SIZE) { > + return IB_INVALID_GUID_MASK; > + } > + > + return IB_SUCCESS; > +} > + > + > /* > * PARAMETERS > * port_guid > @@ -399,12 +470,22 @@ > static inline ib_api_status_t > ipoib_mac_from_guid( > IN const net64_t port_guid, > - OUT mac_addr_t* const p_mac_addr ) > + IN const uint32_t guid_mask, > + OUT mac_addr_t* const p_mac_addr > + ) > { > ib_api_status_t status; > const uint8_t *p_guid = (const uint8_t*)&port_guid; > uint32_t laa; > > + if (guid_mask) { > + status = ipoib_mac_from_general_guid(port_guid, guid_mask, > + p_mac_addr); if( status == IB_SUCCESS ) > + return IB_SUCCESS; > + //otherwise, mask was invalid, getting back to standard flow } > + > + > if( p_guid[0] == 0 ) > { > if( p_guid[1] == 0x02 && p_guid[2] == 0xc9 ) @@ -444,6 +525,13 @@ > if( status == IB_SUCCESS ) > return IB_SUCCESS; > } > + else if( p_guid[1] == 0x18 && p_guid[2] == 0x8b ) { > + status = ipoib_mac_from_dell_guid( port_guid, p_mac_addr ); > + if( status == IB_SUCCESS ) > + return IB_SUCCESS; > + } > + > } > > /* Value of zero is reserved. */ > Index: ulp/opensm/user/include/iba/ib_types.h > =================================================================== > --- ulp/opensm/user/include/iba/ib_types.h (revision 3193) > +++ ulp/opensm/user/include/iba/ib_types.h (working copy) > @@ -7928,6 +7928,7 @@ > IB_INVALID_GID, > IB_INVALID_LID, > IB_INVALID_GUID, > + IB_INVALID_GUID_MASK, > IB_INVALID_CA_HANDLE, > IB_INVALID_AV_HANDLE, > IB_INVALID_CQ_HANDLE, Are we keeping ib_types.h in sync with Linux ? I thought this file was intended on being platform independent. Should this change be made there as well ? -- Hal > Index: ulp/opensm/user/include/iba/ib_types_extended.h > =================================================================== > --- ulp/opensm/user/include/iba/ib_types_extended.h (revision 3193) > +++ ulp/opensm/user/include/iba/ib_types_extended.h (working copy) > @@ -137,6 +137,7 @@ > IB_INVALID_GID, > IB_INVALID_LID, > IB_INVALID_GUID, > + IB_INVALID_GUID_MASK, > IB_INVALID_CA_HANDLE, > IB_INVALID_AV_HANDLE, > IB_INVALID_CQ_HANDLE, > _______________________________________________ > ofw mailing list > [email protected] > http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw > _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
