See embedded comment below. ________________________________
From: Yevgeny Kliteynik [mailto:[EMAIL PROTECTED] 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 <[EMAIL PROTECTED]> 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) _______________________________________________ openib-general mailing list [email protected] http://openib.org/mailman/listinfo/openib-general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
