[ovs-dev] [PATCH v8 3/5] datapath-windows: Retain MRU value in the _OVS_BUFFER_CONTEXT.
Alin Serdean
aserdean at cloudbasesolutions.com
Sat May 6 01:45:00 UTC 2017
Acked-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
> -----Original Message-----
> From: ovs-dev-bounces at openvswitch.org [mailto:ovs-dev-
> bounces at openvswitch.org] On Behalf Of Anand Kumar
> Sent: Friday, May 5, 2017 1:13 AM
> To: dev at 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 at 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 at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
More information about the dev
mailing list