I missed out () in: if (!IS_NFNL_CMD(usrParamsCtx->ovsMsg->nlMsg.nlmsgType) && (usrParamsCtx->ovsMsg->genlMsg.cmd == OVS_CTRL_CMD_EVENT_NOTIFY || usrParamsCtx->ovsMsg->genlMsg.cmd == OVS_CTRL_CMD_READ_NOTIFY))
I have addressed this in an updated version. I will send the one out after addressing other review comments across the patch series. Thanks, Sairam On 6/13/16, 3:37 PM, "Sairam Venugopal" <vsai...@vmware.com> wrote: >Create new NETLINK_CMD and NETLINK_FAMILY to assist in flushing conntrack >entries. Modify >Datapath.c to now support netfilter-netlink messages apart from the >existing netfilter-generic messages. Also hookup the command handler to >execute the OvsCtFlush in Conntrack.c > >Signed-off-by: Sairam Venugopal <vsai...@vmware.com> >--- > datapath-windows/include/OvsDpInterfaceExt.h | 17 ++++++ > datapath-windows/ovsext/Datapath.c | 80 >++++++++++++++++++++++++---- > 2 files changed, 88 insertions(+), 9 deletions(-) > >diff --git a/datapath-windows/include/OvsDpInterfaceExt.h >b/datapath-windows/include/OvsDpInterfaceExt.h >index e235376..1044de7 100644 >--- a/datapath-windows/include/OvsDpInterfaceExt.h >+++ b/datapath-windows/include/OvsDpInterfaceExt.h >@@ -17,6 +17,9 @@ > #ifndef __OVS_DP_INTERFACE_EXT_H_ > #define __OVS_DP_INTERFACE_EXT_H_ 1 > >+#include "include/windows/linux/netfilter/nfnetlink.h" >+#include "include/windows/linux/netfilter/nfnetlink_conntrack.h" >+ > /* Windows kernel datapath extensions to the standard datapath >interface. */ > > /* Version number of the datapath interface extensions. */ >@@ -65,6 +68,7 @@ > #define OVS_WIN_NL_VPORT_FAMILY_ID (NLMSG_MIN_TYPE + 4) > #define OVS_WIN_NL_FLOW_FAMILY_ID (NLMSG_MIN_TYPE + 5) > #define OVS_WIN_NL_NETDEV_FAMILY_ID (NLMSG_MIN_TYPE + 6) >+#define OVS_WIN_NL_CT_FAMILY_ID (NLMSG_MIN_TYPE + 7) > > #define OVS_WIN_NL_INVALID_MCGRP_ID 0 > #define OVS_WIN_NL_MCGRP_START_ID 100 >@@ -156,4 +160,17 @@ enum ovs_win_netdev_attr { > typedef struct ovs_dp_stats OVS_DP_STATS; > typedef enum ovs_vport_type OVS_VPORT_TYPE; > >+/* Conntrack Netlink */ >+#define NFNL_TYPE_CT_GET (NFNL_SUBSYS_CTNETLINK << 8 | IPCTNL_MSG_CT_GET) >+#define NFNL_TYPE_CT_DEL (NFNL_SUBSYS_CTNETLINK << 8 | >IPCTNL_MSG_CT_DELETE) >+#define NFNL_SUBSYSTEM_TYPE(nlmsgType) (nlmsgType >> 8) >+#define NFNL_CT_CMD(nlmsgType) (nlmsgType & 0xff) >+#define IS_NFNL_CMD(nlmsgType) ((nlmsgType == NFNL_TYPE_CT_GET) || >(nlmsgType == NFNL_TYPE_CT_DEL)) >+#define OVS_NL_CT_ATTR_MAX (IPCTNL_MSG_MAX - 1) >+ >+#define OVS_CT_FAMILY "ovs_ct" >+#define OVS_CT_MCGROUP "ovs_ct" >+#define OVS_CT_VERSION 1 >+ >+ > #endif /* __OVS_DP_INTERFACE_EXT_H_ */ >diff --git a/datapath-windows/ovsext/Datapath.c >b/datapath-windows/ovsext/Datapath.c >index b2c7020..802f0b1 100644 >--- a/datapath-windows/ovsext/Datapath.c >+++ b/datapath-windows/ovsext/Datapath.c >@@ -103,7 +103,8 @@ NetlinkCmdHandler OvsGetNetdevCmdHandler, > OvsDeleteVportCmdHandler, > OvsPendPacketCmdHandler, > OvsSubscribePacketCmdHandler, >- OvsReadPacketCmdHandler; >+ OvsReadPacketCmdHandler, >+ OvsCtDeleteCmdHandler; > > static NTSTATUS HandleGetDpTransaction(POVS_USER_PARAMS_CONTEXT >usrParamsCtx, > UINT32 *replyLen); >@@ -282,6 +283,24 @@ NETLINK_FAMILY nlFLowFamilyOps = { > .opsCount = ARRAY_SIZE(nlFlowFamilyCmdOps) > }; > >+/* Netlink Ct family. */ >+NETLINK_CMD nlCtFamilyCmdOps[] = { >+ { .cmd = IPCTNL_MSG_CT_DELETE, >+ .handler = OvsCtDeleteCmdHandler, >+ .supportedDevOp = OVS_TRANSACTION_DEV_OP, >+ .validateDpIndex = TRUE >+ } >+}; >+ >+NETLINK_FAMILY nlCtFamilyOps = { >+ .name = OVS_CT_FAMILY, /* Keep this for consistency*/ >+ .id = OVS_WIN_NL_CT_FAMILY_ID, /* Keep this for consistency*/ >+ .version = OVS_CT_VERSION, /* Keep this for consistency*/ >+ .maxAttr = OVS_NL_CT_ATTR_MAX, >+ .cmds = nlCtFamilyCmdOps, >+ .opsCount = ARRAY_SIZE(nlCtFamilyCmdOps) >+}; >+ > /* Netlink netdev family. */ > NETLINK_CMD nlNetdevFamilyCmdOps[] = { > { .cmd = OVS_WIN_NETDEV_CMD_GET, >@@ -885,6 +904,9 @@ OvsDeviceControl(PDEVICE_OBJECT deviceObject, > > ASSERT(ovsMsg); > switch (ovsMsg->nlMsg.nlmsgType) { >+ case NFNL_TYPE_CT_DEL: >+ nlFamilyOps = &nlCtFamilyOps; >+ break; > case OVS_WIN_NL_CTRL_FAMILY_ID: > nlFamilyOps = &nlControlFamilyOps; > break; >@@ -961,6 +983,30 @@ ValidateNetlinkCmd(UINT32 devOp, > goto done; > } > >+ /* >+ Verify if the Netlink message is part of Netfilter Netlink >+ This is currently used by Conntrack >+ */ >+ if (IS_NFNL_CMD(ovsMsg->nlMsg.nlmsgType)) { >+ >+ /* Validate Netfilter Netlink version is 0 */ >+ if (ovsMsg->nfGenMsg.version != NFNETLINK_V0) { >+ status = STATUS_INVALID_PARAMETER; >+ goto done; >+ } >+ >+ /* Validate Netfilter Netlink Subsystem */ >+ if (NFNL_SUBSYSTEM_TYPE(ovsMsg->nlMsg.nlmsgType) >+ != NFNL_SUBSYS_CTNETLINK) { >+ status = STATUS_INVALID_PARAMETER; >+ goto done; >+ } >+ >+ /* Exit the function because there aren't any other validations >*/ >+ status = STATUS_SUCCESS; >+ goto done; >+ } >+ > for (i = 0; i < nlFamilyOps->opsCount; i++) { > if (nlFamilyOps->cmds[i].cmd == ovsMsg->genlMsg.cmd) { > /* Validate if the command is valid for the device >operation. */ >@@ -1022,14 +1068,29 @@ InvokeNetlinkCmdHandler(POVS_USER_PARAMS_CONTEXT >usrParamsCtx, > NTSTATUS status = STATUS_INVALID_PARAMETER; > UINT16 i; > >- for (i = 0; i < nlFamilyOps->opsCount; i++) { >- if (nlFamilyOps->cmds[i].cmd == >usrParamsCtx->ovsMsg->genlMsg.cmd) { >- NetlinkCmdHandler *handler = nlFamilyOps->cmds[i].handler; >- ASSERT(handler); >- if (handler) { >- status = handler(usrParamsCtx, replyLen); >+ if (IS_NFNL_CMD(usrParamsCtx->ovsMsg->nlMsg.nlmsgType)) { >+ /* If nlMsg is of type Netfilter-Netlink parse the Cmd >accordingly */ >+ UINT8 cmd = NFNL_CT_CMD(usrParamsCtx->ovsMsg->nlMsg.nlmsgType); >+ for (i = 0; i < nlFamilyOps->opsCount; i++) { >+ if (nlFamilyOps->cmds[i].cmd == cmd) { >+ NetlinkCmdHandler *handler = >nlFamilyOps->cmds[i].handler; >+ ASSERT(handler); >+ if (handler) { >+ status = handler(usrParamsCtx, replyLen); >+ } >+ break; >+ } >+ } >+ } else { >+ for (i = 0; i < nlFamilyOps->opsCount; i++) { >+ if (nlFamilyOps->cmds[i].cmd == >usrParamsCtx->ovsMsg->genlMsg.cmd) { >+ NetlinkCmdHandler *handler = >nlFamilyOps->cmds[i].handler; >+ ASSERT(handler); >+ if (handler) { >+ status = handler(usrParamsCtx, replyLen); >+ } >+ break; > } >- break; > } > } > >@@ -1055,7 +1116,8 @@ InvokeNetlinkCmdHandler(POVS_USER_PARAMS_CONTEXT >usrParamsCtx, > POVS_MESSAGE_ERROR msgError = (POVS_MESSAGE_ERROR) > usrParamsCtx->outputBuffer; > >- if (usrParamsCtx->ovsMsg->genlMsg.cmd == >OVS_CTRL_CMD_EVENT_NOTIFY || >+ if (!IS_NFNL_CMD(usrParamsCtx->ovsMsg->nlMsg.nlmsgType) && >+ usrParamsCtx->ovsMsg->genlMsg.cmd == >OVS_CTRL_CMD_EVENT_NOTIFY || > usrParamsCtx->ovsMsg->genlMsg.cmd == >OVS_CTRL_CMD_READ_NOTIFY) { > /* There's no input buffer associated with such >requests. */ > NL_BUFFER nlBuffer; >-- >2.5.0.windows.1 > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev