Message ID | 20170130213949.9388-4-kumaranand@vmware.com |
---|---|
State | Superseded |
Headers | show |
My main comment here would be to see if we can add the MRU to the NBL Buffer Context instead of OvsForwardingContext - https://github.com/openvswitch/ovs/blob/75e2077e0c43224bcca92746b28b01a4936fc101/datapath-windows/ovsext/BufferMgmt.h#L51 This will drastically reduce the amount of changes required to support the MRU field. Thanks, Sairam On 1/30/17, 1:39 PM, "ovs-dev-bounces@openvswitch.org on behalf of Anand Kumar" <ovs-dev-bounces@openvswitch.org on behalf of kumaranand@vmware.com> wrote: >This patch retains the MRU value for the reassembled IP datagram in the >OvsForwardingContext when the packet is forwarded to userspace and/or >retrived from userspace. > >Also retain the MRU value when there are any deferred actions for the >current NBL. > >Signed-off-by: Anand Kumar <kumaranand@vmware.com> >--- >v4->v3: No Change >v2->v3: No change >v1->v2: No change >--- > datapath-windows/ovsext/Actions.c | 49 +++++++++++++++++++++++------------- > datapath-windows/ovsext/Actions.h | 3 +++ > datapath-windows/ovsext/DpInternal.h | 2 +- > datapath-windows/ovsext/PacketIO.c | 9 ++++--- > datapath-windows/ovsext/Recirc.c | 6 ++++- > datapath-windows/ovsext/Recirc.h | 2 ++ > datapath-windows/ovsext/Tunnel.c | 4 +-- > datapath-windows/ovsext/User.c | 26 +++++++++++++------ > datapath-windows/ovsext/User.h | 6 +++-- > 9 files changed, 72 insertions(+), 35 deletions(-) > >diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c >index e4e56e8..5b541b1 100644 >--- a/datapath-windows/ovsext/Actions.c >+++ b/datapath-windows/ovsext/Actions.c >@@ -150,6 +150,7 @@ OvsInitForwardingCtx(OvsForwardingContext *ovsFwdCtx, > UINT32 srcVportNo, > ULONG sendFlags, > PNDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO fwdDetail, >+ UINT16 mru, > OvsCompletionList *completionList, > OVS_PACKET_HDR_INFO *layers, > BOOLEAN resetTunnelInfo) >@@ -167,7 +168,7 @@ OvsInitForwardingCtx(OvsForwardingContext *ovsFwdCtx, > ovsFwdCtx->switchContext = switchContext; > ovsFwdCtx->completionList = completionList; > ovsFwdCtx->fwdDetail = fwdDetail; >- >+ ovsFwdCtx->mru = mru; > if (fwdDetail->NumAvailableDestinations > 0) { > /* > * XXX: even though MSDN says GetNetBufferListDestinations() returns >@@ -615,6 +616,7 @@ OvsDoFlowLookupOutput(OvsForwardingContext *ovsFwdCtx) > ovsFwdCtx->srcVportNo, > ovsFwdCtx->sendFlags, > &key, &hash, &ovsFwdCtx->layers, >+ ovsFwdCtx->mru, > flow->actions, flow->actionsLen); > ovsFwdCtx->curNbl = NULL; > } else { >@@ -623,9 +625,11 @@ OvsDoFlowLookupOutput(OvsForwardingContext *ovsFwdCtx) > ovsFwdCtx->switchContext->datapath.misses++; > InitializeListHead(&missedPackets); > status = OvsCreateAndAddPackets(NULL, 0, OVS_PACKET_CMD_MISS, vport, >- &key,ovsFwdCtx->curNbl, >- FALSE, &ovsFwdCtx->layers, >- ovsFwdCtx->switchContext, &missedPackets, &num); >+ &key,ovsFwdCtx->curNbl, >+ FALSE, &ovsFwdCtx->layers, >+ ovsFwdCtx->switchContext, >+ ovsFwdCtx->mru, >+ &missedPackets, &num); > if (num) { > OvsQueuePackets(&missedPackets, num); > } >@@ -722,6 +726,7 @@ OvsTunnelPortTx(OvsForwardingContext *ovsFwdCtx) > status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, > newNbl, srcVportNo, 0, > NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), >+ ovsFwdCtx->mru, > ovsFwdCtx->completionList, > &ovsFwdCtx->layers, FALSE); > ovsFwdCtx->curNbl = newNbl; >@@ -822,6 +827,7 @@ OvsTunnelPortRx(OvsForwardingContext *ovsFwdCtx) > OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, > newNbl, tunnelRxVport->portNo, 0, > NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), >+ ovsFwdCtx->mru, > ovsFwdCtx->completionList, > &ovsFwdCtx->layers, FALSE); > >@@ -921,6 +927,7 @@ OvsOutputForwardingCtx(OvsForwardingContext *ovsFwdCtx) > status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, > newNbl, ovsFwdCtx->srcVportNo, 0, > NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), >+ ovsFwdCtx->mru, > ovsFwdCtx->completionList, > &ovsFwdCtx->layers, FALSE); > if (status != NDIS_STATUS_SUCCESS) { >@@ -986,7 +993,7 @@ OvsLookupFlowOutput(POVS_SWITCH_CONTEXT switchContext, > status = OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl, > internalVport->portNo, 0, > NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(curNbl), >- completionList, NULL, TRUE); >+ 0, completionList, NULL, TRUE); > if (status != NDIS_STATUS_SUCCESS) { > OvsCompleteNBLForwardingCtx(&ovsFwdCtx, > L"OVS-Dropped due to resources"); >@@ -1060,6 +1067,7 @@ OvsOutputBeforeSetAction(OvsForwardingContext *ovsFwdCtx) > status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, > newNbl, tempVportNo, 0, > NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), >+ ovsFwdCtx->mru, > ovsFwdCtx->completionList, > &ovsFwdCtx->layers, FALSE); > } >@@ -1104,7 +1112,7 @@ OvsPopFieldInPacketBuf(OvsForwardingContext *ovsFwdCtx, > status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, newNbl, > ovsFwdCtx->srcVportNo, 0, > NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), >- NULL, &ovsFwdCtx->layers, FALSE); >+ ovsFwdCtx->mru, NULL, &ovsFwdCtx->layers, FALSE); > if (status != NDIS_STATUS_SUCCESS) { > OvsCompleteNBLForwardingCtx(ovsFwdCtx, > L"Dropped due to resouces"); >@@ -1228,7 +1236,7 @@ OvsActionMplsPush(OvsForwardingContext *ovsFwdCtx, > status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, > newNbl, ovsFwdCtx->srcVportNo, 0, > NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), >- NULL, &ovsFwdCtx->layers, FALSE); >+ ovsFwdCtx->mru, NULL, &ovsFwdCtx->layers, FALSE); > if (status != NDIS_STATUS_SUCCESS) { > OvsCompleteNBLForwardingCtx(ovsFwdCtx, > L"OVS-Dropped due to resources"); >@@ -1360,8 +1368,7 @@ PUINT8 OvsGetHeaderBySize(OvsForwardingContext *ovsFwdCtx, > status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, > newNbl, ovsFwdCtx->srcVportNo, 0, > NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), >- NULL, &ovsFwdCtx->layers, FALSE); >- >+ ovsFwdCtx->mru, NULL, &ovsFwdCtx->layers, FALSE); > if (status != NDIS_STATUS_SUCCESS) { > OvsCompleteNBLForwardingCtx(ovsFwdCtx, > L"OVS-Dropped due to resources"); >@@ -1667,9 +1674,10 @@ OvsExecuteRecirc(OvsForwardingContext *ovsFwdCtx, > } > > if (newNbl) { >- deferredAction = OvsAddDeferredActions(newNbl, key, NULL); >+ deferredAction = OvsAddDeferredActions(newNbl, key, ovsFwdCtx->mru, NULL); > } else { >- deferredAction = OvsAddDeferredActions(ovsFwdCtx->curNbl, key, NULL); >+ deferredAction = OvsAddDeferredActions(ovsFwdCtx->curNbl, key, >+ ovsFwdCtx->mru, NULL); > } > > if (deferredAction) { >@@ -1742,8 +1750,8 @@ OvsOutputUserspaceAction(OvsForwardingContext *ovsFwdCtx, > OVS_PACKET_CMD_ACTION, > vport, key, ovsFwdCtx->curNbl, > NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx->curNbl), >- isRecv, >- layers); >+ isRecv, layers, >+ ovsFwdCtx->mru); > if (elem) { > LIST_ENTRY missedPackets; > InitializeListHead(&missedPackets); >@@ -1821,7 +1829,7 @@ OvsExecuteSampleAction(OvsForwardingContext *ovsFwdCtx, > return STATUS_SUCCESS; > } > >- if (!OvsAddDeferredActions(newNbl, key, a)) { >+ if (!OvsAddDeferredActions(newNbl, key, ovsFwdCtx->mru, a)) { > OVS_LOG_INFO( > "Deferred actions limit reached, dropping sample action."); > OvsCompleteNBL(ovsFwdCtx->switchContext, newNbl, TRUE); >@@ -1857,6 +1865,7 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext, > OvsFlowKey *key, > UINT64 *hash, > OVS_PACKET_HDR_INFO *layers, >+ UINT16 mru, > const PNL_ATTR actions, > INT actionsLen) > { >@@ -1871,8 +1880,8 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext, > > /* XXX: ASSERT that the flow table lock is held. */ > status = OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl, portNo, >- sendFlags, fwdDetail, completionList, >- layers, TRUE); >+ sendFlags, fwdDetail, mru, >+ completionList, layers, TRUE); > if (status != NDIS_STATUS_SUCCESS) { > dropReason = L"OVS-initing destination port list failed"; > goto dropit; >@@ -2173,6 +2182,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext, > OvsFlowKey *key, > UINT64 *hash, > OVS_PACKET_HDR_INFO *layers, >+ UINT16 mru, > const PNL_ATTR actions, > INT actionsLen) > { >@@ -2180,7 +2190,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext, > > status = OvsDoExecuteActions(switchContext, completionList, curNbl, > portNo, sendFlags, key, hash, layers, >- actions, actionsLen); >+ mru, actions, actionsLen); > > if (status == STATUS_SUCCESS) { > status = OvsProcessDeferredActions(switchContext, completionList, >@@ -2203,6 +2213,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext, > PNET_BUFFER_LIST curNbl, > OvsFlowKey *key, > UINT32 srcPortNo, >+ UINT16 mru, > OVS_PACKET_HDR_INFO *layers) > { > NDIS_STATUS status; >@@ -2214,7 +2225,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext, > OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl, > srcPortNo, 0, > NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(curNbl), >- completionList, layers, TRUE); >+ mru, completionList, layers, TRUE); > > flow = OvsLookupFlow(&ovsFwdCtx.switchContext->datapath, key, &hash, FALSE); > if (flow) { >@@ -2240,6 +2251,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext, > ovsFwdCtx.srcVportNo, > ovsFwdCtx.sendFlags, > key, &hash, &ovsFwdCtx.layers, >+ ovsFwdCtx.mru, > flow->actions, flow->actionsLen); > ovsFwdCtx.curNbl = NULL; > >@@ -2264,6 +2276,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext, > vport->portId), > &ovsFwdCtx.layers, > ovsFwdCtx.switchContext, >+ ovsFwdCtx.mru, > &missedPackets, &num); > if (num) { > OvsQueuePackets(&missedPackets, num); >diff --git a/datapath-windows/ovsext/Actions.h b/datapath-windows/ovsext/Actions.h >index c56c260..8636b87 100644 >--- a/datapath-windows/ovsext/Actions.h >+++ b/datapath-windows/ovsext/Actions.h >@@ -29,6 +29,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext, > OvsFlowKey *key, > UINT64 *hash, > OVS_PACKET_HDR_INFO *layers, >+ UINT16 mru, > const PNL_ATTR actions, > int actionsLen); > >@@ -41,6 +42,7 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext, > OvsFlowKey *key, > UINT64 *hash, > OVS_PACKET_HDR_INFO *layers, >+ UINT16 mru, > const PNL_ATTR actions, > int actionsLen); > >@@ -50,6 +52,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext, > PNET_BUFFER_LIST curNbl, > OvsFlowKey *key, > UINT32 srcPortNo, >+ UINT16 mru, > OVS_PACKET_HDR_INFO *layers); > > #endif /* __ACTIONS_H_ */ >diff --git a/datapath-windows/ovsext/DpInternal.h b/datapath-windows/ovsext/DpInternal.h >index f62fc55..9d1a783 100644 >--- a/datapath-windows/ovsext/DpInternal.h >+++ b/datapath-windows/ovsext/DpInternal.h >@@ -298,7 +298,7 @@ typedef struct _OVS_PACKET_INFO { > typedef struct OvsPacketExecute { > uint32_t dpNo; > uint32_t inPort; >- >+ uint16 mru; > uint32_t packetLen; > uint32_t actionsLen; > PNL_MSG_HDR nlMsgHdr; >diff --git a/datapath-windows/ovsext/PacketIO.c b/datapath-windows/ovsext/PacketIO.c >index a90b556..e6d3aa2 100644 >--- a/datapath-windows/ovsext/PacketIO.c >+++ b/datapath-windows/ovsext/PacketIO.c >@@ -335,7 +335,7 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext, > * check the return value. */ > OvsActionsExecute(switchContext, &completionList, curNbl, > portNo, SendFlags, &key, &hash, &layers, >- flow->actions, flow->actionsLen); >+ 0, flow->actions, flow->actionsLen); > OvsReleaseDatapath(datapath, &dpLockState); > NdisReleaseRWLock(switchContext->dispatchLock, &lockState); > continue; >@@ -344,9 +344,10 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext, > > datapath->misses++; > status = OvsCreateAndAddPackets(NULL, 0, OVS_PACKET_CMD_MISS, >- vport, &key, curNbl, >- OvsIsExternalVportByPortId(switchContext, sourcePort), >- &layers, switchContext, &missedPackets, &num); >+ vport, &key, curNbl, >+ OvsIsExternalVportByPortId(switchContext, sourcePort), >+ &layers, switchContext, 0, >+ &missedPackets, &num); > if (status == NDIS_STATUS_SUCCESS) { > /* Complete the packet since it was copied to user > * buffer. */ >diff --git a/datapath-windows/ovsext/Recirc.c b/datapath-windows/ovsext/Recirc.c >index 2febf06..61d0494 100644 >--- a/datapath-windows/ovsext/Recirc.c >+++ b/datapath-windows/ovsext/Recirc.c >@@ -277,6 +277,7 @@ OvsDeferredActionsQueuePush(POVS_DEFERRED_ACTION_QUEUE queue) > POVS_DEFERRED_ACTION > OvsAddDeferredActions(PNET_BUFFER_LIST nbl, > OvsFlowKey *key, >+ UINT16 mru, > const PNL_ATTR actions) > { > POVS_DEFERRED_ACTION_QUEUE queue = OvsDeferredActionsQueueGet(); >@@ -287,6 +288,7 @@ OvsAddDeferredActions(PNET_BUFFER_LIST nbl, > deferredAction->nbl = nbl; > deferredAction->actions = actions; > deferredAction->key = *key; >+ deferredAction->mru = mru; > } > > return deferredAction; >@@ -319,7 +321,8 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext, > portNo, > sendFlags, > &deferredAction->key, NULL, >- layers, deferredAction->actions, >+ layers, deferredAction->mru, >+ deferredAction->actions, > NlAttrGetSize(deferredAction->actions)); > } else { > status = OvsDoRecirc(switchContext, >@@ -327,6 +330,7 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext, > deferredAction->nbl, > &deferredAction->key, > portNo, >+ deferredAction->mru, > layers); > } > } >diff --git a/datapath-windows/ovsext/Recirc.h b/datapath-windows/ovsext/Recirc.h >index 2b314ce..957ca54 100644 >--- a/datapath-windows/ovsext/Recirc.h >+++ b/datapath-windows/ovsext/Recirc.h >@@ -26,6 +26,7 @@ typedef struct _OVS_DEFERRED_ACTION { > PNET_BUFFER_LIST nbl; > PNL_ATTR actions; > OvsFlowKey key; >+ UINT16 mru; > } OVS_DEFERRED_ACTION, *POVS_DEFERRED_ACTION; > > /* >@@ -52,6 +53,7 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext, > POVS_DEFERRED_ACTION > OvsAddDeferredActions(PNET_BUFFER_LIST packet, > OvsFlowKey *key, >+ UINT16 mru, > const PNL_ATTR actions); > > /* >diff --git a/datapath-windows/ovsext/Tunnel.c b/datapath-windows/ovsext/Tunnel.c >index 4b4da00..fcb9335 100644 >--- a/datapath-windows/ovsext/Tunnel.c >+++ b/datapath-windows/ovsext/Tunnel.c >@@ -310,7 +310,7 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl, > > OvsActionsExecute(gOvsSwitchContext, &completionList, pNbl, > portNo, SendFlags, &key, &hash, &layers, >- flow->actions, flow->actionsLen); >+ 0 /*default*/, flow->actions, flow->actionsLen); > > OvsReleaseDatapath(datapath, &dpLockState); > } else { >@@ -319,7 +319,7 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl, > datapath->misses++; > elem = OvsCreateQueueNlPacket(NULL, 0, OVS_PACKET_CMD_MISS, > vport, &key, pNbl, curNb, >- TRUE, &layers); >+ TRUE, &layers, 0 /*default*/); > if (elem) { > /* Complete the packet since it was copied to user buffer. */ > InsertTailList(&missedPackets, &elem->link); >diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c >index c7ac284..290a87d 100644 >--- a/datapath-windows/ovsext/User.c >+++ b/datapath-windows/ovsext/User.c >@@ -283,7 +283,8 @@ OvsNlExecuteCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx, > [OVS_PACKET_ATTR_ACTIONS] = {.type = NL_A_UNSPEC, .optional = FALSE}, > [OVS_PACKET_ATTR_USERDATA] = {.type = NL_A_UNSPEC, .optional = TRUE}, > [OVS_PACKET_ATTR_EGRESS_TUN_KEY] = {.type = NL_A_UNSPEC, >- .optional = TRUE} >+ .optional = TRUE}, >+ [OVS_PACKET_ATTR_MRU] = { .type = NL_A_U16, .optional = TRUE } > }; > > RtlZeroMemory(&execute, sizeof(OvsPacketExecute)); >@@ -381,6 +382,10 @@ _MapNlAttrToOvsPktExec(PNL_MSG_HDR nlMsgHdr, PNL_ATTR *nlAttrs, > ASSERT(keyAttrs[OVS_KEY_ATTR_IN_PORT]); > execute->inPort = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_IN_PORT]); > execute->keyAttrs = keyAttrs; >+ >+ if (nlAttrs[OVS_PACKET_ATTR_MRU]) { >+ execute->mru = NlAttrGetU16(nlAttrs[OVS_PACKET_ATTR_MRU]); >+ } > } > > NTSTATUS >@@ -465,8 +470,8 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute) > vport ? vport->portNo : > OVS_DPPORT_NUMBER_INVALID, > NDIS_SEND_FLAGS_SWITCH_DESTINATION_GROUP, >- &key, NULL, &layers, actions, >- execute->actionsLen); >+ &key, NULL, &layers, execute->mru, >+ actions, execute->actionsLen); > pNbl = NULL; > NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState); > } >@@ -757,6 +762,7 @@ OvsCreateAndAddPackets(PVOID userData, > BOOLEAN isRecv, > POVS_PACKET_HDR_INFO hdrInfo, > POVS_SWITCH_CONTEXT switchContext, >+ UINT16 mru, > LIST_ENTRY *list, > UINT32 *num) > { >@@ -789,8 +795,8 @@ OvsCreateAndAddPackets(PVOID userData, > nb = NET_BUFFER_LIST_FIRST_NB(nbl); > while (nb) { > elem = OvsCreateQueueNlPacket(userData, userDataLen, >- cmd, vport, key, nbl, nb, >- isRecv, hdrInfo); >+ cmd, vport, key, nbl, nb, >+ isRecv, hdrInfo, mru); > if (elem) { > InsertTailList(list, &elem->link); > (*num)++; >@@ -975,7 +981,8 @@ OvsCreateQueueNlPacket(PVOID userData, > PNET_BUFFER_LIST nbl, > PNET_BUFFER nb, > BOOLEAN isRecv, >- POVS_PACKET_HDR_INFO hdrInfo) >+ POVS_PACKET_HDR_INFO hdrInfo, >+ UINT16 mru) > { > #define VLAN_TAG_SIZE 4 > UINT32 allocLen, dataLen, extraLen; >@@ -1070,7 +1077,12 @@ OvsCreateQueueNlPacket(PVOID userData, > OVS_KEY_ATTR_TUNNEL) != STATUS_SUCCESS) { > goto fail; > } >- >+ /* Set MRU attribute */ >+ if (mru != 0) { >+ if (!NlMsgPutTailU16(&nlBuf, OVS_PACKET_ATTR_MRU, mru)) { >+ goto fail; >+ } >+ } > /* XXX must send OVS_PACKET_ATTR_EGRESS_TUN_KEY if set by vswtchd */ > if (userData){ > if (!NlMsgPutTailUnspec(&nlBuf, OVS_PACKET_ATTR_USERDATA, >diff --git a/datapath-windows/ovsext/User.h b/datapath-windows/ovsext/User.h >index 3a42888..92991ac 100644 >--- a/datapath-windows/ovsext/User.h >+++ b/datapath-windows/ovsext/User.h >@@ -72,13 +72,14 @@ VOID OvsCleanupPacketQueue(struct _OVS_OPEN_INSTANCE *instance); > > POVS_PACKET_QUEUE_ELEM OvsCreateQueueNlPacket(PVOID userData, > UINT32 userDataLen, >- UINT32 cmd, >+ UINT32 cmd, > POVS_VPORT_ENTRY vport, > OvsFlowKey *key, > PNET_BUFFER_LIST nbl, > PNET_BUFFER nb, > BOOLEAN isRecv, >- POVS_PACKET_HDR_INFO hdrInfo); >+ POVS_PACKET_HDR_INFO hdrInfo, >+ UINT16 mru); > > VOID OvsQueuePackets(PLIST_ENTRY packetList, UINT32 numElems); > NTSTATUS OvsCreateAndAddPackets(PVOID userData, >@@ -90,6 +91,7 @@ NTSTATUS OvsCreateAndAddPackets(PVOID userData, > BOOLEAN isRecv, > POVS_PACKET_HDR_INFO hdrInfo, > POVS_SWITCH_CONTEXT switchContext, >+ UINT16 mru, > LIST_ENTRY *list, > UINT32 *num); > >-- >2.9.3.windows.1 > >_______________________________________________ >dev mailing list >dev@openvswitch.org >https://urldefense.proofpoint.com/v2/url?u=https-3A__mail.openvswitch.org_mailman_listinfo_ovs-2Ddev&d=DwICAg&c=uilaK90D4TOVoH58JNXRgQ&r=Z6vowHUOjP5ysP_g372c49Nqc1vEKqHKNBkR5Q5Z7uo&m=GhdQPrZGNM53M3M0wFH3eYKNePa-8MxHEhsXXzoDdEI&s=8RIw8qIO89YDtEOLkzzmgxisIhodekhZJfv5nZRmwc0&e=
diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c index e4e56e8..5b541b1 100644 --- a/datapath-windows/ovsext/Actions.c +++ b/datapath-windows/ovsext/Actions.c @@ -150,6 +150,7 @@ OvsInitForwardingCtx(OvsForwardingContext *ovsFwdCtx, UINT32 srcVportNo, ULONG sendFlags, PNDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO fwdDetail, + UINT16 mru, OvsCompletionList *completionList, OVS_PACKET_HDR_INFO *layers, BOOLEAN resetTunnelInfo) @@ -167,7 +168,7 @@ OvsInitForwardingCtx(OvsForwardingContext *ovsFwdCtx, ovsFwdCtx->switchContext = switchContext; ovsFwdCtx->completionList = completionList; ovsFwdCtx->fwdDetail = fwdDetail; - + ovsFwdCtx->mru = mru; if (fwdDetail->NumAvailableDestinations > 0) { /* * XXX: even though MSDN says GetNetBufferListDestinations() returns @@ -615,6 +616,7 @@ OvsDoFlowLookupOutput(OvsForwardingContext *ovsFwdCtx) ovsFwdCtx->srcVportNo, ovsFwdCtx->sendFlags, &key, &hash, &ovsFwdCtx->layers, + ovsFwdCtx->mru, flow->actions, flow->actionsLen); ovsFwdCtx->curNbl = NULL; } else { @@ -623,9 +625,11 @@ OvsDoFlowLookupOutput(OvsForwardingContext *ovsFwdCtx) ovsFwdCtx->switchContext->datapath.misses++; InitializeListHead(&missedPackets); status = OvsCreateAndAddPackets(NULL, 0, OVS_PACKET_CMD_MISS, vport, - &key,ovsFwdCtx->curNbl, - FALSE, &ovsFwdCtx->layers, - ovsFwdCtx->switchContext, &missedPackets, &num); + &key,ovsFwdCtx->curNbl, + FALSE, &ovsFwdCtx->layers, + ovsFwdCtx->switchContext, + ovsFwdCtx->mru, + &missedPackets, &num); if (num) { OvsQueuePackets(&missedPackets, num); } @@ -722,6 +726,7 @@ OvsTunnelPortTx(OvsForwardingContext *ovsFwdCtx) status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, newNbl, srcVportNo, 0, NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), + ovsFwdCtx->mru, ovsFwdCtx->completionList, &ovsFwdCtx->layers, FALSE); ovsFwdCtx->curNbl = newNbl; @@ -822,6 +827,7 @@ OvsTunnelPortRx(OvsForwardingContext *ovsFwdCtx) OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, newNbl, tunnelRxVport->portNo, 0, NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), + ovsFwdCtx->mru, ovsFwdCtx->completionList, &ovsFwdCtx->layers, FALSE); @@ -921,6 +927,7 @@ OvsOutputForwardingCtx(OvsForwardingContext *ovsFwdCtx) status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, newNbl, ovsFwdCtx->srcVportNo, 0, NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), + ovsFwdCtx->mru, ovsFwdCtx->completionList, &ovsFwdCtx->layers, FALSE); if (status != NDIS_STATUS_SUCCESS) { @@ -986,7 +993,7 @@ OvsLookupFlowOutput(POVS_SWITCH_CONTEXT switchContext, status = OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl, internalVport->portNo, 0, NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(curNbl), - completionList, NULL, TRUE); + 0, completionList, NULL, TRUE); if (status != NDIS_STATUS_SUCCESS) { OvsCompleteNBLForwardingCtx(&ovsFwdCtx, L"OVS-Dropped due to resources"); @@ -1060,6 +1067,7 @@ OvsOutputBeforeSetAction(OvsForwardingContext *ovsFwdCtx) status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, newNbl, tempVportNo, 0, NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), + ovsFwdCtx->mru, ovsFwdCtx->completionList, &ovsFwdCtx->layers, FALSE); } @@ -1104,7 +1112,7 @@ OvsPopFieldInPacketBuf(OvsForwardingContext *ovsFwdCtx, status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, newNbl, ovsFwdCtx->srcVportNo, 0, NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), - NULL, &ovsFwdCtx->layers, FALSE); + ovsFwdCtx->mru, NULL, &ovsFwdCtx->layers, FALSE); if (status != NDIS_STATUS_SUCCESS) { OvsCompleteNBLForwardingCtx(ovsFwdCtx, L"Dropped due to resouces"); @@ -1228,7 +1236,7 @@ OvsActionMplsPush(OvsForwardingContext *ovsFwdCtx, status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, newNbl, ovsFwdCtx->srcVportNo, 0, NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), - NULL, &ovsFwdCtx->layers, FALSE); + ovsFwdCtx->mru, NULL, &ovsFwdCtx->layers, FALSE); if (status != NDIS_STATUS_SUCCESS) { OvsCompleteNBLForwardingCtx(ovsFwdCtx, L"OVS-Dropped due to resources"); @@ -1360,8 +1368,7 @@ PUINT8 OvsGetHeaderBySize(OvsForwardingContext *ovsFwdCtx, status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, newNbl, ovsFwdCtx->srcVportNo, 0, NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), - NULL, &ovsFwdCtx->layers, FALSE); - + ovsFwdCtx->mru, NULL, &ovsFwdCtx->layers, FALSE); if (status != NDIS_STATUS_SUCCESS) { OvsCompleteNBLForwardingCtx(ovsFwdCtx, L"OVS-Dropped due to resources"); @@ -1667,9 +1674,10 @@ OvsExecuteRecirc(OvsForwardingContext *ovsFwdCtx, } if (newNbl) { - deferredAction = OvsAddDeferredActions(newNbl, key, NULL); + deferredAction = OvsAddDeferredActions(newNbl, key, ovsFwdCtx->mru, NULL); } else { - deferredAction = OvsAddDeferredActions(ovsFwdCtx->curNbl, key, NULL); + deferredAction = OvsAddDeferredActions(ovsFwdCtx->curNbl, key, + ovsFwdCtx->mru, NULL); } if (deferredAction) { @@ -1742,8 +1750,8 @@ OvsOutputUserspaceAction(OvsForwardingContext *ovsFwdCtx, OVS_PACKET_CMD_ACTION, vport, key, ovsFwdCtx->curNbl, NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx->curNbl), - isRecv, - layers); + isRecv, layers, + ovsFwdCtx->mru); if (elem) { LIST_ENTRY missedPackets; InitializeListHead(&missedPackets); @@ -1821,7 +1829,7 @@ OvsExecuteSampleAction(OvsForwardingContext *ovsFwdCtx, return STATUS_SUCCESS; } - if (!OvsAddDeferredActions(newNbl, key, a)) { + if (!OvsAddDeferredActions(newNbl, key, ovsFwdCtx->mru, a)) { OVS_LOG_INFO( "Deferred actions limit reached, dropping sample action."); OvsCompleteNBL(ovsFwdCtx->switchContext, newNbl, TRUE); @@ -1857,6 +1865,7 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext, OvsFlowKey *key, UINT64 *hash, OVS_PACKET_HDR_INFO *layers, + UINT16 mru, const PNL_ATTR actions, INT actionsLen) { @@ -1871,8 +1880,8 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext, /* XXX: ASSERT that the flow table lock is held. */ status = OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl, portNo, - sendFlags, fwdDetail, completionList, - layers, TRUE); + sendFlags, fwdDetail, mru, + completionList, layers, TRUE); if (status != NDIS_STATUS_SUCCESS) { dropReason = L"OVS-initing destination port list failed"; goto dropit; @@ -2173,6 +2182,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext, OvsFlowKey *key, UINT64 *hash, OVS_PACKET_HDR_INFO *layers, + UINT16 mru, const PNL_ATTR actions, INT actionsLen) { @@ -2180,7 +2190,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext, status = OvsDoExecuteActions(switchContext, completionList, curNbl, portNo, sendFlags, key, hash, layers, - actions, actionsLen); + mru, actions, actionsLen); if (status == STATUS_SUCCESS) { status = OvsProcessDeferredActions(switchContext, completionList, @@ -2203,6 +2213,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext, PNET_BUFFER_LIST curNbl, OvsFlowKey *key, UINT32 srcPortNo, + UINT16 mru, OVS_PACKET_HDR_INFO *layers) { NDIS_STATUS status; @@ -2214,7 +2225,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext, OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl, srcPortNo, 0, NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(curNbl), - completionList, layers, TRUE); + mru, completionList, layers, TRUE); flow = OvsLookupFlow(&ovsFwdCtx.switchContext->datapath, key, &hash, FALSE); if (flow) { @@ -2240,6 +2251,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext, ovsFwdCtx.srcVportNo, ovsFwdCtx.sendFlags, key, &hash, &ovsFwdCtx.layers, + ovsFwdCtx.mru, flow->actions, flow->actionsLen); ovsFwdCtx.curNbl = NULL; @@ -2264,6 +2276,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext, vport->portId), &ovsFwdCtx.layers, ovsFwdCtx.switchContext, + ovsFwdCtx.mru, &missedPackets, &num); if (num) { OvsQueuePackets(&missedPackets, num); diff --git a/datapath-windows/ovsext/Actions.h b/datapath-windows/ovsext/Actions.h index c56c260..8636b87 100644 --- a/datapath-windows/ovsext/Actions.h +++ b/datapath-windows/ovsext/Actions.h @@ -29,6 +29,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext, OvsFlowKey *key, UINT64 *hash, OVS_PACKET_HDR_INFO *layers, + UINT16 mru, const PNL_ATTR actions, int actionsLen); @@ -41,6 +42,7 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext, OvsFlowKey *key, UINT64 *hash, OVS_PACKET_HDR_INFO *layers, + UINT16 mru, const PNL_ATTR actions, int actionsLen); @@ -50,6 +52,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext, PNET_BUFFER_LIST curNbl, OvsFlowKey *key, UINT32 srcPortNo, + UINT16 mru, OVS_PACKET_HDR_INFO *layers); #endif /* __ACTIONS_H_ */ diff --git a/datapath-windows/ovsext/DpInternal.h b/datapath-windows/ovsext/DpInternal.h index f62fc55..9d1a783 100644 --- a/datapath-windows/ovsext/DpInternal.h +++ b/datapath-windows/ovsext/DpInternal.h @@ -298,7 +298,7 @@ typedef struct _OVS_PACKET_INFO { typedef struct OvsPacketExecute { uint32_t dpNo; uint32_t inPort; - + uint16 mru; uint32_t packetLen; uint32_t actionsLen; PNL_MSG_HDR nlMsgHdr; diff --git a/datapath-windows/ovsext/PacketIO.c b/datapath-windows/ovsext/PacketIO.c index a90b556..e6d3aa2 100644 --- a/datapath-windows/ovsext/PacketIO.c +++ b/datapath-windows/ovsext/PacketIO.c @@ -335,7 +335,7 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext, * check the return value. */ OvsActionsExecute(switchContext, &completionList, curNbl, portNo, SendFlags, &key, &hash, &layers, - flow->actions, flow->actionsLen); + 0, flow->actions, flow->actionsLen); OvsReleaseDatapath(datapath, &dpLockState); NdisReleaseRWLock(switchContext->dispatchLock, &lockState); continue; @@ -344,9 +344,10 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext, datapath->misses++; status = OvsCreateAndAddPackets(NULL, 0, OVS_PACKET_CMD_MISS, - vport, &key, curNbl, - OvsIsExternalVportByPortId(switchContext, sourcePort), - &layers, switchContext, &missedPackets, &num); + vport, &key, curNbl, + OvsIsExternalVportByPortId(switchContext, sourcePort), + &layers, switchContext, 0, + &missedPackets, &num); if (status == NDIS_STATUS_SUCCESS) { /* Complete the packet since it was copied to user * buffer. */ diff --git a/datapath-windows/ovsext/Recirc.c b/datapath-windows/ovsext/Recirc.c index 2febf06..61d0494 100644 --- a/datapath-windows/ovsext/Recirc.c +++ b/datapath-windows/ovsext/Recirc.c @@ -277,6 +277,7 @@ OvsDeferredActionsQueuePush(POVS_DEFERRED_ACTION_QUEUE queue) POVS_DEFERRED_ACTION OvsAddDeferredActions(PNET_BUFFER_LIST nbl, OvsFlowKey *key, + UINT16 mru, const PNL_ATTR actions) { POVS_DEFERRED_ACTION_QUEUE queue = OvsDeferredActionsQueueGet(); @@ -287,6 +288,7 @@ OvsAddDeferredActions(PNET_BUFFER_LIST nbl, deferredAction->nbl = nbl; deferredAction->actions = actions; deferredAction->key = *key; + deferredAction->mru = mru; } return deferredAction; @@ -319,7 +321,8 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext, portNo, sendFlags, &deferredAction->key, NULL, - layers, deferredAction->actions, + layers, deferredAction->mru, + deferredAction->actions, NlAttrGetSize(deferredAction->actions)); } else { status = OvsDoRecirc(switchContext, @@ -327,6 +330,7 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext, deferredAction->nbl, &deferredAction->key, portNo, + deferredAction->mru, layers); } } diff --git a/datapath-windows/ovsext/Recirc.h b/datapath-windows/ovsext/Recirc.h index 2b314ce..957ca54 100644 --- a/datapath-windows/ovsext/Recirc.h +++ b/datapath-windows/ovsext/Recirc.h @@ -26,6 +26,7 @@ typedef struct _OVS_DEFERRED_ACTION { PNET_BUFFER_LIST nbl; PNL_ATTR actions; OvsFlowKey key; + UINT16 mru; } OVS_DEFERRED_ACTION, *POVS_DEFERRED_ACTION; /* @@ -52,6 +53,7 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext, POVS_DEFERRED_ACTION OvsAddDeferredActions(PNET_BUFFER_LIST packet, OvsFlowKey *key, + UINT16 mru, const PNL_ATTR actions); /* diff --git a/datapath-windows/ovsext/Tunnel.c b/datapath-windows/ovsext/Tunnel.c index 4b4da00..fcb9335 100644 --- a/datapath-windows/ovsext/Tunnel.c +++ b/datapath-windows/ovsext/Tunnel.c @@ -310,7 +310,7 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl, OvsActionsExecute(gOvsSwitchContext, &completionList, pNbl, portNo, SendFlags, &key, &hash, &layers, - flow->actions, flow->actionsLen); + 0 /*default*/, flow->actions, flow->actionsLen); OvsReleaseDatapath(datapath, &dpLockState); } else { @@ -319,7 +319,7 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl, datapath->misses++; elem = OvsCreateQueueNlPacket(NULL, 0, OVS_PACKET_CMD_MISS, vport, &key, pNbl, curNb, - TRUE, &layers); + TRUE, &layers, 0 /*default*/); if (elem) { /* Complete the packet since it was copied to user buffer. */ InsertTailList(&missedPackets, &elem->link); diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c index c7ac284..290a87d 100644 --- a/datapath-windows/ovsext/User.c +++ b/datapath-windows/ovsext/User.c @@ -283,7 +283,8 @@ OvsNlExecuteCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx, [OVS_PACKET_ATTR_ACTIONS] = {.type = NL_A_UNSPEC, .optional = FALSE}, [OVS_PACKET_ATTR_USERDATA] = {.type = NL_A_UNSPEC, .optional = TRUE}, [OVS_PACKET_ATTR_EGRESS_TUN_KEY] = {.type = NL_A_UNSPEC, - .optional = TRUE} + .optional = TRUE}, + [OVS_PACKET_ATTR_MRU] = { .type = NL_A_U16, .optional = TRUE } }; RtlZeroMemory(&execute, sizeof(OvsPacketExecute)); @@ -381,6 +382,10 @@ _MapNlAttrToOvsPktExec(PNL_MSG_HDR nlMsgHdr, PNL_ATTR *nlAttrs, ASSERT(keyAttrs[OVS_KEY_ATTR_IN_PORT]); execute->inPort = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_IN_PORT]); execute->keyAttrs = keyAttrs; + + if (nlAttrs[OVS_PACKET_ATTR_MRU]) { + execute->mru = NlAttrGetU16(nlAttrs[OVS_PACKET_ATTR_MRU]); + } } NTSTATUS @@ -465,8 +470,8 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute) vport ? vport->portNo : OVS_DPPORT_NUMBER_INVALID, NDIS_SEND_FLAGS_SWITCH_DESTINATION_GROUP, - &key, NULL, &layers, actions, - execute->actionsLen); + &key, NULL, &layers, execute->mru, + actions, execute->actionsLen); pNbl = NULL; NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState); } @@ -757,6 +762,7 @@ OvsCreateAndAddPackets(PVOID userData, BOOLEAN isRecv, POVS_PACKET_HDR_INFO hdrInfo, POVS_SWITCH_CONTEXT switchContext, + UINT16 mru, LIST_ENTRY *list, UINT32 *num) { @@ -789,8 +795,8 @@ OvsCreateAndAddPackets(PVOID userData, nb = NET_BUFFER_LIST_FIRST_NB(nbl); while (nb) { elem = OvsCreateQueueNlPacket(userData, userDataLen, - cmd, vport, key, nbl, nb, - isRecv, hdrInfo); + cmd, vport, key, nbl, nb, + isRecv, hdrInfo, mru); if (elem) { InsertTailList(list, &elem->link); (*num)++; @@ -975,7 +981,8 @@ OvsCreateQueueNlPacket(PVOID userData, PNET_BUFFER_LIST nbl, PNET_BUFFER nb, BOOLEAN isRecv, - POVS_PACKET_HDR_INFO hdrInfo) + POVS_PACKET_HDR_INFO hdrInfo, + UINT16 mru) { #define VLAN_TAG_SIZE 4 UINT32 allocLen, dataLen, extraLen; @@ -1070,7 +1077,12 @@ OvsCreateQueueNlPacket(PVOID userData, OVS_KEY_ATTR_TUNNEL) != STATUS_SUCCESS) { goto fail; } - + /* Set MRU attribute */ + if (mru != 0) { + if (!NlMsgPutTailU16(&nlBuf, OVS_PACKET_ATTR_MRU, mru)) { + goto fail; + } + } /* XXX must send OVS_PACKET_ATTR_EGRESS_TUN_KEY if set by vswtchd */ if (userData){ if (!NlMsgPutTailUnspec(&nlBuf, OVS_PACKET_ATTR_USERDATA, diff --git a/datapath-windows/ovsext/User.h b/datapath-windows/ovsext/User.h index 3a42888..92991ac 100644 --- a/datapath-windows/ovsext/User.h +++ b/datapath-windows/ovsext/User.h @@ -72,13 +72,14 @@ VOID OvsCleanupPacketQueue(struct _OVS_OPEN_INSTANCE *instance); POVS_PACKET_QUEUE_ELEM OvsCreateQueueNlPacket(PVOID userData, UINT32 userDataLen, - UINT32 cmd, + UINT32 cmd, POVS_VPORT_ENTRY vport, OvsFlowKey *key, PNET_BUFFER_LIST nbl, PNET_BUFFER nb, BOOLEAN isRecv, - POVS_PACKET_HDR_INFO hdrInfo); + POVS_PACKET_HDR_INFO hdrInfo, + UINT16 mru); VOID OvsQueuePackets(PLIST_ENTRY packetList, UINT32 numElems); NTSTATUS OvsCreateAndAddPackets(PVOID userData, @@ -90,6 +91,7 @@ NTSTATUS OvsCreateAndAddPackets(PVOID userData, BOOLEAN isRecv, POVS_PACKET_HDR_INFO hdrInfo, POVS_SWITCH_CONTEXT switchContext, + UINT16 mru, LIST_ENTRY *list, UINT32 *num);
This patch retains the MRU value for the reassembled IP datagram in the OvsForwardingContext when the packet is forwarded to userspace and/or retrived from userspace. Also retain the MRU value when there are any deferred actions for the current NBL. Signed-off-by: Anand Kumar <kumaranand@vmware.com> --- v4->v3: No Change v2->v3: No change v1->v2: No change --- datapath-windows/ovsext/Actions.c | 49 +++++++++++++++++++++++------------- datapath-windows/ovsext/Actions.h | 3 +++ datapath-windows/ovsext/DpInternal.h | 2 +- datapath-windows/ovsext/PacketIO.c | 9 ++++--- datapath-windows/ovsext/Recirc.c | 6 ++++- datapath-windows/ovsext/Recirc.h | 2 ++ datapath-windows/ovsext/Tunnel.c | 4 +-- datapath-windows/ovsext/User.c | 26 +++++++++++++------ datapath-windows/ovsext/User.h | 6 +++-- 9 files changed, 72 insertions(+), 35 deletions(-)