diff mbox

[ovs-dev,v5,3/5] datapath-windows: Retain MRU value in the _OVS_BUFFER_CONTEXT.

Message ID 20170202185538.7560-4-kumaranand@vmware.com
State Superseded
Headers show

Commit Message

Anand Kumar Feb. 2, 2017, 6:55 p.m. UTC
This patch introduces a new field MRU(Maximum Recieved Unit) in the
_OVS_BUFFER_CONTEXT and it is used only for Ip Fragments to retain MRU for
the reassembled IP datagram when the packet is forwarded to userspace.

Signed-off-by: Anand Kumar <kumaranand@vmware.com>
---
v4->v5:
	- Refactored the patch as MRU field is removed form ovsForwardingContext.
	- Added MRU field in _OVS_BUFFER_CONTEXT.
	- Updated commit message.
v3->v4: No Change
v2->v3: No change
v1->v2: No change
---
 datapath-windows/ovsext/BufferMgmt.c |  1 +
 datapath-windows/ovsext/BufferMgmt.h |  1 +
 datapath-windows/ovsext/DpInternal.h |  2 +-
 datapath-windows/ovsext/IpFragment.c |  2 ++
 datapath-windows/ovsext/User.c       | 20 +++++++++++++++++++-
 5 files changed, 24 insertions(+), 2 deletions(-)
diff mbox

Patch

diff --git a/datapath-windows/ovsext/BufferMgmt.c b/datapath-windows/ovsext/BufferMgmt.c
index 6027c35..d99052d 100644
--- a/datapath-windows/ovsext/BufferMgmt.c
+++ b/datapath-windows/ovsext/BufferMgmt.c
@@ -266,6 +266,7 @@  OvsInitNBLContext(POVS_BUFFER_CONTEXT ctx,
     ctx->flags = flags;
     ctx->srcPortNo = srcPortNo;
     ctx->origDataLength = origDataLength;
+    ctx->mru = 0;
 }
 
 
diff --git a/datapath-windows/ovsext/BufferMgmt.h b/datapath-windows/ovsext/BufferMgmt.h
index 11a05b2..77b2854 100644
--- a/datapath-windows/ovsext/BufferMgmt.h
+++ b/datapath-windows/ovsext/BufferMgmt.h
@@ -58,6 +58,7 @@  typedef union _OVS_BUFFER_CONTEXT {
             UINT32 origDataLength;
             UINT32 dataOffsetDelta;
         };
+        UINT16 mru;
     };
 
     UINT64 value[MEM_ALIGN_SIZE(16) >> 3];
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/IpFragment.c b/datapath-windows/ovsext/IpFragment.c
index 37abcd8..b0294ce 100644
--- a/datapath-windows/ovsext/IpFragment.c
+++ b/datapath-windows/ovsext/IpFragment.c
@@ -208,6 +208,8 @@  OvsIpv4Reassemble(POVS_SWITCH_CONTEXT switchContext,
         OvsCompleteNBL(switchContext, *curNbl, TRUE);
     }
     /* Store mru in the ovs buffer context. */
+    ctx = (POVS_BUFFER_CONTEXT)NET_BUFFER_LIST_CONTEXT_DATA_START(*newNbl);
+    ctx->mru = entry->mru;
     *curNbl = *newNbl;
     return status;
 }
diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c
index c7ac284..3bfe3d0 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
@@ -397,6 +402,7 @@  OvsExecuteDpIoctl(OvsPacketExecute *execute)
     POVS_VPORT_ENTRY            vport = NULL;
     PNL_ATTR tunnelAttrs[__OVS_TUNNEL_KEY_ATTR_MAX];
     OvsFlowKey tempTunKey = {0};
+    POVS_BUFFER_CONTEXT ctx;
 
     if (execute->packetLen == 0) {
         status = STATUS_INVALID_PARAMETER;
@@ -459,6 +465,9 @@  OvsExecuteDpIoctl(OvsPacketExecute *execute)
     ndisStatus = OvsExtractFlow(pNbl, execute->inPort, &key, &layers,
                      tempTunKey.tunKey.dst == 0 ? NULL : &tempTunKey.tunKey);
 
+    ctx = (POVS_BUFFER_CONTEXT)NET_BUFFER_LIST_CONTEXT_DATA_START(pNbl);
+    ctx->mru = (UINT32)execute->mru;
+
     if (ndisStatus == NDIS_STATUS_SUCCESS) {
         NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState, 0);
         ndisStatus = OvsActionsExecute(gOvsSwitchContext, NULL, pNbl,
@@ -988,6 +997,7 @@  OvsCreateQueueNlPacket(PVOID userData,
     UINT32 nlMsgSize;
     NL_BUFFER nlBuf;
     PNL_MSG_HDR nlMsg;
+    POVS_BUFFER_CONTEXT ctx;
 
     if (vport == NULL){
         /* No vport is not fatal. */
@@ -1071,6 +1081,14 @@  OvsCreateQueueNlPacket(PVOID userData,
         goto fail;
     }
 
+    /* Set MRU attribute */
+    ctx = (POVS_BUFFER_CONTEXT)NET_BUFFER_LIST_CONTEXT_DATA_START(nbl);
+    if (ctx->mru != 0) {
+        if (!NlMsgPutTailU16(&nlBuf, OVS_PACKET_ATTR_MRU, (UINT16)ctx->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,