[ovs-dev] [PATCH v4 3/5] datapath-windows: Retain MRU value in the OvsForwardingContext.

Sairam Venugopal vsairam at vmware.com
Tue Jan 31 00:39:43 UTC 2017


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 at openvswitch.org on behalf of Anand Kumar" <ovs-dev-bounces at openvswitch.org on behalf of kumaranand at 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 at 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 at 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= 


More information about the dev mailing list