Please, commit. I inserted "#if 0" just to make future CM patches clear, but I saw a lot of changes on CM branch. So it will be good idea to apply the CM patches directly on UD code without "#if 0".
-----Original Message----- From: Smith, Stan [mailto:[email protected]] Sent: Friday, January 07, 2011 10:39 PM To: Alex Naslednikov Cc: [email protected] Subject: [PATCH] remove unused CM code 3 of 3 In order to make IPoIB-CM patches clear, remove #if 0 unused CM code. signed-off-by: stan smith <[email protected]> --- A/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.cpp Fri Jan 07 12:01:19 2011 +++ B/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.cpp Fri Jan 07 10:48:53 2011 @@ -75,74 +75,8 @@ __endpt_resolve( IN ipoib_endpt_t* const p_endpt ); -static void -__endpt_cm_send_cb( - IN const ib_cq_handle_t h_cq, - IN void *cq_context ); -static void -__endpt_cm_recv_cb( - IN const ib_cq_handle_t h_cq, - IN void *cq_context ); - -static void -__endpt_cm_buf_mgr_construct( - IN endpt_buf_mgr_t * const p_buf_mgr ); -static void -__conn_reply_cb( - IN ib_cm_rep_rec_t *p_cm_rep ); - -static void -__conn_mra_cb( - IN ib_cm_mra_rec_t *p_mra_rec ); - -static void -__conn_rej_cb( - IN ib_cm_rej_rec_t *p_rej_rec ); - -static void -__conn_dreq_cb( - IN ib_cm_dreq_rec_t *p_dreq_rec ); - -#if 0 //CM -static cl_status_t -__cm_recv_desc_ctor( - IN void* const p_object, - IN void* context, - OUT cl_pool_item_t** const pp_pool_item ); - -static void -__cm_recv_desc_dtor( - IN const cl_pool_item_t* const p_pool_item, - IN void *context ); - -static NDIS_PACKET* -__endpt_cm_get_ndis_pkt( - IN ipoib_port_t* const p_port, - IN ipoib_cm_desc_t* const p_desc ); - -static inline ipoib_cm_desc_t* -__endpt_cm_buf_mgr_get_recv( - IN endpt_buf_mgr_t * const p_buf_mgr ); - -static boolean_t -__cm_recv_is_dhcp( - IN const ipoib_pkt_t* const p_ipoib ); -static ib_api_status_t -__endpt_cm_recv_arp( - IN ipoib_port_t* const p_port, - IN const ipoib_pkt_t* const p_ipoib, - OUT eth_pkt_t* const p_eth, - IN ipoib_endpt_t* const p_src_endpt ); -static ib_api_status_t -__endpt_cm_recv_udp( - IN ipoib_port_t* const p_port, - IN ib_wc_t* const p_wc, - IN const ipoib_pkt_t* const p_ipoib, - OUT eth_pkt_t* const p_eth, - IN ipoib_endpt_t* const p_src_endpt ); -#endif ipoib_endpt_t* ipoib_endpt_create( @@ -296,13 +230,6 @@ p_port->p_adapter->p_ifc->leave_mcast( p_endpt->h_mcast, ipoib_leave_mcast_cb ); } -#if 0 - else if( p_port->p_adapter->params.cm_enabled ) - { - p_endpt->cm_flag = 0; - CL_ASSERT( endpt_cm_get_state( p_endpt ) == IPOIB_CM_DISCONNECTED ); - } -#endif cl_obj_unlock( p_obj ); @@ -449,735 +376,3 @@ IPOIB_EXIT( IPOIB_DBG_ENDPT ); return NDIS_STATUS_SUCCESS; } - -#if 0 - -static void -__endpt_cm_buf_mgr_construct( - IN endpt_buf_mgr_t * const p_buf_mgr ) -{ - IPOIB_ENTER( IPOIB_DBG_INIT ); - - cl_qpool_construct( &p_buf_mgr->recv_pool ); - - p_buf_mgr->h_packet_pool = NULL; - p_buf_mgr->h_buffer_pool = NULL; - - IPOIB_EXIT( IPOIB_DBG_INIT ); -} - -ib_api_status_t -endpt_cm_buf_mgr_init( - IN ipoib_port_t* const p_port ) -{ - cl_status_t cl_status; - NDIS_STATUS ndis_status; - ib_api_status_t ib_status = IB_SUCCESS; - - IPOIB_ENTER( IPOIB_DBG_INIT ); - - if( p_port->cm_buf_mgr.pool_init ) - return ib_status; - - cl_qlist_init( &p_port->cm_buf_mgr.posted_list ); - - __endpt_cm_buf_mgr_construct( &p_port->cm_buf_mgr ); - p_port->cm_recv_mgr.rq_depth = - min( (uint32_t)p_port->p_adapter->params.rq_depth * 8, - p_port->p_ca_attrs->max_srq_wrs/2 ); - p_port->cm_recv_mgr.depth = 0; - /* Allocate the receive descriptors pool */ - cl_status = cl_qpool_init( &p_port->cm_buf_mgr.recv_pool, - p_port->cm_recv_mgr.rq_depth , - 0, - 0, - sizeof( ipoib_cm_desc_t ), - __cm_recv_desc_ctor, - __cm_recv_desc_dtor, - p_port ); - - if( cl_status != CL_SUCCESS ) - { - NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, - EVENT_IPOIB_RECV_POOL, 1, cl_status ); - IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("cl_qpool_init(cm_buf_mgr.recv_pool) returned %#x\n", cl_status) ); - return IB_INSUFFICIENT_MEMORY; - } - - /* Allocate the NDIS buffer and packet pools for receive indication. */ - NdisAllocatePacketPool( &ndis_status, - &p_port->cm_buf_mgr.h_packet_pool, - p_port->cm_recv_mgr.rq_depth, - PROTOCOL_RESERVED_SIZE_IN_PACKET ); - if( ndis_status != NDIS_STATUS_SUCCESS ) - { - NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, - EVENT_IPOIB_RECV_PKT_POOL, 1, ndis_status ); - - IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("NdisAllocatePacketPool returned %08X\n", ndis_status) ); - - ib_status = IB_INSUFFICIENT_RESOURCES; - goto pkt_pool_failed; - } - - NdisAllocateBufferPool( &ndis_status, - &p_port->cm_buf_mgr.h_buffer_pool, - p_port->cm_recv_mgr.rq_depth ); - if( ndis_status != NDIS_STATUS_SUCCESS ) - { - NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, - EVENT_IPOIB_RECV_BUF_POOL, 1, ndis_status ); - - IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("NdisAllocateBufferPool returned %08X\n", ndis_status) ); - - ib_status = IB_INSUFFICIENT_RESOURCES; - goto buf_pool_failed; - } - //NDIS60 - //p_port->cm_recv_mgr.recv_pkt_array = - //cl_zalloc( sizeof(NDIS_PACKET*) * p_port->cm_recv_mgr.rq_depth ); - p_port->cm_recv_mgr.recv_lst_array = - cl_zalloc( sizeof(NET_BUFFER_LIST*) * p_port->cm_recv_mgr.rq_depth ); - - - - if( !p_port->cm_recv_mgr.recv_NBL_array ) - { - IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("cl_zalloc for cm_recv_mgr NET_BUFFER_LIST array failed.\n") ); - - ib_status = IB_INSUFFICIENT_MEMORY; - goto pkt_array_failed; - } - - p_port->cm_buf_mgr.pool_init = TRUE; - return IB_SUCCESS; - - -pkt_array_failed: - if( p_port->cm_buf_mgr.h_buffer_pool ) - NdisFreeBufferPool( p_port->cm_buf_mgr.h_buffer_pool ); -buf_pool_failed: - if( p_port->cm_buf_mgr.h_packet_pool ) - NdisFreePacketPool( p_port->cm_buf_mgr.h_packet_pool ); -pkt_pool_failed: - cl_qpool_destroy( &p_port->cm_buf_mgr.recv_pool ); - - IPOIB_EXIT( IPOIB_DBG_INIT ); - return ib_status; -} - - -void -endpt_cm_buf_mgr_reset( - IN ipoib_port_t* const p_port ) -{ - cl_list_item_t *p_item; - - if( !p_port->cm_buf_mgr.pool_init ) - return; - - if( cl_qlist_count( &p_port->cm_buf_mgr.posted_list ) ) - { - for( p_item = cl_qlist_remove_head( &p_port->cm_buf_mgr.posted_list ); - p_item != cl_qlist_end( &p_port->cm_buf_mgr.posted_list ); - p_item = cl_qlist_remove_head( &p_port->cm_buf_mgr.posted_list ) ) - { - cl_qpool_put( &p_port->cm_buf_mgr.recv_pool, - &( PARENT_STRUCT( p_item, ipoib_cm_desc_t, list_item ))->item ); - } - } -} - -void -endpt_cm_buf_mgr_destroy( - IN ipoib_port_t* const p_port ) -{ - - IPOIB_ENTER(IPOIB_DBG_INIT ); - - CL_ASSERT( p_port ); - - /* Free the receive descriptors. */ - if( !p_port->cm_buf_mgr.pool_init ) - return; - - endpt_cm_buf_mgr_reset( p_port ); - - p_port->cm_buf_mgr.pool_init = FALSE; - - if( p_port->cm_recv_mgr.recv_NBL_array ) - { - cl_free( p_port->cm_recv_mgr.recv_NBL_array ); - } - - /* Destroy the receive packet and buffer pools. */ - if( p_port->cm_buf_mgr.h_buffer_pool ) - NdisFreeBufferPool( p_port->cm_buf_mgr.h_buffer_pool ); - if( p_port->cm_buf_mgr.h_packet_pool ) - NdisFreePacketPool( p_port->cm_buf_mgr.h_packet_pool ); - - cl_qpool_destroy( &p_port->cm_buf_mgr.recv_pool ); - - IPOIB_EXIT( IPOIB_DBG_INIT ); -} - -static cl_status_t -__cm_recv_desc_ctor( - IN void* const p_object, - IN void* context, - OUT cl_pool_item_t** const pp_pool_item ) -{ - ipoib_cm_desc_t* p_desc; - ipoib_port_t* p_port; - ib_mr_create_t create_mr; - net32_t rkey; - - CL_ASSERT( p_object ); - CL_ASSERT( context ); - - p_desc = (ipoib_cm_desc_t*)p_object; - p_port = (ipoib_port_t*)context; - -#define BUF_ALIGN (16) - - p_desc->alloc_buf_size = - ROUNDUP( p_port->p_adapter->params.cm_xfer_block_size, BUF_ALIGN ); - - p_desc->p_alloc_buf = (uint8_t *)ExAllocatePoolWithTag( - NonPagedPool, p_desc->alloc_buf_size, 'DOMC' ); - - if( p_desc->p_alloc_buf == NULL ) - { - IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Failed to allocate CM recv buffer size %d bytes.\n", - p_desc->alloc_buf_size ) ); - return CL_INSUFFICIENT_MEMORY; - } - - create_mr.vaddr = p_desc->p_alloc_buf; - create_mr.length = p_desc->alloc_buf_size; - create_mr.access_ctrl = IB_AC_LOCAL_WRITE; - - if( p_port->p_adapter->p_ifc->reg_mem( p_port->ib_mgr.h_pd, - &create_mr, - &p_desc->lkey, - &rkey, - &p_desc->h_mr ) != IB_SUCCESS ) - { - IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Failed to create Memory Region size %d bytes.\n", - p_desc->alloc_buf_size ) ); - goto ctor_failed; - } - p_desc->p_buf = p_desc->p_alloc_buf + (BUF_ALIGN - sizeof( ipoib_hdr_t)); - p_desc->buf_size = p_desc->alloc_buf_size - (BUF_ALIGN - sizeof( ipoib_hdr_t)); - - /* Setup the local data segment. */ - p_desc->local_ds[0].vaddr = (uint64_t)(uintn_t)p_desc->p_buf; - p_desc->local_ds[0].length = p_desc->buf_size; - p_desc->local_ds[0].lkey = p_desc->lkey; - - /* Setup the work request. */ - p_desc->wr.wr_id = (uintn_t)p_desc; - p_desc->wr.ds_array = p_desc->local_ds; - p_desc->wr.num_ds = 1; - - p_desc->type = PKT_TYPE_CM_UCAST; - - *pp_pool_item = &p_desc->item; - - return CL_SUCCESS; - -ctor_failed: - ExFreePoolWithTag( p_desc->p_alloc_buf, 'DOMC' ); - return CL_INSUFFICIENT_MEMORY; -} - -static void -__cm_recv_desc_dtor( - IN const cl_pool_item_t* const p_pool_item, - IN void *context ) -{ - ipoib_cm_desc_t *p_desc; - ipoib_port_t* p_port; - - if( p_pool_item == NULL || context == NULL ) - return; - - p_port = (ipoib_port_t*)context; - p_desc = PARENT_STRUCT( p_pool_item, ipoib_cm_desc_t, item ); - - if( p_desc->h_mr ) - p_port->p_adapter->p_ifc->dereg_mr( p_desc->h_mr ); - - if( p_desc->p_alloc_buf ) - ExFreePoolWithTag( p_desc->p_alloc_buf, 'DOMC' ); -} - - -static NDIS_PACKET* -__endpt_cm_get_ndis_pkt( - IN ipoib_port_t* const p_port, - IN ipoib_cm_desc_t* const p_desc ) -{ - NDIS_STATUS status; - NDIS_PACKET *p_packet; - NDIS_BUFFER *p_buffer; - - IPOIB_ENTER( IPOIB_DBG_RECV ); - - NdisDprAllocatePacketNonInterlocked( &status, &p_packet, - p_port->cm_buf_mgr.h_packet_pool ); - if( status != NDIS_STATUS_SUCCESS ) - { - IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Failed to allocate NDIS_PACKET: %08x\n", status) ); - return NULL; - } - - IPOIB_PORT_FROM_PACKET( p_packet ) = p_port; - IPOIB_RECV_FROM_PACKET( p_packet ) = p_desc; - - NdisAllocateBuffer( - &status, - &p_buffer, - p_port->cm_buf_mgr.h_buffer_pool, - (void *)(p_desc->p_buf - DATA_OFFSET), - p_desc->len + DATA_OFFSET ); - - if( status != NDIS_STATUS_SUCCESS ) - { - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Failed to allocate NDIS_BUFFER: %08x\n", status) ); - NdisDprFreePacketNonInterlocked( p_packet ); - return NULL; - } - - NdisChainBufferAtFront( p_packet, p_buffer ); - NDIS_SET_PACKET_HEADER_SIZE( p_packet, sizeof(eth_hdr_t) ); - - IPOIB_EXIT( IPOIB_DBG_RECV ); - return p_packet; -} - -static inline ipoib_cm_desc_t* -__endpt_cm_buf_mgr_get_recv( - IN endpt_buf_mgr_t * const p_buf_mgr ) -{ - ipoib_cm_desc_t *p_desc; - - p_desc = (ipoib_cm_desc_t*)cl_qpool_get( &p_buf_mgr->recv_pool ); - if( p_desc ) - cl_qlist_insert_tail( &p_buf_mgr->posted_list, &p_desc->list_item ); - - return p_desc; -} - -void -endpt_cm_buf_mgr_put_recv( - IN endpt_buf_mgr_t * const p_buf_mgr, - IN ipoib_cm_desc_t* const p_desc ) -{ - - IPOIB_ENTER(IPOIB_DBG_RECV ); - - /* Return the descriptor to it's pool. */ - cl_qlist_remove_item( &p_buf_mgr->posted_list, &p_desc->list_item ); - cl_qpool_put( &p_buf_mgr->recv_pool, &p_desc->item ); - - IPOIB_EXIT( IPOIB_DBG_RECV ); -} - -void -endpt_cm_buf_mgr_put_recv_list( - IN endpt_buf_mgr_t * const p_buf_mgr, - IN cl_qlist_t* const p_list ) -{ - cl_qpool_put_list( &p_buf_mgr->recv_pool, p_list ); -} - -uint32_t -endpt_cm_recv_mgr_build_pkt_array( - IN ipoib_port_t* const p_port, - IN ipoib_endpt_t* const p_endpt, - IN cl_qlist_t* const p_done_list, - IN OUT uint32_t* p_bytes_recv ) -{ - cl_list_item_t *p_item; - ipoib_cm_desc_t *p_desc; - uint32_t i = 0; - NDIS_PACKET *p_packet; - NDIS_TCP_IP_CHECKSUM_PACKET_INFO chksum; - - IPOIB_ENTER( IPOIB_DBG_RECV ); - UNUSED_PARAM( p_endpt ); - - p_item = cl_qlist_remove_head( p_done_list ); - - *p_bytes_recv = 0; - - for( p_item; p_item != cl_qlist_end( p_done_list ); - p_item = cl_qlist_remove_head( p_done_list ) ) - { - p_desc = (ipoib_cm_desc_t*)p_item; - - p_packet = __endpt_cm_get_ndis_pkt( p_port, p_desc ); - if( !p_packet ) - { - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Failed to get Packet from descriptor\n" ) ); - endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, p_desc ); - p_port->cm_recv_mgr.depth--; - continue; - } - chksum.Value = 0; - switch( p_port->p_adapter->params.recv_chksum_offload ) - { - default: - CL_ASSERT( FALSE ); - case CSUM_DISABLED: - case CSUM_ENABLED: - NDIS_PER_PACKET_INFO_FROM_PACKET( p_packet, TcpIpChecksumPacketInfo ) = - (void*)(uintn_t)chksum.Value; - break; - case CSUM_BYPASS: - /* Flag the checksums as having been calculated. */ - chksum.Receive.NdisPacketTcpChecksumSucceeded = TRUE; - chksum.Receive.NdisPacketUdpChecksumSucceeded = TRUE; - chksum.Receive.NdisPacketIpChecksumSucceeded = TRUE; - NDIS_PER_PACKET_INFO_FROM_PACKET( p_packet, TcpIpChecksumPacketInfo ) = - (void*)(uintn_t)chksum.Value; - break; - } - - NDIS_SET_PACKET_STATUS( p_packet, NDIS_STATUS_SUCCESS ); - p_port->cm_recv_mgr.recv_NBL_array[i] = p_packet; - i++; - *p_bytes_recv += p_desc->len; - } - - IPOIB_EXIT( IPOIB_DBG_RECV ); - return i; -} -void -endpt_cm_flush_recv( - IN ipoib_port_t* const p_port, - IN ipoib_endpt_t* const p_endpt ) -{ - ib_api_status_t ib_status = IB_SUCCESS; - ib_qp_mod_t mod_attr; - ib_wc_t wc[MAX_RECV_WC]; - ib_wc_t *p_free_wc; - ib_wc_t *p_done_wc; - ib_wc_t *p_wc; - ipoib_cm_desc_t *p_desc; - - IPOIB_ENTER( IPOIB_DBG_RECV ); - - CL_ASSERT( p_endpt ); - - if( p_endpt->conn.h_recv_qp ) - { - memset( &mod_attr, 0, sizeof( mod_attr ) ); - mod_attr.req_state = IB_QPS_ERROR; - p_port->p_adapter->p_ifc->modify_qp( p_endpt->conn.h_send_qp, &mod_attr ); - p_port->p_adapter->p_ifc->modify_qp( p_endpt->conn.h_recv_qp, &mod_attr ); - - for( p_free_wc=wc; p_free_wc < &wc[MAX_RECV_WC - 1]; p_free_wc++ ) - p_free_wc->p_next = p_free_wc + 1; - p_free_wc->p_next = NULL; - - do - { - p_free_wc = wc; - ib_status = - p_port->p_adapter->p_ifc->poll_cq( p_endpt->conn.h_recv_cq, - &p_free_wc, &p_done_wc ); - if( ib_status != IB_SUCCESS && - ib_status != IB_NOT_FOUND ) - { - /* connection CQ failed */ - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Poll Recv CQ failed status %#x\n", ib_status ) ); - break; - } - cl_spinlock_acquire( &p_port->recv_lock ); - for( p_wc = p_done_wc; p_wc; p_wc = p_wc->p_next ) - { - p_desc = (ipoib_cm_desc_t *)(uintn_t)p_wc->wr_id; - endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, p_desc ); - p_port->cm_recv_mgr.depth--; - } - cl_spinlock_release( &p_port->recv_lock ); - } while( !p_free_wc ); - - ib_status = p_port->p_adapter->p_ifc->destroy_qp( p_endpt->conn.h_recv_qp, NULL ); - if( ib_status != IB_SUCCESS ) - { - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Destroy Recv QP failed status %#x\n", ib_status ) ); - } - p_endpt->conn.h_recv_qp = NULL; - } - - if( p_endpt->conn.h_send_qp ) - { - ib_status = p_port->p_adapter->p_ifc->destroy_qp( p_endpt->conn.h_send_qp, NULL ); - if( ib_status != IB_SUCCESS ) - { - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Destroy Send QP failed status %#x\n", ib_status ) ); - } - p_endpt->conn.h_send_qp = NULL; - } - - IPOIB_EXIT( IPOIB_DBG_RECV ); -} - -int32_t -endpt_cm_recv_mgr_filter( - IN ipoib_endpt_t* const p_endpt, - IN ib_wc_t* const p_done_wc_list, - OUT cl_qlist_t* const p_done_list, - OUT cl_qlist_t* const p_bad_list ) -{ - ib_api_status_t ib_status; - ipoib_cm_desc_t *p_desc; - ib_wc_t *p_wc; - ipoib_pkt_t *p_ipoib; - eth_pkt_t *p_eth; - ipoib_port_t* p_port; - int32_t recv_cnt; - - IPOIB_ENTER( IPOIB_DBG_RECV ); - - p_port = ipoib_endpt_parent( p_endpt ); - - for( p_wc = p_done_wc_list, recv_cnt = 0; p_wc; p_wc = p_wc->p_next ) - { - p_desc = (ipoib_cm_desc_t *)(uintn_t)p_wc->wr_id; - recv_cnt++; - if( p_wc->status != IB_WCS_SUCCESS ) - { - if( p_wc->status != IB_WCS_WR_FLUSHED_ERR ) - { - - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Failed completion %s (vendor specific %#x)\n", - p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ), - (int)p_wc->vendor_specific) ); - } - else - { - IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV, - ("Flushed completion %s\n", - p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status )) ); - } - - ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 ); - - cl_qlist_remove_item( &p_port->cm_buf_mgr.posted_list, &p_desc->list_item ); - cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item ); - continue; - } - - /* Successful completion - Setup the ethernet/ip/arp header and queue descriptor for report. */ - ib_status = IB_SUCCESS; - p_ipoib = (ipoib_pkt_t *)((uint8_t*)p_desc->p_buf ); - p_eth = (eth_pkt_t *)((uint8_t*)p_desc->p_buf - DATA_OFFSET ); - - switch( p_ipoib->hdr.type ) - { - case ETH_PROT_TYPE_ARP: - if( p_wc->length < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) ) - { - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Received ARP packet too short (wc_len %d)\n", p_wc->length) ); - ib_status = IB_ERROR; - break; - } - ib_status = __endpt_cm_recv_arp( p_port, p_ipoib, p_eth, p_endpt ); - break; - - case ETH_PROT_TYPE_IP: - if( p_wc->length < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) ) - { - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Received IP packet too short (wc_len %d)\n", p_wc->length) ); - ib_status = IB_ERROR; - break; - } - if( p_ipoib->type.ip.hdr.prot == IP_PROT_UDP ) - { - ib_status = __endpt_cm_recv_udp( p_port, - p_wc, - p_ipoib, - p_eth, - p_endpt ); - } - - break; - } - - if( ib_status != IB_SUCCESS ) - { - ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 ); - cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item ); - continue; - } - - p_eth->hdr.type = p_ipoib->hdr.type; - p_eth->hdr.src = p_endpt->mac; - p_eth->hdr.dst = p_port->p_adapter->mac; - - /* save payload length */ - p_desc->len = p_wc->length; - - cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item ); - } - - IPOIB_EXIT( IPOIB_DBG_RECV ); - return recv_cnt; -} - -ib_api_status_t -endpt_cm_post_recv( - IN ipoib_port_t* const p_port ) -{ - ib_api_status_t ib_status = IB_SUCCESS; - ipoib_cm_desc_t *p_head_desc = NULL; - ipoib_cm_desc_t *p_tail_desc = NULL; - ipoib_cm_desc_t *p_next_desc; - ib_recv_wr_t *p_failed_wc = NULL; - - IPOIB_ENTER( IPOIB_DBG_RECV ); - - while( cl_qpool_count( &p_port->cm_buf_mgr.recv_pool ) > 1 ) - { - /* Pull receives out of the pool and chain them up. */ - p_next_desc = __endpt_cm_buf_mgr_get_recv( - &p_port->cm_buf_mgr ); - if( !p_next_desc ) - { - IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV, - ("Out of receive descriptors! Endpt recv queue depth 0x%x\n", - p_port->cm_recv_mgr.depth ) ); - break; - } - - if( !p_tail_desc ) - { - p_tail_desc = p_next_desc; - p_next_desc->wr.p_next = NULL; - } - else - { - p_next_desc->wr.p_next = &p_head_desc->wr; - } - - p_head_desc = p_next_desc; - - p_port->cm_recv_mgr.depth++; - } - - if( p_head_desc ) - { - ib_status = p_port->p_adapter->p_ifc->post_srq_recv( - p_port->ib_mgr.h_srq, &p_head_desc->wr, &p_failed_wc ); - - if( ib_status != IB_SUCCESS ) - { - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("ip_post_recv returned %s\n", - p_port->p_adapter->p_ifc->get_err_str( ib_status )) ); - - /* put descriptors back to the pool */ - while( p_failed_wc ) - { - p_head_desc = PARENT_STRUCT( p_failed_wc, ipoib_cm_desc_t, wr ); - p_failed_wc = p_failed_wc->p_next; - endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, p_head_desc ); - p_port->cm_recv_mgr.depth--; - } - } - } - - - IPOIB_EXIT( IPOIB_DBG_RECV ); - return( ib_status ); -} - -static ib_api_status_t -__endpt_cm_recv_arp( - IN ipoib_port_t* const p_port, - IN const ipoib_pkt_t* const p_ipoib, - OUT eth_pkt_t* const p_eth, - IN ipoib_endpt_t* const p_src_endpt ) -{ - const ipoib_arp_pkt_t *p_ib_arp; - arp_pkt_t *p_arp; - - p_ib_arp = &p_ipoib->type.arp; - p_arp = &p_eth->type.arp; - - if( p_ib_arp->hw_type != ARP_HW_TYPE_IB || - p_ib_arp->hw_size != sizeof(ipoib_hw_addr_t) || - p_ib_arp->prot_type != ETH_PROT_TYPE_IP ) - { - return IB_ERROR; - } - - p_arp->hw_type = ARP_HW_TYPE_ETH; - p_arp->hw_size = sizeof(mac_addr_t); - p_arp->src_hw = p_src_endpt->mac; - p_arp->src_ip = p_ib_arp->src_ip; - p_arp->dst_hw = p_port->p_local_endpt->mac; - p_arp->dst_ip = p_ib_arp->dst_ip; - - return IB_SUCCESS; -} - -static ib_api_status_t -__endpt_cm_recv_udp( - IN ipoib_port_t* const p_port, - IN ib_wc_t* const p_wc, - IN const ipoib_pkt_t* const p_ipoib, - OUT eth_pkt_t* const p_eth, - IN ipoib_endpt_t* const p_src_endpt ) -{ - ib_api_status_t ib_status = IB_SUCCESS; - - if( p_wc->length < - (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) ) - { - IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("Received UDP packet too short\n") ); - return IB_ERROR; - } - if( __cm_recv_is_dhcp( p_ipoib ) ) - { - ib_status = ipoib_recv_dhcp( p_port, - p_ipoib, - p_eth, - p_src_endpt, - p_port->p_local_endpt ); - } - - return ib_status; -} - -static boolean_t -__cm_recv_is_dhcp( - IN const ipoib_pkt_t* const p_ipoib ) -{ - return( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER && - p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) || - (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT && - p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER) ); -} -#endif _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
