@@ -150,6 +150,7 @@ OvsInitForwardingCtx(OvsForwardingContext *ovsFwdCtx,
UINT32 srcVportNo,
ULONG sendFlags,
PNDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO fwdDetail,
+ UINT16 mru,
OvsCompletionList *completionList,
OVS_PACKET_HDR_INFO *layers,
BOOLEAN resetTunnelInfo)
@@ -167,7 +168,7 @@ OvsInitForwardingCtx(OvsForwardingContext *ovsFwdCtx,
ovsFwdCtx->switchContext = switchContext;
ovsFwdCtx->completionList = completionList;
ovsFwdCtx->fwdDetail = fwdDetail;
-
+ ovsFwdCtx->mru = mru;
if (fwdDetail->NumAvailableDestinations > 0) {
/*
* XXX: even though MSDN says GetNetBufferListDestinations() returns
@@ -615,6 +616,7 @@ OvsDoFlowLookupOutput(OvsForwardingContext *ovsFwdCtx)
ovsFwdCtx->srcVportNo,
ovsFwdCtx->sendFlags,
&key, &hash, &ovsFwdCtx->layers,
+ ovsFwdCtx->mru,
flow->actions, flow->actionsLen);
ovsFwdCtx->curNbl = NULL;
} else {
@@ -623,9 +625,11 @@ OvsDoFlowLookupOutput(OvsForwardingContext *ovsFwdCtx)
ovsFwdCtx->switchContext->datapath.misses++;
InitializeListHead(&missedPackets);
status = OvsCreateAndAddPackets(NULL, 0, OVS_PACKET_CMD_MISS, vport,
- &key,ovsFwdCtx->curNbl,
- FALSE, &ovsFwdCtx->layers,
- ovsFwdCtx->switchContext, &missedPackets, &num);
+ &key,ovsFwdCtx->curNbl,
+ FALSE, &ovsFwdCtx->layers,
+ ovsFwdCtx->switchContext,
+ ovsFwdCtx->mru,
+ &missedPackets, &num);
if (num) {
OvsQueuePackets(&missedPackets, num);
}
@@ -722,6 +726,7 @@ OvsTunnelPortTx(OvsForwardingContext *ovsFwdCtx)
status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext,
newNbl, srcVportNo, 0,
NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl),
+ ovsFwdCtx->mru,
ovsFwdCtx->completionList,
&ovsFwdCtx->layers, FALSE);
ovsFwdCtx->curNbl = newNbl;
@@ -822,6 +827,7 @@ OvsTunnelPortRx(OvsForwardingContext *ovsFwdCtx)
OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext,
newNbl, tunnelRxVport->portNo, 0,
NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl),
+ ovsFwdCtx->mru,
ovsFwdCtx->completionList,
&ovsFwdCtx->layers, FALSE);
@@ -921,6 +927,7 @@ OvsOutputForwardingCtx(OvsForwardingContext *ovsFwdCtx)
status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext,
newNbl, ovsFwdCtx->srcVportNo, 0,
NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl),
+ ovsFwdCtx->mru,
ovsFwdCtx->completionList,
&ovsFwdCtx->layers, FALSE);
if (status != NDIS_STATUS_SUCCESS) {
@@ -986,7 +993,7 @@ OvsLookupFlowOutput(POVS_SWITCH_CONTEXT switchContext,
status = OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl,
internalVport->portNo, 0,
NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(curNbl),
- completionList, NULL, TRUE);
+ 0, completionList, NULL, TRUE);
if (status != NDIS_STATUS_SUCCESS) {
OvsCompleteNBLForwardingCtx(&ovsFwdCtx,
L"OVS-Dropped due to resources");
@@ -1060,6 +1067,7 @@ OvsOutputBeforeSetAction(OvsForwardingContext *ovsFwdCtx)
status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext,
newNbl, tempVportNo, 0,
NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl),
+ ovsFwdCtx->mru,
ovsFwdCtx->completionList,
&ovsFwdCtx->layers, FALSE);
}
@@ -1104,7 +1112,7 @@ OvsPopFieldInPacketBuf(OvsForwardingContext *ovsFwdCtx,
status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, newNbl,
ovsFwdCtx->srcVportNo, 0,
NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl),
- NULL, &ovsFwdCtx->layers, FALSE);
+ ovsFwdCtx->mru, NULL, &ovsFwdCtx->layers, FALSE);
if (status != NDIS_STATUS_SUCCESS) {
OvsCompleteNBLForwardingCtx(ovsFwdCtx,
L"Dropped due to resouces");
@@ -1228,7 +1236,7 @@ OvsActionMplsPush(OvsForwardingContext *ovsFwdCtx,
status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext,
newNbl, ovsFwdCtx->srcVportNo, 0,
NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl),
- NULL, &ovsFwdCtx->layers, FALSE);
+ ovsFwdCtx->mru, NULL, &ovsFwdCtx->layers, FALSE);
if (status != NDIS_STATUS_SUCCESS) {
OvsCompleteNBLForwardingCtx(ovsFwdCtx,
L"OVS-Dropped due to resources");
@@ -1374,7 +1382,7 @@ OvsUpdateIPv4Header(OvsForwardingContext *ovsFwdCtx,
status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext,
newNbl, ovsFwdCtx->srcVportNo, 0,
NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl),
- NULL, &ovsFwdCtx->layers, FALSE);
+ ovsFwdCtx->mru, NULL, &ovsFwdCtx->layers, FALSE);
if (status != NDIS_STATUS_SUCCESS) {
OvsCompleteNBLForwardingCtx(ovsFwdCtx,
L"OVS-Dropped due to resources");
@@ -1545,9 +1553,10 @@ OvsExecuteRecirc(OvsForwardingContext *ovsFwdCtx,
}
if (newNbl) {
- deferredAction = OvsAddDeferredActions(newNbl, key, NULL);
+ deferredAction = OvsAddDeferredActions(newNbl, key, ovsFwdCtx->mru, NULL);
} else {
- deferredAction = OvsAddDeferredActions(ovsFwdCtx->curNbl, key, NULL);
+ deferredAction = OvsAddDeferredActions(ovsFwdCtx->curNbl, key,
+ ovsFwdCtx->mru, NULL);
}
if (deferredAction) {
@@ -1620,8 +1629,8 @@ OvsOutputUserspaceAction(OvsForwardingContext *ovsFwdCtx,
OVS_PACKET_CMD_ACTION,
vport, key, ovsFwdCtx->curNbl,
NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx->curNbl),
- isRecv,
- layers);
+ isRecv, layers,
+ ovsFwdCtx->mru);
if (elem) {
LIST_ENTRY missedPackets;
InitializeListHead(&missedPackets);
@@ -1699,7 +1708,7 @@ OvsExecuteSampleAction(OvsForwardingContext *ovsFwdCtx,
return STATUS_SUCCESS;
}
- if (!OvsAddDeferredActions(newNbl, key, a)) {
+ if (!OvsAddDeferredActions(newNbl, key, ovsFwdCtx->mru, a)) {
OVS_LOG_INFO(
"Deferred actions limit reached, dropping sample action.");
OvsCompleteNBL(ovsFwdCtx->switchContext, newNbl, TRUE);
@@ -1735,6 +1744,7 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext,
OvsFlowKey *key,
UINT64 *hash,
OVS_PACKET_HDR_INFO *layers,
+ UINT16 mru,
const PNL_ATTR actions,
INT actionsLen)
{
@@ -1749,8 +1759,8 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext,
/* XXX: ASSERT that the flow table lock is held. */
status = OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl, portNo,
- sendFlags, fwdDetail, completionList,
- layers, TRUE);
+ sendFlags, fwdDetail, mru,
+ completionList, layers, TRUE);
if (status != NDIS_STATUS_SUCCESS) {
dropReason = L"OVS-initing destination port list failed";
goto dropit;
@@ -2051,6 +2061,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
OvsFlowKey *key,
UINT64 *hash,
OVS_PACKET_HDR_INFO *layers,
+ UINT16 mru,
const PNL_ATTR actions,
INT actionsLen)
{
@@ -2058,7 +2069,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
status = OvsDoExecuteActions(switchContext, completionList, curNbl,
portNo, sendFlags, key, hash, layers,
- actions, actionsLen);
+ mru, actions, actionsLen);
if (status == STATUS_SUCCESS) {
status = OvsProcessDeferredActions(switchContext, completionList,
@@ -2081,6 +2092,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
PNET_BUFFER_LIST curNbl,
OvsFlowKey *key,
UINT32 srcPortNo,
+ UINT16 mru,
OVS_PACKET_HDR_INFO *layers)
{
NDIS_STATUS status;
@@ -2092,7 +2104,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl,
srcPortNo, 0,
NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(curNbl),
- completionList, layers, TRUE);
+ mru, completionList, layers, TRUE);
flow = OvsLookupFlow(&ovsFwdCtx.switchContext->datapath, key, &hash, FALSE);
if (flow) {
@@ -2118,6 +2130,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
ovsFwdCtx.srcVportNo,
ovsFwdCtx.sendFlags,
key, &hash, &ovsFwdCtx.layers,
+ ovsFwdCtx.mru,
flow->actions, flow->actionsLen);
ovsFwdCtx.curNbl = NULL;
@@ -2142,6 +2155,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
switchContext->virtualExternalPortId,
&ovsFwdCtx.layers,
ovsFwdCtx.switchContext,
+ ovsFwdCtx.mru,
&missedPackets, &num);
if (num) {
OvsQueuePackets(&missedPackets, num);
@@ -29,6 +29,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
OvsFlowKey *key,
UINT64 *hash,
OVS_PACKET_HDR_INFO *layers,
+ UINT16 mru,
const PNL_ATTR actions,
int actionsLen);
@@ -41,6 +42,7 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext,
OvsFlowKey *key,
UINT64 *hash,
OVS_PACKET_HDR_INFO *layers,
+ UINT16 mru,
const PNL_ATTR actions,
int actionsLen);
@@ -50,6 +52,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
PNET_BUFFER_LIST curNbl,
OvsFlowKey *key,
UINT32 srcPortNo,
+ UINT16 mru,
OVS_PACKET_HDR_INFO *layers);
#endif /* __ACTIONS_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;
@@ -335,7 +335,7 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext,
* check the return value. */
OvsActionsExecute(switchContext, &completionList, curNbl,
portNo, SendFlags, &key, &hash, &layers,
- flow->actions, flow->actionsLen);
+ 0, flow->actions, flow->actionsLen);
OvsReleaseDatapath(datapath, &dpLockState);
NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
continue;
@@ -344,9 +344,10 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext,
datapath->misses++;
status = OvsCreateAndAddPackets(NULL, 0, OVS_PACKET_CMD_MISS,
- vport, &key, curNbl,
- sourcePort == switchContext->virtualExternalPortId,
- &layers, switchContext, &missedPackets, &num);
+ vport, &key, curNbl,
+ sourcePort == switchContext->virtualExternalPortId,
+ &layers, switchContext, 0,
+ &missedPackets, &num);
if (status == NDIS_STATUS_SUCCESS) {
/* Complete the packet since it was copied to user
* buffer. */
@@ -277,6 +277,7 @@ OvsDeferredActionsQueuePush(POVS_DEFERRED_ACTION_QUEUE queue)
POVS_DEFERRED_ACTION
OvsAddDeferredActions(PNET_BUFFER_LIST nbl,
OvsFlowKey *key,
+ UINT16 mru,
const PNL_ATTR actions)
{
POVS_DEFERRED_ACTION_QUEUE queue = OvsDeferredActionsQueueGet();
@@ -287,6 +288,7 @@ OvsAddDeferredActions(PNET_BUFFER_LIST nbl,
deferredAction->nbl = nbl;
deferredAction->actions = actions;
deferredAction->key = *key;
+ deferredAction->mru = mru;
}
return deferredAction;
@@ -319,7 +321,8 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext,
portNo,
sendFlags,
&deferredAction->key, NULL,
- layers, deferredAction->actions,
+ layers, deferredAction->mru,
+ deferredAction->actions,
NlAttrGetSize(deferredAction->actions));
} else {
status = OvsDoRecirc(switchContext,
@@ -327,6 +330,7 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext,
deferredAction->nbl,
&deferredAction->key,
portNo,
+ deferredAction->mru,
layers);
}
}
@@ -26,6 +26,7 @@ typedef struct _OVS_DEFERRED_ACTION {
PNET_BUFFER_LIST nbl;
PNL_ATTR actions;
OvsFlowKey key;
+ UINT16 mru;
} OVS_DEFERRED_ACTION, *POVS_DEFERRED_ACTION;
/*
@@ -52,6 +53,7 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext,
POVS_DEFERRED_ACTION
OvsAddDeferredActions(PNET_BUFFER_LIST packet,
OvsFlowKey *key,
+ UINT16 mru,
const PNL_ATTR actions);
/*
@@ -310,7 +310,7 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl,
OvsActionsExecute(gOvsSwitchContext, &completionList, pNbl,
portNo, SendFlags, &key, &hash, &layers,
- flow->actions, flow->actionsLen);
+ 0 /*default*/, flow->actions, flow->actionsLen);
OvsReleaseDatapath(datapath, &dpLockState);
} else {
@@ -319,7 +319,7 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl,
datapath->misses++;
elem = OvsCreateQueueNlPacket(NULL, 0, OVS_PACKET_CMD_MISS,
vport, &key, pNbl, curNb,
- TRUE, &layers);
+ TRUE, &layers, 0 /*default*/);
if (elem) {
/* Complete the packet since it was copied to user buffer. */
InsertTailList(&missedPackets, &elem->link);
@@ -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
@@ -465,8 +470,8 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute)
vport ? vport->portNo :
OVS_DPPORT_NUMBER_INVALID,
NDIS_SEND_FLAGS_SWITCH_DESTINATION_GROUP,
- &key, NULL, &layers, actions,
- execute->actionsLen);
+ &key, NULL, &layers, execute->mru,
+ actions, execute->actionsLen);
pNbl = NULL;
NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState);
}
@@ -757,6 +762,7 @@ OvsCreateAndAddPackets(PVOID userData,
BOOLEAN isRecv,
POVS_PACKET_HDR_INFO hdrInfo,
POVS_SWITCH_CONTEXT switchContext,
+ UINT16 mru,
LIST_ENTRY *list,
UINT32 *num)
{
@@ -789,8 +795,8 @@ OvsCreateAndAddPackets(PVOID userData,
nb = NET_BUFFER_LIST_FIRST_NB(nbl);
while (nb) {
elem = OvsCreateQueueNlPacket(userData, userDataLen,
- cmd, vport, key, nbl, nb,
- isRecv, hdrInfo);
+ cmd, vport, key, nbl, nb,
+ isRecv, hdrInfo, mru);
if (elem) {
InsertTailList(list, &elem->link);
(*num)++;
@@ -975,7 +981,8 @@ OvsCreateQueueNlPacket(PVOID userData,
PNET_BUFFER_LIST nbl,
PNET_BUFFER nb,
BOOLEAN isRecv,
- POVS_PACKET_HDR_INFO hdrInfo)
+ POVS_PACKET_HDR_INFO hdrInfo,
+ UINT16 mru)
{
#define VLAN_TAG_SIZE 4
UINT32 allocLen, dataLen, extraLen;
@@ -1070,7 +1077,12 @@ OvsCreateQueueNlPacket(PVOID userData,
OVS_KEY_ATTR_TUNNEL) != STATUS_SUCCESS) {
goto fail;
}
-
+ /* Set MRU attribute */
+ if (mru != 0) {
+ if (!NlMsgPutTailU16(&nlBuf, OVS_PACKET_ATTR_MRU, 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,
@@ -72,13 +72,14 @@ VOID OvsCleanupPacketQueue(struct _OVS_OPEN_INSTANCE *instance);
POVS_PACKET_QUEUE_ELEM OvsCreateQueueNlPacket(PVOID userData,
UINT32 userDataLen,
- UINT32 cmd,
+ UINT32 cmd,
POVS_VPORT_ENTRY vport,
OvsFlowKey *key,
PNET_BUFFER_LIST nbl,
PNET_BUFFER nb,
BOOLEAN isRecv,
- POVS_PACKET_HDR_INFO hdrInfo);
+ POVS_PACKET_HDR_INFO hdrInfo,
+ UINT16 mru);
VOID OvsQueuePackets(PLIST_ENTRY packetList, UINT32 numElems);
NTSTATUS OvsCreateAndAddPackets(PVOID userData,
@@ -90,6 +91,7 @@ NTSTATUS OvsCreateAndAddPackets(PVOID userData,
BOOLEAN isRecv,
POVS_PACKET_HDR_INFO hdrInfo,
POVS_SWITCH_CONTEXT switchContext,
+ UINT16 mru,
LIST_ENTRY *list,
UINT32 *num);
This patch retains the MRU value for the reassembled IP datagram in the OvsForwardingContext when the packet is forwarded to userspace and/or retrived from userspace. Also retain the MRU value when there are any deferred actions for the current NBL. v2->v3: No change v1->v2: No change Signed-off-by: Anand Kumar <kumaranand@vmware.com> --- datapath-windows/ovsext/Actions.c | 48 +++++++++++++++++++++++------------- datapath-windows/ovsext/Actions.h | 3 +++ datapath-windows/ovsext/DpInternal.h | 2 +- datapath-windows/ovsext/PacketIO.c | 9 ++++--- datapath-windows/ovsext/Recirc.c | 6 ++++- datapath-windows/ovsext/Recirc.h | 2 ++ datapath-windows/ovsext/Tunnel.c | 4 +-- datapath-windows/ovsext/User.c | 26 +++++++++++++------ datapath-windows/ovsext/User.h | 6 +++-- 9 files changed, 72 insertions(+), 34 deletions(-)