[IPoIB NDIS 6.0 CM]
authortzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 1 Dec 2009 16:37:01 +0000 (16:37 +0000)
committertzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 1 Dec 2009 16:37:01 +0000 (16:37 +0000)
Bug at LSO flow.
When header is contained in 2 first SG Elements, or the total number of the SG List > MAX_SGE_NUM,
we enter send_copy flow. So, the p_send_buf should be at least 64K. (mlnx 5209)

git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2609 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.h
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h

index 9aaa103..2d5e921 100644 (file)
@@ -57,7 +57,7 @@
  * Header length as defined by IPoIB spec:\r
  * http://www.ietf.org/internet-drafts/draft-ietf-ipoib-ip-over-infiniband-04.txt\r
  */\r
\r
+#define MAX_LSO_PAYLOAD_MTU            65536\r
 #define MAX_UD_PAYLOAD_MTU             (MAX_IB_MTU - sizeof(ipoib_hdr_t))\r
 #define DEFAULT_PAYLOAD_MTU            (DEFAULT_MTU - sizeof(ipoib_hdr_t))\r
 #define MAX_CM_PAYLOAD_MTU             (65520)\r
index e2c1d3a..3f183b9 100644 (file)
@@ -1364,7 +1364,7 @@ __buf_mgr_construct(
        p_port->buf_mgr.h_buffer_pool = NULL;\r
 \r
        NdisInitializeNPagedLookasideList( &p_port->buf_mgr.send_buf_list,\r
-               NULL, NULL, 0, MAX_XFER_BLOCK_SIZE, 'bipi', 0 );\r
+               NULL, NULL, 0, MAX_LSO_PAYLOAD_MTU, 'bipi', 0 );\r
 \r
        p_port->buf_mgr.h_send_pkt_pool = NULL;\r
 \r
@@ -3375,7 +3375,13 @@ CopyNetBuffer(
     ULONG Offset = NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer);\r
     ULONG DataLength = NET_BUFFER_DATA_LENGTH(NetBuffer);\r
 \r
-    \r
+       if (DataLength > MAX_LSO_PAYLOAD_MTU) {\r
+               ASSERT(FALSE);\r
+               IPOIB_PRINT_EXIT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Can't copy buffer of %d because of 64K limitation\n"));\r
+               return 0;\r
+       }\r
+\r
     while (CurrentMdl && DataLength > 0)\r
     {\r
         ULONG  CurrLength;\r
@@ -3467,8 +3473,10 @@ __send_copy(
                return NDIS_STATUS_RESOURCES;\r
        }\r
        tot_len = CopyNetBuffer(s_buf->p_curr_nb, (PUCHAR) s_buf->p_send_buf);\r
-       ASSERT(tot_len);\r
-       ASSERT(tot_len > lso_header_size);\r
+       if (tot_len <= lso_header_size) {\r
+               ASSERT(tot_len > lso_header_size);\r
+               return NDIS_STATUS_FAILURE;\r
+       }\r
        //TODO Do not copy the ETH header \r
        /* Setup the work request. */\r
        int seg_index = lso_header_size ? 0 : 1;\r
@@ -3996,7 +4004,9 @@ __send_gen(
                return NDIS_STATUS_FAILURE;\r
        }\r
        ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;\r
-       \r
+       //TODO: Copy only essential data\r
+       // That is, copy only 2 chunks of ETH header if it contained in several first SG elements\r
+       // Copy only N+1-MAX_SEND_SGE, where N is a lenght of SG List\r
        /* Remember that one of the DS entries is reserved for the IPoIB header. */\r
        if( ( p_sgl->NumberOfElements >= MAX_SEND_SGE ||\r
                p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )\r
index 0e0ace3..2d35ecd 100644 (file)
@@ -282,7 +282,7 @@ typedef union _recv_buf
 */\r
 typedef union _send_buf\r
 {\r
-       uint8_t                 data[MAX_UD_PAYLOAD_MTU];\r
+       uint8_t                 data[MAX_LSO_PAYLOAD_MTU];\r
        ipoib_arp_pkt_t arp;\r
        ip_pkt_t                ip;\r
 \r