[ovs-dev] [PATCH v3] datapath-windows: Add GRE checksum
Nithin Raju
nithin at vmware.com
Wed Jun 8 19:10:08 UTC 2016
> #endif
>@@ -299,34 +312,21 @@ OvsDecapGre(POVS_SWITCH_CONTEXT switchContext,
> EthHdr *ethHdr;
> IPHdr *ipHdr;
> GREHdr *greHdr;
>- UINT32 tunnelSize = 0, packetLength = 0;
>+ UINT32 tunnelSize, packetLength;
> UINT32 headRoom = 0;
> PUINT8 bufferStart;
> NDIS_STATUS status;
>
> curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
> packetLength = NET_BUFFER_DATA_LENGTH(curNb);
>- tunnelSize = GreTunHdrSize(tunKey->flags);
>+ curMdl = NET_BUFFER_CURRENT_MDL(curNb);
>+ tunnelSize = GreTunHdrSize(0);
> if (packetLength <= tunnelSize) {
> return NDIS_STATUS_INVALID_LENGTH;
> }
>
>- /*
>- * Create a copy of the NBL so that we have all the headers in one
>MDL.
>- */
>- *newNbl = OvsPartialCopyNBL(switchContext, curNbl,
>- tunnelSize + OVS_DEFAULT_COPY_SIZE, 0,
>- TRUE /*copy NBL info */);
>-
>- if (*newNbl == NULL) {
>- return NDIS_STATUS_RESOURCES;
>- }
>-
>- curNbl = *newNbl;
>- curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
>- curMdl = NET_BUFFER_CURRENT_MDL(curNb);
>- bufferStart = (PUINT8)MmGetSystemAddressForMdlSafe(curMdl,
>LowPagePriority) +
>- NET_BUFFER_CURRENT_MDL_OFFSET(curNb);
>+ /* Get a contignuous buffer for the maxmimum length of a GRE header
>*/
>+ bufferStart = NdisGetDataBuffer(curNb, OVS_MAX_GRE_LGTH, NULL, 1, 0);
Sorry we have to go back and forth on this. Like I mentioned in the
previous email, the idea is to get a contiguous chunk of memory so we can
walk all the header until the GRE header. It is a good idea to use
NdisGetDataBuffer() instead of copying the NBL. But, we won¹t avoid the
copied NBL anyway since decap has to happen on the copied NBL.
In any case, NdisGetDataBuffer() has some pitfalls:
"If the requested data in the buffer is contiguous, this return value is a
pointer to a location that NDIS provides. If the data is not contiguous,
NDIS uses the Storage parameter as follows:
* If the Storage parameter is non-NULL, NDIS copies the data to the buffer
at Storage. This return value is the pointer passed to the Storage
parameter.
* If the Storage parameter is NULL, this return value is NULL.²
So, if the first MDL does not fit the headers until the GRE headers, we
need to pass explicit memory to NdisGetDataBuffer() in argument #3 in
order for NDIS to copy it over to a contiguous chunk of memory.
Thanks,
-- Nithin
More information about the dev
mailing list