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

Reply via email to