[openib-general] [PATCH] osm: comparing InformInfo records

Yevgeny Kliteynik kliteyn at dev.mellanox.co.il
Sun Nov 12 05:31:04 PST 2006


Hal Rosenstock wrote:
> Hi Yevgeny,
> 
> On Mon, 2006-11-06 at 02:00, Yevgeny Kliteynik wrote:
>> Hi Hal
>>
>> [From Vu Pham]
>>   1. sending InformInfo set subscribe for trap 64,65,144 - this works;
>>      however, osm.log outputs wrong value for "subscribe" field
> 
> What code issues these subscriptions ? How was this patch tested ?

Unfortunately, we don't have this kind of test in the testbase, so 
this patch hasn't been tested.

> 
>>   2. sending InformInfo set *unsubscribe* for
>>      trap 64,65,144 - I'm using/formating the same mad as (1) except the
>>      "subscribe" field is zero; however, opensm response with status 0x200
>> [/From Vu Pham]
>>
>> 1. The received InformInfo struct was modified before dumping it.
>>    This was fixed as part of the second issue.
>> 2. The function that compares InformInfo structures was just comparing
>>    the whole memory allocated for it, including reserved fields.
>>    Fixed to compare more selectively.
>>
>> Yevgeny
>>
>> Signed-off-by:  Yevgeny Kliteynik <kliteyn at dev.mellanox.co.il>
>>
>> Index: opensm/osm_sa_informinfo.c
>> ===================================================================
>> --- opensm/osm_sa_informinfo.c	(revision 10064)
>> +++ opensm/osm_sa_informinfo.c	(working copy)
>> @@ -345,7 +345,6 @@ osm_infr_rcv_process_set_method(
>>    ib_inform_info_t *p_recvd_inform_info;
>>    osm_infr_t inform_info_rec; /* actual inform record to be stored for reports */
>>    osm_infr_t *p_infr;
>> -  uint8_t subscribe;
>>    ib_net32_t qpn;
>>    uint8_t resp_time_val;
>>    ib_api_status_t res;
>> @@ -403,19 +402,11 @@ osm_infr_rcv_process_set_method(
>>     *
>>     * QPN:
>>     * internally we keep the QPN field of the InformInfo updated
>> -   * so we can simply compare the entire record - when finding such.
>> -   * IBA spec only requires the QPN field to be filled when an unsubscribe
>> -   * Set(InformInfo) is done. See table 119 p 740 QPN field
>> -   *
>> -   * SUBSCRIBE:
>> -   * For similar reasons we change the subscribe to 0 on the
>> -   * inserted/searched data
>> +   * so we can simply compare it in the record - when finding such.
>>     */
>>  
>> -  subscribe = p_recvd_inform_info->subscribe;
>> -  if (subscribe)
>> +  if (p_recvd_inform_info->subscribe)
>>    {
>> -    inform_info_rec.inform_record.inform_info.subscribe = 0;
>>      ib_inform_info_set_qpn(
>>        &inform_info_rec.inform_record.inform_info,
>>        inform_info_rec.report_addr.addr_type.gsi.remote_qp );
>> @@ -443,7 +434,7 @@ osm_infr_rcv_process_set_method(
>>    p_infr = osm_infr_get_by_rec( p_rcv->p_subn, p_rcv->p_log, &inform_info_rec );
>>  
>>    /* check to see if the request was for subscribe = 1 */
>> -  if (subscribe)
>> +  if (p_recvd_inform_info->subscribe)
>>    {
>>      /* validate the request for a new or update InformInfo */
>>      if (__validate_infr( p_rcv, &inform_info_rec ) != TRUE)
>> @@ -480,6 +471,8 @@ osm_infr_rcv_process_set_method(
>>          goto Exit;
>>        }
>>  
>> +      /* set the subscribe bit to 0 before adding the record */
>> +      p_infr->inform_record.inform_info.subscribe = 0;
> 
> It seems odd to me to set subscribe to 0 for a subscription (rather than
> when it is an unsibscription). Aren't only subscriptions kept in the
> database ? Is this an artifact of the matching code ? If so, why not
> change that ?

You're right.
Previously the zero value was used for comparing the whole record to
the unsubscribe request (which carries 0 in the 'subscribe' field).
Now that the comparing function has been changed, no need to keep
zeroing this field.
 
>>        /* Add this new osm_infr_t object to subnet object */
>>        osm_infr_insert_to_db( p_rcv->p_subn, p_rcv->p_log, p_infr );
>>  
>> @@ -488,6 +481,8 @@ osm_infr_rcv_process_set_method(
>>      {
>>        /* Update the old instance of the osm_infr_t object */
>>        p_infr->inform_record = inform_info_rec.inform_record;
>> +      /* set the subscribe bit to 0 after updating the record */
>> +      p_infr->inform_record.inform_info.subscribe = 0;
> 
> Same as previous comment.
> 
>>      }
>>    }
>>    else
>> Index: opensm/osm_inform.c
>> ===================================================================
>> --- opensm/osm_inform.c	(revision 10064)
>> +++ opensm/osm_inform.c	(working copy)
>> @@ -206,30 +206,133 @@ __match_inf_rec(
>>    osm_infr_t* p_infr_rec = (osm_infr_t *)context;
>>    osm_infr_t* p_infr = (osm_infr_t*)p_list_item;
>>    osm_log_t *p_log =  p_infr_rec->p_infr_rcv->p_log;
>> -  cl_status_t status;
>> -  int32_t count1, count2;
>> +  cl_status_t status = CL_NOT_FOUND;
>> +  ib_gid_t all_zero_gid;
>> +
>>  
>>    OSM_LOG_ENTER( p_log, __match_inf_rec);
>>  
>> -  count1 = memcmp(&p_infr->report_addr, &p_infr_rec->report_addr,
>> -		  sizeof(p_infr_rec->report_addr));
>> -  if (count1) 
>> -    osm_log( p_log, OSM_LOG_DEBUG,
>> -	     "__match_inf_rec: "
>> -	     "Differ by Address\n" );
>> -  count2 = memcmp(
>> -    &p_infr->inform_record.inform_info,
>> -    &p_infr_rec->inform_record.inform_info,
>> -    sizeof(p_infr->inform_record.inform_info) );
>> -  if (count2) 
>> -    osm_log( p_log, OSM_LOG_DEBUG,
>> -	     "__match_inf_rec: "
>> -	     "Differ by InformInfo\n" ); 
>> -  if ((count1 == 0) && (count2 == 0))
>> -    status = CL_SUCCESS;
>> +  if ( !memcmp(&p_infr->report_addr, 
>> +               &p_infr_rec->report_addr,
>> +               sizeof(p_infr_rec->report_addr)) )
>> +  {
>> +     osm_log( p_log, OSM_LOG_DEBUG,
>> +              "__match_inf_rec: "
>> +              "Differ by Address\n" );
>> +     goto Exit;
>> +  }
>> +
>> +  memset(&all_zero_gid, 0, sizeof(ib_gid_t));
>> +
>> +  /* if inform_info.gid is not zero, ignoring lid range */
>> +  if ( !memcmp(&p_infr_rec->inform_record.inform_info.gid,
>> +               &all_zero_gid, 
>> +               sizeof(p_infr_rec->inform_record.inform_info.gid)) )
>> +  {
>> +     if ( !memcmp(&p_infr->inform_record.inform_info.gid,
>> +                  &p_infr_rec->inform_record.inform_info.gid,
>> +                  sizeof(p_infr->inform_record.inform_info.gid)) )
>> +     {
>> +        osm_log( p_log, OSM_LOG_DEBUG,
>> +                 "__match_inf_rec: "
>> +                 "Differ by InformInfo.gid\n" );
>> +        goto Exit;
>> +     }
>> +  }
>>    else
>> -    status = CL_NOT_FOUND;
>> +  {
>> +     if ( (p_infr->inform_record.inform_info.lid_range_begin !=
>> +           p_infr_rec->inform_record.inform_info.lid_range_begin) ||
>> +          (p_infr->inform_record.inform_info.lid_range_end !=
>> +           p_infr_rec->inform_record.inform_info.lid_range_end) )
>> +     {
>> +        osm_log( p_log, OSM_LOG_DEBUG,
>> +                 "__match_inf_rec: "
>> +                 "Differ by InformInfo.LIDRange\n" );
>> +        goto Exit;
>> +     }
>> +  }
>> +
>> +  if ( p_infr->inform_record.inform_info.is_generic !=
>> +       p_infr_rec->inform_record.inform_info.is_generic )
>> +  {   
>> +     osm_log( p_log, OSM_LOG_DEBUG,
>> +              "__match_inf_rec: "
>> +              "Differ by InformInfo.IsGeneric\n" );
>> +     goto Exit;
>> +  }
>>  
>> +  if ( p_infr->inform_record.inform_info.trap_type !=
>> +       p_infr_rec->inform_record.inform_info.trap_type )
>> +  {
>> +     osm_log( p_log, OSM_LOG_DEBUG,
>> +              "__match_inf_rec: "
>> +              "Differ by InformInfo.TrapType\n" );
>> +     goto Exit;
>> +  }
>> +
>> +  if ( p_infr->inform_record.inform_info.is_generic != 
>> +       p_infr_rec->inform_record.inform_info.is_generic )
>> +  {     
>> +     osm_log( p_log, OSM_LOG_DEBUG,
>> +              "__match_inf_rec: "
>> +              "Differ by InformInfo.IsGeneric\n" );
>> +  }
> 
> This appears to be a duplicate of what was added shortly earlier in this
> patch.

Right, good catch.
I'll send a V2 of this patch shortly.

-- Yevgeny
 
> -- Hal
> 
>> +  else if (p_infr->inform_record.inform_info.is_generic) 
>> +  {
>> +     if ( p_infr->inform_record.inform_info.g_or_v.generic.trap_num != 
>> +          p_infr_rec->inform_record.inform_info.g_or_v.generic.trap_num )
>> +     {
>> +        osm_log( p_log, OSM_LOG_DEBUG,
>> +                 "__match_inf_rec: "
>> +                 "Differ by InformInfo.Generic.TrapNumber\n" );
>> +        goto Exit;
>> +     }
>> +     else if ( p_infr->inform_record.inform_info.g_or_v.generic.qpn_resp_time_val != 
>> +               p_infr_rec->inform_record.inform_info.g_or_v.generic.qpn_resp_time_val )
>> +        osm_log( p_log, OSM_LOG_DEBUG,
>> +                 "__match_inf_rec: "
>> +                 "Differ by InformInfo.Generic.QPNRespTimeVal\n" );
>> +     else if ( p_infr->inform_record.inform_info.g_or_v.generic.node_type_msb != 
>> +               p_infr_rec->inform_record.inform_info.g_or_v.generic.node_type_msb )
>> +        osm_log( p_log, OSM_LOG_DEBUG,
>> +                 "__match_inf_rec: "
>> +                 "Differ by InformInfo.Generic.NodeTypeMSB\n" );
>> +     else if ( p_infr->inform_record.inform_info.g_or_v.generic.node_type_lsb != 
>> +               p_infr_rec->inform_record.inform_info.g_or_v.generic.node_type_lsb )
>> +        osm_log( p_log, OSM_LOG_DEBUG,
>> +                 "__match_inf_rec: "
>> +                 "Differ by InformInfo.Generic.NodeTypeLSB\n" );
>> +     else
>> +           status = CL_SUCCESS;
>> +  }
>> +  else
>> +  {
>> +     if ( p_infr->inform_record.inform_info.g_or_v.vend.dev_id != 
>> +          p_infr_rec->inform_record.inform_info.g_or_v.vend.dev_id )
>> +        osm_log( p_log, OSM_LOG_DEBUG,
>> +                 "__match_inf_rec: "
>> +                 "Differ by InformInfo.Vendor.DeviceID\n" );
>> +     else if ( p_infr->inform_record.inform_info.g_or_v.vend.qpn_resp_time_val != 
>> +               p_infr_rec->inform_record.inform_info.g_or_v.vend.qpn_resp_time_val )
>> +        osm_log( p_log, OSM_LOG_DEBUG,
>> +                 "__match_inf_rec: "
>> +                 "Differ by InformInfo.Vendor.QPNRespTimeVal\n" );
>> +     else if ( p_infr->inform_record.inform_info.g_or_v.vend.vendor_id_msb != 
>> +               p_infr_rec->inform_record.inform_info.g_or_v.vend.vendor_id_msb )
>> +        osm_log( p_log, OSM_LOG_DEBUG,
>> +                 "__match_inf_rec: "
>> +                 "Differ by InformInfo.Vendor.VendorIdMSB\n" );
>> +     else if ( p_infr->inform_record.inform_info.g_or_v.vend.vendor_id_lsb !=
>> +               p_infr_rec->inform_record.inform_info.g_or_v.vend.vendor_id_lsb )
>> +        osm_log( p_log, OSM_LOG_DEBUG,
>> +                 "__match_inf_rec: "
>> +                 "Differ by InformInfo.Vendor.VendorIdLSB\n" );
>> +     else
>> +        status = CL_SUCCESS;
>> +  }
>> +
>> + Exit:
>>    OSM_LOG_EXIT( p_log );
>>    return status;
>>  }
>>
> 





More information about the general mailing list