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

Anand Kumar kumaranand at vmware.com
Mon Jan 30 21:39:47 UTC 2017


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



More information about the dev mailing list