[ovs-dev] [PATCH 2/3 v2] datapath-windows: Using windows kernel netlink parsing APIs.

Ankur Sharma ankursharma at vmware.com
Fri Aug 22 17:00:13 UTC 2014


In this patch we incorporate the usage of netlink message
and the parsing APIs that were added in previous commit.

Signed-off-by: Ankur Sharma <ankursharma at vmware.com>
Reported-at: https://github.com/openvswitch/ovs-issues/issues/18
Acked-by: Nithin Raju <nithin at vmware.com>
---
 datapath-windows/automake.mk           |  5 ++-
 datapath-windows/include/OvsPub.h      | 13 +++-----
 datapath-windows/ovsext/Datapath.c     |  8 ++---
 datapath-windows/ovsext/Datapath.h     |  4 +--
 datapath-windows/ovsext/OvsActions.c   | 58 +++++++++++++++++-----------------
 datapath-windows/ovsext/OvsDebug.h     |  1 +
 datapath-windows/ovsext/OvsFlow.h      |  2 +-
 datapath-windows/ovsext/OvsPacketIO.h  |  2 +-
 datapath-windows/ovsext/OvsUser.c      |  4 +--
 datapath-windows/ovsext/ovsext.vcxproj |  3 ++
 datapath-windows/ovsext/precomp.h      |  2 ++
 11 files changed, 53 insertions(+), 49 deletions(-)

diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
index 47ef225..f8c91e9 100644
--- a/datapath-windows/automake.mk
+++ b/datapath-windows/automake.mk
@@ -5,7 +5,10 @@ EXTRA_DIST += \
 	datapath-windows/Package/package.VcxProj.user \
 	datapath-windows/include/OvsDpInterfaceExt.h \
 	datapath-windows/include/OvsNetlink.h \
-	datapath-windows/include/OvsPub.h \
+	datapath-windows/include/OvsPub.h\
+    datapath-windows/ovsext/Netlink.c \
+    datapath-windows/ovsext/Netlink.h \
+    datapath-windows/include/NetlinkProto.h \
 	datapath-windows/misc/install.cmd \
 	datapath-windows/misc/uninstall.cmd \
 	datapath-windows/ovsext.sln \
diff --git a/datapath-windows/include/OvsPub.h b/datapath-windows/include/OvsPub.h
index 1282996..0446309 100644
--- a/datapath-windows/include/OvsPub.h
+++ b/datapath-windows/include/OvsPub.h
@@ -17,12 +17,7 @@
 #ifndef __OVS_PUB_H_
 #define __OVS_PUB_H_ 1
 
-/* Needed by netlink-protocol.h */
-#define BUILD_ASSERT(EXPR) \
-      typedef char AssertOnCompileFailed[(EXPR) ? 1: -1]
-#define BUILD_ASSERT_DECL(EXPR) BUILD_ASSERT(EXPR)
-
-#include "OvsNetlink.h"
+#include "../ovsext/Netlink.h"
 
 #define OVS_DRIVER_MAJOR_VER 1
 #define OVS_DRIVER_MINOR_VER 0
@@ -369,7 +364,7 @@ typedef struct OvsFlowInfo {
     OvsFlowKey key;
     struct OvsFlowStats stats;
     uint32_t actionsLen;
-    struct nlattr actions[0];
+    NL_ATTR actions[0];
 } OvsFlowInfo;
 
 enum GetFlags {
@@ -425,7 +420,7 @@ typedef struct OvsFlowPut {
     uint32_t actionsLen;
     OvsFlowKey key;
     uint32_t flags;
-    struct nlattr  actions[0];  /* Variable length indicated by actionsLen. */
+    NL_ATTR  actions[0];  /* Variable length indicated by actionsLen. */
 } OvsFlowPut;
 
 #define OVS_MIN_PACKET_SIZE 60
@@ -452,7 +447,7 @@ typedef struct OvsPacketExecute {
        /* Variable size blob with packet data first, followed by action
         * attrs. */
        char packetBuf[0];
-       struct nlattr  actions[0];
+       NL_ATTR  actions[0];
    };
 } OvsPacketExecute;
 
diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c
index 3bb2a2a..40654f5 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -529,7 +529,7 @@ OvsDeviceControl(PDEVICE_OBJECT deviceObject,
     PIO_STACK_LOCATION irpSp;
     NTSTATUS status = STATUS_SUCCESS;
     PFILE_OBJECT fileObject;
-    PVOID inputBuffer;
+    PVOID inputBuffer = NULL;
     PVOID outputBuffer = NULL;
     UINT32 inputBufferLen, outputBufferLen;
     UINT32 code, replyLen = 0;
@@ -645,7 +645,7 @@ OvsDeviceControl(PDEVICE_OBJECT deviceObject,
     }
 
     ASSERT(ovsMsg);
-    switch (ovsMsg->nlMsg.nlmsg_type) {
+    switch (ovsMsg->nlMsg.nlmsgType) {
     case OVS_WIN_NL_CTRL_FAMILY_ID:
         nlFamilyOps = &nlControlFamilyOps;
         break;
@@ -801,8 +801,8 @@ OvsGetPidCmdHandler(PIRP irp,
         POVS_OPEN_INSTANCE instance = (POVS_OPEN_INSTANCE)fileObject->FsContext;
 
         RtlZeroMemory(msgOut, sizeof *msgOut);
-        msgOut->nlMsg.nlmsg_seq = msgIn->nlMsg.nlmsg_seq;
-        msgOut->nlMsg.nlmsg_pid = instance->pid;
+        msgOut->nlMsg.nlmsgSeq = msgIn->nlMsg.nlmsgSeq;
+        msgOut->nlMsg.nlmsgPid = instance->pid;
         *replyLen = sizeof *msgOut;
         /* XXX: We might need to return the DP index as well. */
     } else {
diff --git a/datapath-windows/ovsext/Datapath.h b/datapath-windows/ovsext/Datapath.h
index 2bea0fd..6d8a6db 100644
--- a/datapath-windows/ovsext/Datapath.h
+++ b/datapath-windows/ovsext/Datapath.h
@@ -71,8 +71,8 @@ NTSTATUS OvsCompleteIrpRequest(PIRP irp, ULONG_PTR infoPtr, NTSTATUS status);
  * Structure of any message passed between userspace and kernel.
  */
 typedef struct _OVS_MESSAGE {
-    struct nlmsghdr nlMsg;
-    struct genlmsghdr genlMsg;
+    NL_MSG_HDR nlMsg;
+    GENL_MSG_HDR genlMsg;
     struct ovs_header ovsHdr;
     /* Variable length nl_attrs follow. */
 } OVS_MESSAGE, *POVS_MESSAGE;
diff --git a/datapath-windows/ovsext/OvsActions.c b/datapath-windows/ovsext/OvsActions.c
index d62f2a7..61b233f 100644
--- a/datapath-windows/ovsext/OvsActions.c
+++ b/datapath-windows/ovsext/OvsActions.c
@@ -26,7 +26,6 @@
 #include "OvsChecksum.h"
 #include "OvsPacketIO.h"
 
-
 #ifdef OVS_DBG_MOD
 #undef OVS_DBG_MOD
 #endif
@@ -1030,35 +1029,35 @@ OvsPopVlanInPktBuf(OvsForwardingContext *ovsFwdCtx)
  * --------------------------------------------------------------------------
  */
 static __inline NDIS_STATUS
-OvsTunnelAttrToIPv4TunnelKey(struct nlattr *attr,
+OvsTunnelAttrToIPv4TunnelKey(PNL_ATTR attr,
                              OvsIPv4TunnelKey *tunKey)
 {
-   struct nlattr *a;
+   PNL_ATTR a;
    INT rem;
 
    tunKey->attr[0] = 0;
    tunKey->attr[1] = 0;
    tunKey->attr[2] = 0;
-   ASSERT(nl_attr_type(attr) == OVS_KEY_ATTR_TUNNEL);
+   ASSERT(NlAttrType(attr) == OVS_KEY_ATTR_TUNNEL);
 
-   NL_ATTR_FOR_EACH_UNSAFE (a, rem, nl_attr_data(attr),
-                            nl_attr_get_size(attr)) {
-      switch (nl_attr_type(a)) {
+   NL_ATTR_FOR_EACH_UNSAFE (a, rem, NlAttrData(attr),
+                            NlAttrGetSize(attr)) {
+      switch (NlAttrType(a)) {
       case OVS_TUNNEL_KEY_ATTR_ID:
-         tunKey->tunnelId = nl_attr_get_be64(a);
+         tunKey->tunnelId = NlAttrGetBe64(a);
          tunKey->flags |= OVS_TNL_F_KEY;
          break;
       case OVS_TUNNEL_KEY_ATTR_IPV4_SRC:
-         tunKey->src = nl_attr_get_be32(a);
+         tunKey->src = NlAttrGetBe32(a);
          break;
       case OVS_TUNNEL_KEY_ATTR_IPV4_DST:
-         tunKey->dst = nl_attr_get_be32(a);
+         tunKey->dst = NlAttrGetBe32(a);
          break;
       case OVS_TUNNEL_KEY_ATTR_TOS:
-         tunKey->tos = nl_attr_get_u8(a);
+         tunKey->tos = NlAttrGetU8(a);
          break;
       case OVS_TUNNEL_KEY_ATTR_TTL:
-         tunKey->ttl = nl_attr_get_u8(a);
+         tunKey->ttl = NlAttrGetU8(a);
          break;
       case OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT:
          tunKey->flags |= OVS_TNL_F_DONT_FRAGMENT;
@@ -1283,27 +1282,27 @@ static __inline NDIS_STATUS
 OvsExecuteSetAction(OvsForwardingContext *ovsFwdCtx,
                     OvsFlowKey *key,
                     UINT64 *hash,
-                    const struct nlattr *a)
+                    const PNL_ATTR a)
 {
-    enum ovs_key_attr type = nl_attr_type(a);
+    enum ovs_key_attr type = NlAttrType(a);
     NDIS_STATUS status = NDIS_STATUS_SUCCESS;
 
     switch (type) {
     case OVS_KEY_ATTR_ETHERNET:
         status = OvsUpdateEthHeader(ovsFwdCtx,
-            nl_attr_get_unspec(a, sizeof(struct ovs_key_ethernet)));
+            NlAttrGetUnspec(a, sizeof(struct ovs_key_ethernet)));
         break;
 
     case OVS_KEY_ATTR_IPV4:
         status = OvsUpdateIPv4Header(ovsFwdCtx,
-            nl_attr_get_unspec(a, sizeof(struct ovs_key_ipv4)));
+            NlAttrGetUnspec(a, sizeof(struct ovs_key_ipv4)));
         break;
 
     case OVS_KEY_ATTR_TUNNEL:
     {
         OvsIPv4TunnelKey tunKey;
 
-		status = OvsTunnelAttrToIPv4TunnelKey((struct nlattr *)a, &tunKey);
+		status = OvsTunnelAttrToIPv4TunnelKey((PNL_ATTR)a, &tunKey);
         ASSERT(status == NDIS_STATUS_SUCCESS);
         tunKey.flow_hash = (uint16)(hash ? *hash : OvsHashFlow(key));
         RtlCopyMemory(&ovsFwdCtx->tunKey, &tunKey, sizeof ovsFwdCtx->tunKey);
@@ -1357,10 +1356,10 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
                   OvsFlowKey *key,
                   UINT64 *hash,
                   OVS_PACKET_HDR_INFO *layers,
-                  const struct nlattr *actions,
+                  const PNL_ATTR actions,
                   INT actionsLen)
 {
-    const struct nlattr *a;
+    PNL_ATTR a;
     INT rem;
     UINT32 dstPortID;
     OvsForwardingContext ovsFwdCtx;
@@ -1385,9 +1384,9 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
     }
 
     NL_ATTR_FOR_EACH_UNSAFE (a, rem, actions, actionsLen) {
-        switch(nl_attr_type(a)) {
+        switch(NlAttrType(a)) {
         case OVS_ACTION_ATTR_OUTPUT:
-            dstPortID = nl_attr_get_u32(a);
+            dstPortID = NlAttrGetU32(a);
             status = OvsAddPorts(&ovsFwdCtx, key, dstPortID,
                                               TRUE, TRUE);
             if (status != NDIS_STATUS_SUCCESS) {
@@ -1424,7 +1423,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
             } else {
                  vlanTagValue = 0;
                  vlanTag = (PNDIS_NET_BUFFER_LIST_8021Q_INFO)(PVOID *)&vlanTagValue;
-                 vlan = (struct ovs_action_push_vlan *)nl_attr_get(a);
+                 vlan = (struct ovs_action_push_vlan *)NlAttrGet((const PNL_ATTR)a);
                  vlanTag->TagHeader.VlanId = ntohs(vlan->vlan_tci) & 0xfff;
                  vlanTag->TagHeader.UserPriority = ntohs(vlan->vlan_tci) >> 13;
 
@@ -1465,19 +1464,19 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
 
         case OVS_ACTION_ATTR_USERSPACE:
         {
-            const struct nlattr *userdata_attr;
-            const struct nlattr *queue_attr;
+            PNL_ATTR userdataAttr;
+            PNL_ATTR queueAttr;
             POVS_PACKET_QUEUE_ELEM elem;
             UINT32 queueId = OVS_DEFAULT_PACKET_QUEUE;
             //XXX confusing that portNo is actually portId for external port.
             BOOLEAN isRecv = (portNo == switchContext->externalPortId)
                             || OvsIsTunnelVportNo(portNo);
 
-            queue_attr = nl_attr_find_nested(a, OVS_USERSPACE_ATTR_PID);
-            userdata_attr = nl_attr_find_nested(a, OVS_USERSPACE_ATTR_USERDATA);
+            queueAttr = NlAttrFindNested(a, OVS_USERSPACE_ATTR_PID);
+            userdataAttr = NlAttrFindNested(a, OVS_USERSPACE_ATTR_USERDATA);
 
-            elem = OvsCreateQueuePacket(queueId, (PVOID)userdata_attr,
-                                        userdata_attr->nla_len,
+            elem = OvsCreateQueuePacket(queueId, (PVOID)userdataAttr,
+                                        userdataAttr->nlaLen,
                                         OVS_PACKET_CMD_ACTION,
                                         portNo, (OvsIPv4TunnelKey *)&key->tunKey,
                                         ovsFwdCtx.curNbl,
@@ -1510,7 +1509,8 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
             }
 
             status = OvsExecuteSetAction(&ovsFwdCtx, key, hash,
-                                                      nl_attr_get(a));
+                                         (const PNL_ATTR)NlAttrGet
+                                         ((const PNL_ATTR)a));
             if (status != NDIS_STATUS_SUCCESS) {
                 dropReason = L"OVS-set action failed";
                 goto dropit;
diff --git a/datapath-windows/ovsext/OvsDebug.h b/datapath-windows/ovsext/OvsDebug.h
index 6941f13..a57e73e 100644
--- a/datapath-windows/ovsext/OvsDebug.h
+++ b/datapath-windows/ovsext/OvsDebug.h
@@ -38,6 +38,7 @@
 #define OVS_DBG_IPHELPER BIT32(18)
 #define OVS_DBG_BUFMGMT  BIT32(19)
 #define OVS_DBG_OTHERS   BIT32(21)
+#define OVS_DBG_NETLINK  BIT32(22)
 
 #define OVS_DBG_RESERVED BIT32(31)
 //Please add above OVS_DBG_RESERVED.
diff --git a/datapath-windows/ovsext/OvsFlow.h b/datapath-windows/ovsext/OvsFlow.h
index 93368b3..fa29c68 100644
--- a/datapath-windows/ovsext/OvsFlow.h
+++ b/datapath-windows/ovsext/OvsFlow.h
@@ -33,7 +33,7 @@ typedef struct _OvsFlow {
     UINT64 byteCount;
     UINT32 userActionsLen;   // used for flow query
     UINT32 actionBufferLen;  // used for flow reuse
-    struct nlattr actions[1];
+    NL_ATTR actions[1];
 } OvsFlow;
 
 
diff --git a/datapath-windows/ovsext/OvsPacketIO.h b/datapath-windows/ovsext/OvsPacketIO.h
index 322a8aa..11709dc 100644
--- a/datapath-windows/ovsext/OvsPacketIO.h
+++ b/datapath-windows/ovsext/OvsPacketIO.h
@@ -53,7 +53,7 @@ NDIS_STATUS OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
                             PNET_BUFFER_LIST curNbl, UINT32 srcVportNo,
                             ULONG sendFlags, OvsFlowKey *key, UINT64 *hash,
                             OVS_PACKET_HDR_INFO *layers,
-                            const struct nlattr *actions, int actionsLen);
+                            const PNL_ATTR actions, int actionsLen);
 
 VOID OvsLookupFlowOutput(POVS_SWITCH_CONTEXT switchContext,
                          VOID *compList, PNET_BUFFER_LIST curNbl);
diff --git a/datapath-windows/ovsext/OvsUser.c b/datapath-windows/ovsext/OvsUser.c
index 9fafb16..aac45ae 100644
--- a/datapath-windows/ovsext/OvsUser.c
+++ b/datapath-windows/ovsext/OvsUser.c
@@ -310,7 +310,7 @@ OvsExecuteDpIoctl(PVOID inputBuffer,
     OvsPacketExecute            *execute;
     LOCK_STATE_EX               lockState;
     PNET_BUFFER_LIST pNbl;
-    struct nlattr *actions;
+    PNL_ATTR actions;
     PNDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO fwdDetail;
     OvsFlowKey key;
     OVS_PACKET_HDR_INFO layers;
@@ -338,7 +338,7 @@ OvsExecuteDpIoctl(PVOID inputBuffer,
         status = STATUS_INFO_LENGTH_MISMATCH;
         goto unlock;
     }
-    actions = (struct nlattr *)((PCHAR)&execute->actions + execute->packetLen);
+    actions = (PNL_ATTR)((PCHAR)&execute->actions + execute->packetLen);
 
     /*
      * Allocate the NBL, copy the data from the userspace buffer. Allocate
diff --git a/datapath-windows/ovsext/ovsext.vcxproj b/datapath-windows/ovsext/ovsext.vcxproj
index 2b3e6fd..1a618de 100644
--- a/datapath-windows/ovsext/ovsext.vcxproj
+++ b/datapath-windows/ovsext/ovsext.vcxproj
@@ -75,6 +75,8 @@
     <ClInclude Include="OvsBufferMgmt.h" />
     <ClInclude Include="OvsChecksum.h" />
     <ClInclude Include="Datapath.h" />
+    <ClInclude Include="Netlink.h" />
+    <ClInclude Include="NetlinkProto.h" />
     <ClInclude Include="OvsDebug.h" />
     <ClInclude Include="OvsEth.h" />
     <ClInclude Include="OvsEvent.h" />
@@ -125,6 +127,7 @@
     </ClCompile>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="Netlink.c" />
     <ClCompile Include="Datapath.c" />
     <ClCompile Include="OvsDriver.c" />
     <ClCompile Include="OvsJhash.c" />
diff --git a/datapath-windows/ovsext/precomp.h b/datapath-windows/ovsext/precomp.h
index 5f23d02..5b6c2a9 100644
--- a/datapath-windows/ovsext/precomp.h
+++ b/datapath-windows/ovsext/precomp.h
@@ -24,6 +24,8 @@
 #include "OvsTypes.h"
 #include "..\include\OvsPub.h"
 #include "OvsUtil.h"
+#include "Netlink.h"
+#include "NetlinkProto.h"
 /*
  * Include openvswitch.h from userspace. Changing the location the file from
  * include/linux is pending discussion.
-- 
1.9.1




More information about the dev mailing list