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 <vsai...@vmware.com> --- datapath-windows/ovsext/Datapath.c | 21 ++++++++++++++++++--- datapath-windows/ovsext/Datapath.h | 3 ++- datapath-windows/ovsext/DpInternal.h | 15 +++++++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c index e4d6ab1..a5a0b35 100644 --- a/datapath-windows/ovsext/Datapath.c +++ b/datapath-windows/ovsext/Datapath.c @@ -1268,11 +1268,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); @@ -1288,11 +1289,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..9641bf6 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,19 @@ enum { OVS_EVENT_MASK_ALL = 0x3f, }; +enum { + OVS_EVENT_CT_NEW = ((uint32_t)0x1 << 0), + OVS_EVENT_CT_DELETE = ((uint32_t)0x1 << 1), + OVS_EVENT_CT_MASK_ALL = 0x3 +}; + +/* Supported mcast event groups */ +enum OVS_MCAST_EVENT_ENTRIES { + OVS_MCAST_VPORT_EVENT, + OVS_MCAST_CT_EVENT, + __OVS_MCAST_EVENT_ENTRIES_MAX +}; +#define OVS_MCAST_EVENT_ENTRIES_MAX (__OVS_MCAST_EVENT_ENTRIES_MAX - OVS_MCAST_VPORT_EVENT) typedef struct _OVS_VPORT_EVENT_ENTRY { UINT32 portNo; -- 2.9.0.windows.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev