datapath-windows: Fix warning from the powershell module
[cascardo/ovs.git] / INSTALL.Windows.md
index 0882501..78af0a1 100644 (file)
@@ -35,16 +35,19 @@ install Windows Driver Kit (WDK) 8.1 Update.
 It is important to get the Visual Studio related environment variables and to
 have the $PATH inside the bash to point to the proper compiler and linker. One
 easy way to achieve this is to get into the "Developer Command prompt for visual
 It is important to get the Visual Studio related environment variables and to
 have the $PATH inside the bash to point to the proper compiler and linker. One
 easy way to achieve this is to get into the "Developer Command prompt for visual
-studio" and through it enter into the bash shell available from msys.
+studio" and through it enter into the bash shell available from msys by typing
+'bash --login'.
 
 If after the above step, a 'which link' inside MSYS's bash says,
 "/bin/link.exe", rename /bin/link.exe to something else so that the
 
 If after the above step, a 'which link' inside MSYS's bash says,
 "/bin/link.exe", rename /bin/link.exe to something else so that the
-Visual studio's linker is used.
+Visual studio's linker is used. You should also see a 'which sort' report
+"/bin/sort.exe".
 
 * For pthread support, install the library, dll and includes of pthreads-win32
 project from
 ftp://sourceware.org/pub/pthreads-win32/prebuilt-dll-2-9-1-release to a
 
 * For pthread support, install the library, dll and includes of pthreads-win32
 project from
 ftp://sourceware.org/pub/pthreads-win32/prebuilt-dll-2-9-1-release to a
-directory (e.g.: C:/pthread).
+directory (e.g.: C:/pthread). You should add the pthread-win32's dll
+path (e.g.: C:\pthread\dll\x86) to the Windows' PATH environment variable.
 
 * Get the Open vSwitch sources from either cloning the repo using git
 or from a distribution tar ball.
 
 * Get the Open vSwitch sources from either cloning the repo using git
 or from a distribution tar ball.
@@ -71,10 +74,32 @@ or from a distribution tar ball.
 
     % make
 
 
     % make
 
-* To run all the unit tests:
+  For faster compilation, you can pass the '-j' argument to make.  For
+  example, to run 4 jobs simultaneously, run 'make -j4'.
+
+  Note: MSYS 1.0.18 has a bug that causes parallel make to hang. You
+  can overcome this by downgrading to MSYS 1.0.17.  A simple way to
+  downgrade is to exit all MinGW sessions and then run the command
+  'mingw-get upgrade msys-core-bin=1.0.17-1' from MSVC developers command
+  prompt.
+
+* To run all the unit tests in Open vSwitch, one at a time:
 
     % make check
 
 
     % make check
 
+  To run all the unit tests in Open vSwitch, up to 8 in parallel:
+
+    % make check TESTSUITEFLAGS="-j8"
+
+* To install all the compiled executables on the local machine, run:
+
+    % make install
+
+  The above command will install the Open vSwitch executables in
+  C:/openvswitch.  You can add 'C:\openvswitch\usr\bin' and
+  'C:\openvswitch\usr\sbin' to Windows' PATH environment variable
+  for easy access.
+
 OpenSSL, Open vSwitch and Visual C++
 ------------------------------------
 To get SSL support for Open vSwitch on Windows, do the following:
 OpenSSL, Open vSwitch and Visual C++
 ------------------------------------
 To get SSL support for Open vSwitch on Windows, do the following:
@@ -134,128 +159,259 @@ Steps to install the module
 ---------------------------
 
 01> Run ./uninstall.cmd to remove the old extension.
 ---------------------------
 
 01> Run ./uninstall.cmd to remove the old extension.
-02> Run ./install.cmd to insert the new one. For this to work you will have to
+
+02> Run ./install.cmd to insert the new one.  For this to work you will have to
 turn on TESTSIGNING boot option or 'Disable Driver Signature Enforcement'
 turn on TESTSIGNING boot option or 'Disable Driver Signature Enforcement'
-during boot.
-03> In the Virtual Switch Manager configuration you should now see "VMWare OVS
-Extension" under 'Virtual Switch Extensions'. Click the check box to enable the
-extension.
-
-Steps to run the user processes & configure VXLAN ports
--------------------------------------------------------
-
-01> Create the conf db file.
-ovsdb\ovsdb-tool.exe create conf.db .\vswitchd\vswitch.ovsschema
-
-02> Run ovsdb-server
-ovsdb\ovsdb-server.exe -v --remote=ptcp:6632:127.0.0.1 conf.db
-
-03> Create integration bridge & pif bridge
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 add-br br-int
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 add-br br-pif
-
-04> Dump the ports
-utilities\ovs-dpctl.exe show
-
-* Sample output shows up like this. Currently it is not possible to figure out
-* the mapping between VIF and VM from the output.
-
-$ utilities\ovs-dpctl.exe show
-2014-06-27T01:55:32Z|00001|socket_util|ERR|4789:0.0.0.0:
-socket: Either the application has not called WSAStartup, or WSAStartup failed.
-                                        <<< Ignore this error, it is harmless.
-system@ovs-system:
-        lookups: hit:0 missed:0 lost:0
-        flows: 0
-        masks: hit:0 total:0 hit/pkt:0.00
-        port 16777216: internal            <<< VTEP created by AllowManagementOS
-                                               setting
-        port 16777225: external.1          <<< Physical NIC
-        port 16777288: vmNICEmu.1000048    <<< VIF #1
-        port 16777289: vmNICSyn.1000049    <<< VIF #2
-
-
-05> Add the physical NIC and the internal port to br-pif
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 add-port br-pif <port name>
-
-Eg:
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 add-port br-pif external.1
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 add-port br-pif internal
-
-06> Add the VIFs to br-int
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 add-port br-int <port name>
-
-Eg:
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 add-port br-int vmNICEmu.1000048
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 add-port br-int vmNICSyn.1000049
-
-07> Verify the status
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 show
-
-Eg:
-$ utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 show
-4cd86499-74df-48bd-a64d-8d115b12a9f2
-    Bridge br-pif
-        Port internal
-            Interface internal
-        Port "external.1"
-            Interface "external.1"
-        Port br-pif
-            Interface br-pif
-                type: internal
-    Bridge br-int
-        Port br-int
-            Interface br-int
-                type: internal
-        Port "vmNICEmu.1000048"
-            Interface "vmNICEmu.1000048"
-        Port "vmNICSyn.1000049"
-            Interface "vmNICSyn.1000049"
-
-
-09> Run vswitchd
-vswitchd\ovs-vswitchd.exe -v tcp:127.0.0.1:6632
-
-10> You can figure out the port name to MAC address mapping now. (optional)
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 list interface
-
-//********** VXLAN PORT CONFIGURATION (Supports Multiple ports) ************//
-(Remove all patch ports added to create VLAN networks.)
-11> Add the vxlan port between 172.168.201.101 <-> 172.168.201.102
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 add-port br-int vxlan-1
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 set Interface vxlan-1 type=vxlan
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 set Interface vxlan-1 options:local_ip=172.168.201.101
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 set Interface vxlan-1 options:remote_ip=172.168.201.102
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 set Interface vxlan-1 options:in_key=flow
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 set Interface vxlan-1 options:out_key=flow
-
-12> Add the vxlan port between 172.168.201.101 <-> 172.168.201.105
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 add-port br-int vxlan-2
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 set Interface vxlan-2 type=vxlan
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 set Interface vxlan-2 options:local_ip=172.168.201.102
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 set Interface vxlan-2 options:remote_ip=172.168.201.105
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 set Interface vxlan-2 options:in_key=flow
-utilities\ovs-vsctl.exe --db=tcp:127.0.0.1:6632 set Interface vxlan-2 options:out_key=flow
-
-
-//********** VLAN CONFIGURATION (Using patch ports) ************//
-(Remove all VXLAN ports from the configuration.)
-13> Add a patch port from br-int to br-pif
-utilities/ovs-vsctl.exe -- add-port br-int patch-to-pif
-utilities/ovs-vsctl.exe -- set interface patch-to-pif type=patch options:peer=patch-to-int
-
-14> Add a patch port from br-pif to br-int
-utilities/ovs-vsctl.exe -- add-port br-pif patch-to-int
-utilities/ovs-vsctl.exe -- set interface patch-to-int type=patch options:peer=patch-to-pif
-
-15> Re-Add the VIF ports with the VLAN tag
-utilities\ovs-vsctl.exe add-port br-int vmNICEmu.1000048 tag=900
-utilities\ovs-vsctl.exe add-port br-int vmNICSyn.1000049 tag=900
+during boot.  The following commands can be used:
+    % bcdedit /set LOADOPTIONS DISABLE_INTEGRITY_CHECKS
+    % bcdedit /set TESTSIGNING ON
+    % bcdedit /set nointegritychecks ON
+
+Note: you may have to restart the machine for the settings to take effect.
+
+03> In the Virtual Switch Manager configuration you can enable the Open vSwitch
+Extension on an existing switch or create a new switch.  If you are using an
+existing switch, make sure to enable the "Allow Management OS" option for VXLAN
+to work (covered later).
+
+The command to create a new switch named 'OVS-Extended-Switch' using a physical
+NIC named 'Ethernet 1' is:
+    % New-VMSwitch "OVS-Extended-Switch" -AllowManagementOS $true \
+                   -NetAdapterName "Ethernet 1"
+
+Note: you can obtain the list of physical NICs on the host using
+'Get-NetAdapter' command.
+
+04> In the properties of any switch, you should should now see "Open
+vSwitch Extension" under 'Extensions'.  Click the check box to enable the
+extension.  An alternative way to do the same is to run the following command:
+    % Enable-VMSwitchExtension "Open vSwitch Extension" OVS-Extended-Switch
+
+Note: If you enabled the extension using the command line, a delay of a few
+seconds has been observed for the change to be reflected in the UI.  This is
+not a bug in Open vSwitch.
+
+Steps to run the user processes & configure ports
+-------------------------------------------------
+The following steps assume that you have installed the Open vSwitch
+utilities in the local machine via 'make install'.
+
+01> Create the database.
+    % ovsdb-tool create C:\openvswitch\etc\openvswitch\conf.db \
+        C:\openvswitch\usr\share\openvswitch\vswitch.ovsschema
+
+02> Start the ovsdb-server and initialize the database.
+    % ovsdb-server -vfile:info --remote=punix:db.sock --log-file --pidfile \
+        --detach
+    % ovs-vsctl --no-wait init
+
+    If you would like to terminate the started ovsdb-server, run:
+    % ovs-appctl -t ovsdb-server exit
+
+    (Note that the logfile is created at C:/openvswitch/var/log/openvswitch/)
+
+03> Start ovs-vswitchd.
+    % ovs-vswitchd -vfile:info --log-file --pidfile --detach
+
+    If you would like to terminate the started ovs-vswitchd, run:
+    % ovs-appctl exit
+
+    (Note that the logfile is created at C:/openvswitch/var/log/openvswitch/)
+
+04> Create integration bridge & pif bridge
+    % ovs-vsctl add-br br-int
+    % ovs-vsctl add-br br-pif
+
+NOTE: There's a known bug that running the ovs-vsctl command does not
+terminate.  This is generally solved by having ovs-vswitchd running.  If
+you face the issue despite that, hit Ctrl-C to terminate ovs-vsctl and
+check the output to see if your command succeeded.
+
+NOTE: There's a known bug that the ports added to OVSDB via ovs-vsctl don't
+get to the kernel datapath immediately, ie. they don't show up in the output of
+"ovs-dpctl show" even though they show up in output of "ovs-vsctl show".
+In order to workaround this issue, restart ovs-vswitchd. (You can terminate
+ovs-vswitchd by running 'ovs-appctl exit'.)
+
+05> Dump the ports in the kernel datapath
+    % ovs-dpctl show
+
+* Sample output is as follows:
+
+    % ovs-dpctl show
+    system@ovs-system:
+            lookups: hit:0 missed:0 lost:0
+            flows: 0
+            port 2: br-pif (internal)     <<< internal port on 'br-pif' bridge
+            port 1: br-int (internal)     <<< internal port on 'br-int' bridge
+
+06> Dump the ports in the OVSDB
+    % ovs-vsctl show
+
+* Sample output is as follows:
+    % ovs-vsctl show
+    a56ec7b5-5b1f-49ec-a795-79f6eb63228b
+        Bridge br-pif
+            Port br-pif
+                Interface br-pif
+                    type: internal
+        Bridge br-int
+            Port br-int
+                Interface br-int
+                    type: internal
+
+07> Add the physical NIC and the internal port to br-pif.
+
+In OVS for Hyper-V, we use 'external' as a special name to refer to the
+physical NICs connected to the Hyper-V switch.  An index is added to this
+special name to refer to the particular physical NIC. Eg. 'external.1' refers
+to the first physical NIC on the Hyper-V switch.
+
+Note: Currently, we assume that the Hyper-V switch on which OVS extension is
+enabled has a single physical NIC connected to it.
+
+Interal port is the virtual adapter created on the Hyper-V switch using the
+'AllowManagementOS' setting.  This has already been setup while creating the
+switch using the instructions above.  In OVS for Hyper-V, we use a 'internal'
+as a special name to refer to that adapter.
+
+    % ovs-vsctl add-port br-pif external.1
+    % ovs-vsctl add-port br-pif internal
+
+* Dumping the ports should show the additional ports that were just added.
+  Sample output shows up as follows:
+
+    % ovs-dpctl show
+    system@ovs-system:
+            lookups: hit:0 missed:0 lost:0
+            flows: 0
+            port 4: internal (internal)   <<< 'AllowManagementOS' adapter on
+                                              Hyper-V switch
+            port 2: br-pif (internal)
+            port 1: br-int (internal
+            port 3: external.1            <<< Physical NIC
+
+    % ovs-vsctl show
+    a56ec7b5-5b1f-49ec-a795-79f6eb63228b
+        Bridge br-pif
+            Port internal
+                Interface internal
+            Port br-pif
+                Interface br-pif
+                    type: internal
+            Port "external.1"
+                Interface "external.1"
+        Bridge br-int
+            Port br-int
+                Interface br-int
+                    type: internal
+
+08> Add the VIFs to br-int
+
+Adding VIFs to openvswitch is a two step procedure.  The first step is to
+assign a 'OVS port name' which is a unique name across all VIFs on this
+Hyper-V.  The next step is to add the VIF to the ovsdb using its 'OVS port
+name' as key.
+
+08a> Assign a unique 'OVS port name' to the VIF
+
+Note that the VIF needs to have been disconnected from the Hyper-V switch
+before assigning a 'OVS port name' to it.  In the example below, we assign a
+'OVS port name' called 'ovs-port-a' to a VIF on a VM by name 'VM1'.  By using
+index 0 for '$vnic', the first VIF of the VM is being addressed.  After
+assigning the name 'ovs-port-a', the VIF is connected back to the Hyper-V
+switch with name 'OVS-HV-Switch', which is assumed to be the Hyper-V switch
+with OVS extension enabled.
+
+    Eg:
+    % import-module .\datapath-windows\misc\OVS.psm1
+    % $vnic = Get-VMNetworkAdapter <Name of the VM>
+    % Disconnect-VMNetworkAdapter -VMNetworkAdapter $vnic[0]
+    % $vnic[0] | Set-VMNetworkAdapterOVSPort -OVSPortName ovs-port-a
+    % Connect-VMNetworkAdapter -VMNetworkAdapter $vnic[0] \
+                               -SwitchName OVS-Extended-Switch
+
+08b> Add the VIFs to br-int in ovsdb
+
+    Eg:
+    % ovs-vsctl add-port br-int ovs-port-a
+
+09> Verify the status
+    % ovs-dpctl show
+    system@ovs-system:
+            lookups: hit:0 missed:0 lost:0
+            flows: 0
+            port 4: internal (internal)
+            port 5: ovs-port-a
+            port 2: br-pif (internal)
+            port 1: br-int (internal
+            port 3: external.1
+
+    % ovs-vsctl show
+    4cd86499-74df-48bd-a64d-8d115b12a9f2
+        Bridge br-pif
+            Port internal
+                Interface internal
+            Port "external.1"
+                Interface "external.1"
+            Port br-pif
+                Interface br-pif
+                    type: internal
+        Bridge br-int
+            Port br-int
+                Interface br-int
+                    type: internal
+            Port "ovs-port-a"
+                Interface "ovs-port-a"
+
+Steps to configure patch ports and switch VLAN tagging
+------------------------------------------------------
+The Windows Open vSwitch implementation support VLAN tagging in the switch.
+Switch VLAN tagging along with patch ports between 'br-int' and 'br-pif' is
+used to configure VLAN tagging functionality between two VMs on different
+Hyper-Vs.  The following examples demonstrate how it can be done:
+
+01> Add a patch port from br-int to br-pif
+    % ovs-vsctl add-port br-int patch-to-pif
+    % ovs-vsctl set interface patch-to-pif type=patch \
+                                 options:peer=patch-to-int
+
+02> Add a patch port from br-pif to br-int
+    % ovs-vsctl add-port br-pif patch-to-int
+    % ovs-vsctl set interface patch-to-int type=patch \
+                                 options:peer=patch-to-pif
+
+03> Re-Add the VIF ports with the VLAN tag
+    % ovs-vsctl add-port br-int ovs-port-a tag=900
+    % ovs-vsctl add-port br-int ovs-port-b tag=900
+
+Steps to add VXLAN tunnels
+--------------------------
+The Windows Open vSwitch implementation support VXLAN tunnels.  To add VXLAN
+tunnels, the following steps serve as examples.
+
+Note that, any patch ports created between br-int and br-pif MUST be beleted
+prior to adding VXLAN tunnels.
+
+01> Add the vxlan port between 172.168.201.101 <-> 172.168.201.102
+    % ovs-vsctl add-port br-int vxlan-1
+    % ovs-vsctl set Interface vxlan-1 type=vxlan
+    % ovs-vsctl set Interface vxlan-1 options:local_ip=172.168.201.101
+    % ovs-vsctl set Interface vxlan-1 options:remote_ip=172.168.201.102
+    % ovs-vsctl set Interface vxlan-1 options:in_key=flow
+    % ovs-vsctl set Interface vxlan-1 options:out_key=flow
+
+02> Add the vxlan port between 172.168.201.101 <-> 172.168.201.105
+    % ovs-vsctl add-port br-int vxlan-2
+    % ovs-vsctl set Interface vxlan-2 type=vxlan
+    % ovs-vsctl set Interface vxlan-2 options:local_ip=172.168.201.102
+    % ovs-vsctl set Interface vxlan-2 options:remote_ip=172.168.201.105
+    % ovs-vsctl set Interface vxlan-2 options:in_key=flow
+    % ovs-vsctl set Interface vxlan-2 options:out_key=flow
 
 
 Requirements
 ------------
 
 
 Requirements
 ------------
-
 * We require that you don't disable the "Allow management operating system to
 share this network adapter" under 'Virtual Switch Properties' > 'Connection
 type: External network', in the HyperV virtual network switch configuration.
 * We require that you don't disable the "Allow management operating system to
 share this network adapter" under 'Virtual Switch Properties' > 'Connection
 type: External network', in the HyperV virtual network switch configuration.
@@ -265,9 +421,59 @@ type: External network', in the HyperV virtual network switch configuration.
 this is still a work in progress. Till the support is complete we recommend
 disabling TX/RX offloads for both the VM's as well as the HyperV.
 
 this is still a work in progress. Till the support is complete we recommend
 disabling TX/RX offloads for both the VM's as well as the HyperV.
 
+Windows Services
+----------------
+Open vSwitch daemons come with support to run as a Windows service. The
+instructions here assume that you have installed the Open vSwitch utilities
+and daemons via 'make install'. The commands shown here can be run from
+MSYS bash or Windows command prompt.
+
+* Create the database.
+
+  % ovsdb-tool create C:/openvswitch/etc/openvswitch/conf.db \
+        "C:/openvswitch/usr/share/openvswitch/vswitch.ovsschema"
+
+* Create the ovsdb-server service and start it.
+
+  % sc create ovsdb-server binpath="C:/openvswitch/usr/sbin/ovsdb-server.exe C:/openvswitch/etc/openvswitch/conf.db -vfile:info --log-file --pidfile --remote=punix:db.sock --service --service-monitor"
+
+  One of the common issues with creating a Windows service is with mungled
+  paths. You can make sure that the correct path has been registered with
+  the Windows services manager by running:
+
+  % sc qc ovsdb-server
+
+  Start the service.
+
+  % sc start ovsdb-server
+
+  Check that the service is healthy by running:
+
+  % sc query ovsdb-server
+
+* Initialize the database.
+
+  % ovs-vsctl --no-wait init
+
+* Create the ovs-vswitchd service and start it.
+
+  % sc create ovs-vswitchd binpath="C:/openvswitch/usr/sbin/ovs-vswitchd.exe --pidfile -vfile:info --log-file  --service --service-monitor"
+
+  % sc start ovs-vswitchd
+
+  Check that the service is healthy by running:
+
+  % sc query ovs-vswitchd
+
+* To stop and delete the services, run:
+
+  % sc stop ovs-vswitchd
+  % sc stop ovsdb-server
+  % sc delete ovs-vswitchd
+  % sc delete ovsdb-server
+
 Windows autobuild service
 -------------------------
 Windows autobuild service
 -------------------------
-
 AppVeyor (appveyor.com) provides a free Windows autobuild service for
 opensource projects.  Open vSwitch has integration with AppVeyor for
 continuous build.  A developer can build test his changes for Windows by
 AppVeyor (appveyor.com) provides a free Windows autobuild service for
 opensource projects.  Open vSwitch has integration with AppVeyor for
 continuous build.  A developer can build test his changes for Windows by