From: ftillier Date: Mon, 10 Oct 2005 19:54:53 +0000 (+0000) Subject: [IBAL] Handle RMPP send payload < MAD buffer length X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=1edc99f4a17501899e3cfdd0152cda94a7728289;p=~shefty%2Frdma-win.git [IBAL] Handle RMPP send payload < MAD buffer length Signed-off-by: Fab Tillier (ftillier@silverstorm.com) git-svn-id: svn://openib.tc.cornell.edu/gen1@106 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/core/al/al_mad.c b/trunk/core/al/al_mad.c index a909da90..6c9d1e73 100644 --- a/trunk/core/al/al_mad.c +++ b/trunk/core/al/al_mad.c @@ -1681,6 +1681,7 @@ __queue_mad_wr( al_mad_element_t *p_al_element; ib_rmpp_mad_t *p_rmpp_hdr; uint8_t *p_rmpp_src, *p_rmpp_dst; + uintn_t hdr_len, offset, max_len; CL_ENTER( AL_DBG_MAD_SVC, g_al_dbg_lvl ); p_send_wr = &h_send->mad_wr.send_wr; @@ -1702,28 +1703,32 @@ __queue_mad_wr( p_rmpp_dst = (uint8_t*)(uintn_t)p_al_element->mad_ds.vaddr; #endif p_rmpp_src = (uint8_t* __ptr64)h_send->p_send_mad->p_mad_buf; - p_rmpp_hdr = (ib_rmpp_mad_t* __ptr64)h_send->p_send_mad->p_mad_buf; + p_rmpp_hdr = (ib_rmpp_mad_t*)p_rmpp_src; if( h_send->p_send_mad->p_mad_buf->mgmt_class == IB_MCLASS_SUBN_ADM ) - { - /* Copy the header into the registered send buffer. */ - cl_memcpy( p_rmpp_dst, p_rmpp_src, IB_SA_MAD_HDR_SIZE ); - /* Copy this segment's payload into the registered send buffer. */ - p_rmpp_dst = p_rmpp_dst + IB_SA_MAD_HDR_SIZE; - p_rmpp_src = p_rmpp_src + IB_SA_MAD_HDR_SIZE + - ( (cl_ntoh32( p_rmpp_hdr->seg_num ) - 1) * IB_SA_DATA_SIZE ); - cl_memcpy( p_rmpp_dst, p_rmpp_src, IB_SA_DATA_SIZE ); - } + hdr_len = IB_SA_MAD_HDR_SIZE; else + hdr_len = MAD_RMPP_HDR_SIZE; + + max_len = MAD_BLOCK_SIZE - hdr_len; + + offset = hdr_len + (max_len * (cl_ntoh32( p_rmpp_hdr->seg_num ) - 1)); + + /* Copy the header into the registered send buffer. */ + cl_memcpy( p_rmpp_dst, p_rmpp_src, hdr_len ); + + /* Copy this segment's payload into the registered send buffer. */ + CL_ASSERT( h_send->p_send_mad->size != offset ); + if( (h_send->p_send_mad->size - offset) < max_len ) { - /* Copy the header into the registered send buffer. */ - cl_memcpy( p_rmpp_dst, p_rmpp_src, MAD_RMPP_HDR_SIZE ); - /* Copy this segment's payload into the registered send buffer. */ - p_rmpp_dst = p_rmpp_dst + MAD_RMPP_HDR_SIZE; - p_rmpp_src = p_rmpp_src + MAD_RMPP_HDR_SIZE + - ( (cl_ntoh32( p_rmpp_hdr->seg_num ) - 1) * MAD_RMPP_DATA_SIZE ); - cl_memcpy( p_rmpp_dst, p_rmpp_src, MAD_RMPP_DATA_SIZE ); + max_len = h_send->p_send_mad->size - offset; + /* Clear unused payload. */ + cl_memclr( p_rmpp_dst + hdr_len + max_len, + MAD_BLOCK_SIZE - hdr_len - max_len ); } + + cl_memcpy( + p_rmpp_dst + hdr_len, p_rmpp_src + offset, max_len ); } p_send_wr->num_ds = 1;