The format of Client Identifier Field (CID) was changed.

/* The CID will contain of: 
	CID[0] = DHCP_OPT_CLIENT_ID == 61
	CID[1] = coIPoIB_CID_Len == 22
	CID[2:13] = coIBDefaultDHCPPrefix; (Here CID[2] always == coIPoIB_HwTypeIB == 0xFF)
	CID[14:21] = GUID;
*/
Signed-off by: Alexander Naslednikov (xalex at mellanox.co.il)
Index: B:/users/xalex/MLNX_WinOF-2_1_2/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
===================================================================
--- B:/users/xalex/MLNX_WinOF-2_1_2/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp	(revision 6117)
+++ B:/users/xalex/MLNX_WinOF-2_1_2/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp	(revision 6118)
@@ -2727,16 +2727,22 @@
 	if( p_cid ) /* from client */
 	{
 		/* Validate that the length and type of the option is as required. */
-		if( p_cid[1] != 21 )
+		IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,
+					("DHCP CID received is:"));
+		for (int i=0; i < coIPoIB_CID_TotalLen; ++i) {
+			IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,
+				("[%d] 0x%x: \n",i, p_cid[i]));
+		}
+		if( p_cid[1] != coIPoIB_CID_Len )
 		{
 			IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
-				("Client-identifier length not 21 as required.\n") );
+				("Client-identifier length is not equal to %d as required.\n",coIPoIB_CID_Len) );
 			return IB_INVALID_SETTING;
 		}
-		if( p_cid[2] != DHCP_HW_TYPE_IB )
+		if( p_cid[2] != coIPoIB_HwTypeIB)
 		{
 			IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
-				("Client-identifier type is wrong.\n") );
+				("Client-identifier type is %d <> %d and wrong \n", p_cid[2], coIPoIB_HwTypeIB) );
 			return IB_INVALID_SETTING;
 		}
 		/*
@@ -2746,8 +2752,10 @@
 		 */
 		p_cid[1] =  sizeof (ib_net64_t) + 1;// CID length 
 		p_cid[2] =  DHCP_HW_TYPE_ETH;// CID type
-		RtlMoveMemory( &p_cid[3], &p_cid[15], sizeof (ib_net64_t) );
-		RtlFillMemory(&p_cid[11], 12, 0);
+		//Copy the GUID to the 3-d byte of CID
+		RtlMoveMemory( &p_cid[3], &p_cid[coIPoIB_CID_TotalLen - sizeof (ib_net64_t)], sizeof (ib_net64_t) );
+		// Clear the rest
+		RtlFillMemory(&p_cid[3+sizeof (ib_net64_t)],coIPoIB_CID_TotalLen - 3 -sizeof (ib_net64_t), 0);
 
 		RtlCopyMemory( p_dhcp->chaddr, &p_src->mac, sizeof(p_src->mac) );
 		RtlFillMemory( &p_dhcp->chaddr[sizeof(p_src->mac)],
@@ -4512,7 +4520,6 @@
 	uint8_t				*p_option, *p_cid = NULL;
 	uint8_t				msg = 0;
 	size_t				len;
-	ib_gid_t			gid;
 
 	IPOIB_ENTER( IPOIB_DBG_SEND );
 
@@ -4624,10 +4631,11 @@
 			if( p_cid[1] == HW_ADDR_LEN+1 && !cl_memcmp( &p_cid[3],
 				&s_buf->p_port->p_adapter->params.conf_mac.addr, HW_ADDR_LEN ) )
 			{
-				/* Make sure there's room to extend it.  23 is the size of
-				 * the CID option for IPoIB.
+				ASSERT( FALSE );
+				/* Make sure there's room to extend it.  22 is the size of
+				 * the CID option for IPoIB. (20 is the length, one byte for type and the second for lenght field)
 				 */
-				if( buf_len + 23 - p_cid[1] > sizeof(dhcp_pkt_t) )
+				if( buf_len + coIPoIB_CID_TotalLen - p_cid[1] > sizeof(dhcp_pkt_t) )
 				{
 					IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
 						("Can't convert CID to IPoIB format.\n") );
@@ -4640,13 +4648,8 @@
 				
 				p_cid += len;
 				p_cid[0] = DHCP_OPT_CLIENT_ID;
-				p_cid[1] = 21;
-				p_cid[2] = DHCP_HW_TYPE_IB;
+				p_cid[1] = coIPoIB_CID_Len;
 			}
-			else
-			{
-				p_cid[2] = DHCP_HW_TYPE_IB;
-			}
 		}
 		else
 		{
@@ -4654,7 +4657,7 @@
 			 * Make sure there's room to extend it.  23 is the size of
 			 * the CID option for IPoIB.
 			 */
-			if( buf_len + 23 > sizeof(dhcp_pkt_t) )
+			if( buf_len + coIPoIB_CID_TotalLen > sizeof(dhcp_pkt_t) )
 			{
 				IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
 					("Can't convert CID to IPoIB format.\n") );
@@ -4662,18 +4665,19 @@
 			}
 
 			p_cid = p_option;
-			p_option = p_cid + 23;
-			p_option[0] = DHCP_OPT_END;
 			p_cid[0] = DHCP_OPT_CLIENT_ID;
-			p_cid[1] = 21;
-			p_cid[2] = DHCP_HW_TYPE_IB;
+			p_cid[1] = coIPoIB_CID_Len;
 		}
 
-		CL_ASSERT( p_cid[1] == 21 );
-		p_cid[23]= DHCP_OPT_END;
-		ib_gid_set_default( &gid, s_buf->p_port->p_adapter->guids.port_guid.guid );
-		cl_memcpy( &p_cid[7], &gid, sizeof(ib_gid_t) );
-		cl_memcpy( &p_cid[3], &s_buf->p_port->ib_mgr.qpn, sizeof(s_buf->p_port->ib_mgr.qpn) );		
+		CL_ASSERT( p_cid[1] == coIPoIB_CID_Len);
+		p_cid[coIPoIB_CID_TotalLen]= DHCP_OPT_END;
+		
+		// Copy the default prefix for ALL DHCP messages
+		cl_memcpy( &p_cid[2], &coIBDefaultDHCPPrefix[0], sizeof coIBDefaultDHCPPrefix);
+		// Copy the GUID into the last 8 bytes of the CID field
+		cl_memcpy( &p_cid[2+ sizeof(coIBDefaultDHCPPrefix)],&s_buf->p_port->p_adapter->guids.port_guid.guid , 
+			sizeof(s_buf->p_port->p_adapter->guids.port_guid.guid) );
+		
 		p_ib_dhcp->htype = DHCP_HW_TYPE_IB;
 
 		/* update lengths to include any change we made */
@@ -4690,6 +4694,8 @@
 
 	/* Server messages. */
 	case DHCPOFFER:
+		p_ib_dhcp->htype = 0x20;
+		p_ib_dhcp->hlen = 0x8;
 	case DHCPACK:
 	case DHCPNAK:
 		/* don't touch server messages */