datapath-windows: Extract flow metadata in execute cmd handler.
authorSorin Vinturis <svinturis@cloudbasesolutions.com>
Fri, 25 Mar 2016 14:49:27 +0000 (14:49 +0000)
committerBen Pfaff <blp@ovn.org>
Fri, 25 Mar 2016 15:24:38 +0000 (08:24 -0700)
Signed-off-by: Sorin Vinturis <svinturis@cloudbasesolutions.com>
Acked-by: Sairam Venugopal <vsairam@vmware.com>
Acked-by: Nithin Raju <nithin@vmware.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
datapath-windows/ovsext/DpInternal.h
datapath-windows/ovsext/Flow.c
datapath-windows/ovsext/Flow.h
datapath-windows/ovsext/User.c

index bf56836..d26833f 100644 (file)
@@ -270,6 +270,7 @@ typedef struct OvsPacketExecute {
    uint32_t actionsLen;
    PCHAR packetBuf;
    PNL_ATTR actions;
+   PNL_ATTR *keyAttrs;
 } OvsPacketExecute;
 
 
index a82b51b..f15a3de 100644 (file)
@@ -1757,6 +1757,25 @@ 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]);
+        key->l2.keyLen += sizeof(key->recircId);
+    }
+
+    if (keyAttrs[OVS_KEY_ATTR_DP_HASH]) {
+        key->dpHash = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_DP_HASH]);
+        key->l2.keyLen += sizeof(key->dpHash);
+    }
+
+    return status;
+}
+
 /*
  *----------------------------------------------------------------------------
  * Initializes 'flow' members from 'packet', 'skb_priority', 'tun_id', and
index 78bf7cc..310c472 100644 (file)
@@ -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);
index cadffda..6b2d94a 100644 (file)
@@ -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);
     }