[ofw] [PATCH] Make WSD use new IBAT library
Leonid Keller
leonid at mellanox.co.il
Thu Jul 3 01:43:10 PDT 2008
Applied in 1332. Thank you.
> -----Original Message-----
> From: ofw-bounces at lists.openfabrics.org
> [mailto:ofw-bounces at lists.openfabrics.org] On Behalf Of Fab Tillier
> Sent: Wednesday, July 02, 2008 10:01 PM
> To: ofw at lists.openfabrics.org
> Subject: [ofw] [PATCH] Make WSD use new IBAT library
>
> This patch obviously depends on the IBAT library patch.
>
> It removes the dependency of WSD on DAPL ATS, and reduces
> connection establishment SA queries from 2 (ATS query + PR
> query) to 1 (PR query).
>
> Signed-off-by: Fab Tillier <ftillier at microsoft.com>
>
> diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id:
> old\ulp\wsd\user\ibsp_duplicate.c trunk\ulp\wsd\user\ibsp_duplicate.c
> --- old\ulp\wsd\user\ibsp_duplicate.c Thu Jun 26 20:35:13 2008
> +++ trunk\ulp\wsd\user\ibsp_duplicate.c Wed Jul 02 11:57:30 2008
> @@ -104,8 +104,10 @@ setup_duplicate_socket(
> }
>
> /* Get the GUID for the remote IP address. */
> - ret = query_guid_address( socket_info->port,
> - socket_info->peer_addr.sin_addr.S_un.S_addr,
> &dest_port_guid );
> + ret = query_guid_address(
> + (struct sockaddr*)&socket_info->local_addr,
> + (struct sockaddr*)&socket_info->peer_addr,
> + &dest_port_guid );
> if( ret )
> {
> IBSP_ERROR( ("query_guid_address failed for
> IP %08x\n", diff -up -N -r -X trunk\docs\dontdiff.txt -I
> \$Id: old\ulp\wsd\user\ibsp_ip.c trunk\ulp\wsd\user\ibsp_ip.c
> --- old\ulp\wsd\user\ibsp_ip.c Mon Jun 30 11:07:49 2008
> +++ trunk\ulp\wsd\user\ibsp_ip.c Wed Jul 02 11:57:30 2008
> @@ -43,6 +43,7 @@
> #endif
>
> #include "ibspdll.h"
> +#include "iba/ibat.h"
>
>
> /*------------------------------------------------------------
> --------------*/
>
> @@ -257,123 +258,42 @@ update_ip_addresses(
>
>
> /*------------------------------------------------------------
> --------------*/
>
> -/*
> - * Query a GUID from an IP address
> - */
> -
> -struct query_guid_context
> -{
> - ib_api_status_t status;
> - ib_net64_t guid;
> -};
> -
> -static void AL_API
> -query_guid_callback(
> - ib_query_rec_t
> *p_query_rec )
> -{
> - struct query_guid_context *query_context =
> - (struct query_guid_context
> *)p_query_rec->query_context;
> - ib_service_record_t *service_record;
> -
> - IBSP_ENTER( IBSP_DBG_HW );
> - IBSP_PRINT(TRACE_LEVEL_INFORMATION, IBSP_DBG_HW,
> - ("status is %d, count is %d\n", p_query_rec->status,
> - p_query_rec->result_cnt) );
> -
> - if( p_query_rec->status == IB_SUCCESS &&
> p_query_rec->result_cnt )
> - {
> - query_context->status = IB_SUCCESS;
> -
> - service_record = ib_get_query_svc_rec(
> p_query_rec->p_result_mad, 0 );
> -
> - CL_ASSERT( service_record != NULL );
> -
> - query_context->guid = ib_gid_get_guid(
> &service_record->service_gid );
> - }
> - else
> - {
> - query_context->status = IB_ERROR;
> - }
> -
> - if( p_query_rec->p_result_mad )
> - ib_put_mad( p_query_rec->p_result_mad );
> -
> - IBSP_EXIT( IBSP_DBG_HW );
> -}
> -
>
> /* Synchronously query the SA for a GUID. Return 0 on
> success. */ int query_guid_address(
> - IN struct ibsp_port
> *port,
> - IN ib_net32_t
> ip_addr,
> + IN const struct sockaddr
> *p_src_addr,
> + IN const struct sockaddr
> *p_dest_addr,
> OUT ib_net64_t
> *port_guid )
> {
> - ib_user_query_t user_query;
> - struct query_guid_context query_context;
> - ib_service_record_t service_record;
> - ib_query_handle_t query_handle;
> - ib_query_req_t query_req;
> - ib_api_status_t status;
> + ib_gid_pair_t gids;
> + uint16_t pkey;
> + HRESULT hr;
>
> IBSP_ENTER( IBSP_DBG_HW );
>
> - query_req.query_type = IB_QUERY_USER_DEFINED;
> - query_req.p_query_input = &user_query;
> - query_req.port_guid = port->guid;
> - query_req.timeout_ms = g_sa_timeout;
> - query_req.retry_cnt = g_sa_retries;
> - query_req.flags = IB_FLAGS_SYNC;
> - query_req.query_context = &query_context;
> - query_req.pfn_query_cb = query_guid_callback;
> -
> - /* TODO: which method one is correct? */
> - user_query.method = IB_MAD_METHOD_GETTABLE;
> - //user_query.method = IB_MAD_METHOD_GET;
> - user_query.attr_id = IB_MAD_ATTR_SERVICE_RECORD;
> - user_query.attr_size = sizeof(ib_service_record_t);
> - user_query.comp_mask =
> - IB_SR_COMPMASK_SPKEY |
> - IB_SR_COMPMASK_SLEASE |
> - IB_SR_COMPMASK_SNAME |
> - IB_SR_COMPMASK_SDATA8_12 |
> - IB_SR_COMPMASK_SDATA8_13 |
> IB_SR_COMPMASK_SDATA8_14 | IB_SR_COMPMASK_SDATA8_15;
> -
> - user_query.p_attr = &service_record;
> -
> - memset( &service_record, 0, sizeof(service_record) );
> - service_record.service_pkey = cl_hton16( IB_DEFAULT_PKEY );
> - service_record.service_data8[12] = (uint8_t) (ip_addr >> 0);
> - service_record.service_data8[13] = (uint8_t) (ip_addr >> 8);
> - service_record.service_data8[14] = (uint8_t) (ip_addr >> 16);
> - service_record.service_data8[15] = (uint8_t) (ip_addr >> 24);
> - service_record.service_lease = 0xFFFFFFFF;
> - strcpy( (void*)service_record.service_name, ATS_NAME );
> -
> - status = ib_query( g_ibsp.al_handle, &query_req,
> &query_handle );
> -
> - if( status != IB_SUCCESS )
> + for(;;)
> {
> - IBSP_ERROR( ("ib_query failed (%d)\n", status) );
> - goto error;
> - }
> + hr = IbatResolve(
> + p_src_addr,
> + p_dest_addr,
> + (IN6_ADDR*)&gids.src_gid,
> + (IN6_ADDR*)&gids.dest_gid,
> + &pkey
> + );
>
> - if( query_context.status != IB_SUCCESS )
> - {
> - IBSP_PRINT(TRACE_LEVEL_INFORMATION, IBSP_DBG_HW,
> - ("query success, but no GUID for IP
> address %x (query status %d)\n",
> - ip_addr, query_context.status) );
> - goto error;
> - }
> + if( hr != E_PENDING )
> + break;
>
> - *port_guid = query_context.guid;
> + Sleep( 100 );
> + }
> + if( hr == S_OK )
> + *port_guid = gids.dest_gid.unicast.interface_id;
>
> - IBSP_EXIT( IBSP_DBG_HW );
> - return 0;
> + IBSP_ERROR( ("IBAT::Resolve failed for IP %08x\n",
> + ((struct
> sockaddr_in*)p_dest_addr)->sin_addr.s_addr) );
>
> -error:
> - IBSP_ERROR_EXIT( ("query_ip_address failed\n") );
> - return 1;
> + return hr;
> }
>
>
> /*------------------------------------------------------------
> --------------*/
> diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id:
> old\ulp\wsd\user\ibspdll.c trunk\ulp\wsd\user\ibspdll.c
> --- old\ulp\wsd\user\ibspdll.c Mon Jun 30 11:07:49 2008
> +++ trunk\ulp\wsd\user\ibspdll.c Wed Jul 02 11:57:30 2008
> @@ -854,7 +854,8 @@ IBSPConnect(
> }
>
> /* Get the GUID for that IP address. */
> - ret = query_guid_address( socket_info->port,
> addr->sin_addr.s_addr, &dest_port_guid );
> + ret = query_guid_address(
> + (struct sockaddr*)&socket_info->local_addr, name,
> + &dest_port_guid );
> if( ret )
> {
> IBSP_ERROR_EXIT( ("query_guid_address failed
> for IP %08x\n", diff -up -N -r -X trunk\docs\dontdiff.txt -I
> \$Id: old\ulp\wsd\user\ibspproto.h trunk\ulp\wsd\user\ibspproto.h
> --- old\ulp\wsd\user\ibspproto.h Mon Jun 30 11:07:49 2008
> +++ trunk\ulp\wsd\user\ibspproto.h Wed Jul 02 11:57:30 2008
> @@ -159,8 +159,8 @@ ip_cmp(
>
> int
> query_guid_address(
> - IN struct ibsp_port
> *port,
> - IN ib_net32_t
> ip_addr,
> + IN const struct sockaddr
> *p_src_addr,
> + IN const struct sockaddr
> *p_dest_addr,
> OUT ib_net64_t
> *port_guid );
>
> int
> diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id:
> old\ulp\wsd\user\SOURCES trunk\ulp\wsd\user\SOURCES
> --- old\ulp\wsd\user\SOURCES Thu Jun 26 20:35:13 2008
> +++ trunk\ulp\wsd\user\SOURCES Wed Jul 02 11:57:30 2008
> @@ -32,10 +32,12 @@ USER_C_FLAGS=$(USER_C_FLAGS) -DCL_NO_TRA
>
> TARGETLIBS=\
> $(SDK_LIB_PATH)\kernel32.lib \
> + $(SDK_LIB_PATH)\Advapi32.lib \
> $(SDK_LIB_PATH)\ws2_32.lib \
> + $(SDK_LIB_PATH)\iphlpapi.lib \
> $(SDK_LIB_PATH)\rpcrt4.lib \
> - $(SDK_LIB_PATH)\Advapi32.lib \
> $(SDK_LIB_PATH)\LoadPerf.lib \
> + $(TARGETPATH)\*\ibat.lib \
> !if $(FREEBUILD)
> $(TARGETPATH)\*\complib.lib \
> $(TARGETPATH)\*\ibal.lib
>
More information about the ofw
mailing list