[ofw] [Patch 43/62] Reference implementation of NDv2
Fab Tillier
ftillier at microsoft.com
Wed Feb 20 18:32:48 PST 2013
Update IBAT so that the RoCE driver only needs to register/deregister with IBAT, without having to update routes.
Signed-off-by: Fab Tillier <ftillier at microsoft.com>
diff -dwup3 -X excl.txt -r \dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\ibat\kernel\route.cpp .\core\ibat\kernel\route.cpp
--- \dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\ibat\kernel\route.cpp Tue Aug 07 16:41:02 2012
+++ .\core\ibat\kernel\route.cpp Mon Aug 13 12:55:41 2012
@@ -50,8 +50,7 @@ struct IBAT_ROUTE_REQUEST
IbatRoute*
IbatRoute::Create(
const ib_gid_t* pSrcGid,
- const ib_gid_t* pDestGid,
- BOOLEAN isRoCE
+ const ib_gid_t* pDestGid
)
{
IbatRoute* pRoute = static_cast<IbatRoute*>(
@@ -68,34 +67,7 @@ IbatRoute::Create(
KeInitializeSpinLock( &pRoute->m_requestLock );
pRoute->m_requestList = NULL;
- if( isRoCE == TRUE )
- {
- ib_path_rec_init_local(
- &pRoute->m_path,
- pDestGid,
- pSrcGid,
- 0,
- 0,
- 0,
- IB_DEFAULT_PKEY,
- 0,
- 0,
- IB_PATH_SELECTOR_EXACTLY,
- IB_MTU_LEN_1024,
- IB_PATH_SELECTOR_EXACTLY,
- IB_PATH_RECORD_RATE_10_GBS,
- IB_PATH_SELECTOR_EXACTLY,
- 0,
- 0
- );
- ib_path_rec_set_hop_flow_raw( &pRoute->m_path, 1, 0, FALSE );
-
- pRoute->m_state = NlnsReachable;
- }
- else
- {
pRoute->m_state = NlnsUnreachable;
- }
pRoute->m_hQuery = NULL;
pRoute->m_nRef = 1;
diff -dwup3 -X excl.txt -r \dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\ibat\kernel\route.h .\core\ibat\kernel\route.h
--- \dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\ibat\kernel\route.h Tue Aug 07 16:41:02 2012
+++ .\core\ibat\kernel\route.h Mon Aug 13 12:56:46 2012
@@ -59,8 +59,7 @@ class IbatRoute
public:
static IbatRoute* Create(
const ib_gid_t* pSrcGid,
- const ib_gid_t* pDestGid,
- BOOLEAN isRoCE
+ const ib_gid_t* pDestGid
);
inline VOID AddRef(){ InterlockedIncrement( &m_nRef ); }
diff -dwup3 -X excl.txt -r \dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\ibat\kernel\router.cpp .\core\ibat\kernel\router.cpp
--- \dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\ibat\kernel\router.cpp Tue Aug 07 16:41:02 2012
+++ .\core\ibat\kernel\router.cpp Mon Aug 13 12:59:54 2012
@@ -111,6 +111,38 @@ IbatRouter* IbatRouter::Create( UINT64 p
}
KeInitializeSpinLock( &pRouter->m_lock );
+ pRouter->m_portGuid = portGuid;
+ pRouter->m_isRoCE = isRoCE;
+ if( isRoCE == TRUE )
+ {
+ ib_gid_t srcGid;
+ ib_gid_set_default( &srcGid, portGuid );
+
+ ib_gid_t destGid;
+ ib_gid_set_default( &destGid, 0 );
+
+ ib_path_rec_init_local(
+ &pRouter->m_path,
+ &destGid,
+ &srcGid,
+ 0,
+ 0,
+ 0,
+ IB_DEFAULT_PKEY,
+ 0,
+ 0,
+ IB_PATH_SELECTOR_EXACTLY,
+ IB_MTU_LEN_2048,
+ IB_PATH_SELECTOR_EXACTLY,
+ IB_PATH_RECORD_RATE_10_GBS,
+ IB_PATH_SELECTOR_EXACTLY,
+ 0,
+ 0
+ );
+ ib_path_rec_set_hop_flow_raw( &pRouter->m_path, 1, 0, FALSE );
+ }
+ else
+ {
RtlInitializeGenericTableAvl(
&pRouter->m_table,
&IbatRouter::RouteCompare,
@@ -118,8 +150,7 @@ IbatRouter* IbatRouter::Create( UINT64 p
&IbatRouter::RouteFree,
pRouter
);
- pRouter->m_portGuid = portGuid;
- pRouter->m_isRoCE = isRoCE;
+ }
return pRouter;
}
@@ -131,6 +162,11 @@ IbatRouter::Update(
__in const ib_gid_t* pDestGid
)
{
+ if( m_isRoCE == TRUE )
+ {
+ return STATUS_SUCCESS;
+ }
+
NTSTATUS status = STATUS_SUCCESS;
KLOCK_QUEUE_HANDLE hdl;
IbatRoute* pRoute;
@@ -140,7 +176,7 @@ IbatRouter::Update(
ib_gid_t srcGid;
ib_gid_set_default( &srcGid, m_portGuid );
- pRoute = IbatRoute::Create( &srcGid, pDestGid, m_isRoCE );
+ pRoute = IbatRoute::Create( &srcGid, pDestGid );
if( pRoute == NULL )
{
return STATUS_INSUFFICIENT_RESOURCES;
@@ -185,6 +221,11 @@ IbatRouter::Update(
VOID
IbatRouter::Reset()
{
+ if( m_isRoCE == TRUE )
+ {
+ return;
+ }
+
KLOCK_QUEUE_HANDLE hdl;
IBAT_ROUTE_ENTRY* pRouteEntry;
@@ -216,6 +257,26 @@ IbatRouter::Resolve(
__out ib_path_rec_t* pPath
)
{
+ if( m_isRoCE == TRUE )
+ {
+ RtlCopyMemory( pPath, &m_path, sizeof(m_path) );
+ //
+ // Copy OUI to first 3 bytes of interface ID. OUI is the first 3 bytes of the MAC.
+ //
+ RtlCopyMemory( &pPath->dgid.raw[8], &mac, 3 );
+ pPath->dgid.raw[8] ^= 2;
+ //
+ // Fill in the middle two bytes.
+ //
+ pPath->dgid.raw[11] = 0xFF;
+ pPath->dgid.raw[12] = 0xFE;
+ //
+ // Copy the lower 3 bytes of the MAC to the last 3 bytes of the interface ID.
+ //
+ RtlCopyMemory( &pPath->dgid.raw[13], reinterpret_cast<UINT8*>(&mac) + 3, 3);
+ return STATUS_SUCCESS;
+ }
+
NTSTATUS status = STATUS_HOST_UNREACHABLE;
KLOCK_QUEUE_HANDLE hdl;
diff -dwup3 -X excl.txt -r \dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\ibat\kernel\router.h .\core\ibat\kernel\router.h
--- \dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\ibat\kernel\router.h Tue Aug 07 16:41:02 2012
+++ .\core\ibat\kernel\router.h Mon Aug 13 12:34:04 2012
@@ -44,7 +44,11 @@ struct IbatRouter
{
private:
KSPIN_LOCK m_lock;
+ union
+ {
- RTL_AVL_TABLE m_table;
+ RTL_AVL_TABLE m_table;
+ ib_path_rec_t m_path;
+ };
UINT64 m_portGuid;
BOOLEAN m_isRoCE;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ndv2.43.patch
Type: application/octet-stream
Size: 5797 bytes
Desc: ndv2.43.patch
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20130221/f1141108/attachment.obj>
More information about the ofw
mailing list