2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 06:15:47 +00:00

Windows: Add internal switch port per OVS bridge

This patch updates the following commands in the vswitch:
 ovs-vsctl add-br br-test
 ovs-vsctl del-br br-test

ovs-vsctl add-br br-test:
    This command will now create an internal port on the MSFT virtual switch
  using the WMI interface from Msvm_VirtualEthernetSwitchManagementService
  leveraging the method AddResourceSettings.
    Before creating the actual port, the switch will be queried to see if there
  is not a port already created (good for restarts when restarting the
  vswitch daemon). If there is a port defined it will return success and log
  a message.
    After checking if the port already exists the command will also verify
  if the forwarding extension (windows datapath) is enabled and on a single
  switch. If it is not activated or if it is activated on multiple switches
  it will return an error and a message will be logged.
    After the port was created on the switch, we will disable the adapter on
  the host and rename to the corresponding OVS bridge name for consistency.
    The user will enable and set the values he wants after creation.

ovs-vsctl del-br br-test
    This command will remove an internal port on the MSFT virtual switch
  using the Msvm_VirtualEthernetSwitchManagementService class and executing
  the method RemoveResourceSettings.

Both commands will be blocking until the WMI job is finished, this allows us
to guarantee that the ports are created and their name are set before issuing
a netlink message to the windows datapath.

This patch also includes helpers for normal WMI retrievals and initializations.
Appveyor and documentation has been modified to include the libraries needed
for COM objects.

This patch was tested individually using IMallocSpy and CRT heap checks
to ensure no new memory leaks are introduced.

Tested on the following OS's:
Windows 2012, Windows 2012r2, Windows 2016

Signed-off-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>
Acked-by: Paul Boca <pboca@cloudbasesolutions.com>
Acked-by: Sairam Venugopal <vsairam@vmware.com>
Signed-off-by: Gurucharan Shetty <guru@ovn.org>
This commit is contained in:
Alin Serdean
2016-12-20 19:41:22 +00:00
committed by Gurucharan Shetty
parent 7532fefec4
commit da467899ab
5 changed files with 1353 additions and 2 deletions

View File

@@ -41,5 +41,5 @@ build_script:
- C:\MinGW\msys\1.0\bin\bash -lc "cp /c/pthreads-win32/Pre-built.2/dll/x86/*.dll /c/openvswitch/."
- C:\MinGW\msys\1.0\bin\bash -lc "mv /bin/link.exe /bin/link_copy.exe"
- C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && ./boot.sh"
- C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && ./configure CC=build-aux/cccl LD=\"`which link`\" LIBS=\"-lws2_32 -liphlpapi\" --with-pthread=C:/pthreads-win32/Pre-built.2 --with-openssl=C:/OpenSSL-Win32 --with-vstudiotarget=\"Debug\""
- C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && ./configure CC=build-aux/cccl LD=\"`which link`\" LIBS=\"-lws2_32 -liphlpapi -lwbemuuid -lole32 -loleaut32\" --with-pthread=C:/pthreads-win32/Pre-built.2 --with-openssl=C:/OpenSSL-Win32 --with-vstudiotarget=\"Debug\""
- C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && make"

View File

@@ -388,7 +388,9 @@ lib_libopenvswitch_la_SOURCES += \
lib/netlink-notifier.h \
lib/netlink-protocol.h \
lib/netlink-socket.c \
lib/netlink-socket.h
lib/netlink-socket.h \
lib/wmi.c \
lib/wmi.h
endif
if HAVE_POSIX_AIO

View File

@@ -58,6 +58,7 @@
VLOG_DEFINE_THIS_MODULE(dpif_netlink);
#ifdef _WIN32
#include "wmi.h"
enum { WINDOWS = 1 };
#else
enum { WINDOWS = 0 };
@@ -849,6 +850,16 @@ dpif_netlink_port_add__(struct dpif_netlink *dpif, struct netdev *netdev,
#endif
}
#ifdef _WIN32
if (request.type == OVS_VPORT_TYPE_INTERNAL) {
if (!create_wmi_port(name)){
VLOG_ERR("Could not create wmi internal port with name:%s", name);
vport_del_socksp(dpif, socksp);
return EINVAL;
};
}
#endif
tnl_cfg = netdev_get_tunnel_config(netdev);
if (tnl_cfg && (tnl_cfg->dst_port != 0 || tnl_cfg->exts)) {
ofpbuf_use_stack(&options, options_stub, sizeof options_stub);
@@ -940,6 +951,16 @@ dpif_netlink_port_del__(struct dpif_netlink *dpif, odp_port_t port_no)
vport.cmd = OVS_VPORT_CMD_DEL;
vport.dp_ifindex = dpif->dp_ifindex;
vport.port_no = port_no;
#ifdef _WIN32
struct dpif_port temp_dpif_port;
dpif_netlink_port_query__(dpif, port_no, NULL, &temp_dpif_port);
if (!strcmp(temp_dpif_port.type, "internal")) {
if (!delete_wmi_port(temp_dpif_port.name)){
VLOG_ERR("Could not delete wmi port with name: %s",
temp_dpif_port.name);
};
}
#endif
error = dpif_netlink_vport_transact(&vport, NULL, NULL);
vport_del_channels(dpif, port_no);

1277
lib/wmi.c Normal file

File diff suppressed because it is too large Load Diff

51
lib/wmi.h Normal file
View File

@@ -0,0 +1,51 @@
/*
* Copyright (c) 2016 Cloudbase Solutions Srl
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef WMI_H
#define WMI_H 1
#include <windefs.h>
#include <Wbemidl.h>
static inline void fill_context(IWbemContext *pContext)
{
VARIANT var;
/* IncludeQualifiers. */
VariantInit(&var);
var.vt = VT_BOOL;
var.boolVal = VARIANT_TRUE;
pContext->lpVtbl->SetValue(pContext, L"IncludeQualifiers", 0, &var);
VariantClear(&var);
VariantInit(&var);
var.vt = VT_I4;
var.lVal = 0;
pContext->lpVtbl->SetValue(pContext, L"PathLevel", 0, &var);
VariantClear(&var);
/* ExcludeSystemProperties. */
VariantInit(&var);
var.vt = VT_BOOL;
var.boolVal = VARIANT_FALSE;
pContext->lpVtbl->SetValue(pContext, L"ExcludeSystemProperties", 0, &var);
VariantClear(&var);
}
boolean create_wmi_port(char *name);
boolean delete_wmi_port(char *name);
#endif /* wmi.h */