From bf4077e2cb571584cebcb1b506a34b5f31dc7be0 Mon Sep 17 00:00:00 2001 From: Shashank Ram Date: Mon, 21 Aug 2017 14:45:23 -0700 Subject: datapath-windows: Move OvsCreateNewNBLsFromMultipleNBs to BuggerMgmt Moves function OvsCreateNewNBLsFromMultipleNBs() to BufferMgmt.c to facilitate consumption from outside PacketIO.c. Signed-off-by: Shashank Ram Acked-by: Anand Kumar Acked-by: Alin Gabriel Serdean Signed-off-by: Alin Gabriel Serdean --- datapath-windows/ovsext/BufferMgmt.c | 47 ++++++++++++++++++++++++++++++++++++ datapath-windows/ovsext/BufferMgmt.h | 4 +++ datapath-windows/ovsext/PacketIO.c | 42 -------------------------------- 3 files changed, 51 insertions(+), 42 deletions(-) (limited to 'datapath-windows') diff --git a/datapath-windows/ovsext/BufferMgmt.c b/datapath-windows/ovsext/BufferMgmt.c index 1ede4a32e..5c9e5627c 100644 --- a/datapath-windows/ovsext/BufferMgmt.c +++ b/datapath-windows/ovsext/BufferMgmt.c @@ -1783,3 +1783,50 @@ OvsGetCtxSourcePortNo(PNET_BUFFER_LIST nbl, *portNo = ctx->srcPortNo; return NDIS_STATUS_SUCCESS; } + +/* + * -------------------------------------------------------------------------- + * OvsCreateNewNBLsFromMultipleNBs -- + * Creates an NBL chain where each NBL has a single NB, + * from an NBL which has multiple NBs. + * Sets 'curNbl' and 'lastNbl' to the first and last NBL in the + * newly created NBL chain respectively, and completes the original NBL. + * -------------------------------------------------------------------------- + */ +NTSTATUS +OvsCreateNewNBLsFromMultipleNBs(POVS_SWITCH_CONTEXT switchContext, + PNET_BUFFER_LIST *curNbl, + PNET_BUFFER_LIST *lastNbl) +{ + NTSTATUS status = STATUS_SUCCESS; + PNET_BUFFER_LIST newNbls = NULL; + PNET_BUFFER_LIST nbl = NULL; + BOOLEAN error = TRUE; + + do { + /* Create new NBLs from curNbl with multiple net buffers. */ + newNbls = OvsPartialCopyToMultipleNBLs(switchContext, + *curNbl, 0, 0, TRUE); + if (NULL == newNbls) { + OVS_LOG_ERROR("Failed to allocate NBLs with single NB."); + status = NDIS_STATUS_RESOURCES; + break; + } + + nbl = newNbls; + while (nbl) { + *lastNbl = nbl; + nbl = NET_BUFFER_LIST_NEXT_NBL(nbl); + } + + (*curNbl)->Next = NULL; + + OvsCompleteNBL(switchContext, *curNbl, TRUE); + + *curNbl = newNbls; + + error = FALSE; + } while (error); + + return status; +} diff --git a/datapath-windows/ovsext/BufferMgmt.h b/datapath-windows/ovsext/BufferMgmt.h index e6cc0fe82..dcf310a27 100644 --- a/datapath-windows/ovsext/BufferMgmt.h +++ b/datapath-windows/ovsext/BufferMgmt.h @@ -141,4 +141,8 @@ NDIS_STATUS OvsSetCtxSourcePortNo(PNET_BUFFER_LIST nbl, UINT32 portNo); NDIS_STATUS OvsGetCtxSourcePortNo(PNET_BUFFER_LIST nbl, UINT32 *portNo); +NTSTATUS OvsCreateNewNBLsFromMultipleNBs(PVOID context, + PNET_BUFFER_LIST *curNbl, + PNET_BUFFER_LIST *lastNbl); + #endif /* __BUFFER_MGMT_H_ */ diff --git a/datapath-windows/ovsext/PacketIO.c b/datapath-windows/ovsext/PacketIO.c index 81c574e75..38e3e5f36 100644 --- a/datapath-windows/ovsext/PacketIO.c +++ b/datapath-windows/ovsext/PacketIO.c @@ -46,10 +46,6 @@ extern NDIS_STRING ovsExtFriendlyNameUC; static VOID OvsFinalizeCompletionList(OvsCompletionList *completionList); static VOID OvsCompleteNBLIngress(POVS_SWITCH_CONTEXT switchContext, PNET_BUFFER_LIST netBufferLists, ULONG sendCompleteFlags); -static NTSTATUS OvsCreateNewNBLsFromMultipleNBs( - POVS_SWITCH_CONTEXT switchContext, - PNET_BUFFER_LIST *curNbl, - PNET_BUFFER_LIST *lastNbl); VOID OvsInitCompletionList(OvsCompletionList *completionList, @@ -500,41 +496,3 @@ OvsExtCancelSendNBL(NDIS_HANDLE filterModuleContext, /* All send requests get completed synchronously, so there is no need to * implement this callback. */ } - -static NTSTATUS -OvsCreateNewNBLsFromMultipleNBs(POVS_SWITCH_CONTEXT switchContext, - PNET_BUFFER_LIST *curNbl, - PNET_BUFFER_LIST *lastNbl) -{ - NTSTATUS status = STATUS_SUCCESS; - PNET_BUFFER_LIST newNbls = NULL; - PNET_BUFFER_LIST nbl = NULL; - BOOLEAN error = TRUE; - - do { - /* Create new NBLs from curNbl with multiple net buffers. */ - newNbls = OvsPartialCopyToMultipleNBLs(switchContext, - *curNbl, 0, 0, TRUE); - if (NULL == newNbls) { - OVS_LOG_ERROR("Failed to allocate NBLs with single NB."); - status = NDIS_STATUS_RESOURCES; - break; - } - - nbl = newNbls; - while (nbl) { - *lastNbl = nbl; - nbl = NET_BUFFER_LIST_NEXT_NBL(nbl); - } - - (*curNbl)->Next = NULL; - - OvsCompleteNBL(switchContext, *curNbl, TRUE); - - *curNbl = newNbls; - - error = FALSE; - } while (error); - - return status; -} -- cgit v1.2.1