From 4d302ec9898a42288a045ebf9f98d1710eccc496 Mon Sep 17 00:00:00 2001 From: Stan Smith Date: Fri, 22 Jan 2010 23:05:49 +0000 Subject: [PATCH] [CORE] ib/mad: fix routing of vendor mads. SVN commit 2174 introduced an error that resulted in all vendor MADs being routed to the local HCA driver. This results in the ib-diag vendstat failing to receive a response when trying to gather statistics about a remote device. We should only route vendor mads to the local HCA if the mad is one of the mellanox vendor classes, the mad is not a response, and the local HCA is the destination for the mad. Simplify both the send and receive processing to be consistent in vendor mad handling. Problem reported by Mohammad Sawalha. Signed-off-by: Sean Hefty git-svn-id: svn://openib.tc.cornell.edu/gen1@2678 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- branches/WOF2-2/core/al/kernel/al_smi.c | 28 ++++++++++++++----------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/branches/WOF2-2/core/al/kernel/al_smi.c b/branches/WOF2-2/core/al/kernel/al_smi.c index 7f5abee9..5e1c7fa0 100644 --- a/branches/WOF2-2/core/al/kernel/al_smi.c +++ b/branches/WOF2-2/core/al/kernel/al_smi.c @@ -192,6 +192,10 @@ static mad_route_t route_recv_perf( IN ib_mad_element_t* p_mad_element ); +static mad_route_t +route_recv_vendor( + IN ib_mad_element_t* p_mad_element ); + ib_api_status_t forward_sm_trap( IN spl_qp_svc_t* p_spl_qp_svc, @@ -1191,20 +1195,12 @@ route_mad_send( case IB_MCLASS_PERF: case IB_MCLASS_BM: - local = ( h_av && + case IB_MLX_VENDOR_CLASS1: + case IB_MLX_VENDOR_CLASS2: + local = !(p_mad->method & IB_MAD_METHOD_RESP_MASK) && ( h_av && ( h_av->av_attr.dlid == ( h_av->av_attr.path_bits | p_spl_qp_svc->base_lid ) ) ); break; - - default: - /* Route vendor specific MADs to the HCA provider. */ - if( ib_class_is_vendor_specific( p_mad->mgmt_class ) ) - { - local = ( h_av && - ( h_av->av_attr.dlid == - ( h_av->av_attr.path_bits | p_spl_qp_svc->base_lid ) ) ); - } - break; } } @@ -2959,7 +2955,7 @@ process_mad_recv( case IB_MLX_VENDOR_CLASS1: case IB_MLX_VENDOR_CLASS2: - route = ROUTE_LOCAL; + route = route_recv_vendor( p_mad_element ); break; default: @@ -3119,6 +3115,14 @@ route_recv_perf( return ROUTE_DISPATCHER; } +static mad_route_t +route_recv_vendor( + IN ib_mad_element_t* p_mad_element ) +{ + return ( p_mad_element->p_mad_buf->method & IB_MAD_METHOD_RESP_MASK ) ? + ROUTE_DISPATCHER : ROUTE_LOCAL; +} + /* * Forward a locally generated Subnet Management trap. */ -- 2.46.0