OpenSM/osm_sa_path_record.c: Support SL in PathRecord requests based on whether or not QoS is enabled
Signed-off-by: Hal Rosenstock <[EMAIL PROTECTED]> Index: opensm/osm_sa_path_record.c =================================================================== --- opensm/osm_sa_path_record.c (revision 8507) +++ opensm/osm_sa_path_record.c (working copy) @@ -66,6 +66,7 @@ #include <opensm/osm_helper.h> #include <opensm/osm_pkey.h> #include <opensm/osm_multicast.h> +#include <opensm/osm_partition.h> #define OSM_PR_RCV_POOL_MIN_SIZE 64 #define OSM_PR_RCV_POOL_GROW_SIZE 64 @@ -164,6 +165,7 @@ __osm_pr_rcv_get_path_parms( const osm_physp_t* p_physp; const osm_physp_t* p_dest_physp; const osm_switch_t* p_sw; + const osm_prtn_t* p_prtn; const ib_port_info_t* p_pi; const cl_qmap_t* p_sw_tbl; ib_api_status_t status = IB_SUCCESS; @@ -174,6 +176,7 @@ __osm_pr_rcv_get_path_parms( uint8_t required_mtu; uint8_t required_rate; uint8_t required_pkt_life; + uint8_t sl; ib_net16_t dest_lid; OSM_LOG_ENTER( p_rcv->p_log, __osm_pr_rcv_get_path_parms ); @@ -548,7 +551,6 @@ __osm_pr_rcv_get_path_parms( p_parms->mtu = mtu; p_parms->rate = rate; p_parms->pkt_life = pkt_life; - p_parms->sl = OSM_DEFAULT_SL; if( comp_mask & IB_PR_COMPMASK_RAWTRAFFIC && cl_ntoh32( p_pr->hop_flow_raw ) & ( 1<<31 ) ) @@ -560,8 +562,9 @@ __osm_pr_rcv_get_path_parms( { osm_log( p_rcv->p_log, OSM_LOG_ERROR, "__osm_pr_rcv_get_path_parms: ERR 1F1A: " - "Ports do not share specified P_Key\n"); + "Ports do not share specified P_Key 0x%4x\n", cl_ntoh16(pkey)); status = IB_NOT_FOUND; + goto Exit; } } else @@ -573,9 +576,32 @@ __osm_pr_rcv_get_path_parms( "__osm_pr_rcv_get_path_parms: ERR 1F1B: " "Ports do not have any shared P_Keys\n"); status = IB_NOT_FOUND; + goto Exit; } } + + p_prtn = (osm_prtn_t *)cl_qmap_get(&p_rcv->p_subn->prtn_pkey_tbl, + cl_ntoh16(pkey & ~0x8000)); + if ( p_prtn == (osm_prtn_t *)cl_qmap_end(&p_rcv->p_subn->prtn_pkey_tbl) ) + { + /* this may be possible when pkey tables are created somehow in + previous runs or things are going wrong here */ + sl = OSM_DEFAULT_SL; + osm_log( p_rcv->p_log, OSM_LOG_VERBOSE, + "__osm_pr_rcv_get_path_parms: ERR 1F1C: " + "No partition found for P_Key 0x%04x - using default SL %d\n", cl_ntoh16(pkey), sl ); + } + else + sl = p_prtn->sl; + + if ( ( comp_mask & IB_PR_COMPMASK_SL ) && ib_path_rec_sl( p_pr ) != sl ) + { + status = IB_NOT_FOUND; + goto Exit; + } + p_parms->pkey = pkey; + p_parms->sl = sl; Exit: OSM_LOG_EXIT( p_rcv->p_log ); @@ -613,7 +639,7 @@ __osm_pr_rcv_build_pr( p_pr->slid = cl_hton16( src_lid_ho ); p_pr->pkey = p_parms->pkey; - p_pr->sl = p_parms->sl; + p_pr->sl = cl_hton16(p_parms->sl); p_pr->mtu = (uint8_t)(p_parms->mtu | 0x80); p_pr->rate = (uint8_t)(p_parms->rate | 0x80); @@ -987,18 +1013,6 @@ __osm_pr_rcv_get_end_points( into the endpoints. */ - if( comp_mask & IB_PR_COMPMASK_SL ) - { - if( p_pr->sl != OSM_DEFAULT_SL ) - { - if ( p_sa_mad->method == IB_MAD_METHOD_GET ) - sa_status = IB_SA_MAD_STATUS_NO_RECORDS; - *pp_src_port = 0; - *pp_dest_port = 0; - goto Exit; - } - } - if( comp_mask & IB_PR_COMPMASK_SGID ) { *pp_src_port = (osm_port_t*)cl_qmap_get( @@ -1414,7 +1428,7 @@ __osm_pr_match_mgrp_attributes( if( comp_mask & IB_PR_COMPMASK_SL ) { - if( ( p_pr->sl & 0xf ) != sl ) + if( ib_path_rec_sl( p_pr ) != sl ) goto Exit; } @@ -1422,7 +1436,7 @@ __osm_pr_match_mgrp_attributes( if( ( comp_mask & IB_PR_COMPMASK_NUMBPATH ) && ( p_sa_mad->method != IB_MAD_METHOD_GET ) ) { - if( ( p_pr->num_path & 0x7f ) == 0 ) + if( ib_path_rec_num_path( p_pr ) == 0 ) goto Exit; } _______________________________________________ openib-general mailing list openib-general@openib.org http://openib.org/mailman/listinfo/openib-general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general