summaryrefslogtreecommitdiff
path: root/datapath-windows
diff options
context:
space:
mode:
authorAnkur Sharma <ankursharma@vmware.com>2014-08-22 10:00:13 -0700
committerBen Pfaff <blp@nicira.com>2014-08-22 10:29:37 -0700
commitd838e577300ddd2878ff9777d7588c2f54af2c07 (patch)
tree5e207ab25e569b2d3c8f75471171a5b1c36a108e /datapath-windows
parent344b47e15e583f251e9ef02c77a374d15a6e25e6 (diff)
downloadopenvswitch-d838e577300ddd2878ff9777d7588c2f54af2c07.tar.gz
datapath-windows: Using windows kernel netlink parsing APIs.
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@vmware.com> Reported-at: https://github.com/openvswitch/ovs-issues/issues/18 Acked-by: Nithin Raju <nithin@vmware.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'datapath-windows')
-rw-r--r--datapath-windows/automake.mk5
-rw-r--r--datapath-windows/include/OvsPub.h13
-rw-r--r--datapath-windows/ovsext/Datapath.c8
-rw-r--r--datapath-windows/ovsext/Datapath.h4
-rw-r--r--datapath-windows/ovsext/OvsActions.c58
-rw-r--r--datapath-windows/ovsext/OvsDebug.h1
-rw-r--r--datapath-windows/ovsext/OvsFlow.h2
-rw-r--r--datapath-windows/ovsext/OvsPacketIO.h2
-rw-r--r--datapath-windows/ovsext/OvsUser.c4
-rw-r--r--datapath-windows/ovsext/ovsext.vcxproj3
-rw-r--r--datapath-windows/ovsext/precomp.h2
11 files changed, 53 insertions, 49 deletions
diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
index 47ef22515..78bdb84a6 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/ovsext/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 128299661..044630918 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 3bb2a2a32..40654f50e 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 2bea0fd2c..6d8a6db4f 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 d62f2a72a..61b233fca 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 6941f1372..a57e73e41 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 93368b33b..fa29c6838 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 322a8aab7..11709dc3f 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 9fafb1620..aac45ae5b 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 2b3e6fd6d..1a618dec7 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 5f23d02b3..5b6c2a971 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.