]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
[IPOIB_NDIS6_CM] incorporate trunk commit 2994;
authorStan Smith <stan.smith@intel.com>
Tue, 16 Nov 2010 18:16:11 +0000 (18:16 +0000)
committerStan Smith <stan.smith@intel.com>
Tue, 16 Nov 2010 18:16:11 +0000 (18:16 +0000)
ETH header was copied twice when falling into __send_copy flow

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

branches/WOF2-3/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
branches/WOF2-3/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h

index 8c84403839b8caabe91b36066227c8c20c25655e..731f1a21fef95763f3928e6fd297b75a6a741da3 100644 (file)
@@ -3702,7 +3702,10 @@ __send_copy(
        IN                              ipoib_send_NB_SG *                      s_buf,\r
        IN                              UINT                                            lso_header_size)\r
 {\r
-       ULONG                                   tot_len = 0;\r
+       ULONG                   tot_len = 0;\r
+       uint32_t                offset = \r
+                                               (lso_header_size ? EthIPoIBHeaderOffset : EthHeaderOffset );\r
+       int seg_index = lso_header_size ? 0 : 1;\r
 \r
        IPOIB_ENTER( IPOIB_DBG_SEND );\r
 \r
@@ -3722,13 +3725,11 @@ __send_copy(
                ASSERT(tot_len > lso_header_size);\r
                return NDIS_STATUS_FAILURE;\r
        }\r
-       //TODO Do not copy the ETH header \r
+       \r
        /* Setup the work request. */\r
-       int seg_index = lso_header_size ? 0 : 1;\r
-\r
        p_desc->send_wr[0].local_ds[seg_index].vaddr = cl_get_physaddr(\r
-               ((uint8_t*)s_buf->p_send_buf) + lso_header_size );\r
-       p_desc->send_wr[0].local_ds[seg_index].length = tot_len - lso_header_size;\r
+               ((uint8_t*)s_buf->p_send_buf) + lso_header_size + offset );\r
+       p_desc->send_wr[0].local_ds[seg_index].length = tot_len - lso_header_size - offset;\r
        p_desc->send_wr[0].local_ds[seg_index].lkey = p_port->ib_mgr.lkey;\r
        p_desc->send_wr[0].wr.num_ds = seg_index+1;\r
 \r
@@ -4265,9 +4266,7 @@ __send_gen(
        NDIS_STATUS             status;\r
        uint32_t                i, j            = 1;\r
        ULONG                   DataOffset      = 0;    \r
-       uint32_t                EthHeaderOffset                 = sizeof(eth_hdr_t);\r
-       static const    EthIPoIBHeaderOffset    = EthHeaderOffset - sizeof(ipoib_hdr_t);\r
-       \r
+       uint32_t                offset          = EthHeaderOffset;\r
        PERF_DECLARE( SendCopy );\r
 \r
        IPOIB_ENTER( IPOIB_DBG_SEND );\r
@@ -4282,7 +4281,6 @@ __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\r
           first SG elements.\r
@@ -4340,18 +4338,18 @@ __send_gen(
                        return NDIS_STATUS_SUCCESS;\r
                }               \r
        }\r
-       else while( EthHeaderOffset )\r
+       else while( offset )\r
        {\r
-               if( p_sgl->Elements[i].Length <= EthHeaderOffset )\r
+               if( p_sgl->Elements[i].Length <= offset )\r
                {\r
-                       EthHeaderOffset -= p_sgl->Elements[i++].Length;\r
+                       offset -= p_sgl->Elements[i++].Length;\r
                }\r
                else\r
                {\r
                        p_desc->send_wr[0].local_ds[j].vaddr =\r
-                               p_sgl->Elements[i].Address.QuadPart + EthHeaderOffset + DataOffset;\r
+                               p_sgl->Elements[i].Address.QuadPart + offset + DataOffset;\r
                        p_desc->send_wr[0].local_ds[j].length =\r
-                               p_sgl->Elements[i].Length - EthHeaderOffset - DataOffset;\r
+                               p_sgl->Elements[i].Length - offset - DataOffset;\r
                        p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;\r
                        if( p_desc->send_wr[0].local_ds[j].length > 0 )\r
                        {\r
index 501f3f513040ab3686ce04821492c46facc40160..36ad0d9199fce02e3236de961fcdf255c2affc5c 100644 (file)
@@ -168,6 +168,11 @@ typedef struct _ipoib_hdr
 *      resv\r
 *              Reserved portion of IPoIB header.\r
 *********/\r
+static const uint32_t  EthHeaderOffset                 = sizeof(eth_hdr_t);\r
+\r
+//We reuse eth header to put there IPoIB header for LSO Net Buffers.\r
+// Thus, when copying such NB one need to jump over the appropriate offset\r
+static const uint32_t  EthIPoIBHeaderOffset    = EthHeaderOffset - sizeof(ipoib_hdr_t);\r
 \r
 typedef struct _ipoib_arp_pkt\r
 {\r
@@ -184,6 +189,7 @@ typedef struct _ipoib_arp_pkt
 }      PACK_SUFFIX ipoib_arp_pkt_t;\r
 \r
 \r
+\r
 /****s* IPoIB Driver/ipoib_pkt_t\r
 * NAME\r
 *      ipoib_pkt_t\r