summaryrefslogtreecommitdiff
path: root/datapath-windows
diff options
context:
space:
mode:
authorSairam Venugopal <vsairam@vmware.com>2016-07-25 17:04:39 -0700
committerGurucharan Shetty <guru@ovn.org>2016-07-29 08:37:29 -0700
commit1f3dd67f336da4a1335de2bebf1b1df2d62a508a (patch)
tree82adba2c7ec3d19db3bcf4a1731d644a7ec34816 /datapath-windows
parent32654528b82a0faebeb250c2680ce2088f6aa74d (diff)
downloadopenvswitch-1f3dd67f336da4a1335de2bebf1b1df2d62a508a.tar.gz
datapath-windows: Define new multicast conntrack events and netlink protocol
The Hyper-V datapath supports NETLINK_GENERIC and NETLINK_NETFILTER protocols for netlink communication. Define these two protocols in the datapath. Define new Conntrack events (new and delete) and add support for subscribing to these events. Parse out OVS_NL_ATTR_MCAST_GRP and store it as part of OVS_EVENT_SUBSCRIBE structure. Signed-off-by: Sairam Venugopal <vsairam@vmware.com> Acked-By: Yin Lin <linyi@vmware.com> Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com> Signed-off-by: Gurucharan Shetty <guru@ovn.org>
Diffstat (limited to 'datapath-windows')
-rw-r--r--datapath-windows/ovsext/Datapath.c21
-rw-r--r--datapath-windows/ovsext/Datapath.h3
-rw-r--r--datapath-windows/ovsext/DpInternal.h16
-rw-r--r--datapath-windows/ovsext/Netlink/NetlinkProto.h3
4 files changed, 39 insertions, 4 deletions
diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c
index 75f133a90..f9f965c26 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -1273,11 +1273,12 @@ OvsSubscribeEventCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
OVS_EVENT_SUBSCRIBE request;
BOOLEAN rc;
UINT8 join;
+ UINT32 mcastGrp;
PNL_ATTR attrs[2];
const NL_POLICY policy[] = {
[OVS_NL_ATTR_MCAST_GRP] = {.type = NL_A_U32 },
[OVS_NL_ATTR_MCAST_JOIN] = {.type = NL_A_U8 },
- };
+ };
UNREFERENCED_PARAMETER(replyLen);
@@ -1293,11 +1294,25 @@ OvsSubscribeEventCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
goto done;
}
- /* XXX Ignore the MC group for now */
+ mcastGrp = NlAttrGetU32(attrs[OVS_NL_ATTR_MCAST_GRP]);
join = NlAttrGetU8(attrs[OVS_NL_ATTR_MCAST_JOIN]);
request.dpNo = msgIn->ovsHdr.dp_ifindex;
request.subscribe = join;
- request.mask = OVS_EVENT_MASK_ALL;
+ request.mcastGrp = mcastGrp;
+ request.protocol = instance->protocol;
+ request.mask = 0;
+
+ /* We currently support Vport and CT related events */
+ if (instance->protocol == NETLINK_GENERIC) {
+ request.mask = OVS_EVENT_MASK_ALL;
+ } else if (instance->protocol == NETLINK_NETFILTER) {
+ if (mcastGrp == NFNLGRP_CONNTRACK_NEW) {
+ request.mask = OVS_EVENT_CT_NEW;
+ }
+ if (mcastGrp == NFNLGRP_CONNTRACK_DESTROY) {
+ request.mask = OVS_EVENT_CT_DELETE;
+ }
+ }
status = OvsSubscribeEventIoctl(instance->fileObject, &request,
sizeof request);
diff --git a/datapath-windows/ovsext/Datapath.h b/datapath-windows/ovsext/Datapath.h
index 2b41d82ac..57b483a30 100644
--- a/datapath-windows/ovsext/Datapath.h
+++ b/datapath-windows/ovsext/Datapath.h
@@ -51,7 +51,8 @@ typedef struct _OVS_OPEN_INSTANCE {
PVOID eventQueue;
POVS_USER_PACKET_QUEUE packetQueue;
UINT32 pid;
- UINT32 protocol; /* Refers to NETLINK Family (eg. NETLINK_GENERIC)*/
+ UINT32 protocol; /* Refers to NETLINK Family (eg. NETLINK_GENERIC)*/
+ UINT32 mcastMask; /* Mask of subscribed Mcast Groups */
struct {
POVS_MESSAGE ovsMsg; /* OVS message passed during dump start. */
diff --git a/datapath-windows/ovsext/DpInternal.h b/datapath-windows/ovsext/DpInternal.h
index 8abe61dc3..22599a0e2 100644
--- a/datapath-windows/ovsext/DpInternal.h
+++ b/datapath-windows/ovsext/DpInternal.h
@@ -310,6 +310,8 @@ typedef struct _OVS_EVENT_SUBSCRIBE {
uint32_t dpNo;
uint32_t subscribe;
uint32_t mask;
+ uint32_t mcastGrp;
+ uint32_t protocol;
} OVS_EVENT_SUBSCRIBE, *POVS_EVENT_SUBSCRIBE;
typedef struct _OVS_EVENT_POLL {
@@ -327,6 +329,20 @@ enum {
OVS_EVENT_MASK_ALL = 0x3f,
};
+enum {
+ OVS_EVENT_CT_NEW = (1 << 0),
+ OVS_EVENT_CT_DELETE = (1 << 1),
+ OVS_EVENT_CT_MASK_ALL = 0x3
+};
+
+/* Supported mcast event groups */
+enum OVS_MCAST_EVENT_TYPES {
+ OVS_MCAST_VPORT_EVENT,
+ OVS_MCAST_CT_EVENT,
+ __OVS_MCAST_EVENT_TYPES_MAX
+};
+#define OVS_MCAST_EVENT_TYPES_MAX (__OVS_MCAST_EVENT_TYPES_MAX \
+ - OVS_MCAST_VPORT_EVENT)
typedef struct _OVS_VPORT_EVENT_ENTRY {
UINT32 portNo;
diff --git a/datapath-windows/ovsext/Netlink/NetlinkProto.h b/datapath-windows/ovsext/Netlink/NetlinkProto.h
index beb14d552..517531199 100644
--- a/datapath-windows/ovsext/Netlink/NetlinkProto.h
+++ b/datapath-windows/ovsext/Netlink/NetlinkProto.h
@@ -125,4 +125,7 @@ BUILD_ASSERT_DECL(sizeof(NL_ATTR) == 4);
#define OVS_HDRLEN NLMSG_ALIGN(sizeof(OVS_HDR))
#define NLA_HDRLEN ((INT) NLA_ALIGN(sizeof(NL_ATTR)))
+#define NETLINK_NETFILTER 12
+#define NETLINK_GENERIC 16
+
#endif /* NetlinProto.h */