diff options
author | Sairam Venugopal <vsairam@vmware.com> | 2016-07-25 17:04:39 -0700 |
---|---|---|
committer | Gurucharan Shetty <guru@ovn.org> | 2016-07-29 08:37:29 -0700 |
commit | 1f3dd67f336da4a1335de2bebf1b1df2d62a508a (patch) | |
tree | 82adba2c7ec3d19db3bcf4a1731d644a7ec34816 /datapath-windows | |
parent | 32654528b82a0faebeb250c2680ce2088f6aa74d (diff) | |
download | openvswitch-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.c | 21 | ||||
-rw-r--r-- | datapath-windows/ovsext/Datapath.h | 3 | ||||
-rw-r--r-- | datapath-windows/ovsext/DpInternal.h | 16 | ||||
-rw-r--r-- | datapath-windows/ovsext/Netlink/NetlinkProto.h | 3 |
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 */ |