Signed-off-by: Sorin Vinturis <svintu...@cloudbasesolutions.com> --- v3: No changes from the previous version. --- datapath-windows/ovsext/DpInternal.h | 1 + datapath-windows/ovsext/Flow.c | 17 +++++++++++++++++ datapath-windows/ovsext/Flow.h | 2 ++ datapath-windows/ovsext/User.c | 7 +++++++ 4 files changed, 27 insertions(+)
diff --git a/datapath-windows/ovsext/DpInternal.h b/datapath-windows/ovsext/DpInternal.h index 612ff7b..4d4fec3 100644 --- a/datapath-windows/ovsext/DpInternal.h +++ b/datapath-windows/ovsext/DpInternal.h @@ -270,6 +270,7 @@ typedef struct OvsPacketExecute { uint32_t actionsLen; PCHAR packetBuf; PNL_ATTR actions; + PNL_ATTR *keyAttrs; } OvsPacketExecute; diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c index 8fc068e..e256ec6 100644 --- a/datapath-windows/ovsext/Flow.c +++ b/datapath-windows/ovsext/Flow.c @@ -1735,6 +1735,23 @@ DeleteAllFlows(OVS_DATAPATH *datapath) } } +NDIS_STATUS +OvsGetFlowMetadata(OvsFlowKey *key, + PNL_ATTR *keyAttrs) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + if (keyAttrs[OVS_KEY_ATTR_RECIRC_ID]) { + key->recircId = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_RECIRC_ID]); + } + + if (keyAttrs[OVS_KEY_ATTR_DP_HASH]) { + key->dpHash = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_DP_HASH]); + } + + return status; +} + /* *---------------------------------------------------------------------------- * Initializes 'flow' members from 'packet', 'skb_priority', 'tun_id', and diff --git a/datapath-windows/ovsext/Flow.h b/datapath-windows/ovsext/Flow.h index 78bf7cc..310c472 100644 --- a/datapath-windows/ovsext/Flow.h +++ b/datapath-windows/ovsext/Flow.h @@ -51,6 +51,8 @@ NDIS_STATUS OvsDeleteFlowTable(OVS_DATAPATH *datapath); NDIS_STATUS OvsAllocateFlowTable(OVS_DATAPATH *datapath, POVS_SWITCH_CONTEXT switchContext); +NDIS_STATUS OvsGetFlowMetadata(OvsFlowKey *key, + PNL_ATTR *keyAttrs); NDIS_STATUS OvsExtractFlow(const NET_BUFFER_LIST *pkt, UINT32 inPort, OvsFlowKey *flow, POVS_PACKET_HDR_INFO layers, OvsIPv4TunnelKey *tunKey); diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c index cadffda..6b2d94a 100644 --- a/datapath-windows/ovsext/User.c +++ b/datapath-windows/ovsext/User.c @@ -383,6 +383,7 @@ _MapNlAttrToOvsPktExec(PNL_ATTR *nlAttrs, PNL_ATTR *keyAttrs, execute->actionsLen = NlAttrGetSize(nlAttrs[OVS_PACKET_ATTR_ACTIONS]); execute->inPort = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_IN_PORT]); + execute->keyAttrs = keyAttrs; } NTSTATUS @@ -429,6 +430,11 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute) } // XXX: Figure out if any of the other members of fwdDetail need to be set. + status = OvsGetFlowMetadata(&key, execute->keyAttrs); + if (status != STATUS_SUCCESS) { + goto dropit; + } + ndisStatus = OvsExtractFlow(pNbl, fwdDetail->SourcePortId, &key, &layers, NULL); if (ndisStatus == NDIS_STATUS_SUCCESS) { @@ -450,6 +456,7 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute) } } +dropit: if (pNbl) { OvsCompleteNBL(gOvsSwitchContext, pNbl, TRUE); } -- 1.9.0.msysgit.0 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev