[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));
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
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;
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,
UINT32 nlMsgSize;
NL_BUFFER nlBuf;
PNL_MSG_HDR nlMsg;
+ POVS_BUFFER_CONTEXT ctx;
if (vport == NULL){
/* No vport is not fatal. */
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,