[ovs-dev] [PATCH 4/9] datapath-windows: Add support for Conntrack IPCTNL_MSG_CT_DELETE cmd in Datapath.c

Paul Boca pboca at cloudbasesolutions.com
Thu Jun 23 19:49:31 UTC 2016


Acked-by: Paul-Daniel Boca <pboca at cloudbasesolutions.com>

> -----Original Message-----
> From: dev [mailto:dev-bounces at openvswitch.org] On Behalf Of Sairam
> Venugopal
> Sent: Tuesday, June 21, 2016 4:23 AM
> To: dev at openvswitch.org
> Subject: [ovs-dev] [PATCH 4/9] datapath-windows: Add support for
> Conntrack IPCTNL_MSG_CT_DELETE cmd in Datapath.c
> 
> 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 <vsairam at vmware.com>
> ---
>  datapath-windows/include/OvsDpInterfaceExt.h | 17 ++++++
>  datapath-windows/ovsext/Datapath.c           | 82
> ++++++++++++++++++++++++----
>  2 files changed, 89 insertions(+), 10 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..7cc8390 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,8 +1116,9 @@
> 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 ||
> -                usrParamsCtx->ovsMsg->genlMsg.cmd ==
> OVS_CTRL_CMD_READ_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;
>                  msgIn = &msgInTmp;
> --
> 2.5.0.windows.1
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev


More information about the dev mailing list