\r
static void __port_mcast_garbage_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2);\r
static void __port_do_mcast_garbage(ipoib_port_t* const p_port );\r
+\r
+\r
+static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2);\r
+\r
+\r
/******************************************************************************\r
*\r
* Declarations\r
IN const ib_cq_handle_t h_cq,\r
IN void *cq_context );\r
\r
-static NDIS_STATUS GetLsoHeaderSize(\r
- IN ipoib_port_t* const pPort,\r
- IN PNDIS_BUFFER CurrBuffer,\r
- IN LsoData *pLsoData,\r
- OUT uint16_t *pSize,\r
- OUT INT *IndexOfData,\r
- IN ipoib_hdr_t *ipoib_hdr\r
- );\r
+static NDIS_STATUS\r
+GetLsoHeaderSize(\r
+ IN ipoib_port_t* const pPort,\r
+ IN PNDIS_BUFFER CurrBuffer,\r
+ IN LsoData *pLsoData,\r
+ OUT uint16_t *pSize,\r
+ OUT INT *IndexOfData,\r
+ IN ipoib_hdr_t *ipoib_hdr );\r
\r
+static NDIS_STATUS\r
+__build_lso_desc(\r
+ IN ipoib_port_t* const p_port,\r
+ IN OUT ipoib_send_desc_t* const p_desc,\r
+ IN ULONG mss,\r
+ IN int32_t hdr_idx );\r
+\r
+static NDIS_STATUS\r
+__send_fragments(\r
+ IN ipoib_port_t* const p_port,\r
+ IN ipoib_send_desc_t* const p_desc,\r
+ IN eth_hdr_t* const p_eth_hdr,\r
+ IN ip_hdr_t* const p_ip_hdr,\r
+ IN uint32_t buf_len,\r
+ IN NDIS_BUFFER* p_ndis_buf );\r
+\r
+static void\r
+__update_fragment_ip_hdr(\r
+IN ip_hdr_t* const p_ip_hdr,\r
+IN uint16_t fragment_size, \r
+IN uint16_t fragment_offset, \r
+IN BOOLEAN more_fragments );\r
+\r
+static void\r
+__copy_ip_options(\r
+IN uint8_t* p_buf,\r
+IN uint8_t* p_options,\r
+IN uint32_t options_len,\r
+IN BOOLEAN copy_all );\r
/******************************************************************************\r
*\r
* Endpoint manager operations\r
\r
inline void ipoib_port_deref(ipoib_port_t * p_port, int type)\r
{\r
- cl_obj_deref( &p_port->obj );\r
-\r
#if DBG\r
cl_atomic_dec( &p_port->ref[type % ref_mask] );\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
#else\r
UNREFERENCED_PARAMETER(type);\r
#endif\r
+ cl_obj_deref( &p_port->obj );\r
+\r
}\r
\r
/* function returns pointer to payload that is going after IP header.\r
*/\r
static void* GetIpPayloadPtr(const ip_hdr_t* const p_ip_hdr)\r
{\r
- return (void*)((uint8_t*)p_ip_hdr + 4*(p_ip_hdr->ver_hl & 0xf));\r
+ return (void*)((uint8_t*)p_ip_hdr + IP_HEADER_LENGTH(p_ip_hdr));\r
}\r
\r
/******************************************************************************\r
p_adapter->p_ifc->get_err_str( status )) );\r
return status;\r
}\r
+\r
+ KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);\r
+\r
+\r
/* Initialize multicast garbage collector timer and DPC object */\r
KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);\r
KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);\r
}\r
\r
qp_create.h_sq_cq = p_port->ib_mgr.h_send_cq;\r
- qp_create.sq_signaled = TRUE;\r
+ qp_create.sq_signaled = FALSE;\r
status = p_port->p_adapter->p_ifc->create_qp(\r
p_port->ib_mgr.h_pd, &qp_create, p_port,\r
__qp_event, &p_port->ib_mgr.h_qp );\r
IPOIB_EXIT( IPOIB_DBG_RECV );\r
}\r
\r
+static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void * s_arg1 , void * s_arg2)\r
+{\r
+\r
+ ipoib_port_t *p_port = context;\r
+\r
+ UNREFERENCED_PARAMETER(p_gc_dpc);\r
+ UNREFERENCED_PARAMETER(s_arg1);\r
+ UNREFERENCED_PARAMETER(s_arg2);\r
+\r
+\r
+ __recv_cb(NULL, p_port);\r
+ ipoib_port_deref( p_port, ref_recv_cb );\r
+\r
+\r
+}\r
+\r
\r
static void\r
__recv_cb(\r
recv_cnt += __recv_mgr_filter( p_port, p_wc, &done_list, &bad_list );\r
cl_perf_stop( &p_port->p_adapter->perf, FilterRecv );\r
\r
- } while( !p_free );\r
+ } while( (!p_free) && (recv_cnt < 128));\r
\r
/* We're done looking at the endpoint map, release the reference. */\r
cl_atomic_dec( &p_port->endpt_rdr );\r
} while( pkt_cnt );\r
cl_spinlock_release( &p_port->recv_lock );\r
\r
- /*\r
- * Rearm after filtering to prevent contention on the enpoint maps\r
- * and eliminate the possibility of having a call to\r
- * __endpt_mgr_insert find a duplicate.\r
- */\r
- cl_perf_start( RearmRecv );\r
- status = p_port->p_adapter->p_ifc->rearm_cq(\r
- p_port->ib_mgr.h_recv_cq, FALSE );\r
- cl_perf_stop( &p_port->p_adapter->perf, RearmRecv );\r
- CL_ASSERT( status == IB_SUCCESS );\r
+ if (p_free ) {\r
+ /*\r
+ * Rearm after filtering to prevent contention on the enpoint maps\r
+ * and eliminate the possibility of having a call to\r
+ * __endpt_mgr_insert find a duplicate.\r
+ */\r
+ cl_perf_start( RearmRecv );\r
+ status = p_port->p_adapter->p_ifc->rearm_cq(\r
+ p_port->ib_mgr.h_recv_cq, FALSE );\r
+ cl_perf_stop( &p_port->p_adapter->perf, RearmRecv );\r
+ CL_ASSERT( status == IB_SUCCESS );\r
\r
- ipoib_port_deref( p_port, ref_recv_cb );\r
+ ipoib_port_deref( p_port, ref_recv_cb );\r
+ } else {\r
+ // Please note the reference is still up\r
+ KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);\r
+ }\r
\r
cl_perf_stop( &p_port->p_adapter->perf, RecvCb );\r
\r
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
("__endpt_mgr_insert returned %s\n",\r
p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+ *pp_src = NULL;\r
return;\r
}\r
cl_obj_unlock( &p_port->obj );\r
if((len - sizeof(ipoib_hdr_t)) > p_port->p_adapter->params.payload_mtu)\r
{\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
- ("Received ETH packet > payload MTU (%d)\n",\r
+ ("Received ETH packet len %d > payload MTU (%d)\n",\r
+ (len - sizeof(ipoib_hdr_t)),\r
p_port->p_adapter->params.payload_mtu) );\r
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
cl_perf_start( FilterArp );\r
status = __send_mgr_filter_arp(\r
p_port, p_eth_hdr, p_buf, buf_len, p_desc );\r
+ p_desc->send_dir = SEND_UD_QP;\r
cl_perf_stop( &p_port->p_adapter->perf, FilterArp );\r
break;\r
\r
* The IPoIB spec doesn't define how to send non IP or ARP packets.\r
* Just send the payload and hope for the best.\r
*/\r
+\r
+ p_desc->send_dir = SEND_UD_QP;\r
cl_perf_start( SendGen );\r
status = __send_gen( p_port, p_desc, 0 );\r
cl_perf_stop( &p_port->p_adapter->perf, SendGen );\r
NdisQueryPacketLength( p_desc->p_pkt, &tot_len );\r
\r
/* Setup the work request. */\r
- p_desc->local_ds[1].vaddr = cl_get_physaddr(\r
+ p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr(\r
((uint8_t*)p_desc->p_buf) + sizeof(eth_hdr_t) );\r
- p_desc->local_ds[1].length = tot_len - sizeof(eth_hdr_t);\r
- p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;\r
- p_desc->wr.num_ds = 2;\r
+ p_desc->send_wr[0].local_ds[1].length = tot_len - sizeof(eth_hdr_t);\r
+ p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
+ p_desc->send_wr[0].wr.num_ds = 2;\r
\r
/* Copy the packet. */\r
NdisCopyFromPacketToPacketSafe( p_packet, bytes_copied, tot_len,\r
CL_ASSERT( i == 0 );\r
if( offset < PAGE_SIZE )\r
{\r
- p_desc->local_ds[j].lkey = p_port->ib_mgr.lkey;\r
- p_desc->local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
+ p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+ p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
/* Add the byte offset since we're on the 1st page. */\r
- p_desc->local_ds[j].vaddr += offset;\r
+ p_desc->send_wr[0].local_ds[j].vaddr += offset;\r
if( offset + buf_len > PAGE_SIZE )\r
{\r
- p_desc->local_ds[j].length = PAGE_SIZE - offset;\r
- buf_len -= p_desc->local_ds[j].length;\r
+ p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;\r
+ buf_len -= p_desc->send_wr[0].local_ds[j].length;\r
}\r
else\r
{\r
- p_desc->local_ds[j].length = buf_len;\r
+ p_desc->send_wr[0].local_ds[j].length = buf_len;\r
buf_len = 0;\r
}\r
/* This data segment is done. Move to the next. */\r
/* Finish this MDL */\r
while( buf_len )\r
{\r
- p_desc->local_ds[j].lkey = p_port->ib_mgr.lkey;\r
- p_desc->local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
+ p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+ p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
/* Add the first page's offset if we're on the first page. */\r
if( i == 0 )\r
- p_desc->local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl );\r
+ p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl );\r
\r
if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE )\r
{\r
/* Buffers spans pages. */\r
- p_desc->local_ds[j].length =\r
+ p_desc->send_wr[0].local_ds[j].length =\r
PAGE_SIZE - MmGetMdlByteOffset( p_mdl );\r
- buf_len -= p_desc->local_ds[j].length;\r
+ buf_len -= p_desc->send_wr[0].local_ds[j].length;\r
/* This page is done. Move to the next. */\r
i++;\r
}\r
else\r
{\r
/* Last page of the buffer. */\r
- p_desc->local_ds[j].length = buf_len;\r
+ p_desc->send_wr[0].local_ds[j].length = buf_len;\r
buf_len = 0;\r
}\r
/* This data segment is done. Move to the next. */\r
}\r
\r
/* Set the number of data segments. */\r
- p_desc->wr.num_ds = j;\r
+ p_desc->send_wr[0].wr.num_ds = j;\r
\r
IPOIB_EXIT( IPOIB_DBG_SEND );\r
return IB_SUCCESS;\r
}\r
\r
/* Remember that one of the DS entries is reserved for the IPoIB header. */\r
- if( ( p_sgl->NumberOfElements > MAX_SEND_SGE ||\r
+ if( ( p_sgl->NumberOfElements >= MAX_SEND_SGE ||\r
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )\r
{\r
\r
- IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
+ IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
("Too many buffers %d to fit in WR ds_array[%d] \\r
Or buffer[0] length %d < Eth header. Copying data.\n",\r
p_sgl->NumberOfElements, MAX_SEND_SGE, p_sgl->Elements[0].Length ) );\r
}\r
else\r
{\r
- p_desc->local_ds[j].vaddr =\r
+ p_desc->send_wr[0].local_ds[j].vaddr =\r
p_sgl->Elements[i].Address.QuadPart + offset;\r
- p_desc->local_ds[j].length =\r
+ p_desc->send_wr[0].local_ds[j].length =\r
p_sgl->Elements[i].Length - offset;\r
- p_desc->local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+ p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
i++;\r
j++;\r
break;\r
/* Now fill in the rest of the local data segments. */\r
while( i < p_sgl->NumberOfElements )\r
{\r
- p_desc->local_ds[j].vaddr = p_sgl->Elements[i].Address.QuadPart;\r
- p_desc->local_ds[j].length = p_sgl->Elements[i].Length;\r
- p_desc->local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+ p_desc->send_wr[0].local_ds[j].vaddr = p_sgl->Elements[i].Address.QuadPart;\r
+ p_desc->send_wr[0].local_ds[j].length = p_sgl->Elements[i].Length;\r
+ p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
i++;\r
j++;\r
}\r
\r
/* Set the number of data segments. */\r
- p_desc->wr.num_ds = j;\r
+ p_desc->send_wr[0].wr.num_ds = j;\r
\r
IPOIB_EXIT( IPOIB_DBG_SEND );\r
return NDIS_STATUS_SUCCESS;\r
{\r
NDIS_STATUS status;\r
ip_hdr_t *p_ip_hdr;\r
+ uint32_t ip_packet_len;\r
\r
PERF_DECLARE( QueryIp );\r
PERF_DECLARE( SendTcp );\r
return NDIS_STATUS_BUFFER_TOO_SHORT;\r
}\r
\r
- if( p_ip_hdr->offset ||\r
- p_ip_hdr->prot != IP_PROT_UDP )\r
+ switch( p_ip_hdr->prot )\r
{\r
- /* Check if this packet is IGMP */\r
- if ( p_ip_hdr->prot == IP_PROT_IGMP ) \r
- {\r
- /*\r
- In igmp packet I saw that iph arrive in 2 NDIS_BUFFERs:\r
- 1. iph\r
- 2. ip options\r
- So to get the IGMP packet we need to skip the ip options NDIS_BUFFER\r
- */\r
- size_t iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;\r
- size_t iph_options_size = iph_size_in_bytes - buf_len;\r
- buf_len -= sizeof(ip_hdr_t);//without ipheader\r
+ case IP_PROT_UDP:\r
\r
- /*\r
- Could be a case that arrived igmp packet not from type IGMPv2 ,\r
- but IGMPv1 or IGMPv3.\r
- We anyway pass it to __send_mgr_filter_igmp_v2().\r
- */\r
- __send_mgr_filter_igmp_v2(p_port, p_ip_hdr, iph_options_size, p_buf, buf_len);\r
- }\r
- /* Not a UDP packet. */\r
- cl_perf_start( SendTcp );\r
- status = __send_gen( p_port, p_desc,0 );\r
- cl_perf_stop( &p_port->p_adapter->perf, SendTcp );\r
- IPOIB_EXIT( IPOIB_DBG_SEND );\r
+ cl_perf_start( FilterUdp );\r
+ status = __send_mgr_filter_udp(\r
+ p_port, p_ip_hdr, p_buf, (buf_len - sizeof(ip_hdr_t)), p_desc );\r
+ cl_perf_stop( &p_port->p_adapter->perf, FilterUdp );\r
+ if( status == NDIS_STATUS_PENDING )\r
+ { /* not DHCP packet, keep going */\r
+ if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )\r
+ p_desc->send_dir = SEND_UD_QP;\r
+ else\r
+ p_desc->send_dir = SEND_RC_QP;\r
+ break;\r
+ }\r
return status;\r
+ \r
+ case IP_PROT_TCP:\r
+ p_desc->send_dir = SEND_RC_QP;\r
+ break;\r
+ case IP_PROT_IGMP:\r
+ /*\r
+ In igmp packet I saw that iph arrive in 2 NDIS_BUFFERs:\r
+ 1. iph\r
+ 2. ip options\r
+ So to get the IGMP packet we need to skip the ip options NDIS_BUFFER.\r
+ Could be a case that arrived igmp packet not from type IGMPv2 ,\r
+ but IGMPv1 or IGMPv3.\r
+ We anyway pass it to __send_mgr_filter_igmp_v2().\r
+ */\r
+ status =\r
+ __send_mgr_filter_igmp_v2(p_port, p_ip_hdr,\r
+ (size_t)( IP_HEADER_LENGTH(p_ip_hdr) - buf_len ),\r
+ p_buf, (buf_len - sizeof(ip_hdr_t)) );\r
+ if( status != NDIS_STATUS_SUCCESS )\r
+ return status;\r
+ p_desc->send_dir = SEND_UD_QP;\r
+ break;\r
+ case IP_PROT_ICMP:\r
+ p_desc->send_dir = SEND_UD_QP;\r
+ default:\r
+ break;\r
+ }\r
+ \r
+ if( !p_port->p_adapter->params.cm_enabled )\r
+ {\r
+ p_desc->send_dir = SEND_UD_QP;\r
+ goto send_gen;\r
+ }\r
+ else if( endpt_cm_get_state( p_desc->p_endpt ) != IPOIB_CM_CONNECTED )\r
+ {\r
+ p_desc->send_dir = SEND_UD_QP;\r
}\r
\r
- buf_len -= sizeof(ip_hdr_t);\r
+ if( p_desc->send_dir == SEND_UD_QP )\r
+ {\r
+ ip_packet_len = cl_ntoh16( p_ip_hdr->length );\r
+ if( ip_packet_len > p_port->p_adapter->params.payload_mtu )\r
+ {\r
+ status = __send_fragments( p_port, p_desc, (eth_hdr_t* const)p_eth_hdr,\r
+ (ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_buf );\r
+ return status;\r
+ }\r
+ }\r
\r
- cl_perf_start( FilterUdp );\r
- status = __send_mgr_filter_udp(\r
- p_port, p_ip_hdr, p_buf, buf_len, p_desc );\r
- cl_perf_stop( &p_port->p_adapter->perf, FilterUdp );\r
+send_gen:\r
+ cl_perf_start( SendTcp );\r
+ status = __send_gen( p_port, p_desc,0 );\r
+ cl_perf_stop( &p_port->p_adapter->perf, SendTcp );\r
\r
IPOIB_EXIT( IPOIB_DBG_SEND );\r
return status;\r
p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )\r
{\r
/* Not a DHCP packet. */\r
- cl_perf_start( SendUdp );\r
- status = __send_gen( p_port, p_desc,0 );\r
- cl_perf_stop( &p_port->p_adapter->perf, SendUdp );\r
- IPOIB_EXIT( IPOIB_DBG_SEND );\r
- return status;\r
+ return NDIS_STATUS_PENDING;\r
}\r
\r
buf_len -= sizeof(udp_hdr_t);\r
}\r
/* no chksum for udp */\r
p_desc->p_buf->ip.prot.udp.hdr.chksum = 0;\r
- p_desc->local_ds[1].vaddr = cl_get_physaddr( p_desc->p_buf );\r
- p_desc->local_ds[1].length = sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t);\r
- p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;\r
- p_desc->wr.num_ds = 2;\r
+ p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_desc->p_buf );\r
+ p_desc->send_wr[0].local_ds[1].length = sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t);\r
+ p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
+ p_desc->send_wr[0].wr.num_ds = 2;\r
+ p_desc->send_dir = SEND_UD_QP;\r
IPOIB_EXIT( IPOIB_DBG_SEND );\r
return NDIS_STATUS_SUCCESS;\r
}\r
#if DBG\r
if( p_port->p_adapter->params.cm_enabled )\r
{\r
- IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
- (" %s SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
- (( p_arp->op == ARP_OP_REQ )? "ARP REQUEST" : "ARP REPLY" ),\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+ (" ARP SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
p_desc->p_endpt, \r
endpt_cm_get_state( p_desc->p_endpt ),\r
p_desc->p_endpt->cm_flag, \r
\r
p_ib_arp->dst_ip = p_arp->dst_ip;\r
\r
- p_desc->local_ds[1].vaddr = cl_get_physaddr( p_ib_arp );\r
- p_desc->local_ds[1].length = sizeof(ipoib_arp_pkt_t);\r
- p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;\r
- p_desc->wr.num_ds = 2;\r
+ p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_ib_arp );\r
+ p_desc->send_wr[0].local_ds[1].length = sizeof(ipoib_arp_pkt_t);\r
+ p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
+ p_desc->send_wr[0].wr.num_ds = 2;\r
+ p_desc->send_wr[0].wr.p_next = NULL;\r
\r
IPOIB_EXIT( IPOIB_DBG_SEND );\r
return NDIS_STATUS_SUCCESS;\r
IN NDIS_PACKET* const p_packet,\r
OUT NDIS_BUFFER** const pp_buf,\r
OUT eth_hdr_t** const pp_eth_hdr,\r
- OUT UINT* p_buf_len,\r
- OUT UINT* p_tot_len )\r
+ OUT UINT* p_buf_len )\r
{\r
+ UINT tot_len;\r
\r
IPOIB_ENTER( IPOIB_DBG_SEND );\r
\r
NdisGetFirstBufferFromPacketSafe(\r
- p_packet, pp_buf, pp_eth_hdr, p_buf_len, p_tot_len, NormalPagePriority );\r
+ p_packet, pp_buf, pp_eth_hdr, p_buf_len, &tot_len, NormalPagePriority );\r
\r
if( !*pp_eth_hdr )\r
{\r
PNDIS_PACKET_EXTENSION PktExt;\r
PNDIS_TCP_IP_CHECKSUM_PACKET_INFO pChecksumPktInfo; //NDIS 5.1\r
ULONG mss;\r
- LsoData TheLsoData;\r
- INT IndexOfData = 0;\r
- ULONG PhysBufCount;\r
- ULONG PacketLength;\r
- PNDIS_BUFFER FirstBuffer;\r
- uint16_t lso_header_size;\r
-\r
\r
PERF_DECLARE( SendMgrFilter );\r
\r
IPOIB_ENTER( IPOIB_DBG_SEND );\r
\r
/* Format the send descriptor. */\r
- cl_perf_start( SendMgrFilter );\r
\r
PktExt = NDIS_PACKET_EXTENSION_FROM_PACKET(p_desc->p_pkt);\r
- pChecksumPktInfo = (PNDIS_TCP_IP_CHECKSUM_PACKET_INFO)&PktExt->NdisPacketInfo[TcpIpChecksumPacketInfo];\r
+ pChecksumPktInfo = \r
+ (PNDIS_TCP_IP_CHECKSUM_PACKET_INFO)&PktExt->NdisPacketInfo[TcpIpChecksumPacketInfo];\r
mss = PtrToUlong(PktExt->NdisPacketInfo[TcpLargeSendPacketInfo]);\r
- //TODO: optimization: we already got total length from NdisGetFirstBufferFromPacketSafe before\r
- NdisQueryPacket(p_desc->p_pkt, (PUINT)&PhysBufCount, NULL, &FirstBuffer,(PUINT)&PacketLength);\r
\r
/* Format the send descriptor. */\r
hdr_idx = cl_atomic_inc( &p_port->hdr_idx );\r
p_port->hdr[hdr_idx].type = p_eth_hdr->type;\r
p_port->hdr[hdr_idx].resv = 0;\r
\r
+ p_desc->send_wr[0].local_ds[0].vaddr = cl_get_physaddr( &p_port->hdr[hdr_idx] );\r
+ p_desc->send_wr[0].local_ds[0].length = sizeof(ipoib_hdr_t);\r
+ p_desc->send_wr[0].local_ds[0].lkey = p_port->ib_mgr.lkey;\r
+ p_desc->send_wr[0].wr.send_opt = 0;\r
+\r
if( p_port->p_adapter->params.lso && mss )\r
{\r
- memset(&TheLsoData, 0, sizeof TheLsoData );\r
- status = GetLsoHeaderSize(\r
- p_port,\r
- FirstBuffer, \r
- &TheLsoData, \r
- &lso_header_size,\r
- &IndexOfData,\r
- &p_port->hdr[hdr_idx] );\r
-\r
- if ((status != NDIS_STATUS_SUCCESS ) || \r
- (TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) {\r
- ASSERT(FALSE);\r
-\r
- IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this packet\n"));\r
-\r
- //NdisReleaseSpinLock(&Port->SendLock);\r
- //MP_ASSERT_NDIS_PACKET_TYPE(Packet);\r
- //SendComplete(Port, Packet, NDIS_STATUS_INVALID_PACKET);\r
- //NdisAcquireSpinLock(&Port->SendLock);\r
- //IPOIB_PRINT_EXIT\r
+ status = __build_lso_desc( p_port, p_desc, mss, hdr_idx );\r
+ if( status != NDIS_STATUS_SUCCESS )\r
+ {\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("__build_lso_desc returned 0x%08X.\n", status) );\r
return status;\r
}\r
- ASSERT(lso_header_size > 0);\r
- p_desc->wr.dgrm.ud.mss = mss;\r
- p_desc->wr.dgrm.ud.header = TheLsoData.LsoBuffers[0].pData;\r
- p_desc->wr.dgrm.ud.hlen = lso_header_size; \r
- // Tell NDIS how much we will send.\r
- PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = UlongToPtr(PacketLength);\r
- p_desc->wr.send_opt |= (IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | IB_SEND_OPT_SIGNALED;\r
- __send_gen(p_port, p_desc, IndexOfData);\r
- p_desc->wr.wr_type = WR_LSO;\r
- } else {\r
-\r
- /* Setup the first local data segment (used for the IPoIB header). */\r
- p_desc->local_ds[0].vaddr = cl_get_physaddr( &p_port->hdr[hdr_idx] );\r
- p_desc->local_ds[0].length = sizeof(ipoib_hdr_t);\r
- p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;\r
-\r
+ }\r
+ else\r
+ {\r
+ uint32_t i;\r
+ cl_perf_start( SendMgrFilter );\r
status = __send_mgr_filter(\r
- p_port, p_eth_hdr, p_buf, buf_len, p_desc);\r
+ p_port, p_eth_hdr, p_buf, buf_len, p_desc );\r
cl_perf_stop( &p_port->p_adapter->perf, SendMgrFilter );\r
if( status != NDIS_STATUS_SUCCESS )\r
{\r
("__send_mgr_filter returned 0x%08X.\n", status) );\r
return status;\r
}\r
- p_desc->wr.wr_type = WR_SEND;\r
- p_desc->wr.send_opt = IB_SEND_OPT_SIGNALED;\r
- }\r
-\r
\r
-\r
- /* Setup the work request. */\r
- p_desc->wr.p_next = NULL;\r
- p_desc->wr.wr_id = (uintn_t)p_desc->p_pkt;\r
- p_desc->wr.ds_array = p_desc->local_ds;\r
-\r
- /* check if we can send data through RC QP */\r
- if( !( p_eth_hdr->dst.addr[0] & (uint8_t)0x01 ) && \r
- endpt_cm_get_state( p_desc->p_endpt) == IPOIB_CM_CONNECTED )\r
- {\r
- p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;\r
- }\r
- else /* UD QP */\r
- {\r
- if( p_port->p_adapter->params.send_chksum_offload && \r
- ( pChecksumPktInfo->Transmit.NdisPacketChecksumV4 || \r
- pChecksumPktInfo->Transmit.NdisPacketChecksumV6 ))\r
+ if( p_desc->send_dir == SEND_UD_QP )\r
{\r
- // Set transimition checksum offloading \r
- if( pChecksumPktInfo->Transmit.NdisPacketIpChecksum )\r
+ p_desc->send_qp = p_port->ib_mgr.h_qp; // UD QP\r
+ for( i = 0; i < p_desc->num_wrs; i++ )\r
{\r
- p_desc->wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;\r
+ p_desc->send_wr[i].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;\r
+ p_desc->send_wr[i].wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;\r
+ p_desc->send_wr[i].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;\r
+ p_desc->send_wr[i].wr.dgrm.ud.pkey_index = p_port->pkey_index;\r
+ p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;\r
+ p_desc->send_wr[i].wr.send_opt = 0;\r
+\r
+ if( p_port->p_adapter->params.send_chksum_offload && \r
+ ( pChecksumPktInfo->Transmit.NdisPacketChecksumV4 || \r
+ pChecksumPktInfo->Transmit.NdisPacketChecksumV6 ))\r
+ {\r
+ // Set transimition checksum offloading \r
+ if( pChecksumPktInfo->Transmit.NdisPacketIpChecksum )\r
+ {\r
+ p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;\r
+ }\r
+ if( pChecksumPktInfo->Transmit.NdisPacketTcpChecksum )\r
+ {\r
+ p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;\r
+ }\r
+ }\r
}\r
- if( pChecksumPktInfo->Transmit.NdisPacketTcpChecksum )\r
+ }\r
+ else // RC QP\r
+ {\r
+ CL_ASSERT( p_desc->send_dir == SEND_RC_QP );\r
+ p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;\r
+ }\r
+ for( i = 0; i < p_desc->num_wrs; i++ )\r
+ {\r
+ p_desc->send_wr[i].wr.wr_type = WR_SEND;\r
+ p_desc->send_wr[i].wr.wr_id = (uintn_t)p_desc->p_pkt;\r
+ p_desc->send_wr[i].wr.ds_array = &p_desc->send_wr[i].local_ds[0];\r
+ if( i )\r
{\r
- p_desc->wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;\r
+ p_desc->send_wr[i-1].wr.p_next = &p_desc->send_wr[i].wr;\r
}\r
}\r
-\r
- p_desc->send_qp = p_port->ib_mgr.h_qp;\r
- p_desc->wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;\r
- p_desc->wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;\r
- p_desc->wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;\r
- p_desc->wr.dgrm.ud.pkey_index = p_port->pkey_index;\r
- p_desc->wr.dgrm.ud.rsvd = NULL;\r
+ p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |= IB_SEND_OPT_SIGNALED;\r
+ p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;\r
}\r
\r
/* Store context in our reserved area of the packet. */\r
return NDIS_STATUS_SUCCESS;\r
}\r
\r
+static NDIS_STATUS\r
+__build_lso_desc(\r
+ IN ipoib_port_t* const p_port,\r
+ IN OUT ipoib_send_desc_t* const p_desc,\r
+ IN ULONG mss,\r
+ IN int32_t hdr_idx )\r
+{\r
+ NDIS_STATUS status;\r
+ PNDIS_PACKET_EXTENSION PktExt;\r
+ LsoData TheLsoData;\r
+ INT IndexOfData = 0;\r
+ ULONG PhysBufCount;\r
+ ULONG PacketLength;\r
+ PNDIS_BUFFER FirstBuffer;\r
+ uint16_t lso_header_size;\r
+\r
+ IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+ NdisQueryPacket(p_desc->p_pkt, (PUINT)&PhysBufCount, NULL, \r
+ &FirstBuffer,(PUINT)&PacketLength);\r
+ PktExt = NDIS_PACKET_EXTENSION_FROM_PACKET(p_desc->p_pkt);\r
+\r
+ memset(&TheLsoData, 0, sizeof TheLsoData );\r
+ status = GetLsoHeaderSize(\r
+ p_port,\r
+ FirstBuffer, \r
+ &TheLsoData, \r
+ &lso_header_size,\r
+ &IndexOfData,\r
+ &p_port->hdr[hdr_idx] );\r
+\r
+ if ((status != NDIS_STATUS_SUCCESS ) || \r
+ (TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) \r
+ {\r
+ ASSERT(FALSE);\r
+\r
+ IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this packet\n"));\r
+\r
+ //NdisReleaseSpinLock(&Port->SendLock);\r
+ //MP_ASSERT_NDIS_PACKET_TYPE(Packet);\r
+ //SendComplete(Port, Packet, NDIS_STATUS_INVALID_PACKET);\r
+ //NdisAcquireSpinLock(&Port->SendLock);\r
+ //IPOIB_PRINT_EXIT\r
+ if( status == NDIS_STATUS_SUCCESS )\r
+ {\r
+ status = NDIS_STATUS_INVALID_PACKET;\r
+ }\r
+ return status;\r
+ }\r
+ ASSERT(lso_header_size > 0);\r
+ // Tell NDIS how much we will send.\r
+ PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = UlongToPtr(PacketLength);\r
+\r
+ p_desc->send_wr[0].wr.dgrm.ud.mss = mss;\r
+ p_desc->send_wr[0].wr.dgrm.ud.header = TheLsoData.LsoBuffers[0].pData;\r
+ p_desc->send_wr[0].wr.dgrm.ud.hlen = lso_header_size; \r
+ p_desc->send_wr[0].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;\r
+ p_desc->send_wr[0].wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;\r
+ p_desc->send_wr[0].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;\r
+ p_desc->send_wr[0].wr.dgrm.ud.pkey_index = p_port->pkey_index;\r
+ p_desc->send_wr[0].wr.dgrm.ud.rsvd = NULL;\r
+ \r
+ p_desc->send_wr[0].wr.wr_id = (uintn_t)p_desc->p_pkt;\r
+ p_desc->send_wr[0].wr.ds_array = p_desc->send_wr[0].local_ds;\r
+ p_desc->send_wr[0].wr.wr_type = WR_LSO;\r
+ p_desc->send_wr[0].wr.send_opt = \r
+ (IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | IB_SEND_OPT_SIGNALED;\r
+ \r
+ p_desc->send_wr[0].wr.p_next = NULL;\r
+ p_desc->send_qp = p_port->ib_mgr.h_qp;\r
+ p_desc->send_dir = SEND_UD_QP;\r
+ status = __send_gen(p_port, p_desc, IndexOfData );\r
+\r
+ IPOIB_EXIT( IPOIB_DBG_SEND );\r
+ return status;\r
+}\r
\r
static inline void\r
__process_failed_send(\r
eth_hdr_t *p_eth_hdr;\r
NDIS_BUFFER *p_buf;\r
UINT buf_len;\r
- UINT tot_len;\r
+ ib_send_wr_t *p_wr_failed;\r
\r
PERF_DECLARE( GetEthHdr );\r
PERF_DECLARE( BuildSendDesc );\r
desc.p_endpt = NULL;\r
desc.p_buf = NULL;\r
desc.send_qp = NULL;\r
+ desc.num_wrs = 1;\r
\r
/* Get the ethernet header so we can find the endpoint. */\r
cl_perf_start( GetEthHdr );\r
status = __send_mgr_get_eth_hdr(\r
- p_packet_array[i], &p_buf, &p_eth_hdr, &buf_len, &tot_len );\r
+ p_packet_array[i], &p_buf, &p_eth_hdr, &buf_len );\r
cl_perf_stop( &p_port->p_adapter->perf, GetEthHdr );\r
if( status != NDIS_STATUS_SUCCESS )\r
{\r
NDIS_BUFFER *p_ip_hdr_buf;\r
UINT ip_hdr_buf_len;\r
\r
- /* drop multicast packets larger than UD MTU */\r
- if( p_port->p_adapter->params.cm_enabled &&\r
- tot_len > p_port->p_adapter->params.payload_mtu )\r
- {\r
- cl_perf_start( ProcessFailedSends );\r
- __process_failed_send( p_port, &desc, NDIS_STATUS_SUCCESS );\r
- cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
- continue;\r
- }\r
// Extract the ip hdr \r
if(buf_len >= sizeof(ip_hdr_t)+ sizeof(eth_hdr_t))\r
{\r
if( status == NDIS_STATUS_PENDING )\r
{\r
ipoib_endpt_deref( desc.p_endpt );\r
- break;\r
+ continue;\r
}\r
cl_perf_start( ProcessFailedSends );\r
__process_failed_send( p_port, &desc, status );\r
\r
/* Post the WR. */\r
cl_perf_start( PostSend );\r
- ib_status = p_port->p_adapter->p_ifc->post_send( desc.send_qp, &desc.wr, NULL );\r
+ ib_status = p_port->p_adapter->p_ifc->post_send( desc.send_qp, &desc.send_wr[0].wr, &p_wr_failed );\r
cl_perf_stop( &p_port->p_adapter->perf, PostSend );\r
if( ib_status != IB_SUCCESS )\r
{\r
eth_hdr_t *p_eth_hdr;\r
NDIS_BUFFER *p_buf;\r
UINT buf_len;\r
- UINT tot_len;\r
+ ib_send_wr_t *p_wr_failed;\r
\r
PERF_DECLARE( GetEndpt );\r
PERF_DECLARE( BuildSendDesc );\r
desc.p_endpt = NULL;\r
desc.p_buf = NULL;\r
desc.send_qp = NULL;\r
+ desc.num_wrs = 1;\r
\r
/* Get the ethernet header so we can find the endpoint. */\r
status = __send_mgr_get_eth_hdr(\r
- desc.p_pkt, &p_buf, &p_eth_hdr, &buf_len, &tot_len );\r
+ desc.p_pkt, &p_buf, &p_eth_hdr, &buf_len );\r
if( status != NDIS_STATUS_SUCCESS )\r
{\r
cl_perf_start( ProcessFailedSends );\r
cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );\r
if( status == NDIS_STATUS_PENDING )\r
{\r
+ CL_ASSERT(desc.p_endpt == NULL);\r
cl_qlist_insert_head( &p_port->send_mgr.pending_list,\r
IPOIB_LIST_ITEM_FROM_PACKET( desc.p_pkt ) );\r
break;\r
else if( status != NDIS_STATUS_SUCCESS )\r
{\r
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );\r
+ CL_ASSERT(desc.p_endpt == NULL);\r
\r
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )\r
{\r
{\r
/* ARP REPLY packet queued */\r
ipoib_endpt_deref( desc.p_endpt );\r
- break;\r
+ continue;\r
}\r
cl_perf_start( ProcessFailedSends );\r
__process_failed_send( p_port, &desc, status );\r
\r
/* Post the WR. */\r
cl_perf_start( PostSend );\r
- ib_status = p_port->p_adapter->p_ifc->post_send( desc.send_qp, &desc.wr, NULL );\r
+ ib_status = p_port->p_adapter->p_ifc->post_send( desc.send_qp, &desc.send_wr[0].wr, &p_wr_failed );\r
cl_perf_stop( &p_port->p_adapter->perf, PostSend );\r
if( ib_status != IB_SUCCESS )\r
{\r
\r
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,\r
&p_port->p_local_endpt->mac_item );\r
- cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,\r
- &p_port->p_local_endpt->gid_item );\r
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,\r
&p_port->p_local_endpt->lid_item );\r
\r
/* Destroy all multicast endpoints now that we have released the lock. */\r
while( cl_qlist_count( &mc_list ) )\r
{\r
- cl_obj_destroy( &PARENT_STRUCT( cl_qlist_remove_head( &mc_list ),\r
- ipoib_endpt_t, mac_item.pool_item.list_item )->obj );\r
+ cl_list_item_t *p_item;\r
+ p_item = cl_qlist_remove_head( &mc_list );\r
+ p_endpt = PARENT_STRUCT(p_item, ipoib_endpt_t, mac_item.pool_item.list_item);\r
+ cl_obj_destroy( &p_endpt->obj);\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
\r
IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
\r
+ /* This function must be called from the recieve path */\r
+ CL_ASSERT(p_port->endpt_rdr > 0);\r
+\r
cl_obj_lock( &p_port->obj );\r
- /* Wait for all readers to complete. */\r
+ /* Wait for all readers to complete. */ \r
while( p_port->endpt_rdr > 1 )\r
;\r
\r
p_qitem = cl_qmap_insert(\r
&p_port->endpt_mgr.lid_endpts, p_endpt->dlid, &p_endpt->lid_item );\r
CL_ASSERT( p_qitem == &p_endpt->lid_item );\r
+ if (p_qitem != &p_endpt->lid_item) {\r
+ // Since we failed to insert into the list, make sure it is not removed\r
+ p_endpt->dlid =0;\r
+ }\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
\r
/* Allocate the broadcast endpoint. */\r
p_endpt = ipoib_endpt_create( &p_mcast_rec->p_member_rec->mgid,\r
- p_mcast_rec->p_member_rec->mlid, CL_HTON32(0x00FFFFFF) );\r
+ 0 , CL_HTON32(0x00FFFFFF) );\r
if( !p_endpt )\r
{\r
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
}\r
\r
-\r
-void\r
-ipoib_port_flush_endpts(\r
- IN ipoib_port_t* const p_port )\r
-{\r
- cl_map_item_t *p_item;\r
- ipoib_endpt_t *p_endpt;\r
-\r
- IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
- cl_obj_lock( &p_port->obj );\r
- p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );\r
- while( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
- {\r
- p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
- p_item = cl_qmap_next( p_item );\r
-\r
- /*\r
- * If the endpoint has been marked as expired before, and we have\r
- * an AV handle, free the AV.\r
- */\r
- if( p_endpt->expired && p_endpt->h_av )\r
- {\r
- CL_ASSERT( p_endpt->obj.ref_cnt == 1 );\r
- p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av );\r
- p_endpt->h_av = NULL;\r
- p_endpt->expired = FALSE;\r
- }\r
-\r
- /*\r
- * If the endpoint is not in use, mark it as expired.\r
- * Note that the ref count is only zero when the endpoint gets\r
- * destroyed, so an endpoint that is not in use has a ref count of 1.\r
- * Also note that we never expire any multicast endpoints.\r
- */\r
- CL_ASSERT( p_endpt->obj.ref_cnt != 0 );\r
- if( p_endpt->obj.ref_cnt == 1 && p_endpt->h_av && !p_endpt->h_mcast )\r
- p_endpt->expired = TRUE;\r
- }\r
- cl_obj_unlock( &p_port->obj );\r
-\r
- IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-}\r
-\r
-\r
/*\r
* The sequence for port up is as follows:\r
* 1. The port goes active. This allows the adapter to send SA queries\r
\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
\r
+ cl_obj_lock( &p_port->obj );\r
+ if ((p_port->state == IB_QPS_INIT) ||\r
+ (p_port->state == IB_QPS_RTS)){\r
+ cl_obj_unlock( &p_port->obj );\r
+ status = STATUS_SUCCESS;\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+ ("p_port->state = %d - Aborting.\n", p_port->state) ); \r
+ goto up_done;\r
+ }\r
+ p_port->state = IB_QPS_INIT;\r
+ cl_obj_unlock( &p_port->obj ); \r
+\r
+\r
/* Wait for all work requests to get flushed. */\r
while( p_port->recv_mgr.depth || p_port->send_mgr.depth )\r
cl_thread_suspend( 0 );\r
\r
- cl_obj_lock( &p_port->obj );\r
- p_port->state = IB_QPS_INIT;\r
KeResetEvent( &p_port->sa_event );\r
- cl_obj_unlock( &p_port->obj );\r
\r
mad_out = (ib_mad_t*)cl_zalloc(256);\r
if(! mad_out)\r
ipoib_set_inactive( p_port->p_adapter );\r
__endpt_mgr_reset_all( p_port );\r
}\r
+ ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+ p_port->state = IB_QPS_ERROR;\r
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
}\r
\r
cl_memclr( &av_attr, sizeof(ib_av_attr_t) );\r
av_attr.port_num = p_port->port_num;\r
av_attr.sl = 0;\r
- IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ENDPT,\r
- ("<__endpt_mgr_add_local>: av_attr.dlid = p_port_info->base_lid = %d\n",p_port_info->base_lid));\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+ (" av_attr.dlid = p_port_info->base_lid = %d\n", cl_ntoh16( p_port_info->base_lid ) ));\r
av_attr.dlid = p_port_info->base_lid;\r
av_attr.static_rate = p_port->ib_mgr.rate;\r
av_attr.path_bits = 0;\r
\r
cl_obj_lock( &p_port->obj );\r
p_port->ib_mgr.h_query = NULL;\r
+\r
+ CL_ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
if( p_port->state != IB_QPS_INIT )\r
{\r
status = IB_CANCELED;\r
goto done;\r
}\r
-\r
+ \r
status = p_query_rec->status;\r
\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+ ("status of request %s\n", \r
+ p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+\r
switch( status )\r
{\r
case IB_SUCCESS:\r
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );\r
}\r
-\r
done:\r
cl_obj_unlock( &p_port->obj );\r
\r
ipoib_set_inactive( p_port->p_adapter );\r
__endpt_mgr_reset_all( p_port );\r
}\r
+ p_port->state = IB_QPS_ERROR;\r
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
}\r
\r
p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;\r
\r
cl_obj_lock( &p_port->obj );\r
+\r
+ ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
if( p_port->state != IB_QPS_INIT )\r
{\r
cl_obj_unlock( &p_port->obj );\r
if( p_mcast_rec->status == IB_SUCCESS )\r
-\r
{\r
ipoib_port_ref(p_port, ref_leave_mcast);\r
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, __leave_error_mcast_cb );\r
("Invalid state - Aborting.\n") );\r
return;\r
}\r
-\r
status = p_mcast_rec->status;\r
-\r
if( status != IB_SUCCESS )\r
{\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
{\r
ipoib_set_inactive( p_port->p_adapter );\r
__endpt_mgr_reset_all( p_port );\r
+ ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+ p_port->state = IB_QPS_ERROR;\r
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
}\r
ipoib_port_deref( p_port, ref_bcast_req_failed );\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
return;\r
}\r
- cl_obj_unlock( &p_port->obj );\r
p_port->bc_join_retry_cnt = 0;\r
- if(! p_port->p_local_endpt)\r
+\r
+ while( p_port->endpt_rdr )\r
+ {\r
+ cl_obj_unlock( &p_port->obj );\r
+ cl_obj_lock( &p_port->obj );\r
+ }\r
+\r
+ if( !p_port->p_local_endpt )\r
{\r
ib_port_info_t port_info;\r
cl_memclr(&port_info, sizeof(port_info));\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
("__endpt_mgr_add_local returned %s\n",\r
p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+ cl_obj_unlock( &p_port->obj );\r
goto err;\r
}\r
}\r
+\r
+ cl_obj_unlock( &p_port->obj );\r
+\r
status = __endpt_mgr_add_bcast( p_port, p_mcast_rec );\r
if( status != IB_SUCCESS )\r
{\r
err:\r
/* Flag the adapter as hung. */\r
p_port->p_adapter->hung = TRUE;\r
+ ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+ p_port->state = IB_QPS_ERROR; \r
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
ipoib_port_deref( p_port, ref_bcast_error );\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
\r
cl_obj_lock( &p_port->obj );\r
/* Only change the state if we're still in INIT. */\r
- if( p_port->state == IB_QPS_INIT )\r
+ ASSERT( p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+ if (p_port->state == IB_QPS_INIT) {\r
p_port->state = IB_QPS_RTS;\r
+ }\r
cl_obj_unlock( &p_port->obj );\r
\r
/* Prepost receives. */\r
cl_spinlock_release( &p_port->recv_lock );\r
\r
/* Notify the adapter that we now have an active connection. */\r
- ipoib_set_active( p_port->p_adapter );\r
+ status = ipoib_set_active( p_port->p_adapter );\r
+ if( status != IB_SUCCESS )\r
+ {\r
+ ib_qp_mod_t qp_mod;\r
+ ipoib_set_inactive( p_port->p_adapter );\r
+ KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+ ("ipoib_set_active returned %s.\n",p_port->p_adapter->p_ifc->get_err_str( status )));\r
+ cl_spinlock_acquire( &p_port->recv_lock );\r
+ cl_obj_lock( &p_port->obj );\r
+ p_port->state = IB_QPS_ERROR;\r
+ if( p_port->ib_mgr.h_query )\r
+ {\r
+ p_port->p_adapter->p_ifc->cancel_query(\r
+ p_port->p_adapter->h_al, p_port->ib_mgr.h_query );\r
+ p_port->ib_mgr.h_query = NULL;\r
+ }\r
+ cl_obj_unlock( &p_port->obj );\r
+ cl_spinlock_release( &p_port->recv_lock );\r
+\r
+ CL_ASSERT( p_port->ib_mgr.h_qp );\r
+ cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );\r
+ qp_mod.req_state = IB_QPS_ERROR;\r
+ status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, &qp_mod );\r
+ __endpt_mgr_reset_all( p_port );\r
+\r
+ ipoib_port_deref( p_port, ref_join_bcast );\r
+ return;\r
+ }\r
\r
if( p_port->p_adapter->params.cm_enabled &&\r
!p_port->p_local_endpt->conn.h_cm_listen )\r
ib_api_status_t status;\r
ipoib_port_t *p_port;\r
cl_fmap_item_t *p_item;\r
- cl_map_item_t *p_qitem;\r
ipoib_endpt_t *p_endpt;\r
\r
IPOIB_ENTER( IPOIB_DBG_MCAST );\r
p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;\r
\r
cl_obj_lock( &p_port->obj );\r
+ while( p_port->endpt_rdr )\r
+ {\r
+ cl_obj_unlock( &p_port->obj );\r
+ cl_obj_lock( &p_port->obj );\r
+ }\r
if( p_port->state != IB_QPS_RTS )\r
{\r
cl_obj_unlock( &p_port->obj );\r
("Invalid state - Aborting.\n") );\r
return;\r
}\r
- cl_obj_unlock( &p_port->obj );\r
\r
if( p_mcast_rec->status != IB_SUCCESS )\r
{\r
+ cl_obj_unlock( &p_port->obj );\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
("Multicast join request failed with status %s.\n",\r
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );\r
return;\r
}\r
\r
- cl_obj_lock( &p_port->obj );\r
p_item = cl_fmap_get(\r
&p_port->endpt_mgr.gid_endpts, &p_mcast_rec->p_member_rec->mgid );\r
if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) )\r
\r
/*\r
* The endpoint is already in the GID and MAC maps.\r
- * Add it to the LID map if it has local scope.\r
+ * mast endpoint are not used in the LID map.\r
*/\r
- if( p_endpt->dlid )\r
- {\r
- p_qitem = cl_qmap_insert(\r
- &p_port->endpt_mgr.lid_endpts, p_endpt->dlid, &p_endpt->lid_item );\r
- CL_ASSERT( p_qitem == &p_endpt->lid_item );\r
- }\r
+ CL_ASSERT(p_endpt->dlid == 0);\r
/* set flag that endpoint is use */\r
p_endpt->is_in_use = TRUE;\r
cl_obj_unlock( &p_port->obj );\r
}\r
IpHdr = (ip_hdr_t UNALIGNED*)pSrc;\r
IpHeaderLen = (uint16_t)IP_HEADER_LENGTH(IpHdr);\r
- ASSERT(IpHdr->prot == PROTOCOL_TCP);\r
+ ASSERT(IpHdr->prot == IP_PROT_TCP);\r
if (CurrLength < IpHeaderLen) {\r
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error processing packets\n"));\r
return status;\r
cl_qlist_init( &destroy_mc_list );\r
\r
cl_obj_lock( &p_port->obj );\r
+ /* Wait for all readers to finish */\r
+ while( p_port->endpt_rdr )\r
+ {\r
+ cl_obj_unlock( &p_port->obj );\r
+ cl_obj_lock( &p_port->obj );\r
+ }\r
cnt = 0;\r
p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );\r
while( (p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts )) && (cnt < GC_MAX_LEAVE_NUM))\r
/* Destroy all multicast endpoints now that we have released the lock. */\r
while( cl_qlist_count( &destroy_mc_list ) )\r
{\r
- p_endpt = PARENT_STRUCT( cl_qlist_head( &destroy_mc_list ),\r
+ p_endpt = PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),\r
ipoib_endpt_t, mac_item.pool_item.list_item );\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
("mcast garbage collector: destroying endpoint %02x:%02x:%02x:%02x:%02x:%02x \n", \r
p_endpt->mac.addr[3],\r
p_endpt->mac.addr[4],\r
p_endpt->mac.addr[5]) );\r
-\r
- cl_obj_destroy( &PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),\r
- ipoib_endpt_t, mac_item.pool_item.list_item )->obj );\r
+ cl_obj_destroy( &p_endpt->obj );\r
}\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
return STATUS_SUCCESS;\r
}\r
+\r
+/* \r
+* Put all fragments into separate WR and chain together.\r
+* The last WR will be set to generate CQ Event.\r
+* lookaside buffer is used for ipoib and ip headers attached to each WR.\r
+* Buffer will be released on last WR send completion.\r
+*/\r
+static NDIS_STATUS\r
+__send_fragments(\r
+IN ipoib_port_t* const p_port,\r
+IN ipoib_send_desc_t* const p_desc,\r
+IN eth_hdr_t* const p_eth_hdr,\r
+IN ip_hdr_t* const p_ip_hdr,\r
+IN uint32_t buf_len,\r
+IN NDIS_BUFFER* p_ndis_buf )\r
+{\r
+ uint32_t ds_idx = 0;\r
+ uint32_t wr_idx = 0;\r
+ uint32_t sgl_idx = 2; //skip eth hdr, ip hdr\r
+ uint32_t options_len = 0;\r
+ uint8_t* p_options = NULL;\r
+ uint8_t* p_buf;\r
+ uint32_t frag_offset = 0;\r
+ uint32_t next_sge;\r
+ uint32_t wr_size = 0;\r
+ uint32_t ip_hdr_len = IP_HEADER_LENGTH( p_ip_hdr );\r
+ uint32_t total_ip_len = cl_ntoh16( p_ip_hdr->length );\r
+\r
+ SCATTER_GATHER_LIST *p_sgl;\r
+\r
+ IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+ if( IP_DONT_FRAGMENT(p_ip_hdr) )\r
+ return NDIS_STATUS_INVALID_PACKET;\r
+ \r
+ p_sgl = NDIS_PER_PACKET_INFO_FROM_PACKET( p_desc->p_pkt, ScatterGatherListPacketInfo );\r
+ if( !p_sgl )\r
+ {\r
+ ASSERT( p_sgl );\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("Failed to get SGL from packet.\n") );\r
+ return NDIS_STATUS_FAILURE;\r
+ }\r
+ if( ( p_sgl->NumberOfElements > MAX_SEND_SGE ||\r
+ p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )\r
+ {\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("Too many SG Elements in packet.\n") );\r
+ return NDIS_STATUS_FAILURE;\r
+ }\r
+ p_buf = (uint8_t *)\r
+ ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
+ if( !p_buf )\r
+ {\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("Failed to allocate lookaside buffer.\n") );\r
+ return NDIS_STATUS_RESOURCES;\r
+ }\r
+ p_desc->p_buf = (send_buf_t*)p_buf;\r
+\r
+ /* build first fragment WR */\r
+ ((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;\r
+ ((ipoib_hdr_t*)p_buf)->resv = 0;\r
+ p_desc->send_wr[0].local_ds[0].vaddr = cl_get_physaddr( (void *)p_buf );\r
+ p_desc->send_wr[0].local_ds[0].length = sizeof( ipoib_hdr_t );\r
+ p_desc->send_wr[0].local_ds[0].lkey = p_port->ib_mgr.lkey;\r
+ \r
+ p_buf += sizeof( ipoib_hdr_t );\r
+\r
+ if( buf_len < ip_hdr_len )\r
+ { /* ip options in a separate buffer */\r
+ CL_ASSERT( buf_len == sizeof( ip_hdr_t ) );\r
+ NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );\r
+ if( !p_ndis_buf )\r
+ {\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("Failed to get IP options buffer.\n") );\r
+ return NDIS_STATUS_FAILURE;\r
+ }\r
+ NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len, NormalPagePriority );\r
+ if( !p_options )\r
+ {\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("Failed to query IP options buffer address.\n") );\r
+ return NDIS_STATUS_FAILURE;\r
+ }\r
+ cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );\r
+ if( p_options && options_len )\r
+ { \r
+ cl_memcpy( &p_buf[sizeof(ip_hdr_t)], p_options, options_len );\r
+ }\r
+ wr_size = buf_len + options_len;\r
+ sgl_idx++;\r
+ }\r
+ else\r
+ { /*options probably in the same buffer */\r
+ cl_memcpy( p_buf, p_ip_hdr, buf_len );\r
+ options_len = ip_hdr_len - sizeof( ip_hdr_t );\r
+ if( options_len )\r
+ {\r
+ p_options = p_buf + sizeof( ip_hdr_t );\r
+ }\r
+ frag_offset += ( buf_len - ip_hdr_len );\r
+ wr_size = buf_len;\r
+ }\r
+ ++ds_idx;\r
+\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;\r
+ \r
+ /* count how much data can be put into the first WR beside IP header.\r
+ * other protocols headers possibly supplied in subsequent buffers.\r
+ */\r
+ for( sgl_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )\r
+ {\r
+ next_sge = p_sgl->Elements[sgl_idx].Length;\r
+\r
+ /* add sgl if it can fit into the same WR \r
+ * Note: so far not going to split large SGE between WRs,\r
+ * so first fragment could be a smaller size.\r
+ */\r
+ if( next_sge <= ( p_port->p_adapter->params.payload_mtu - wr_size ) )\r
+ {\r
+ ++ds_idx;\r
+ wr_size += next_sge;\r
+ frag_offset += next_sge;\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = \r
+ p_sgl->Elements[sgl_idx].Address.QuadPart;\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+ }\r
+ else\r
+ {\r
+ /* fix ip hdr for the first fragment and move on */\r
+ __update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,\r
+ (uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );\r
+\r
+ p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;\r
+ p_buf += ip_hdr_len;\r
+ p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ): 0);\r
+ frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );\r
+ ++wr_idx;\r
+ ds_idx = 0;\r
+ break;\r
+ }\r
+ }\r
+ total_ip_len -= wr_size;\r
+ wr_size = 0;\r
+\r
+ for( sgl_idx, wr_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )\r
+ {\r
+ uint32_t seg_len;\r
+ uint64_t next_sgl_addr;\r
+ \r
+ if( wr_idx >= ( MAX_WRS_PER_MSG - 1 ) )\r
+ return NDIS_STATUS_RESOURCES;\r
+ \r
+ next_sge = p_sgl->Elements[sgl_idx].Length;\r
+ next_sgl_addr = p_sgl->Elements[sgl_idx].Address.QuadPart;\r
+\r
+ while( next_sge )\r
+ {\r
+ if( ds_idx == 0 )\r
+ { /* new ipoib + ip header */\r
+ ((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;\r
+ ((ipoib_hdr_t*)p_buf)->resv = 0;\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t );\r
+ p_buf += sizeof( ipoib_hdr_t );\r
+ ++ds_idx;\r
+\r
+ cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );\r
+ if( p_options && options_len )\r
+ {\r
+ /* copy ip options if needed */\r
+ __copy_ip_options( &p_buf[sizeof(ip_hdr_t)], \r
+ p_options, options_len, FALSE );\r
+ }\r
+ wr_size = ip_hdr_len;\r
+ }\r
+ if( ds_idx == 1 )\r
+ {\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+ ++ds_idx;\r
+ }\r
+\r
+ seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu - wr_size ) )?\r
+ ( p_port->p_adapter->params.payload_mtu - wr_size ) : next_sge;\r
+\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = next_sgl_addr;\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;\r
+ p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+ ++ds_idx;\r
+ \r
+ wr_size += seg_len;\r
+ total_ip_len -= seg_len;\r
+\r
+ if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len == 0 )\r
+ { /* fix ip hdr for that fragment */\r
+ __update_fragment_ip_hdr( (ip_hdr_t* const)p_buf, (uint16_t)wr_size,\r
+ ((uint16_t)(frag_offset >> 3 )), \r
+ (BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr)) );\r
+ p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;\r
+ if( total_ip_len > 0 )\r
+ {\r
+ ++wr_idx;\r
+ frag_offset += (wr_size - ip_hdr_len);\r
+ wr_size = 0;\r
+ ds_idx = 0;\r
+ p_buf += ip_hdr_len;\r
+ }\r
+ }\r
+ next_sge -= seg_len;\r
+ if( next_sge > 0 )\r
+ {\r
+ next_sgl_addr += seg_len;\r
+ }\r
+ }\r
+ }\r
+ p_desc->num_wrs += wr_idx;\r
+ \r
+ IPOIB_EXIT( IPOIB_DBG_SEND );\r
+ return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+static void\r
+__update_fragment_ip_hdr(\r
+IN ip_hdr_t* const p_ip_hdr,\r
+IN uint16_t fragment_size, \r
+IN uint16_t fragment_offset, \r
+IN BOOLEAN more_fragments )\r
+{\r
+\r
+ p_ip_hdr->length = cl_hton16( fragment_size ); // bytes\r
+ p_ip_hdr->offset = cl_hton16( fragment_offset ); // 8-byte units\r
+ if( more_fragments )\r
+ {\r
+ IP_SET_MORE_FRAGMENTS( p_ip_hdr );\r
+ }\r
+ else\r
+ {\r
+ IP_SET_LAST_FRAGMENT( p_ip_hdr );\r
+ }\r
+ p_ip_hdr->chksum = 0;\r
+ p_ip_hdr->chksum = ipchksum( (uint16_t*)p_ip_hdr, IP_HEADER_LENGTH(p_ip_hdr) );\r
+}\r
+\r
+static void\r
+__copy_ip_options(\r
+IN uint8_t* p_buf,\r
+IN uint8_t* p_options,\r
+IN uint32_t options_len,\r
+IN BOOLEAN copy_all )\r
+{\r
+ uint32_t option_length;\r
+ uint32_t total_length = 0;\r
+ uint32_t copied_length = 0;\r
+ uint8_t* p_src = p_options;\r
+ uint8_t* p_dst = p_buf;\r
+\r
+ if( p_options == NULL || options_len == 0 )\r
+ return;\r
+ if( copy_all )\r
+ {\r
+ cl_memcpy( p_dst, p_src, options_len );\r
+ return;\r
+ }\r
+ do\r
+ {\r
+ if( ( *p_src ) == 0 ) // end of options list\r
+ {\r
+ total_length++;\r
+ break;\r
+ }\r
+ if( ( *p_src ) == 0x1 ) // no op\r
+ {\r
+ p_src++;\r
+ total_length++;\r
+ continue;\r
+ }\r
+ /*from RFC791: \r
+ * This option may be used between options, for example, to align\r
+ * the beginning of a subsequent option on a 32 bit boundary.\r
+ */\r
+ if( copied_length && (copied_length % 4) )\r
+ {\r
+ uint32_t align = 4 - (copied_length % 4);\r
+ cl_memset( p_dst, 0x1, (size_t)align );\r
+ p_dst += align;\r
+ copied_length += align;\r
+ }\r
+ option_length = *(p_src + 1);\r
+\r
+ if( *p_src & 0x80 )\r
+ {\r
+ cl_memcpy( p_dst, p_src, option_length );\r
+ p_dst += option_length;\r
+ copied_length += option_length;\r
+ }\r
+ total_length += option_length;\r
+ p_src += option_length;\r
+\r
+ }while( total_length < options_len );\r
+\r
+ CL_ASSERT( total_length == options_len );\r
+ CL_ASSERT( copied_length <= 40 );\r
+\r
+ /* padding the rest */\r
+ if( options_len > copied_length )\r
+ {\r
+ cl_memclr( p_dst, ( options_len - copied_length ) );\r
+ }\r
+ return;\r
+}\r
Class = Net\r
ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318}\r
Provider = %OPENIB%\r
-DriverVer=09/09/2008,2.0.0000.1576\r
+DriverVer=10/10/2008,2.0.0000.1630\r
CatalogFile=ipoib.cat\r
\r
[Manufacturer]\r
\r
[OPENIB.ntx86]\r
%IpoibDesc% = Ipoib.DDInstall, IBA\IPoIB ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP% = Ipoib.DDInstall, IBA\IPoIBP ; Internet Protocol over InfiniBand Adapter with partition key\r
\r
[OPENIB.ntamd64]\r
%IpoibDesc% = Ipoib.DDInstall, IBA\IPoIB ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP% = Ipoib.DDInstall, IBA\IPoIBP ; Internet Protocol over InfiniBand Adapter with partition key\r
\r
[OPENIB.ntia64]\r
%IpoibDesc% = Ipoib.DDInstall, IBA\IPoIB ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP% = Ipoib.DDInstall, IBA\IPoIBP ; Internet Protocol over InfiniBand Adapter with partition key\r
\r
[Ipoib.DDInstall.ntx86]\r
Characteristics = 0x81 ; NCF_HAS_UI | NCF_VIRTUAL\r
HKR, Ndi\Interfaces, UpperRange, 0, "ndis5"\r
HKR, Ndi\Interfaces, LowerRange, 0, "ethernet"\r
\r
-HKR, Ndi\Params\RqDepth, ParamDesc, 0, "Receive Queue Depth"\r
+HKR, Ndi\Params\RqDepth, ParamDesc, 0, %RQ_DEPTH_STR%\r
HKR, Ndi\Params\RqDepth, Type, 0, "dword"\r
HKR, Ndi\Params\RqDepth, Default, 0, "512"\r
HKR, Ndi\Params\RqDepth, Optional, 0, "0"\r
HKR, Ndi\Params\RqDepth, Max, 0, "1024"\r
HKR, Ndi\Params\RqDepth, Step, 0, "128"\r
\r
-HKR, Ndi\Params\RqLowWatermark, ParamDesc, 0, "Receive Queue Low Watermark"\r
+HKR, Ndi\Params\RqLowWatermark, ParamDesc, 0, %RQ_WATERMARK_STR%\r
HKR, Ndi\Params\RqLowWatermark, Type, 0, "dword"\r
HKR, Ndi\Params\RqLowWatermark, Default, 0, "4"\r
HKR, Ndi\Params\RqLowWatermark, Optional, 0, "0"\r
HKR, Ndi\Params\RqLowWatermark, Max, 0, "8"\r
HKR, Ndi\Params\RqLowWatermark, Step, 0, "1"\r
\r
-HKR, Ndi\Params\SqDepth, ParamDesc, 0, "Send Queue Depth"\r
+HKR, Ndi\Params\SqDepth, ParamDesc, 0, %SQ_DEPTH_STR%\r
HKR, Ndi\Params\SqDepth, Type, 0, "dword"\r
HKR, Ndi\Params\SqDepth, Default, 0, "512"\r
HKR, Ndi\Params\SqDepth, Optional, 0, "0"\r
HKR, Ndi\Params\SqDepth, Max, 0, "1024"\r
HKR, Ndi\Params\SqDepth, Step, 0, "128"\r
\r
-HKR, Ndi\Params\SendChksum, ParamDesc, 0, "Send Checksum Offload"\r
+HKR, Ndi\Params\SendChksum, ParamDesc, 0, %SQ_CSUM_STR%\r
HKR, Ndi\Params\SendChksum, Type, 0, "enum"\r
HKR, Ndi\Params\SendChksum, Default, 0, "1"\r
HKR, Ndi\Params\SendChksum, Optional, 0, "0"\r
-HKR, Ndi\Params\SendChksum\enum, "0", 0, "Disabled"\r
-HKR, Ndi\Params\SendChksum\enum, "1", 0, "Enabled (if supported by HW)"\r
-HKR, Ndi\Params\SendChksum\enum, "2", 0, "Bypass"\r
+HKR, Ndi\Params\SendChksum\enum, "0", 0, %DISABLED_STR%\r
+HKR, Ndi\Params\SendChksum\enum, "1", 0, %ENABLED_IF_STR%\r
+HKR, Ndi\Params\SendChksum\enum, "2", 0, %BYPASS_STR%\r
\r
-HKR, Ndi\Params\RecvChksum, ParamDesc, 0, "Recv Checksum Offload"\r
+HKR, Ndi\Params\RecvChksum, ParamDesc, 0, %RQ_CSUM_STR%\r
HKR, Ndi\Params\RecvChksum, Type, 0, "enum"\r
HKR, Ndi\Params\RecvChksum, Default, 0, "1"\r
HKR, Ndi\Params\RecvChksum, Optional, 0, "0"\r
-HKR, Ndi\Params\RecvChksum\enum, "0", 0, "Disabled"\r
-HKR, Ndi\Params\RecvChksum\enum, "1", 0, "Enabled (if supported by HW)"\r
-HKR, Ndi\Params\RecvChksum\enum, "2", 0, "Bypass"\r
+HKR, Ndi\Params\RecvChksum\enum, "0", 0, %DISABLED_STR%\r
+HKR, Ndi\Params\RecvChksum\enum, "1", 0, %ENABLED_IF_STR%\r
+HKR, Ndi\Params\RecvChksum\enum, "2", 0, %BYPASS_STR%\r
\r
-HKR, Ndi\Params\lso, ParamDesc, 0, "Large Send Offload"\r
+HKR, Ndi\Params\lso, ParamDesc, 0, %LSO_STR%\r
HKR, Ndi\Params\lso, Type, 0, "enum"\r
HKR, Ndi\Params\lso, Default, 0, "0"\r
HKR, Ndi\Params\lso, Optional, 0, "0"\r
-HKR, Ndi\Params\lso\enum, "0", 0, "Disabled"\r
-HKR, Ndi\Params\lso\enum, "1", 0, "Enabled"\r
+HKR, Ndi\Params\lso\enum, "0", 0, %DISABLED_STR%\r
+HKR, Ndi\Params\lso\enum, "1", 0, %ENABLED_STR%\r
\r
\r
-HKR, Ndi\Params\SaTimeout, ParamDesc, 0, "SA Query Timeout (ms)"\r
+HKR, Ndi\Params\SaTimeout, ParamDesc, 0, %SA_QUERY_TO_STR%\r
HKR, Ndi\Params\SaTimeout, Type, 0, "dword"\r
HKR, Ndi\Params\SaTimeout, Default, 0, "1000"\r
HKR, Ndi\Params\SaTimeout, Optional, 0, "0"\r
HKR, Ndi\Params\SaTimeout, Min, 0, "500"\r
HKR, Ndi\Params\SaTimeout, Step, 0, "250"\r
\r
-HKR, Ndi\Params\SaRetries, ParamDesc, 0, "SA Query Retry Count"\r
+HKR, Ndi\Params\SaRetries, ParamDesc, 0, %SA_QUERY_RETRY_STR%\r
HKR, Ndi\Params\SaRetries, Type, 0, "dword"\r
HKR, Ndi\Params\SaRetries, Default, 0, "10"\r
HKR, Ndi\Params\SaRetries, Optional, 0, "0"\r
HKR, Ndi\Params\SaRetries, Min, 0, "1"\r
\r
-HKR, Ndi\Params\RecvRatio, ParamDesc, 0, "Receive Pool Ratio"\r
+HKR, Ndi\Params\RecvRatio, ParamDesc, 0, %RECV_RATIO_STR%\r
HKR, Ndi\Params\RecvRatio, Type, 0, "dword"\r
HKR, Ndi\Params\RecvRatio, Default, 0, "1"\r
HKR, Ndi\Params\RecvRatio, Optional, 0, "0"\r
HKR, Ndi\Params\RecvRatio, Min, 0, "1"\r
HKR, Ndi\Params\RecvRatio, Max, 0, "10"\r
\r
-HKR, Ndi\Params\PayloadMtu, ParamDesc, 0, "Payload Mtu size"\r
+HKR, Ndi\Params\PayloadMtu, ParamDesc, 0, %MTU_STR%\r
HKR, Ndi\Params\PayloadMtu, Type, 0, "dword"\r
HKR, Ndi\Params\PayloadMtu, Default, 0, "2044"\r
-HKR, Ndi\Params\PayloadMtu, Min, 0, "60"\r
-HKR, Ndi\Params\PayloadMtu, Max, 0, "4092"\r
+HKR, Ndi\Params\PayloadMtu, Min, 0, "512"\r
+HKR, Ndi\Params\PayloadMtu, Max, 0, "65520"\r
\r
-HKR, Ndi\Params\MCLeaveRescan, ParamDesc, 0, "MC leave rescan (sec)"\r
+HKR, Ndi\Params\MCLeaveRescan, ParamDesc, 0, %MC_RESCAN_STR%\r
HKR, Ndi\Params\MCLeaveRescan, Type, 0, "dword"\r
HKR, Ndi\Params\MCLeaveRescan, Default, 0, "260"\r
HKR, Ndi\Params\MCLeaveRescan, Optional, 0, "0"\r
HKR, Ndi\Params\MCLeaveRescan, Min, 0, "1"\r
HKR, Ndi\Params\MCLeaveRescan, Max, 0, "3600"\r
\r
+HKR, Ndi\Params\GUIDMask, ParamDesc, 0, %GUID_MASK_STR%\r
+HKR, Ndi\Params\GUIDMask, Type, 0, "dword"\r
+HKR, Ndi\Params\GUIDMask, Default, 0, "0"\r
+HKR, Ndi\Params\GUIDMask, Optional, 0, "0"\r
+HKR, Ndi\Params\GUIDMask, Min, 0, "0"\r
+HKR, Ndi\Params\GUIDMask, Max, 0, "252"\r
+\r
+HKR, Ndi\Params\BCJoinRetry, ParamDesc, 0, %BC_JOIN_RETRY_STR%\r
+HKR, Ndi\Params\BCJoinRetry, Type, 0, "dword"\r
+HKR, Ndi\Params\BCJoinRetry, Default, 0, "50"\r
+HKR, Ndi\Params\BCJoinRetry, Optional, 0, "0"\r
+HKR, Ndi\Params\BCJoinRetry, Min, 0, "0"\r
+HKR, Ndi\Params\BCJoinRetry, Max, 0, "1000"\r
+\r
+HKR, Ndi\Params\CmEnabled, ParamDesc, 0, %CONNECTED_MODE_STR%\r
+HKR, Ndi\Params\CmEnabled, Type, 0, "enum"\r
+HKR, Ndi\Params\CmEnabled, Default, 0, "0"\r
+HKR, Ndi\Params\CmEnabled, Optional, 0, "0"\r
+HKR, Ndi\Params\CmEnabled\enum, "0", 0, %DISABLED_STR%\r
+HKR, Ndi\Params\CmEnabled\enum, "1", 0, %ENABLED_STR%\r
+\r
[IpoibService]\r
DisplayName = %IpoibServiceDispName%\r
ServiceType = 1 ;%SERVICE_KERNEL_DRIVER%\r
REG_DWORD = 0x00010001\r
REG_DWORD_NO_CLOBBER = 0x00010003\r
\r
+RQ_DEPTH_STR = "Receive Queue depth"\r
+RQ_WATERMARK_STR = "Receive Queue Low Watermark"\r
+SQ_DEPTH_STR = "Send Queue Depth"\r
+SQ_CSUM_STR = "Send Checksum Offload"\r
+RQ_CSUM_STR = "Recv Checksum Offload"\r
+LSO_STR = "Large Send Offload"\r
+SA_QUERY_TO_STR = "SA Query Timeout (ms)"\r
+SA_QUERY_RETRY_STR = "SA Query Retry Count"\r
+RECV_RATIO_STR = "Receive Pool Ratio"\r
+MTU_STR = "Payload Mtu size"\r
+MC_RESCAN_STR = "MC leave rescan (sec)"\r
+GUID_MASK_STR = "GUID bitwise mask"\r
+BC_JOIN_RETRY_STR = "Number of retries connecting to bc"\r
+\r
+ENABLED_IF_STR = "Enabled (if supported by HW)"\r
+ENABLED_STR = "Enabled"\r
+DISABLED_STR = "Disabled"\r
+BYPASS_STR = "Bypass"\r
+CONNECTED_MODE_STR = "Connected mode"\r
-; OpenIB Internet Protocol over InfiniBand Adapter\r
+; OpenFabrics Alliance Internet Protocol over InfiniBand Adapter\r
; Copyright 2005 SilverStorm Technologies all Rights Reserved.\r
; Copyright 2006 Mellanox Technologies all Rights Reserved.\r
\r
Class = Net\r
ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318}\r
Provider = %OPENIB%\r
-DriverVer=05/15/2008,1.1.0000.1177\r
+DriverVer=06/11/2008,1.0.0000.1207\r
CatalogFile=ipoib.cat\r
\r
[Manufacturer]\r
\r
[OPENIB.ntx86]\r
%IpoibDesc% = Ipoib.DDInstall, IBA\IPoIB ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP% = Ipoib.DDInstall, IBA\IPoIBP ; Internet Protocol over InfiniBand Adapter with partition key\r
\r
[OPENIB.ntamd64]\r
%IpoibDesc% = Ipoib.DDInstall, IBA\IPoIB ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP% = Ipoib.DDInstall, IBA\IPoIBP ; Internet Protocol over InfiniBand Adapter with partition key\r
\r
[OPENIB.ntia64]\r
%IpoibDesc% = Ipoib.DDInstall, IBA\IPoIB ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP% = Ipoib.DDInstall, IBA\IPoIBP ; Internet Protocol over InfiniBand Adapter with partition key\r
\r
[Ipoib.DDInstall.ntx86]\r
Characteristics = 0x81 ; NCF_HAS_UI | NCF_VIRTUAL\r
AddReg = IpoibAddReg\r
CopyFiles = IpoibCopyFiles\r
-CopyFiles = WsdCopyFiles\r
+CopyFiles = WsdCopyFiles\r
+CopyFiles = NdCopyFiles\r
\r
[Ipoib.DDInstall.ntamd64]\r
Characteristics = 0x81 ; NCF_HAS_UI | NCF_VIRTUAL\r
AddReg = IpoibAddReg\r
CopyFiles = IpoibCopyFiles\r
-CopyFiles = WsdCopyFiles\r
-CopyFiles = WOW64CopyFiles\r
+CopyFiles = WsdCopyFiles\r
+CopyFiles = NdCopyFiles\r
+CopyFiles = WOW64CopyFiles\r
\r
[Ipoib.DDInstall.ntia64]\r
Characteristics = 0x81 ; NCF_HAS_UI | NCF_VIRTUAL\r
AddReg = IpoibAddReg\r
CopyFiles = IpoibCopyFiles\r
-CopyFiles = WsdCopyFiles\r
-CopyFiles = WOW64CopyFiles\r
+CopyFiles = WsdCopyFiles\r
+CopyFiles = NdCopyFiles\r
+CopyFiles = WOW64CopyFiles\r
\r
[Ipoib.DDInstall.ntx86.Services]\r
AddService = ipoib, 2, IpoibService, IpoibEventLog\r
AddService = ipoib, 2, IpoibService, IpoibEventLog\r
\r
[IpoibAddReg]\r
+HKR, ,RDMACapable, %REG_DWORD%, 1\r
HKR, Ndi, Service, 0, "ipoib"\r
HKR, Ndi\Interfaces, UpperRange, 0, "ndis5"\r
HKR, Ndi\Interfaces, LowerRange, 0, "ethernet"\r
\r
-HKR, Ndi\Params\RqDepth, ParamDesc, 0, "Receive Queue Depth"\r
+HKR, Ndi\Params\RqDepth, ParamDesc, 0, %RQ_DEPTH_STR%\r
HKR, Ndi\Params\RqDepth, Type, 0, "dword"\r
HKR, Ndi\Params\RqDepth, Default, 0, "512"\r
HKR, Ndi\Params\RqDepth, Optional, 0, "0"\r
HKR, Ndi\Params\RqDepth, Max, 0, "1024"\r
HKR, Ndi\Params\RqDepth, Step, 0, "128"\r
\r
-HKR, Ndi\Params\RqLowWatermark, ParamDesc, 0, "Receive Queue Low Watermark"\r
+HKR, Ndi\Params\RqLowWatermark, ParamDesc, 0, %RQ_WATERMARK_STR%\r
HKR, Ndi\Params\RqLowWatermark, Type, 0, "dword"\r
HKR, Ndi\Params\RqLowWatermark, Default, 0, "4"\r
-HKR, Ndi\Params\RqLowWatermark, Optional, 0, "1"\r
+HKR, Ndi\Params\RqLowWatermark, Optional, 0, "0"\r
HKR, Ndi\Params\RqLowWatermark, Min, 0, "2"\r
HKR, Ndi\Params\RqLowWatermark, Max, 0, "8"\r
HKR, Ndi\Params\RqLowWatermark, Step, 0, "1"\r
\r
-HKR, Ndi\Params\SqDepth, ParamDesc, 0, "Send Queue Depth"\r
+HKR, Ndi\Params\SqDepth, ParamDesc, 0, %SQ_DEPTH_STR%\r
HKR, Ndi\Params\SqDepth, Type, 0, "dword"\r
HKR, Ndi\Params\SqDepth, Default, 0, "512"\r
HKR, Ndi\Params\SqDepth, Optional, 0, "0"\r
HKR, Ndi\Params\SqDepth, Max, 0, "1024"\r
HKR, Ndi\Params\SqDepth, Step, 0, "128"\r
\r
-HKR, Ndi\Params\SendChksum, ParamDesc, 0, "Send Checksum Offload"\r
+HKR, Ndi\Params\SendChksum, ParamDesc, 0, %SQ_CSUM_STR%\r
HKR, Ndi\Params\SendChksum, Type, 0, "enum"\r
HKR, Ndi\Params\SendChksum, Default, 0, "1"\r
HKR, Ndi\Params\SendChksum, Optional, 0, "0"\r
-HKR, Ndi\Params\SendChksum\enum, "0", 0, "Disabled"\r
-HKR, Ndi\Params\SendChksum\enum, "1", 0, "Enabled (if supported by HW)"\r
-HKR, Ndi\Params\SendChksum\enum, "2", 0, "Bypass"\r
+HKR, Ndi\Params\SendChksum\enum, "0", 0, %DISABLED_STR%\r
+HKR, Ndi\Params\SendChksum\enum, "1", 0, %ENABLED_IF_STR%\r
+HKR, Ndi\Params\SendChksum\enum, "2", 0, %BYPASS_STR%\r
\r
-HKR, Ndi\Params\RecvChksum, ParamDesc, 0, "Recv Checksum Offload"\r
+HKR, Ndi\Params\RecvChksum, ParamDesc, 0, %RQ_CSUM_STR%\r
HKR, Ndi\Params\RecvChksum, Type, 0, "enum"\r
HKR, Ndi\Params\RecvChksum, Default, 0, "1"\r
HKR, Ndi\Params\RecvChksum, Optional, 0, "0"\r
-HKR, Ndi\Params\RecvChksum\enum, "0", 0, "Disabled"\r
-HKR, Ndi\Params\RecvChksum\enum, "1", 0, "Enabled (if supported by HW)"\r
-HKR, Ndi\Params\RecvChksum\enum, "2", 0, "Bypass"\r
+HKR, Ndi\Params\RecvChksum\enum, "0", 0, %DISABLED_STR%\r
+HKR, Ndi\Params\RecvChksum\enum, "1", 0, %ENABLED_IF_STR%\r
+HKR, Ndi\Params\RecvChksum\enum, "2", 0, %BYPASS_STR%\r
\r
-HKR, Ndi\Params\lso, ParamDesc, 0, "Large Send Offload"\r
+HKR, Ndi\Params\lso, ParamDesc, 0, %LSO_STR%\r
HKR, Ndi\Params\lso, Type, 0, "enum"\r
HKR, Ndi\Params\lso, Default, 0, "0"\r
HKR, Ndi\Params\lso, Optional, 0, "0"\r
-HKR, Ndi\Params\lso\enum, "0", 0, "Disabled"\r
-HKR, Ndi\Params\lso\enum, "1", 0, "Enabled"\r
+HKR, Ndi\Params\lso\enum, "0", 0, %DISABLED_STR%\r
+HKR, Ndi\Params\lso\enum, "1", 0, %ENABLED_STR%\r
\r
-HKR, Ndi\Params\SaTimeout, ParamDesc, 0, "SA Query Timeout (ms)"\r
+\r
+HKR, Ndi\Params\SaTimeout, ParamDesc, 0, %SA_QUERY_TO_STR%\r
HKR, Ndi\Params\SaTimeout, Type, 0, "dword"\r
HKR, Ndi\Params\SaTimeout, Default, 0, "1000"\r
HKR, Ndi\Params\SaTimeout, Optional, 0, "0"\r
HKR, Ndi\Params\SaTimeout, Min, 0, "500"\r
HKR, Ndi\Params\SaTimeout, Step, 0, "250"\r
\r
-HKR, Ndi\Params\SaRetries, ParamDesc, 0, "SA Query Retry Count"\r
+HKR, Ndi\Params\SaRetries, ParamDesc, 0, %SA_QUERY_RETRY_STR%\r
HKR, Ndi\Params\SaRetries, Type, 0, "dword"\r
HKR, Ndi\Params\SaRetries, Default, 0, "10"\r
HKR, Ndi\Params\SaRetries, Optional, 0, "0"\r
HKR, Ndi\Params\SaRetries, Min, 0, "1"\r
\r
-HKR, Ndi\Params\RecvRatio, ParamDesc, 0, "Receive Pool Ratio"\r
+HKR, Ndi\Params\RecvRatio, ParamDesc, 0, %RECV_RATIO_STR%\r
HKR, Ndi\Params\RecvRatio, Type, 0, "dword"\r
HKR, Ndi\Params\RecvRatio, Default, 0, "1"\r
HKR, Ndi\Params\RecvRatio, Optional, 0, "0"\r
HKR, Ndi\Params\RecvRatio, Min, 0, "1"\r
HKR, Ndi\Params\RecvRatio, Max, 0, "10"\r
\r
-HKR, Ndi\Params\PayloadMtu, ParamDesc, 0, "Payload Mtu size"\r
+HKR, Ndi\Params\PayloadMtu, ParamDesc, 0, %MTU_STR%\r
HKR, Ndi\Params\PayloadMtu, Type, 0, "dword"\r
HKR, Ndi\Params\PayloadMtu, Default, 0, "2044"\r
-HKR, Ndi\Params\PayloadMtu, Min, 0, "60"\r
+HKR, Ndi\Params\PayloadMtu, Min, 0, "512"\r
HKR, Ndi\Params\PayloadMtu, Max, 0, "65520"\r
\r
-HKR, Ndi\Params\CmEnabled, ParamDesc, 0, "Connected Mode"\r
+HKR, Ndi\Params\MCLeaveRescan, ParamDesc, 0, %MC_RESCAN_STR%\r
+HKR, Ndi\Params\MCLeaveRescan, Type, 0, "dword"\r
+HKR, Ndi\Params\MCLeaveRescan, Default, 0, "260"\r
+HKR, Ndi\Params\MCLeaveRescan, Optional, 0, "0"\r
+HKR, Ndi\Params\MCLeaveRescan, Min, 0, "1"\r
+HKR, Ndi\Params\MCLeaveRescan, Max, 0, "3600"\r
+\r
+HKR, Ndi\Params\GUIDMask, ParamDesc, 0, %GUID_MASK_STR%\r
+HKR, Ndi\Params\GUIDMask, Type, 0, "dword"\r
+HKR, Ndi\Params\GUIDMask, Default, 0, "0"\r
+HKR, Ndi\Params\GUIDMask, Optional, 0, "0"\r
+HKR, Ndi\Params\GUIDMask, Min, 0, "0"\r
+HKR, Ndi\Params\GUIDMask, Max, 0, "252"\r
+\r
+HKR, Ndi\Params\BCJoinRetry, ParamDesc, 0, %BC_JOIN_RETRY_STR%\r
+HKR, Ndi\Params\BCJoinRetry, Type, 0, "dword"\r
+HKR, Ndi\Params\BCJoinRetry, Default, 0, "50"\r
+HKR, Ndi\Params\BCJoinRetry, Optional, 0, "0"\r
+HKR, Ndi\Params\BCJoinRetry, Min, 0, "0"\r
+HKR, Ndi\Params\BCJoinRetry, Max, 0, "1000"\r
+\r
+HKR, Ndi\Params\CmEnabled, ParamDesc, 0, %CONNECTED_MODE_STR%\r
HKR, Ndi\Params\CmEnabled, Type, 0, "enum"\r
HKR, Ndi\Params\CmEnabled, Default, 0, "0"\r
HKR, Ndi\Params\CmEnabled, Optional, 0, "0"\r
-HKR, Ndi\Params\CmEnabled\enum, "0", 0, "Disabled"\r
-HKR, Ndi\Params\CmEnabled\enum, "1", 0, "Enabled"\r
+HKR, Ndi\Params\CmEnabled\enum, "0", 0, %DISABLED_STR%\r
+HKR, Ndi\Params\CmEnabled\enum, "1", 0, %ENABLED_STR%\r
\r
[IpoibService]\r
DisplayName = %IpoibServiceDispName%\r
[WsdCopyFiles]\r
ibwsd.dll,,,0x00000002\r
\r
+[NdCopyFiles]\r
+ibndprov.dll,,,0x00000002\r
+ndinstall.exe,,,0x00000002\r
+\r
[WOW64CopyFiles]\r
ibwsd.dll,ibwsd32.dll,,0x00000002\r
+ibndprov.dll,ibndprov32.dll,,0x00000002\r
\r
[SourceDisksNames.x86]\r
1 = %IcsDisk1%,,,""\r
[SourceDisksFiles.x86]\r
ipoib.sys = 1\r
ibwsd.dll = 1\r
+ibndprov.dll = 1\r
+ndinstall.exe = 1\r
\r
[SourceDisksFiles.amd64]\r
ipoib.sys = 1\r
ibwsd.dll = 1\r
ibwsd32.dll = 1\r
+ibndprov.dll = 1\r
+ibndprov32.dll = 1\r
+ndinstall.exe = 1\r
\r
[SourceDisksFiles.ia64]\r
ipoib.sys = 1\r
ibwsd.dll = 1\r
ibwsd32.dll = 1\r
+ibndprov.dll = 1\r
+ibndprov32.dll = 1\r
+ndinstall.exe = 1\r
\r
[DestinationDirs]\r
IpoibCopyFiles = %DIRID_DRIVERS%\r
WsdCopyFiles = %DIRID_SYSTEM%\r
+NdCopyFiles = %DIRID_SYSTEM%\r
WOW64CopyFiles = %DIRID_SYSTEM_X86%\r
DefaultDestDir = %DIRID_SYSTEM%\r
\r
[Strings]\r
-OPENIB = "OpenIB Alliance"\r
-IpoibDesc = "OpenIB IPoIB Adapter"\r
+OPENIB = "OpenFabrics Alliance"\r
+IpoibDesc = "OpenFabrics IPoIB Adapter"\r
+IpoibDescP = "OpenFabrics IPoIB Adapter Partition"\r
IpoibServiceDispName = "IPoIB"\r
-IcsDisk1 = "OpenIB IPoIB Disk #1"\r
+IcsDisk1 = "OpenFabrics IPoIB Disk #1"\r
DIRID_SYSTEM = 11\r
DIRID_DRIVERS = 12\r
DIRID_SYSTEM_X86 = 16425\r
+REG_DWORD = 0x00010001\r
REG_DWORD_NO_CLOBBER = 0x00010003\r
+\r
+RQ_DEPTH_STR = "Receive Queue depth"\r
+RQ_WATERMARK_STR = "Receive Queue Low Watermark"\r
+SQ_DEPTH_STR = "Send Queue Depth"\r
+SQ_CSUM_STR = "Send Checksum Offload"\r
+RQ_CSUM_STR = "Recv Checksum Offload"\r
+LSO_STR = "Large Send Offload"\r
+SA_QUERY_TO_STR = "SA Query Timeout (ms)"\r
+SA_QUERY_RETRY_STR = "SA Query Retry Count"\r
+RECV_RATIO_STR = "Receive Pool Ratio"\r
+MTU_STR = "Payload Mtu size"\r
+MC_RESCAN_STR = "MC leave rescan (sec)"\r
+GUID_MASK_STR = "GUID bitwise mask"\r
+BC_JOIN_RETRY_STR = "Number of retries connecting to bc"\r
+\r
+ENABLED_IF_STR = "Enabled (if supported by HW)"\r
+ENABLED_STR = "Enabled"\r
+DISABLED_STR = "Disabled"\r
+BYPASS_STR = "Bypass"\r
+CONNECTED_MODE_STR = "Connected mode"
\ No newline at end of file