diff mbox

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

Message ID 20170504221254.7896-4-kumaranand@vmware.com
State Accepted
Headers show

Commit Message

Anand Kumar May 4, 2017, 10:12 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>
---
v7->v8: No change
v6->v7: Increase value size in OVS_BUFFER_CONTEXT
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 |  3 ++-
 datapath-windows/ovsext/DpInternal.h |  2 +-
 datapath-windows/ovsext/IpFragment.c |  2 ++
 datapath-windows/ovsext/User.c       | 20 +++++++++++++++++++-
 5 files changed, 25 insertions(+), 3 deletions(-)

Comments

Alin Serdean May 6, 2017, 1:45 a.m. UTC | #1
Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>

> -----Original Message-----
> From: ovs-dev-bounces@openvswitch.org [mailto:ovs-dev-
> bounces@openvswitch.org] On Behalf Of Anand Kumar
> Sent: Friday, May 5, 2017 1:13 AM
> To: dev@openvswitch.org
> Subject: [ovs-dev] [PATCH v8 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>
> ---
> v7->v8: No change
> v6->v7: Increase value size in OVS_BUFFER_CONTEXT
> 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 |  3 ++-  datapath-
> windows/ovsext/DpInternal.h |  2 +-  datapath-
> windows/ovsext/IpFragment.c |  2 ++
>  datapath-windows/ovsext/User.c       | 20 +++++++++++++++++++-
>  5 files changed, 25 insertions(+), 3 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..294d40a 100644
> --- a/datapath-windows/ovsext/BufferMgmt.h
> +++ b/datapath-windows/ovsext/BufferMgmt.h
> @@ -58,9 +58,10 @@ typedef union _OVS_BUFFER_CONTEXT {
>              UINT32 origDataLength;
>              UINT32 dataOffsetDelta;
>          };
> +        UINT16 mru;
>      };
> 
> -    UINT64 value[MEM_ALIGN_SIZE(16) >> 3];
> +    UINT64 value[MEM_ALIGN_SIZE(32) >> 3];
>  } OVS_BUFFER_CONTEXT, *POVS_BUFFER_CONTEXT;
> 
>  typedef struct _OVS_NBL_POOL {
> 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 c689b99..675c32e 100644
> --- a/datapath-windows/ovsext/IpFragment.c
> +++ b/datapath-windows/ovsext/IpFragment.c
> @@ -211,6 +211,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(*new
> Nbl);
> +    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://mail.openvswitch.org/mailman/listinfo/ovs-dev
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..294d40a 100644
--- a/datapath-windows/ovsext/BufferMgmt.h
+++ b/datapath-windows/ovsext/BufferMgmt.h
@@ -58,9 +58,10 @@  typedef union _OVS_BUFFER_CONTEXT {
             UINT32 origDataLength;
             UINT32 dataOffsetDelta;
         };
+        UINT16 mru;
     };
 
-    UINT64 value[MEM_ALIGN_SIZE(16) >> 3];
+    UINT64 value[MEM_ALIGN_SIZE(32) >> 3];
 } OVS_BUFFER_CONTEXT, *POVS_BUFFER_CONTEXT;
 
 typedef struct _OVS_NBL_POOL {
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 c689b99..675c32e 100644
--- a/datapath-windows/ovsext/IpFragment.c
+++ b/datapath-windows/ovsext/IpFragment.c
@@ -211,6 +211,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,