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

Hal Rosenstock halr at voltaire.com
Mon Nov 13 06:09:51 PST 2006


See embedded comment below.

________________________________

From: Yevgeny Kliteynik [mailto:kliteyn at dev.mellanox.co.il]
Sent: Sun 11/12/2006 8:42 AM
To: Hal Rosenstock; OPENIB
Subject: [PATCH v2] osm: comparing InformInfo records



Hi Hal

Here's the fixed InformInfo patch

Yevgeny

Signed-off-by:  Yevgeny Kliteynik <kliteyn at dev.mellanox.co.il>
Index: opensm/osm_inform.c
===================================================================
--- opensm/osm_inform.c (revision 10100)
+++ opensm/osm_inform.c (working copy)
@@ -206,30 +206,123 @@ __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
+  {
+     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.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" );
+  }
+  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 )

<hnr> Isn't QPN supposed to be ignored on an unsubscribe request ? </hnr>

+        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
-    status = CL_NOT_FOUND;
+  {
+     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;
 }
Index: opensm/osm_sa_informinfo.c
===================================================================
--- opensm/osm_sa_informinfo.c  (revision 10100)
+++ 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)






More information about the general mailing list