[openib-general] OpenSM: Don't return NO RECORDS status in re sponse to SA GetTable

Hal Rosenstock halr at voltaire.com
Wed Jan 19 13:15:33 PST 2005


On Wed, 2005-01-19 at 16:06, Eitan Zahavi wrote:
> 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? 

It does. It returns an RMPP'd SA GetTableResp with just the SA class
header and no records.

> Is it written somewhere?

Just what you cited.

>  I thought that for every request a response is required - unless
> there is some access violation.

A response is given. It just has a good status and no records in the
data. This is different from NO RECORDS status (for normal SA GetResp).
That's what this patch does.

-- Hal

> 
> 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
> 




More information about the general mailing list