Could you elaborate on removing IB_MCLASS_SUBN_ADM and some other management classes and on the changes in GMP handling ? TIA
> -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of Sean Hefty > Sent: Friday, May 08, 2009 9:33 PM > To: Hefty, Sean; [email protected] > Subject: [ofw] [PATCH 4/4] MAD: fix issues routing vendor MADs > > Only dispatch received vendor defined MADs to the HCA driver > if the management class is one of the MLX vendor defined classes. > > When dispatching MADs locally that are not handled by the HCA > driver, copy the sent MAD data into the received MAD buffer. > Also initialize the address information of the dispatched > MAD, so that replies can be routed correctly back to the > sender. If a MAD is not handled by the HCA driver and cannot > be dispatched, return the MAD to the MAD pool to avoid leaking MADs. > > Finally, we simplify the MAD dispatch code. > > Signed-off-by: Sean Hefty <[email protected]> > --- > diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I > '\$Id:' trunk\core\al/al_mad.c branches\winverbs\core\al/al_mad.c > --- trunk\core\al/al_mad.c 2009-01-26 09:34:31.125875000 -0800 > +++ branches\winverbs\core\al/al_mad.c 2009-05-07 > 10:27:30.082632500 -0700 > @@ -1027,7 +1027,6 @@ __use_tid_routing( > IN const ib_mad_t* const > p_mad_hdr, > IN const boolean_t > are_we_sender ) > { > - ib_rmpp_mad_t *p_rmpp_mad; > boolean_t is_orig; > > AL_ENTER( AL_DBG_MAD_SVC ); > @@ -1039,45 +1038,10 @@ __use_tid_routing( > return FALSE; > } > > - /* > - * Determine originator for a sent MAD. Received MADs > are just the > - * opposite. > - */ > - > - /* Non-DATA RMPP MADs are handled differently. */ > - p_rmpp_mad = (ib_rmpp_mad_t*)p_mad_hdr; > - if( (p_mad_hdr->mgmt_class == IB_MCLASS_SUBN_ADM) && > - ( ib_rmpp_is_flag_set( p_rmpp_mad, > IB_RMPP_FLAG_ACTIVE ) && > - (p_rmpp_mad->rmpp_type != IB_RMPP_TYPE_DATA) ) ) > - { > - /* > - * We need to distinguish between ACKs sent > after receiving > - * a request, versus ACKs sent after receiving > a response. ACKs > - * to a request are from the responder. ACKs > to a response are > - * from the originator. > - > - * Note that we assume STOP and ABORT packets > are initiated by > - * receivers. If both senders and receivers can > - * initiate STOP and ABORT MADs, then we can't > distinguish which > - * transaction is associated with the MAD. The > TID for a > - * send and receive can be the same. > - */ > - is_orig = !ib_mad_is_response( p_mad_hdr ); > - } > + if (are_we_sender) > + is_orig = !ib_mad_is_response(p_mad_hdr); > else > - { > - /* > - * See if the MAD is being sent in response to > a previous MAD. If > - * it is, then we're NOT the originator. Note > that trap repress > - * MADs are responses, even though the response > bit isn't set. > - */ > - is_orig = !( ib_mad_is_response( p_mad_hdr ) || > - (p_mad_hdr->method == > IB_MAD_METHOD_TRAP_REPRESS) ); > - } > - > - /* If we're the receiver, toggle the result. */ > - if( !are_we_sender ) > - is_orig = !is_orig; > + is_orig = ib_mad_is_response(p_mad_hdr); > > AL_EXIT( AL_DBG_MAD_SVC ); > return is_orig; > @@ -2221,12 +2192,9 @@ __mad_svc_recv_done( > } > > /* > - * See if the MAD was sent in response to a previously > sent MAD. Note > - * that trap repress messages are responses, even > though the response > - * bit isn't set. > + * See if the MAD was sent in response to a previously sent MAD. > */ > - if( ib_mad_is_response( p_mad_hdr ) || > - (p_mad_hdr->method == IB_MAD_METHOD_TRAP_REPRESS) ) > + if( ib_mad_is_response( p_mad_hdr ) ) > { > /* Process the received response. */ > __process_recv_resp( h_mad_svc, p_mad_element > ); diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt > -I '\$Id:' trunk\core\al/kernel/al_smi.c > branches\winverbs\core\al/kernel/al_smi.c > --- trunk\core\al/kernel/al_smi.c 2009-01-26 > 09:34:30.250875000 -0800 > +++ branches\winverbs\core\al/kernel/al_smi.c 2009-05-07 > 15:53:12.270907500 -0700 > @@ -172,11 +172,11 @@ process_mad_recv( > IN spl_qp_svc_t* > p_spl_qp_svc, > IN ib_mad_element_t* > p_mad_element ); > > -mad_route_t > +static mad_route_t > route_recv_smp( > IN ib_mad_element_t* > p_mad_element ); > > -mad_route_t > +static mad_route_t > route_recv_smp_attr( > IN ib_mad_element_t* > p_mad_element ); > > @@ -184,12 +184,12 @@ mad_route_t > route_recv_dm_mad( > IN ib_mad_element_t* > p_mad_element ); > > -mad_route_t > -route_recv_gmp( > +static mad_route_t > +route_recv_bm( > IN ib_mad_element_t* > p_mad_element ); > > -mad_route_t > -route_recv_gmp_attr( > +static mad_route_t > +route_recv_perf( > IN ib_mad_element_t* > p_mad_element ); > > ib_api_status_t > @@ -2234,6 +2234,7 @@ fwd_local_mad( > ib_mad_t* p_mad; > ib_smp_t* p_smp; > al_mad_send_t* p_mad_send; > + ib_mad_element_t* p_send_mad; > ib_mad_element_t* p_mad_response = NULL; > ib_mad_t* p_mad_response_buf; > ib_api_status_t status = IB_SUCCESS; > @@ -2263,6 +2264,8 @@ fwd_local_mad( > return status; > } > p_mad_response_buf = p_mad_response->p_mad_buf; > + /* Copy MAD to dispatch locally in case CA > doesn't handle it. */ > + *p_mad_response_buf = *p_mad; > } > else > { > @@ -2399,9 +2402,17 @@ fwd_local_mad( > > > /* Construct the receive MAD element. */ > - p_mad_response->status = IB_WCS_SUCCESS; > - p_mad_response->remote_qp = > p_mad_wr->send_wr.dgrm.ud.remote_qp; > - p_mad_response->remote_lid = > p_spl_qp_svc->base_lid; > + p_send_mad = p_mad_send->p_send_mad; > + p_mad_response->status = IB_WCS_SUCCESS; > + p_mad_response->grh_valid = p_send_mad->grh_valid; > + if( p_mad_response->grh_valid ) > + *p_mad_response->p_grh = *p_send_mad->p_grh; > + p_mad_response->path_bits = p_send_mad->path_bits; > + p_mad_response->pkey_index = p_send_mad->pkey_index; > + p_mad_response->remote_lid = p_send_mad->remote_lid; > + p_mad_response->remote_qkey = p_send_mad->remote_qkey; > + p_mad_response->remote_qp = p_send_mad->remote_qp; > + p_mad_response->remote_sl = p_send_mad->remote_sl; > if( p_mad_wr->send_wr.send_opt & IB_RECV_OPT_IMMEDIATE ) > { > p_mad_response->immediate_data = > p_mad_wr->send_wr.immediate_data; @@ -2413,6 +2424,8 @@ fwd_local_mad( > * the send. This guarantees that the send > request cannot time out. > */ > status = mad_disp_recv_done( > p_spl_qp_svc->h_mad_disp, p_mad_response ); > + if( status != IB_SUCCESS ) > + ib_put_mad( p_mad_response ); > } > > __complete_send_mad( p_spl_qp_svc->h_mad_disp, > p_mad_wr,IB_WCS_SUCCESS); @@ -2937,35 +2950,19 @@ process_mad_recv( > break; > > case IB_MCLASS_PERF: > - /* Process the received GMP. */ > - switch( p_mad_element->p_mad_buf->method ) > - { > - case IB_MAD_METHOD_GET: > - case IB_MAD_METHOD_SET: > - route = ROUTE_LOCAL; > - break; > - default: > - break; > - } > + route = route_recv_perf( p_mad_element ); > break; > > case IB_MCLASS_BM: > - route = route_recv_gmp( p_mad_element ); > + route = route_recv_bm( p_mad_element ); > break; > > - case IB_MCLASS_SUBN_ADM: > - case IB_MCLASS_DEV_MGMT: > - case IB_MCLASS_COMM_MGMT: > - case IB_MCLASS_SNMP: > + case IB_MLX_VENDOR_CLASS1: > + case IB_MLX_VENDOR_CLASS2: > + route = ROUTE_LOCAL; > break; > > default: > - /* Route vendor specific MADs to the > HCA provider. */ > - if( ib_class_is_vendor_specific( > - p_mad_element->p_mad_buf->mgmt_class ) ) > - { > - route = route_recv_gmp( p_mad_element ); > - } > break; > } > } > @@ -2989,7 +2986,7 @@ process_mad_recv( > /* > * Route a received SMP. > */ > -mad_route_t > +static mad_route_t > route_recv_smp( > IN ib_mad_element_t* > p_mad_element ) > { > @@ -3054,7 +3051,7 @@ route_recv_smp( > /* > * Route received SMP attributes. > */ > -mad_route_t > +static mad_route_t > route_recv_smp_attr( > IN ib_mad_element_t* > p_mad_element ) > { > @@ -3090,72 +3087,38 @@ route_recv_smp_attr( } > > > -/* > - * Route a received GMP. > - */ > -mad_route_t > -route_recv_gmp( > +static mad_route_t > +route_recv_bm( > IN ib_mad_element_t* > p_mad_element ) > { > - mad_route_t route; > - > - AL_ENTER( AL_DBG_SMI ); > - > - CL_ASSERT( p_mad_element ); > - > - /* Process the received GMP. */ > switch( p_mad_element->p_mad_buf->method ) > { > case IB_MAD_METHOD_GET: > case IB_MAD_METHOD_SET: > - /* Route vendor specific MADs to the HCA provider. */ > - if( ib_class_is_vendor_specific( > - p_mad_element->p_mad_buf->mgmt_class ) ) > - { > - route = ROUTE_LOCAL; > - } > - else > - { > - route = route_recv_gmp_attr( p_mad_element ); > - } > + if( p_mad_element->p_mad_buf->attr_id == > IB_MAD_ATTR_CLASS_PORT_INFO ) > + return ROUTE_LOCAL; > break; > - > default: > - route = ROUTE_DISPATCHER; > break; > } > - > - AL_EXIT( AL_DBG_SMI ); > - return route; > + return ROUTE_DISPATCHER; > } > > - > - > -/* > - * Route received GMP attributes. > - */ > -mad_route_t > -route_recv_gmp_attr( > +static mad_route_t > +route_recv_perf( > IN ib_mad_element_t* > p_mad_element ) > { > - mad_route_t route; > - > - AL_ENTER( AL_DBG_SMI ); > - > - CL_ASSERT( p_mad_element ); > - > - /* Process the received GMP attributes. */ > - if( p_mad_element->p_mad_buf->attr_id == > IB_MAD_ATTR_CLASS_PORT_INFO ) > - route = ROUTE_LOCAL; > - else > - route = ROUTE_DISPATCHER; > - > - AL_EXIT( AL_DBG_SMI ); > - return route; > + switch( p_mad_element->p_mad_buf->method ) > + { > + case IB_MAD_METHOD_GET: > + case IB_MAD_METHOD_SET: > + return ROUTE_LOCAL; > + default: > + break; > + } > + return ROUTE_DISPATCHER; > } > > - > - > /* > * Forward a locally generated Subnet Management trap. > */ > @@ -3263,8 +3226,7 @@ recv_local_mad( > * We need to get a response from the local HCA to this > MAD only if this > * MAD is not itself a response. > */ > - p_mad_request->resp_expected = !( ib_mad_is_response( > p_mad_hdr ) || > - ( p_mad_hdr->method == IB_MAD_METHOD_TRAP_REPRESS ) ); > + p_mad_request->resp_expected = !ib_mad_is_response( p_mad_hdr ); > p_mad_request->timeout_ms = LOCAL_MAD_TIMEOUT; > p_mad_request->send_opt = IB_SEND_OPT_LOCAL; > > diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I > '\$Id:' trunk\inc\iba/ib_types.h branches\winverbs\inc\iba/ib_types.h > --- trunk\inc\iba/ib_types.h 2009-05-05 23:05:51.060250000 -0700 > +++ branches\winverbs\inc\iba/ib_types.h 2009-05-07 > 15:31:55.012120700 -0700 > @@ -3795,8 +3798,8 @@ ib_mad_is_response( > IN const ib_mad_t* const > p_mad ) > { > CL_ASSERT( p_mad ); > - return( (p_mad->method & IB_MAD_METHOD_RESP_MASK) == > - IB_MAD_METHOD_RESP_MASK ); > + return ((p_mad->method & IB_MAD_METHOD_RESP_MASK) || > + (p_mad->method == IB_MAD_METHOD_TRAP_REPRESS)); > } > /* > * PARAMETERS > > > _______________________________________________ > ofw mailing list > [email protected] > http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw > _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
