[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