[ovs-dev] [PATCH 2/4] Upcall NL packet format: NL Flow utilities, parametrized Key to NL conversion

Eitan Eliahu eliahue at vmware.com
Fri Oct 10 18:08:29 UTC 2014


Extend the key and tunnel key conversion to nested NL format functions use the
NL attribute as a parameter so we can use them for missed packet formatting.

Add functions for calculating the space needed for storing the key and the
tunnel key in NL format

Signed-off-by: Eitan Eliahu <eliahue at vmware.com>
---
 datapath-windows/ovsext/Flow.c | 74 +++++++++++++++++++++++++++++++++---------
 datapath-windows/ovsext/Flow.h |  6 ++++
 2 files changed, 64 insertions(+), 16 deletions(-)

diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
index 50fa954..2b420d2 100644
--- a/datapath-windows/ovsext/Flow.c
+++ b/datapath-windows/ovsext/Flow.c
@@ -68,10 +68,6 @@ static NTSTATUS _FlowNlDumpCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
                                       UINT32 *replyLen);
 static NTSTATUS _MapFlowInfoToNl(PNL_BUFFER nlBuf,
                                  OvsFlowInfo *flowInfo);
-static NTSTATUS _MapFlowKeyToNlKey(PNL_BUFFER nlBuf,
-                                   OvsFlowKey *flowKey);
-static NTSTATUS _MapFlowTunKeyToNlKey(PNL_BUFFER nlBuf,
-                                      OvsIPv4TunnelKey *tunKey);
 static NTSTATUS _MapFlowStatsToNlStats(PNL_BUFFER nlBuf,
                                        OvsFlowStats *flowStats);
 static NTSTATUS _MapFlowActionToNlAction(PNL_BUFFER nlBuf,
@@ -621,7 +617,8 @@ _MapFlowInfoToNl(PNL_BUFFER nlBuf, OvsFlowInfo *flowInfo)
 {
     NTSTATUS rc = STATUS_SUCCESS;
 
-    rc = _MapFlowKeyToNlKey(nlBuf, &(flowInfo->key));
+    rc = MapFlowKeyToNlKey(nlBuf, &(flowInfo->key), OVS_FLOW_ATTR_KEY,
+                           OVS_KEY_ATTR_TUNNEL);
     if (rc != STATUS_SUCCESS) {
         goto done;
     }
@@ -712,18 +709,21 @@ error_nested_start:
 
 /*
  *----------------------------------------------------------------------------
- *  _MapFlowKeyToNlKey --
- *    Maps OvsFlowKey to OVS_FLOW_ATTR_KEY attribute.
+ *  MapFlowKeyToNlKey --
+ *   Maps OvsFlowKey to OVS_FLOW_ATTR_KEY attribute.
  *----------------------------------------------------------------------------
  */
-static NTSTATUS
-_MapFlowKeyToNlKey(PNL_BUFFER nlBuf, OvsFlowKey *flowKey)
+NTSTATUS
+MapFlowKeyToNlKey(PNL_BUFFER nlBuf,
+                  OvsFlowKey *flowKey,
+                  UINT16 keyType,
+                  UINT16 tunKeyType)
 {
     NTSTATUS rc = STATUS_SUCCESS;
     struct ovs_key_ethernet ethKey;
     UINT32 offset = 0;
 
-    offset = NlMsgStartNested(nlBuf, OVS_FLOW_ATTR_KEY);
+    offset = NlMsgStartNested(nlBuf, keyType);
     if (!offset) {
         /* Starting the nested attribute failed. */
         rc = STATUS_UNSUCCESSFUL;
@@ -793,7 +793,8 @@ _MapFlowKeyToNlKey(PNL_BUFFER nlBuf, OvsFlowKey *flowKey)
     }
 
     if (flowKey->tunKey.dst) {
-        rc = _MapFlowTunKeyToNlKey(nlBuf, &(flowKey->tunKey));
+        rc = MapFlowTunKeyToNlKey(nlBuf, &(flowKey->tunKey),
+                                  tunKeyType);
         if (rc != STATUS_SUCCESS) {
             goto done;
         }
@@ -807,17 +808,19 @@ error_nested_start:
 
 /*
  *----------------------------------------------------------------------------
- *  _MapFlowTunKeyToNlKey --
- *    Maps OvsIPv4TunnelKey to OVS_TUNNEL_KEY_ATTR_ID attribute.
+ *  MapFlowTunKeyToNlKey --
+ *   Maps OvsIPv4TunnelKey to OVS_TUNNEL_KEY_ATTR_ID attribute.
  *----------------------------------------------------------------------------
  */
-static NTSTATUS
-_MapFlowTunKeyToNlKey(PNL_BUFFER nlBuf, OvsIPv4TunnelKey *tunKey)
+NTSTATUS
+MapFlowTunKeyToNlKey(PNL_BUFFER nlBuf,
+                     OvsIPv4TunnelKey *tunKey,
+                     UINT16 tunKeyType)
 {
     NTSTATUS rc = STATUS_SUCCESS;
     UINT32 offset = 0;
 
-    offset = NlMsgStartNested(nlBuf, OVS_KEY_ATTR_TUNNEL);
+    offset = NlMsgStartNested(nlBuf, tunKeyType);
     if (!offset) {
         /* Starting the nested attribute failed. */
         rc = STATUS_UNSUCCESSFUL;
@@ -2302,4 +2305,43 @@ unlock:
     return status;
 }
 
+UINT32
+OvsTunKeyAttrSize(void)
+{
+    return NlAttrTotalSize(4)   /* OVS_KEY_ATTR_PRIORITY */
+         + NlAttrTotalSize(0)   /* OVS_KEY_ATTR_TUNNEL */
+         + OvsFlowKeyAttrSize()
+         + NlAttrTotalSize(4)   /* OVS_KEY_ATTR_IN_PORT */
+         + NlAttrTotalSize(4)   /* OVS_KEY_ATTR_SKB_MARK */
+         + NlAttrTotalSize(4)   /* OVS_KEY_ATTR_DP_HASH */
+         + NlAttrTotalSize(4)   /* OVS_KEY_ATTR_RECIRC_ID */
+         + NlAttrTotalSize(12)  /* OVS_KEY_ATTR_ETHERNET */
+         + NlAttrTotalSize(2)   /* OVS_KEY_ATTR_ETHERTYPE */
+         + NlAttrTotalSize(4)   /* OVS_KEY_ATTR_VLAN */
+         + NlAttrTotalSize(0)   /* OVS_KEY_ATTR_ENCAP */
+         + NlAttrTotalSize(2)   /* OVS_KEY_ATTR_ETHERTYPE */
+         + NlAttrTotalSize(40)  /* OVS_KEY_ATTR_IPV6 */
+         + NlAttrTotalSize(2)   /* OVS_KEY_ATTR_ICMPV6 */
+         + NlAttrTotalSize(28); /* OVS_KEY_ATTR_ND */
+}
+
+UINT32
+OvsFlowKeyAttrSize(void)
+{
+    /* Whenever adding new OVS_TUNNEL_KEY_ FIELDS, we should consider
+     * updating this function.
+     */
+    return NlAttrTotalSize(8)    /* OVS_TUNNEL_KEY_ATTR_ID */
+         + NlAttrTotalSize(4)    /* OVS_TUNNEL_KEY_ATTR_IPV4_SRC */
+         + NlAttrTotalSize(4)    /* OVS_TUNNEL_KEY_ATTR_IPV4_DST */
+         + NlAttrTotalSize(1)    /* OVS_TUNNEL_KEY_ATTR_TOS */
+         + NlAttrTotalSize(1)    /* OVS_TUNNEL_KEY_ATTR_TTL */
+         + NlAttrTotalSize(0)    /* OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT */
+         + NlAttrTotalSize(0)    /* OVS_TUNNEL_KEY_ATTR_CSUM */
+         + NlAttrTotalSize(0)    /* OVS_TUNNEL_KEY_ATTR_OAM */
+         + NlAttrTotalSize(256)  /* OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS */
+         + NlAttrTotalSize(2)    /* OVS_TUNNEL_KEY_ATTR_TP_SRC */
+         + NlAttrTotalSize(2);   /* OVS_TUNNEL_KEY_ATTR_TP_DST */
+}
+
 #pragma warning( pop )
diff --git a/datapath-windows/ovsext/Flow.h b/datapath-windows/ovsext/Flow.h
index 2b5b93c..e817bcf 100644
--- a/datapath-windows/ovsext/Flow.h
+++ b/datapath-windows/ovsext/Flow.h
@@ -72,6 +72,12 @@ NTSTATUS OvsFlowNlCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
                              UINT32 *replyLen);
 NTSTATUS OvsFlowNlGetCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
                                 UINT32 *replyLen);
+NTSTATUS MapFlowKeyToNlKey(PNL_BUFFER nlBuf, OvsFlowKey *flowKey,
+                           UINT16 keyType, UINT16 tunKeyType);
+NTSTATUS MapFlowTunKeyToNlKey(PNL_BUFFER nlBuf, OvsIPv4TunnelKey *tunKey,
+                              UINT16 tunKeyType);
+UINT32 OvsFlowKeyAttrSize(void);
+UINT32 OvsTunKeyAttrSize(void);
 
 /* Flags for tunneling */
 #define OVS_TNL_F_DONT_FRAGMENT         (1 << 0)
-- 
1.9.4.msysgit.0




More information about the dev mailing list