From patchwork Mon Jan 30 21:39:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anand Kumar X-Patchwork-Id: 721731 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3vC2qd5jJlz9s3T for ; Tue, 31 Jan 2017 08:40:13 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 4A062B5F; Mon, 30 Jan 2017 21:40:09 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 66CA7B2B for ; Mon, 30 Jan 2017 21:40:07 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from EX13-EDG-OU-002.vmware.com (ex13-edg-ou-002.vmware.com [208.91.0.190]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 0B57C1F5 for ; Mon, 30 Jan 2017 21:40:05 +0000 (UTC) Received: from sc9-mailhost2.vmware.com (10.113.161.72) by EX13-EDG-OU-002.vmware.com (10.113.208.156) with Microsoft SMTP Server id 15.0.1156.6; Mon, 30 Jan 2017 13:39:22 -0800 Received: from localhost.localdomain (htb-1s-eng-dhcp259.eng.vmware.com [10.33.79.3]) by sc9-mailhost2.vmware.com (Postfix) with ESMTP id 27A2DB0485; Mon, 30 Jan 2017 13:40:05 -0800 (PST) From: Anand Kumar To: Date: Mon, 30 Jan 2017 13:39:47 -0800 Message-ID: <20170130213949.9388-4-kumaranand@vmware.com> X-Mailer: git-send-email 2.9.3.windows.1 In-Reply-To: <20170130213949.9388-1-kumaranand@vmware.com> References: <20170130213949.9388-1-kumaranand@vmware.com> MIME-Version: 1.0 Received-SPF: None (EX13-EDG-OU-002.vmware.com: kumaranand@vmware.com does not designate permitted sender hosts) X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH v4 3/5] datapath-windows: Retain MRU value in the OvsForwardingContext. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org 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 --- 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);