ib/mad: fix routing of vendor mads
[mirror/winof/.git] / core / al / kernel / al_smi.c
index 7f5abee..5e1c7fa 100644 (file)
@@ -192,6 +192,10 @@ static mad_route_t
 route_recv_perf(\r
        IN                              ib_mad_element_t*                       p_mad_element );\r
 \r
+static mad_route_t\r
+route_recv_vendor(\r
+       IN                              ib_mad_element_t*                       p_mad_element );\r
+\r
 ib_api_status_t\r
 forward_sm_trap(\r
        IN                              spl_qp_svc_t*                           p_spl_qp_svc,\r
@@ -1191,20 +1195,12 @@ route_mad_send(
 \r
                case IB_MCLASS_PERF:\r
                case IB_MCLASS_BM:\r
-                       local = ( h_av &&\r
+               case IB_MLX_VENDOR_CLASS1:\r
+               case IB_MLX_VENDOR_CLASS2:\r
+                       local = !(p_mad->method & IB_MAD_METHOD_RESP_MASK) && ( h_av &&\r
                                ( h_av->av_attr.dlid ==\r
                                ( h_av->av_attr.path_bits | p_spl_qp_svc->base_lid ) ) );\r
                        break;\r
-\r
-               default:\r
-                       /* Route vendor specific MADs to the HCA provider. */\r
-                       if( ib_class_is_vendor_specific( p_mad->mgmt_class ) )\r
-                       {\r
-                               local = ( h_av &&\r
-                                       ( h_av->av_attr.dlid ==\r
-                                       ( h_av->av_attr.path_bits | p_spl_qp_svc->base_lid ) ) );\r
-                       }\r
-                       break;\r
                }\r
        }\r
 \r
@@ -2959,7 +2955,7 @@ process_mad_recv(
 \r
                case IB_MLX_VENDOR_CLASS1:\r
                case IB_MLX_VENDOR_CLASS2:\r
-                       route = ROUTE_LOCAL;\r
+                       route = route_recv_vendor( p_mad_element );\r
                        break;\r
 \r
                default:\r
@@ -3119,6 +3115,14 @@ route_recv_perf(
        return ROUTE_DISPATCHER;\r
 }\r
 \r
+static mad_route_t\r
+route_recv_vendor(\r
+       IN                              ib_mad_element_t*                       p_mad_element )\r
+{\r
+       return ( p_mad_element->p_mad_buf->method & IB_MAD_METHOD_RESP_MASK ) ?\r
+               ROUTE_DISPATCHER : ROUTE_LOCAL;\r
+}\r
+\r
 /*\r
  * Forward a locally generated Subnet Management trap.\r
  */\r