[openib-general] OpenSM: Don't return NO RECORDS status in re sponse to SA GetTable
Eitan Zahavi
eitan at mellanox.co.il
Wed Jan 19 13:06:19 PST 2005
Hi Hal,
You wrote:
" OpenSM: Don't return NO RECORDS status in response to SA GetTable"
I did find the following section in the table describing MAD errors:
No records match query. May be returned only by a SubnAdmGetResp().
Never returned for an RMPP response because an
RMPP transaction with a payload length of zero is a valid transaction.
However, isn't the SA supposed to return something in return to a request?
Is it written somewhere? I thought that for every request a response is
required - unless there is some access violation.
Eitan Zahavi
Design Technology Director
Mellanox Technologies LTD
Tel:+972-4-9097208
Fax:+972-4-9593245
P.O. Box 586 Yokneam 20692 ISRAEL
-----Original Message-----
From: Hal Rosenstock [mailto:halr at voltaire.com]
Sent: Wednesday, January 19, 2005 6:03 PM
To: openib-general at openib.org
Subject: [openib-general] OpenSM: Don't return NO RECORDS status in response
to SA GetTable
OpenSM: Don't return NO RECORDS status in response to SA GetTable
Index: osm_sa_vlarb_record.c
===================================================================
--- osm_sa_vlarb_record.c (revision 1582)
+++ osm_sa_vlarb_record.c (working copy)
@@ -509,7 +509,7 @@
"osm_vlarb_rec_rcv_process: "
"Returning %u records.\n", num_rec );
- if( num_rec == 0 )
+ if ((p_rcvd_mad->method == IB_MAD_METHOD_GET) && (num_rec == 0))
{
osm_sa_send_error( p_rcv->p_resp, p_madw,
IB_SA_MAD_STATUS_NO_RECORDS );
@@ -603,4 +603,3 @@
Exit:
OSM_LOG_EXIT( p_rcv->p_log );
}
-
Index: osm_sa_lft_record.c
===================================================================
--- osm_sa_lft_record.c (revision 1582)
+++ osm_sa_lft_record.c (working copy)
@@ -453,7 +453,8 @@
"osm_lftr_rcv_process: "
"Returning %u records.\n", num_rec );
- if( num_rec == 0 )
+ if ((p_rcvd_mad->method != IB_MAD_METHOD_GETTABLE) &&
+ (num_rec == 0))
{
osm_sa_send_error( p_rcv->p_resp, p_madw,
IB_SA_MAD_STATUS_NO_RECORDS );
Index: osm_sa_service_record.c
===================================================================
--- osm_sa_service_record.c (revision 1582)
+++ osm_sa_service_record.c (working copy)
@@ -391,7 +391,6 @@
goto Exit;
}
-
trim_num_rec = 0;
#ifndef VENDOR_RMPP_SUPPORT
trim_num_rec = (MAD_BLOCK_SIZE - IB_SA_MAD_HDR_SIZE) /
sizeof(ib_service_record_t);
@@ -468,7 +467,8 @@
p_resp_sr = (ib_service_record_t*)ib_sa_mad_get_payload_ptr(
p_resp_sa_mad );
- if( num_rec == 0 )
+ if( (p_resp_sa_mad->method != IB_MAD_METHOD_GETTABLE_RESP) &&
+ (num_rec == 0))
{
p_resp_sa_mad->status = IB_SA_MAD_STATUS_NO_RECORDS;
cl_memclr( p_resp_sr, sizeof(*p_resp_sr) );
@@ -835,7 +835,6 @@
p_recvd_service_rec =
(ib_service_record_t*)ib_sa_mad_get_payload_ptr( p_sa_mad );
-
cl_qlist_init(&sr_match_item.sr_list);
sr_match_item.p_service_rec = p_recvd_service_rec;
sr_match_item.comp_mask = p_sa_mad->comp_mask;
@@ -851,7 +850,8 @@
__get_matching_sr,
&context);
- if( cl_qlist_count( &sr_match_item.sr_list ) == 0 )
+ if ((p_sa_mad->method == IB_MAD_METHOD_GET) &&
+ (cl_qlist_count( &sr_match_item.sr_list ) == 0))
{
cl_plock_release(p_rcv->p_lock);
Index: osm_sa_portinfo_record.c
===================================================================
--- osm_sa_portinfo_record.c (revision 1582)
+++ osm_sa_portinfo_record.c (working copy)
@@ -719,7 +719,7 @@
"osm_pir_rcv_process: "
"Returning %u records.\n", num_rec );
- if( num_rec == 0 )
+ if ((p_rcvd_mad->method == IB_MAD_METHOD_GET) && (num_rec == 0))
{
osm_sa_send_error( p_rcv->p_resp, p_madw,
IB_SA_MAD_STATUS_NO_RECORDS );
Index: osm_sa_pkey_record.c
===================================================================
--- osm_sa_pkey_record.c (revision 1582)
+++ osm_sa_pkey_record.c (working copy)
@@ -365,7 +365,6 @@
cl_qlist_init( &rec_list );
-
context.p_rcvd_rec = p_rcvd_rec;
context.p_list = &rec_list;
context.comp_mask = p_rcvd_mad->comp_mask;
@@ -457,7 +456,7 @@
"osm_pkey_rec_rcv_process: "
"Returning %u records.\n", num_rec );
- if( num_rec == 0 )
+ if((p_rcvd_mad->method == IB_MAD_METHOD_GET) && (num_rec == 0))
{
osm_sa_send_error( p_rcv->p_resp, p_madw,
IB_SA_MAD_STATUS_NO_RECORDS );
Index: osm_sa_slvl_record.c
===================================================================
--- osm_sa_slvl_record.c (revision 1582)
+++ osm_sa_slvl_record.c (working copy)
@@ -485,7 +485,7 @@
"osm_slvl_rec_rcv_process: "
"Returning %u records.\n", num_rec );
- if( num_rec == 0 )
+ if ((p_rcvd_mad->method == IB_MAD_METHOD_GET) && (num_rec == 0))
{
osm_sa_send_error( p_rcv->p_resp, p_madw,
IB_SA_MAD_STATUS_NO_RECORDS );
Index: osm_sa_node_record.c
===================================================================
--- osm_sa_node_record.c (revision 1582)
+++ osm_sa_node_record.c (working copy)
@@ -557,7 +557,7 @@
"osm_nr_rcv_process: "
"Returning %u records.\n", num_rec );
- if( num_rec == 0 )
+ if ((p_rcvd_mad->method == IB_MAD_METHOD_GET) && (num_rec == 0))
{
osm_sa_send_error( p_rcv->p_resp, p_madw,
IB_SA_MAD_STATUS_NO_RECORDS );
Index: osm_sa_link_record.c
===================================================================
--- osm_sa_link_record.c (revision 1582)
+++ osm_sa_link_record.c (working copy)
@@ -130,7 +130,6 @@
OSM_LOG_EXIT( p_rcv->p_log );
}
-
/**********************************************************************
**********************************************************************/
ib_api_status_t
@@ -284,7 +283,6 @@
}
-
}
else
{
@@ -386,8 +384,6 @@
OSM_LOG_EXIT( p_rcv->p_log );
}
-
-
/**********************************************************************
**********************************************************************/
static void
@@ -524,8 +520,6 @@
OSM_LOG_EXIT( p_rcv->p_log );
}
-
-
/**********************************************************************
Returns the SA status to return to the client.
**********************************************************************/
@@ -552,6 +546,8 @@
p_lr = (ib_link_record_t*)ib_sa_mad_get_payload_ptr( p_sa_mad );
comp_mask = p_sa_mad->comp_mask;
+ *pp_src_port = NULL;
+ *pp_dest_port = NULL;
if( p_sa_mad->comp_mask & IB_LR_COMPMASK_FROM_LID )
{
@@ -559,10 +555,11 @@
cl_ntoh16(p_lr->from_lid),
(void**)pp_src_port );
- if( (status != CL_SUCCESS) || (*pp_src_port == NULL) )
+ if( ( (status != CL_SUCCESS) || (*pp_src_port == NULL) ) &&
+ (p_sa_mad->method == IB_MAD_METHOD_GET) )
{
/*
- This 'error' is a the client's fault (bad gid) so
+ This 'error' is the client's fault (bad lid) so
don't enter it as an error in our own log.
Return an error response to the client.
*/
@@ -582,10 +579,11 @@
cl_ntoh16(p_lr->to_lid),
(void**)pp_dest_port );
- if( (status != CL_SUCCESS) || (*pp_dest_port == NULL) )
+ if( ( (status != CL_SUCCESS) || (*pp_dest_port == NULL) ) &&
+ (p_sa_mad->method == IB_MAD_METHOD_GET) )
{
/*
- This 'error' is a the client's fault (bad gid) so
+ This 'error' is the client's fault (bad lid) so
don't enter it as an error in our own log.
Return an error response to the client.
*/
@@ -604,7 +602,6 @@
return( sa_status );
}
-
/**********************************************************************
**********************************************************************/
static void
@@ -703,7 +700,6 @@
/* C15-0.1.5 - always return SM_Key = 0 (table 151 p 782) */
p_resp_sa_mad->sm_key = 0;
-
#ifndef VENDOR_RMPP_SUPPORT
/* we support only one packet RMPP - so we will set the first and
last flags for gettable */
@@ -720,7 +716,7 @@
p_resp_lr = (ib_link_record_t*)ib_sa_mad_get_payload_ptr(
p_resp_sa_mad );
- if( num_rec == 0 )
+ if ((p_rcvd_mad->method == IB_MAD_METHOD_GET) && (num_rec == 0))
{
p_resp_sa_mad->status = IB_SA_MAD_STATUS_NO_RECORDS;
cl_memclr( p_resp_lr, sizeof(*p_resp_lr) );
@@ -762,7 +758,6 @@
OSM_LOG_EXIT( p_rcv->p_log );
}
-
/**********************************************************************
**********************************************************************/
void
@@ -810,7 +805,6 @@
goto Exit;
}
-
if( osm_log_is_active( p_rcv->p_log, OSM_LOG_DEBUG ) )
osm_dump_link_record( p_rcv->p_log, p_lr, OSM_LOG_DEBUG );
@@ -837,7 +831,8 @@
cl_plock_release( p_rcv->p_lock );
- if( cl_qlist_count( &lr_list ) == 0 )
+ if( (cl_qlist_count( &lr_list ) == 0) &&
+ (p_sa_mad->method == IB_MAD_METHOD_GET) )
{
osm_sa_send_error( p_rcv->p_resp, p_madw,
IB_SA_MAD_STATUS_NO_RECORDS );
Index: osm_sa_mcmember_record.c
===================================================================
--- osm_sa_mcmember_record.c (revision 1582)
+++ osm_sa_mcmember_record.c (working copy)
@@ -1678,16 +1678,16 @@
"osm_mcmr_query_mgrp: "
"Returning %u records.\n", num_rec );
- if( num_rec == 0 )
+ if ((p_rcvd_mad->method == IB_MAD_METHOD_GET) && (num_rec == 0))
{
osm_sa_send_error( p_rcv->p_resp, p_madw,
IB_SA_MAD_STATUS_NO_RECORDS );
goto Exit;
}
- /* */
- /* Get a MAD to reply. Address of Mad is in the received mad_wrapper
*/
- /* */
+ /*
+ * Get a MAD to reply. Address of Mad is in the received mad_wrapper
+ */
p_resp_madw = osm_mad_pool_get( p_rcv->p_mad_pool,
p_madw->h_bind,
num_rec * sizeof(ib_member_rec_t) +
IB_SA_MAD_HDR_SIZE,
Index: osm_sa_path_record.c
===================================================================
--- osm_sa_path_record.c (revision 1582)
+++ osm_sa_path_record.c (working copy)
@@ -941,7 +941,8 @@
if( comp_mask & IB_PR_COMPMASK_PKEY )
{
- if( p_pr->pkey != IB_DEFAULT_PKEY )
+ if ( (p_pr->pkey != IB_DEFAULT_PKEY) &&
+ (p_sa_mad->method == IB_MAD_METHOD_GET) )
{
sa_status = IB_SA_MAD_STATUS_NO_RECORDS;
goto Exit;
@@ -950,7 +951,8 @@
if( comp_mask & IB_PR_COMPMASK_SL )
{
- if( p_pr->sl != OSM_DEFAULT_SL )
+ if( (p_pr->sl != OSM_DEFAULT_SL) &&
+ (p_sa_mad->method == IB_MAD_METHOD_GET) )
{
sa_status = IB_SA_MAD_STATUS_NO_RECORDS;
goto Exit;
@@ -982,15 +984,17 @@
}
else
{
+ *pp_src_port = 0;
if( p_sa_mad->comp_mask & IB_PR_COMPMASK_SLID )
{
status = cl_ptr_vector_at( &p_rcv->p_subn->port_lid_tbl,
cl_ntoh16(p_pr->slid),
(void**)pp_src_port );
- if( (status != CL_SUCCESS) || (*pp_src_port == NULL) )
+ if( ( (status != CL_SUCCESS) || (*pp_src_port == NULL) ) &&
+ (p_sa_mad->method == IB_MAD_METHOD_GET) )
{
/*
- This 'error' is a the client's fault (bad lid) so
+ This 'error' is the client's fault (bad lid) so
don't enter it as an error in our own log.
Return an error response to the client.
*/
@@ -1002,15 +1006,7 @@
sa_status = IB_SA_MAD_STATUS_NO_RECORDS;
goto Exit;
}
-
}
- else
- {
- /*
- No source information specified.
- */
- *pp_src_port = 0;
- }
}
if( p_sa_mad->comp_mask & IB_PR_COMPMASK_DGID )
@@ -1023,7 +1019,7 @@
&p_rcv->p_subn->port_guid_tbl ) )
{
/*
- This 'error' is a the client's fault (bad gid) so
+ This 'error' is the client's fault (bad gid) so
don't enter it as an error in our own log.
Return an error response to the client.
*/
@@ -1038,15 +1034,17 @@
}
else
{
+ *pp_dest_port = 0;
if( p_sa_mad->comp_mask & IB_PR_COMPMASK_DLID )
{
status = cl_ptr_vector_at( &p_rcv->p_subn->port_lid_tbl,
cl_ntoh16(p_pr->dlid),
(void**)pp_dest_port );
- if( (status != CL_SUCCESS) || (*pp_dest_port == NULL) )
+ if( ( (status != CL_SUCCESS) || (*pp_dest_port == NULL) ) &&
+ (p_sa_mad->method == IB_MAD_METHOD_GET) )
{
/*
- This 'error' is a the client's fault (bad gid) so
+ This 'error' is the client's fault (bad lid) so
don't enter it as an error in our own log.
Return an error response to the client.
*/
@@ -1058,15 +1056,7 @@
sa_status = IB_SA_MAD_STATUS_NO_RECORDS;
goto Exit;
}
-
}
- else
- {
- /*
- No destination information specified.
- */
- *pp_dest_port = 0;
- }
}
Exit:
@@ -1118,7 +1108,6 @@
OSM_LOG_EXIT( p_rcv->p_log );
}
-
/**********************************************************************
**********************************************************************/
static void
@@ -1193,7 +1182,6 @@
OSM_LOG_EXIT( p_rcv->p_log );
}
-
/**********************************************************************
**********************************************************************/
static void
@@ -1260,7 +1248,7 @@
"Generating response with %u records.\n", num_rec );
}
- if( num_rec == 0 )
+ if ((p_rcvd_mad->method == IB_MAD_METHOD_GET) && (num_rec == 0))
{
osm_sa_send_error( p_rcv->p_resp, p_madw,
IB_SA_MAD_STATUS_NO_RECORDS );
@@ -1307,9 +1295,10 @@
p_resp_pr = (ib_path_rec_t*)ib_sa_mad_get_payload_ptr( p_resp_sa_mad
);
- if( num_rec == 0 )
+ if ( num_rec == 0 )
{
- p_resp_sa_mad->status = IB_SA_MAD_STATUS_NO_RECORDS;
+ if (p_resp_sa_mad->method == IB_MAD_METHOD_GET_RESP)
+ p_resp_sa_mad->status = IB_SA_MAD_STATUS_NO_RECORDS;
cl_memclr( p_resp_pr, sizeof(*p_resp_pr) );
}
else
_______________________________________________
openib-general mailing list
openib-general at openib.org
http://openib.org/mailman/listinfo/openib-general
To unsubscribe, please visit
http://openib.org/mailman/listinfo/openib-general
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/general/attachments/20050119/80530f01/attachment.html>
More information about the general
mailing list