@@ -266,6 +266,7 @@ OvsInitNBLContext(POVS_BUFFER_CONTEXT ctx,
ctx->flags = flags;
ctx->srcPortNo = srcPortNo;
ctx->origDataLength = origDataLength;
+ ctx->mru = 0;
}
@@ -58,6 +58,7 @@ typedef union _OVS_BUFFER_CONTEXT {
UINT32 origDataLength;
UINT32 dataOffsetDelta;
};
+ UINT16 mru;
};
UINT64 value[MEM_ALIGN_SIZE(16) >> 3];
@@ -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;
@@ -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;
}
@@ -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,
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(-)