diff mbox

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

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

Commit Message

Anand Kumar March 24, 2017, 8:51 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>
---
v5->v6: No Change
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(-)

Comments

Sairam Venugopal April 6, 2017, 4:56 p.m. UTC | #1
Thanks for incorporating this change.

Acked-by: Sairam Venugopal <vsairam@vmware.com>





On 3/24/17, 1:51 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 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>
>---
>v5->v6: No Change
>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 --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..3154640 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 = 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,
>-- 
>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=ygQza7U57S_gHFlFqzZe9Z6tGIlxZID_zSModfdY0OU&s=evQb7koQKlj7oZLL6sG7n-_kMgpoJldvRt27zPa4qXs&e=
Alin Serdean April 7, 2017, 2:19 a.m. UTC | #2
This looks good, just one small thing inlined.

> -----Original Message-----
> From: ovs-dev-bounces@openvswitch.org [mailto:ovs-dev-
> bounces@openvswitch.org] On Behalf Of Anand Kumar
> Sent: Friday, March 24, 2017 10:51 PM
> To: dev@openvswitch.org
> Subject: [ovs-dev] [PATCH v6 3/5] datapath-windows: Retain MRU value in
> the _OVS_BUFFER_CONTEXT.
> 
> 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>
> ---
> v5->v6: No Change
> 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
> --- 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]; 
[Alin Serdean] Please increase the size of value to adjust for the new value (`mru`)
diff --git a/datapath-
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..3154640 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 = 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,