From d05a782c4185819be032886e10be40bc32f2e9d4 Mon Sep 17 00:00:00 2001 From: ftillier Date: Mon, 13 Mar 2006 18:04:04 +0000 Subject: [PATCH] [IPoIB] Fix NDIS WHQL 1c_OffloadInvalid test failure. git-svn-id: svn://openib.tc.cornell.edu/gen1@244 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/ulp/ipoib/kernel/ipoib_driver.c | 73 +++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/trunk/ulp/ipoib/kernel/ipoib_driver.c b/trunk/ulp/ipoib/kernel/ipoib_driver.c index 6850cdee..4047adb9 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_driver.c +++ b/trunk/ulp/ipoib/kernel/ipoib_driver.c @@ -1289,8 +1289,8 @@ __ipoib_get_tcp_task_offload( p_adapter->guids.port_num) ); buf_len = sizeof(NDIS_TASK_OFFLOAD_HEADER) + - sizeof(NDIS_TASK_OFFLOAD) + - sizeof(NDIS_TASK_TCP_IP_CHECKSUM) - 1; + offsetof( NDIS_TASK_OFFLOAD, TaskBuffer ) + + sizeof(NDIS_TASK_TCP_IP_CHECKSUM); *(p_oid_info->p_bytes_needed) = buf_len; @@ -1354,6 +1354,69 @@ __ipoib_get_tcp_task_offload( } +static NDIS_STATUS +__ipoib_set_tcp_task_offload( + IN ipoib_adapter_t* p_adapter, + IN void* const p_info_buf, + IN ULONG* const p_info_len ) +{ + NDIS_TASK_OFFLOAD_HEADER *p_offload_hdr; + NDIS_TASK_OFFLOAD *p_offload_task; + NDIS_TASK_TCP_IP_CHECKSUM *p_offload_chksum; + + IPOIB_TRACE( IPOIB_DBG_OID | IPOIB_DBG_INFO, + ("Port %d received set for OID_TCP_TASK_OFFLOAD\n", + p_adapter->guids.port_num) ); + + p_offload_hdr = (NDIS_TASK_OFFLOAD_HEADER*)p_info_buf; + + if( *p_info_len < sizeof(NDIS_TASK_OFFLOAD_HEADER) ) + return NDIS_STATUS_INVALID_LENGTH; + + if( p_offload_hdr->Version != NDIS_TASK_OFFLOAD_VERSION ) + return NDIS_STATUS_INVALID_DATA; + + if( p_offload_hdr->Size != sizeof(NDIS_TASK_OFFLOAD_HEADER) ) + return NDIS_STATUS_INVALID_LENGTH; + + if( !p_offload_hdr->OffsetFirstTask ) + return NDIS_STATUS_SUCCESS; + + if( p_offload_hdr->EncapsulationFormat.Encapsulation != + IEEE_802_3_Encapsulation ) + { + return NDIS_STATUS_INVALID_DATA; + } + + p_offload_task = (NDIS_TASK_OFFLOAD*) + (((UCHAR*)p_offload_hdr) + p_offload_hdr->OffsetFirstTask); + + if( *p_info_len < sizeof(NDIS_TASK_OFFLOAD_HEADER) + + offsetof( NDIS_TASK_OFFLOAD, TaskBuffer ) + + sizeof(NDIS_TASK_TCP_IP_CHECKSUM) ) + { + return NDIS_STATUS_INVALID_LENGTH; + } + + if( p_offload_task->Version != NDIS_TASK_OFFLOAD_VERSION ) + return NDIS_STATUS_INVALID_DATA; + p_offload_chksum = + (NDIS_TASK_TCP_IP_CHECKSUM*)p_offload_task->TaskBuffer; + + if( !p_adapter->params.send_chksum_offload && + (p_offload_chksum->V4Transmit.IpOptionsSupported || + p_offload_chksum->V4Transmit.TcpOptionsSupported || + p_offload_chksum->V4Transmit.TcpChecksum || + p_offload_chksum->V4Transmit.UdpChecksum || + p_offload_chksum->V4Transmit.IpChecksum) ) + { + return NDIS_STATUS_NOT_SUPPORTED; + } + + return NDIS_STATUS_SUCCESS; +} + + //! Issues a hardware reset to the NIC and/or resets the driver's software state. /* Tear down the connection and start over again. This is only called when there is a problem. For example, if a send, query info, or set info had a time out. MiniportCheckForHang will @@ -1575,8 +1638,10 @@ ipoib_set_info( case OID_TCP_TASK_OFFLOAD: IPOIB_TRACE( IPOIB_DBG_OID | IPOIB_DBG_INFO, ("Port %d received set for OID_TCP_TASK_OFFLOAD\n", port_num) ); - /* TODO: See if we need to handle this OID, or if just setting the - * checksum OK flags in the packets always works. */ + + buf_len = info_buf_len; + status = + __ipoib_set_tcp_task_offload( p_adapter, info_buf, &buf_len ); break; /* Optional General */ -- 2.41.0