This patch adds support for user-define mask for generic mac generation 
Signed-off by: Alexander Naslednikov (xalex at mellanox.co.il)
Index: D:/Windows/MLNX_WINOF/ulp/opensm/user/include/iba/ib_types.h
===================================================================
--- D:/Windows/MLNX_WINOF/ulp/opensm/user/include/iba/ib_types.h
(revision 3214)
+++ D:/Windows/MLNX_WINOF/ulp/opensm/user/include/iba/ib_types.h
(revision 3215)
@@ -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,
Index:
D:/Windows/MLNX_WINOF/ulp/opensm/user/include/iba/ib_types_extended.h
===================================================================
---
D:/Windows/MLNX_WINOF/ulp/opensm/user/include/iba/ib_types_extended.h
(revision 3214)
+++
D:/Windows/MLNX_WINOF/ulp/opensm/user/include/iba/ib_types_extended.h
(revision 3215)
@@ -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,
Index: D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_adapter.c
===================================================================
--- D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_adapter.c
(revision 3214)
+++ D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_adapter.c
(revision 3215)
@@ -344,7 +344,7 @@
 
        /* Validate the port GUID and generate the MAC address. */
        status =
-               ipoib_mac_from_guid( p_adapter->guids.port_guid.guid,
&p_adapter->mac );
+               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: D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_port.c
===================================================================
--- D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_port.c (revision 3214)
+++ D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_port.c (revision 3215)
@@ -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: D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_adapter.h
===================================================================
--- D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_adapter.h
(revision 3214)
+++ D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_adapter.h
(revision 3215)
@@ -77,6 +77,7 @@
        uint32_t        xfer_block_size;
        mac_addr_t      conf_mac;
        uint32_t        mc_leave_rescan;
+       uint32_t        guid_mask;
 }      ipoib_params_t;
 /*
 * FIELDS
Index: D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_driver.c
===================================================================
--- D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_driver.c
(revision 3214)
+++ D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_driver.c
(revision 3215)
@@ -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: D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/netipoib.inx
===================================================================
--- D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/netipoib.inx (revision 3214)
+++ D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/netipoib.inx (revision 3215)
@@ -152,6 +152,13 @@
 HKR, Ndi\Params\MCLeaveRescan,         Max,            0, "3600"
 
 
+HKR, Ndi\Params\guid_mask,             ParamDesc,      0, "GUID bitwise
mask"
+HKR, Ndi\Params\guid_mask,             Type,           0, "dword"
+HKR, Ndi\Params\guid_mask,             Default,        0, "0"
+HKR, Ndi\Params\guid_mask,             Optional,       0, "0"
+HKR, Ndi\Params\guid_mask,             Min,            0, "0"
+HKR, Ndi\Params\guid_mask,             Max,            0, "252"
+
 [IpoibService]
 DisplayName     = %IpoibServiceDispName%
 ServiceType     = 1 ;%SERVICE_KERNEL_DRIVER%
Index: D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_xfr_mgr.h
===================================================================
--- D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_xfr_mgr.h
(revision 3214)
+++ D:/Windows/MLNX_WINOF/ulp/ipoib/kernel/ipoib_xfr_mgr.h
(revision 3215)
@@ -274,12 +274,60 @@
 *              The MAC address was successfully converted.
 *
 *********/
+
+
+/****f* IPOIB/ipoib_mac_from_general_guid
+* NAME
+*      ipoib_mac_from_dell_guid
+*
+* DESCRIPTION
+*      Generates an ethernet MAC address given 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                              uint32_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 digit_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 ) {
+                       ++digit_counter;
+                       if (digit_counter > MAC_ADDR_SIZE) {
+                               //to avoid negative index
+                               return IB_INVALID_GUID_MASK;
+                       }
+                       p_mac_addr->addr[MAC_ADDR_SIZE - digit_counter]
= p_guid [i];
+               }
+       }
+               // check for the mask validity: it should have 6
non-zero bits
+               if (digit_counter != MAC_ADDR_SIZE) {
+                       return IB_INVALID_GUID_MASK;
+               }
+               
+       return IB_SUCCESS;
+}
+
+
 /*
 * PARAMETERS
 *      port_guid
 *              The port GUID, in network byte order, for which to
generate a
 *              MAC address.
 *
+*      guid_mask
+*              Each BIT in the mask indicates whether to include the
appropriate BYTE
+*              to the MAC address. Bit 0 corresponds to the less
significant BYTE , i.e.
+*              highest index in the MAC array
+*
 *      p_mac_addr
 *              Pointer to a mac address in which to store the results.
 *
@@ -442,12 +490,23 @@
 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                              uint32_t
guid_mask,
+               OUT                     mac_addr_t* const
p_mac_addr
+               )
 {
+       static const guid_default_mask = 0xE7; //==0b 11100111
        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 )
Index: D:/Windows/MLNX_WINOF/inc/iba/ib_types.h
===================================================================
--- D:/Windows/MLNX_WINOF/inc/iba/ib_types.h    (revision 3214)
+++ D:/Windows/MLNX_WINOF/inc/iba/ib_types.h    (revision 3215)
@@ -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,

Attachment: ipoib_guid2.diff
Description: ipoib_guid2.diff

_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to