diff options
Diffstat (limited to 'datapath-windows')
-rw-r--r-- | datapath-windows/ovsext/BufferMgmt.c | 1 | ||||
-rw-r--r-- | datapath-windows/ovsext/BufferMgmt.h | 3 | ||||
-rw-r--r-- | datapath-windows/ovsext/DpInternal.h | 2 | ||||
-rw-r--r-- | datapath-windows/ovsext/IpFragment.c | 2 | ||||
-rw-r--r-- | 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 6027c3513..d99052de4 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 11a05b2c5..294d40af9 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 f62fc55cb..9d1a78312 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 c689b9992..675c32e5a 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 c7ac28456..31546408d 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, |