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. v2: Squashed patches 2/9 and 5/9 into one. Addressed review comments from Yin Lin and Alin Serdean Signed-off-by: Sairam Venugopal <vsai...@vmware.com> --- datapath-windows/ovsext/Datapath.c | 21 ++++++++++++++++++--- datapath-windows/ovsext/Datapath.h | 3 ++- datapath-windows/ovsext/DpInternal.h | 16 ++++++++++++++++ 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 75f133a..f9f965c 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 2b41d82..57b483a 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 8abe61d..22599a0 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 beb14d5..5175311 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 */ -- 2.9.0.windows.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev