Acked-by: Alin Gabriel Serdean <[email protected]>
> -----Original Message----- > From: [email protected] [mailto:ovs-dev- > [email protected]] On Behalf Of Anand Kumar > Sent: Friday, May 5, 2017 1:13 AM > To: [email protected] > 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 <[email protected]> > --- > 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 > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
