Yocto 2.4

Move OpenBMC to Yocto 2.4(rocko)

Tested: Built and verified Witherspoon and Palmetto images
Change-Id: I12057b18610d6fb0e6903c60213690301e9b0c67
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/import-layers/meta-virtualization/recipes-networking/cni/cni_git.bb b/import-layers/meta-virtualization/recipes-networking/cni/cni_git.bb
new file mode 100644
index 0000000..427a812
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/cni/cni_git.bb
@@ -0,0 +1,95 @@
+HOMEPAGE = "https://github.com/containernetworking/cni"
+SUMMARY = "Container Network Interface - networking for Linux containers"
+DESCRIPTION = "CNI (Container Network Interface), a Cloud Native Computing \
+Foundation project, consists of a specification and libraries for writing \
+plugins to configure network interfaces in Linux containers, along with a \
+number of supported plugins. CNI concerns itself only with network connectivity \
+of containers and removing allocated resources when the container is deleted. \
+Because of this focus, CNI has a wide range of support and the specification \
+is simple to implement. \
+"
+
+SRCREV_cni = "4b9e11a5266fe50222ed00c5973c6ea4a384a4bb"
+SRCREV_plugins = "c238c93b5e7c681f1935ff813b30e82f96f6c367"
+SRC_URI = "\
+	git://github.com/containernetworking/cni.git;nobranch=1;name=cni \
+        git://github.com/containernetworking/plugins.git;nobranch=1;destsuffix=plugins;name=plugins \
+	"
+
+RPROVIDES_${PN} += "kubernetes-cni"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://src/import/LICENSE;md5=fa818a259cbed7ce8bc2a22d35a464fc"
+
+GO_IMPORT = "import"
+
+PV = "0.6.0+git${SRCREV_cni}"
+
+inherit go
+inherit goarch
+
+do_compile() {
+	export GOARCH="${TARGET_GOARCH}"
+	export GOROOT="${STAGING_LIBDIR_NATIVE}/${TARGET_SYS}/go"
+	export GOPATH="${S}/src/import:${S}/src/import/vendor"
+
+	# Pass the needed cflags/ldflags so that cgo
+	# can find the needed headers files and libraries
+	export CGO_ENABLED="1"
+	export CFLAGS=""
+	export LDFLAGS=""
+	export CGO_CFLAGS="${BUILDSDK_CFLAGS} --sysroot=${STAGING_DIR_TARGET}"
+	export CGO_LDFLAGS="${BUILDSDK_LDFLAGS} --sysroot=${STAGING_DIR_TARGET}"
+
+	# link fixups for compilation
+	rm -f ${S}/src/import/vendor/src
+	ln -sf ./ ${S}/src/import/vendor/src
+	rm -rf ${S}/src/import/plugins
+	rm -rf ${S}/src/import/vendor/github.com/containernetworking/plugins
+
+	mkdir -p ${S}/src/import/vendor/github.com/containernetworking/cni
+
+	ln -sf ../../../../libcni ${S}/src/import/vendor/github.com/containernetworking/cni/libcni
+	ln -sf ../../../../pkg ${S}/src/import/vendor/github.com/containernetworking/cni/pkg
+	ln -sf ../../../../cnitool ${S}/src/import/vendor/github.com/containernetworking/cni/cnitool
+	ln -sf ${WORKDIR}/plugins ${S}/src/import/vendor/github.com/containernetworking/plugins
+
+	export GOPATH="${S}/src/import/.gopath:${S}/src/import/vendor:${STAGING_DIR_TARGET}/${prefix}/local/go"
+	export GOROOT="${STAGING_DIR_NATIVE}/${nonarch_libdir}/${HOST_SYS}/go"
+
+	# Pass the needed cflags/ldflags so that cgo
+	# can find the needed headers files and libraries
+	export CGO_ENABLED="1"
+	export CGO_CFLAGS="${CFLAGS} --sysroot=${STAGING_DIR_TARGET}"
+	export CGO_LDFLAGS="${LDFLAGS} --sysroot=${STAGING_DIR_TARGET}"
+
+	cd ${S}/src/import/vendor/github.com/containernetworking/cni/libcni
+	go build
+
+	cd ${S}/src/import/vendor/github.com/containernetworking/cni/cnitool
+	go build
+
+	cd ${S}/src/import/vendor/github.com/containernetworking/plugins/
+	PLUGINS="plugins/meta/* plugins/main/*"
+	mkdir -p ${WORKDIR}/plugins/bin/
+	for p in $PLUGINS; do
+	    plugin="$(basename "$p")"
+	    echo "building: $p"
+	    go build -o ${WORKDIR}/plugins/bin/$plugin github.com/containernetworking/plugins/$p
+	done
+}
+
+do_install() {
+    localbindir="/opt/cni/bin"
+
+    install -d ${D}${localbindir}
+    install -d ${D}/${sysconfdir}/cni/net.d
+
+    install -m 755 ${S}/src/import/cnitool/cnitool ${D}/${localbindir}
+    install -m 755 -D ${WORKDIR}/plugins/bin/* ${D}/${localbindir}
+}
+
+FILES_${PN} += "/opt/cni/bin/*"
+
+INHIBIT_PACKAGE_STRIP = "1"
+INSANE_SKIP_${PN} += "ldflags already-stripped"
diff --git a/import-layers/meta-virtualization/recipes-networking/netns/files/0001-Use-correct-go-cross-compiler.patch b/import-layers/meta-virtualization/recipes-networking/netns/files/0001-Use-correct-go-cross-compiler.patch
new file mode 100644
index 0000000..ed66e11
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/netns/files/0001-Use-correct-go-cross-compiler.patch
@@ -0,0 +1,77 @@
+From d5c319bb61155d94bef2571a095d82983d786b94 Mon Sep 17 00:00:00 2001
+From: Paul Barker <pbarker@toganlabs.com>
+Date: Fri, 13 Oct 2017 17:58:11 +0000
+Subject: [PATCH] Use correct go cross-compiler
+
+Signed-off-by: Paul Barker <pbarker@toganlabs.com>
+Upstream-status: Pending
+---
+ Makefile | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index cb9a46d..633f884 100644
+--- a/src/import/Makefile
++++ b/src/import/Makefile
+@@ -33,12 +33,12 @@ build: $(NAME) ## Builds a dynamic executable or package
+ 
+ $(NAME): *.go VERSION
+ 	@echo "+ $@"
+-	go build -tags "$(BUILDTAGS)" ${GO_LDFLAGS} -o $(NAME) .
++	$(GO) build -tags "$(BUILDTAGS)" ${GO_LDFLAGS} -o $(NAME) .
+ 
+ .PHONY: static
+ static: ## Builds a static executable
+ 	@echo "+ $@"
+-	CGO_ENABLED=0 go build \
++	CGO_ENABLED=0 $(GO) build \
+ 				-tags "$(BUILDTAGS) static_build" \
+ 				${GO_LDFLAGS_STATIC} -o $(NAME) .
+ 
+@@ -55,21 +55,21 @@ lint: ## Verifies `golint` passes
+ .PHONY: test
+ test: ## Runs the go tests
+ 	@echo "+ $@"
+-	@go test -v -tags "$(BUILDTAGS) cgo" $(shell go list ./... | grep -v vendor)
++	@$(GO) test -v -tags "$(BUILDTAGS) cgo" $(shell $(GO) list ./... | grep -v vendor)
+ 
+ .PHONY: vet
+ vet: ## Verifies `go vet` passes
+ 	@echo "+ $@"
+-	@go vet $(shell go list ./... | grep -v vendor) | grep -v '.pb.go:' | tee /dev/stderr
++	@$(GO) vet $(shell $(GO) list ./... | grep -v vendor) | grep -v '.pb.go:' | tee /dev/stderr
+ 
+ .PHONY: install
+ install: ## Installs the executable or package
+ 	@echo "+ $@"
+-	@go install .
++	@$(GO) install .
+ 
+ define buildpretty
+ mkdir -p $(BUILDDIR)/$(1)/$(2);
+-GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 go build \
++GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 $(GO) build \
+ 	 -o $(BUILDDIR)/$(1)/$(2)/$(NAME) \
+ 	 -a -tags "$(BUILDTAGS) static_build netgo" \
+ 	 -installsuffix netgo ${GO_LDFLAGS_STATIC} .;
+@@ -83,7 +83,7 @@ cross: *.go VERSION ## Builds the cross-compiled binaries, creating a clean dire
+ 	$(foreach GOOSARCH,$(GOOSARCHES), $(call buildpretty,$(subst /,,$(dir $(GOOSARCH))),$(notdir $(GOOSARCH))))
+ 
+ define buildrelease
+-GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 go build \
++GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 $(GO) build \
+ 	 -o $(BUILDDIR)/$(NAME)-$(1)-$(2) \
+ 	 -a -tags "$(BUILDTAGS) static_build netgo" \
+ 	 -installsuffix netgo ${GO_LDFLAGS_STATIC} .;
+@@ -99,7 +99,7 @@ release: *.go VERSION ## Builds the cross-compiled binaries, naming them in such
+ .PHONY: bump-version
+ BUMP := patch
+ bump-version: ## Bump the version in the version file. Set KIND to [ patch | major | minor ]
+-	@go get -u github.com/jessfraz/junk/sembump # update sembump tool
++	@$(GO) get -u github.com/jessfraz/junk/sembump # update sembump tool
+ 	$(eval NEW_VERSION = $(shell sembump --kind $(BUMP) $(VERSION)))
+ 	@echo "Bumping VERSION from $(VERSION) to $(NEW_VERSION)"
+ 	echo $(NEW_VERSION) > VERSION
+-- 
+2.7.4
+
diff --git a/import-layers/meta-virtualization/recipes-networking/netns/netns_git.bb b/import-layers/meta-virtualization/recipes-networking/netns/netns_git.bb
index 641d55f..d35836e 100644
--- a/import-layers/meta-virtualization/recipes-networking/netns/netns_git.bb
+++ b/import-layers/meta-virtualization/recipes-networking/netns/netns_git.bb
@@ -1,11 +1,14 @@
 HOMEPAGE = "https://github.com/jfrazelle/netns"
 SUMMARY = "Runc hook for setting up default bridge networking."
 LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=20ce4c6a4f32d6ee4a68e3a7506db3f1"
+LIC_FILES_CHKSUM = "file://src/import/LICENSE;md5=20ce4c6a4f32d6ee4a68e3a7506db3f1"
 
-SRC_URI = "git://github.com/jessfraz/netns;branch=master"
-SRCREV = "85b1ab9fcccbaa404a2636b52a48bbde02437cf7"
-PV = "0.1.0+git${SRCPV}"
+SRC_URI = "git://github.com/jessfraz/netns;branch=master \
+           file://0001-Use-correct-go-cross-compiler.patch \
+          "
+SRCREV = "74e23a0e5c4e7ac011aafcc4623586c196f1b3ef"
+PV = "0.2.1"
+GO_IMPORT = "import"
 
 S = "${WORKDIR}/git"
 
@@ -20,12 +23,13 @@
 	# Go looks in a src directory under any directory in GOPATH but netns
 	# uses 'vendor' instead of 'vendor/src'. We can fix this with a symlink.
 	#
-	# We also need to link in the ipallocator directory as that is not under
-	# a src directory.
-	ln -sfn . "${S}/vendor/src"
-	mkdir -p "${S}/vendor/src/github.com/jessfraz/netns"
-	ln -sfn "${S}/ipallocator" "${S}/vendor/src/github.com/jessfraz/netns/ipallocator"
-	export GOPATH="${S}/vendor"
+	# We also need to link in the ipallocator and version directories as
+	# they are not under the src directory.
+	ln -sfn . "${S}/src/import/vendor/src"
+	mkdir -p "${S}/src/import/vendor/src/github.com/jessfraz/netns"
+	ln -sfn "${S}/src/import/ipallocator" "${S}/src/import/vendor/src/github.com/jessfraz/netns/ipallocator"
+	ln -sfn "${S}/src/import/version" "${S}/src/import/vendor/src/github.com/jessfraz/netns/version"
+	export GOPATH="${S}/src/import/vendor"
 
 	# Pass the needed cflags/ldflags so that cgo
 	# can find the needed headers files and libraries
@@ -35,10 +39,11 @@
 	export CGO_CFLAGS="${BUILDSDK_CFLAGS} --sysroot=${STAGING_DIR_TARGET}"
 	export CGO_LDFLAGS="${BUILDSDK_LDFLAGS} --sysroot=${STAGING_DIR_TARGET}"
 
+	cd ${S}/src/import
 	oe_runmake static
 }
 
 do_install() {
 	install -d ${D}/${sbindir}
-	install ${S}/netns ${D}/${sbindir}/netns
+	install ${S}/src/import/netns ${D}/${sbindir}/netns
 }
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/files/configure-Only-link-against-libpcap-on-FreeBSD.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/files/configure-Only-link-against-libpcap-on-FreeBSD.patch
deleted file mode 100644
index 0a44b85..0000000
--- a/import-layers/meta-virtualization/recipes-networking/openvswitch/files/configure-Only-link-against-libpcap-on-FreeBSD.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-From d30e714ccb9d13caf39d14d5b2fc9523b678ed51 Mon Sep 17 00:00:00 2001
-From: Ben Pfaff <blp@nicira.com>
-Date: Thu, 14 Mar 2013 15:20:55 -0700
-Subject: [PATCH] configure: Only link against libpcap on FreeBSD.
-
-commit d30e714ccb9d13caf39d14d5b2fc9523b678ed51 upstream
-http://git.openvswitch.org/git/openvswitch
-
-On other platforms there is no benefit to linking against libpcap, because
-it is not used.
-
-Signed-off-by: Ben Pfaff <blp@nicira.com>
-CC: Ed Maste <emaste@freebsd.org>
----
- acinclude.m4 | 7 ++++++-
- configure.ac | 3 +--
- 2 files changed, 7 insertions(+), 3 deletions(-)
-
-diff --git a/acinclude.m4 b/acinclude.m4
-index f0610c9..19a47dd 100644
---- a/acinclude.m4
-+++ b/acinclude.m4
-@@ -1,6 +1,6 @@
- # -*- autoconf -*-
- 
--# Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
-+# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
-@@ -295,6 +295,8 @@ AC_DEFUN([OVS_CHECK_IF_PACKET],
-    fi])
- 
- dnl Checks for net/if_dl.h.
-+dnl
-+dnl (We use this as a proxy for checking whether we're building on FreeBSD.)
- AC_DEFUN([OVS_CHECK_IF_DL],
-   [AC_CHECK_HEADER([net/if_dl.h],
-                    [HAVE_IF_DL=yes],
-@@ -303,6 +305,9 @@ AC_DEFUN([OVS_CHECK_IF_DL],
-    if test "$HAVE_IF_DL" = yes; then
-       AC_DEFINE([HAVE_IF_DL], [1],
-                 [Define to 1 if net/if_dl.h is available.])
-+
-+      # On FreeBSD we use libpcap to access network devices.
-+      AC_SEARCH_LIBS([pcap_open_live], [pcap])
-    fi])
- 
- dnl Checks for buggy strtok_r.
-diff --git a/configure.ac b/configure.ac
-index 1cacd29..bd49179 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -1,4 +1,4 @@
--# Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
-+# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
-@@ -44,7 +44,6 @@ AC_SYS_LARGEFILE
- AC_SEARCH_LIBS([pow], [m])
- AC_SEARCH_LIBS([clock_gettime], [rt])
- AC_SEARCH_LIBS([timer_create], [rt])
--AC_SEARCH_LIBS([pcap_open_live], [pcap])
- 
- OVS_CHECK_ESX
- OVS_CHECK_COVERAGE
--- 
-1.8.3.2
-
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-make-remaining-scripts-use-usr-bin-env.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-make-remaining-scripts-use-usr-bin-env.patch
index 68f46ff..4441c1e 100644
--- a/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-make-remaining-scripts-use-usr-bin-env.patch
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-make-remaining-scripts-use-usr-bin-env.patch
@@ -33,7 +33,7 @@
 +++ b/build-aux/check-structs
 @@ -1,4 +1,4 @@
 -#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
  
  import os.path
  import sys
@@ -43,7 +43,7 @@
 +++ b/build-aux/extract-ofp-actions
 @@ -1,4 +1,4 @@
 -#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
  
  import sys
  import os.path
@@ -53,7 +53,7 @@
 +++ b/build-aux/extract-ofp-errors
 @@ -1,4 +1,4 @@
 -#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
  
  import sys
  import os.path
@@ -63,7 +63,7 @@
 +++ b/build-aux/extract-ofp-fields
 @@ -1,4 +1,4 @@
 -#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
  
  import getopt
  import sys
@@ -73,7 +73,7 @@
 +++ b/build-aux/extract-ofp-msgs
 @@ -1,4 +1,4 @@
 -#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
  
  import sys
  import os.path
@@ -83,7 +83,7 @@
 +++ b/build-aux/xml2nroff
 @@ -1,4 +1,4 @@
 -#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
  
  # Copyright (c) 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
  #
@@ -93,7 +93,7 @@
 +++ b/ovn/utilities/ovn-docker-overlay-driver
 @@ -1,4 +1,4 @@
 -#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
  # Copyright (C) 2015 Nicira, Inc.
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -103,7 +103,7 @@
 +++ b/ovn/utilities/ovn-docker-underlay-driver
 @@ -1,4 +1,4 @@
 -#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
  # Copyright (C) 2015 Nicira, Inc.
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -113,7 +113,7 @@
 +++ b/ovsdb/ovsdb-doc
 @@ -1,4 +1,4 @@
 -#! /usr/bin/python
-+#! /usr/bin/env python
++#! /usr/bin/env python3
  
  # Copyright (c) 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
  #
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-switch-remaining-scripts-to-use-python3.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-switch-remaining-scripts-to-use-python3.patch
new file mode 100644
index 0000000..a02b2a4
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/files/python-switch-remaining-scripts-to-use-python3.patch
@@ -0,0 +1,113 @@
+From 176528ca3a8b76c9d0bb71b1e56eeebccc655c71 Mon Sep 17 00:00:00 2001
+From: Mark Asselstine <mark.asselstine@windriver.com>
+Date: Wed, 3 May 2017 10:39:12 -0400
+Subject: [PATCH] python: switch remaining scripts to use python3
+
+Work to remove the main openvswitch package's dependency on python 2.
+
+Signed-off-by: Mark Asselstine <mark.asselstine@windriver.com>
+---
+ ofproto/ipfix-gen-entities                            | 2 +-
+ tests/test-l7.py                                      | 2 +-
+ utilities/checkpatch.py                               | 2 +-
+ utilities/ovs-dev.py                                  | 2 +-
+ utilities/ovs-pipegen.py                              | 2 +-
+ vtep/ovs-vtep                                         | 2 +-
+ xenserver/etc_xapi.d_plugins_openvswitch-cfg-update   | 2 +-
+ xenserver/opt_xensource_libexec_interface-reconfigure | 2 +-
+ xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync | 2 +-
+ 9 files changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/ofproto/ipfix-gen-entities b/ofproto/ipfix-gen-entities
+index 0be7199..d2cce42 100755
+--- a/ofproto/ipfix-gen-entities
++++ b/ofproto/ipfix-gen-entities
+@@ -1,4 +1,4 @@
+-#! /usr/bin/env python
++#! /usr/bin/env python3
+ #
+ # Copyright (C) 2012 Nicira, Inc.
+ #
+diff --git a/tests/test-l7.py b/tests/test-l7.py
+index d7854a1..f09defb 100755
+--- a/tests/test-l7.py
++++ b/tests/test-l7.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # Copyright (c) 2015, 2016 Nicira, Inc.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py
+index 26eb5c3..2e1932b 100755
+--- a/utilities/checkpatch.py
++++ b/utilities/checkpatch.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # Copyright (c) 2016 Red Hat, Inc.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+diff --git a/utilities/ovs-dev.py b/utilities/ovs-dev.py
+index 9ce0f04..839e13e 100755
+--- a/utilities/ovs-dev.py
++++ b/utilities/ovs-dev.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # Copyright (c) 2013, 2014, 2015, 2016 Nicira, Inc.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+diff --git a/utilities/ovs-pipegen.py b/utilities/ovs-pipegen.py
+index 4bf240f..2a8f13e 100755
+--- a/utilities/ovs-pipegen.py
++++ b/utilities/ovs-pipegen.py
+@@ -1,4 +1,4 @@
+-#! /usr/bin/env python
++#! /usr/bin/env python3
+ # Copyright (c) 2013, 2014, 2015 Nicira, Inc.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+diff --git a/vtep/ovs-vtep b/vtep/ovs-vtep
+index fd652d4..19d63f9 100755
+--- a/vtep/ovs-vtep
++++ b/vtep/ovs-vtep
+@@ -1,4 +1,4 @@
+-#! /usr/bin/env python
++#! /usr/bin/env python3
+ # Copyright (C) 2013 Nicira, Inc. All Rights Reserved.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+diff --git a/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update b/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update
+index e7404e3..5edad76 100755
+--- a/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update
++++ b/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ #
+ # xapi plugin script to update the cache of configuration items in the
+ # ovs-vswitchd configuration that are managed in the xapi database when
+diff --git a/xenserver/opt_xensource_libexec_interface-reconfigure b/xenserver/opt_xensource_libexec_interface-reconfigure
+index ea4a742..c6745ee 100755
+--- a/xenserver/opt_xensource_libexec_interface-reconfigure
++++ b/xenserver/opt_xensource_libexec_interface-reconfigure
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ #
+ # Copyright (c) 2008,2009 Citrix Systems, Inc.
+ #
+diff --git a/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync b/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync
+index a776c00..d5ff8af 100755
+--- a/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync
++++ b/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync
+@@ -1,4 +1,4 @@
+-#! /usr/bin/env python
++#! /usr/bin/env python3
+ # Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License");
+-- 
+2.7.4
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0001-Python3-compatibility-Convert-print-statements.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0001-Python3-compatibility-Convert-print-statements.patch
new file mode 100644
index 0000000..d619758
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0001-Python3-compatibility-Convert-print-statements.patch
@@ -0,0 +1,1264 @@
+From c5c18f9c5f1b7217d43af43be9736c1762c7ebba Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 1/8] Python3 compatibility: Convert print statements
+
+Commit d34a1cc02536f9a812517a71accec3fbd3c6c98b from
+https://github.com/openvswitch/ovs.git
+
+This patch fixes up all the print statements to work with python3 or
+python2.
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ build-aux/check-structs       |   4 +-
+ build-aux/extract-ofp-actions |  68 +++---
+ build-aux/extract-ofp-errors  |   2 +-
+ build-aux/extract-ofp-fields  |   2 +-
+ build-aux/extract-ofp-msgs    |   6 +-
+ ovsdb/ovsdb-doc               |   6 +-
+ ovsdb/ovsdb-idlc.in           | 523 +++++++++++++++++++++---------------------
+ 7 files changed, 306 insertions(+), 305 deletions(-)
+
+diff --git a/build-aux/check-structs b/build-aux/check-structs
+index f79f235..bae511f 100755
+--- a/build-aux/check-structs
++++ b/build-aux/check-structs
+@@ -211,7 +211,7 @@ def checkStructs():
+ 
+     if '--help' in sys.argv:
+         argv0 = os.path.basename(sys.argv[0])
+-        print '''\
++        print('''\
+ %(argv0)s, for checking struct and struct member alignment
+ usage: %(argv0)s -Ipath HEADER [HEADER]...
+ 
+@@ -226,7 +226,7 @@ assertions using OFP_ASSERT.
+ 
+ This program is specialized for reading Open vSwitch's OpenFlow header
+ files.  It will not work on arbitrary header files without extensions.\
+-''' % {"argv0": argv0}
++''' % {"argv0": argv0})
+         sys.exit(0)
+ 
+     global fileName
+diff --git a/build-aux/extract-ofp-actions b/build-aux/extract-ofp-actions
+index 0062ab8..874e6b4 100755
+--- a/build-aux/extract-ofp-actions
++++ b/build-aux/extract-ofp-actions
+@@ -67,7 +67,7 @@ def fatal(msg):
+ 
+ def usage():
+     argv0 = os.path.basename(sys.argv[0])
+-    print ('''\
++    print('''\
+ %(argv0)s, for extracting OpenFlow action data
+ usage: %(argv0)s OFP_ACTIONS.C [--prototypes | --definitions]
+ 
+@@ -238,36 +238,36 @@ def extract_ofp_actions(fn, definitions):
+     if n_errors:
+         sys.exit(1)
+ 
+-    print """\
++    print("""\
+ /* Generated automatically; do not modify!     -*- buffer-read-only: t -*- */
+-"""
++""")
+ 
+     if definitions:
+-        print "/* Verify that structs used as actions are reasonable sizes. */"
++        print("/* Verify that structs used as actions are reasonable sizes. */")
+         for s in sorted(arg_structs):
+-            print "BUILD_ASSERT_DECL(sizeof(%s) %% OFP_ACTION_ALIGN == 0);" % s
++            print("BUILD_ASSERT_DECL(sizeof(%s) %% OFP_ACTION_ALIGN == 0);" % s)
+ 
+-        print "\nstatic struct ofpact_raw_instance all_raw_instances[] = {"
++        print("\nstatic struct ofpact_raw_instance all_raw_instances[] = {")
+         for vendor in domain:
+             for type_ in domain[vendor]:
+                 for version in domain[vendor][type_]:
+                     d = domain[vendor][type_][version]
+-                    print "    { { 0x%08x, %2d, 0x%02x }, " % (
+-                        vendor, type_, version)
+-                    print "      %s," % d["enum"]
+-                    print "      HMAP_NODE_NULL_INITIALIZER,"
+-                    print "      HMAP_NODE_NULL_INITIALIZER,"
+-                    print "      %s," % d["min_length"]
+-                    print "      %s," % d["max_length"]
+-                    print "      %s," % d["arg_ofs"]
+-                    print "      %s," % d["arg_len"]
+-                    print "      \"%s\"," % re.sub('_RAW[0-9]*', '', d["enum"], 1)
++                    print("    { { 0x%08x, %2d, 0x%02x }, " % (
++                        vendor, type_, version))
++                    print("      %s," % d["enum"])
++                    print("      HMAP_NODE_NULL_INITIALIZER,")
++                    print("      HMAP_NODE_NULL_INITIALIZER,")
++                    print("      %s," % d["min_length"])
++                    print("      %s," % d["max_length"])
++                    print("      %s," % d["arg_ofs"])
++                    print("      %s," % d["arg_len"])
++                    print("      \"%s\"," % re.sub('_RAW[0-9]*', '', d["enum"], 1))
+                     if d["deprecation"]:
+-                        print "      \"%s\"," % re.sub(r'(["\\])', r'\\\1', d["deprecation"])
++                        print("      \"%s\"," % re.sub(r'(["\\])', r'\\\1', d["deprecation"]))
+                     else:
+-                        print "      NULL,"
+-                    print "    },"
+-        print "};";
++                        print("      NULL,")
++                    print("    },")
++        print("};")
+ 
+     for versions in enums.values():
+         need_ofp_version = False
+@@ -314,11 +314,11 @@ def extract_ofp_actions(fn, definitions):
+             decl += "}"
+         else:
+             decl += ";"
+-        print decl
+-        print
++        print(decl)
++        print("")
+ 
+     if definitions:
+-        print """\
++        print("""\
+ static enum ofperr
+ ofpact_decode(const struct ofp_action_header *a, enum ofp_raw_action_type raw,
+               enum ofp_version version, uint64_t arg,
+@@ -326,14 +326,14 @@ ofpact_decode(const struct ofp_action_header *a, enum ofp_raw_action_type raw,
+               uint64_t *tlv_bitmap, struct ofpbuf *out)
+ {
+     switch (raw) {\
+-"""
++""")
+         for versions in enums.values():
+             enum = versions[0]["enum"]
+-            print "    case %s:" % enum
++            print("    case %s:" % enum)
+             base_argtype = versions[0]["base_argtype"]
+             arg_vl_mff_map = versions[0]["arg_vl_mff_map"]
+             if base_argtype == 'void':
+-                print "        return decode_%s(out);" % enum
++                print("        return decode_%s(out);" % enum)
+             else:
+                 if base_argtype.startswith('struct'):
+                     arg = "ALIGNED_CAST(const %s *, a)" % base_argtype
+@@ -344,16 +344,16 @@ ofpact_decode(const struct ofp_action_header *a, enum ofp_raw_action_type raw,
+                     else:
+                         arg = "arg"
+                 if arg_vl_mff_map:
+-                    print "        return decode_%s(%s, version, vl_mff_map, tlv_bitmap, out);" % (enum, arg)
++                    print("        return decode_%s(%s, version, vl_mff_map, tlv_bitmap, out);" % (enum, arg))
+                 else:
+-                    print "        return decode_%s(%s, version, out);" % (enum, arg)
+-            print
+-        print """\
++                    print("        return decode_%s(%s, version, out);" % (enum, arg))
++            print("")
++        print("""\
+     default:
+         OVS_NOT_REACHED();
+     }
+ }\
+-"""
++""")
+     else:
+         for versions in enums.values():
+             enum = versions[0]["enum"]
+@@ -368,15 +368,15 @@ ofpact_decode(const struct ofp_action_header *a, enum ofp_raw_action_type raw,
+                 if arg_vl_mff_map:
+                     prototype += 'const struct vl_mff_map *, uint64_t *, '
+             prototype += "struct ofpbuf *);"
+-            print prototype
++            print(prototype)
+ 
+-        print """
++        print("""
+ static enum ofperr ofpact_decode(const struct ofp_action_header *,
+                                  enum ofp_raw_action_type raw,
+                                  enum ofp_version version,
+                                  uint64_t arg, const struct vl_mff_map *vl_mff_map,
+                                  uint64_t *tlv_bitmap, struct ofpbuf *out);
+-"""
++""")
+ 
+ if __name__ == '__main__':
+     if '--help' in sys.argv:
+diff --git a/build-aux/extract-ofp-errors b/build-aux/extract-ofp-errors
+index 2312b76..336a240 100755
+--- a/build-aux/extract-ofp-errors
++++ b/build-aux/extract-ofp-errors
+@@ -426,7 +426,7 @@ static const struct ofperr_domain %s = {
+                 vendor, type_, code = map[enum]
+                 if code == None:
+                     code = -1
+-                print "        { %#8x, %2d, %3d }, /* %s */" % (vendor, type_, code, enum)
++                print ("        { %#8x, %2d, %3d }, /* %s */" % (vendor, type_, code, enum))
+             else:
+                 print ("        {       -1, -1,  -1 }, /* %s */" % enum)
+         print ("""\
+diff --git a/build-aux/extract-ofp-fields b/build-aux/extract-ofp-fields
+index 498b887..425a85f 100755
+--- a/build-aux/extract-ofp-fields
++++ b/build-aux/extract-ofp-fields
+@@ -728,7 +728,7 @@ def make_ovs_fields(meta_flow_h, meta_flow_xml):
+ ovs\-fields \- protocol header fields in OpenFlow and Open vSwitch
+ .
+ .PP
+-''') % version
++''' % version)
+ 
+     recursively_replace(doc, 'oxm_classes', make_oxm_classes_xml(document))
+ 
+diff --git a/build-aux/extract-ofp-msgs b/build-aux/extract-ofp-msgs
+index 1813638..a67e870 100755
+--- a/build-aux/extract-ofp-msgs
++++ b/build-aux/extract-ofp-msgs
+@@ -56,14 +56,14 @@ def fatal(msg):
+ 
+ def usage():
+     argv0 = os.path.basename(sys.argv[0])
+-    print '''\
++    print('''\
+ %(argv0)s, for extracting OpenFlow message types from header files
+ usage: %(argv0)s INPUT OUTPUT
+   where INPUT is the name of the input header file
+     and OUTPUT is the output file name.
+ Despite OUTPUT, the output is written to stdout, and the OUTPUT argument
+ only controls #line directives in the output.\
+-''' % {"argv0": argv0}
++''' % {"argv0": argv0})
+     sys.exit(0)
+ 
+ def make_sizeof(s):
+@@ -378,5 +378,5 @@ if __name__ == '__main__':
+         line_number = 0
+ 
+         for line in extract_ofp_msgs(sys.argv[2]):
+-            print line
++            print(line)
+         
+diff --git a/ovsdb/ovsdb-doc b/ovsdb/ovsdb-doc
+index 5cf26ee..b34fb11 100755
+--- a/ovsdb/ovsdb-doc
++++ b/ovsdb/ovsdb-doc
+@@ -258,7 +258,7 @@ represent strong references; thin lines represent weak references.
+     return s
+ 
+ def usage():
+-    print """\
++    print("""\
+ %(argv0)s: ovsdb schema documentation generator
+ Prints documentation for an OVSDB schema as an nroff-formatted manpage.
+ usage: %(argv0)s [OPTIONS] SCHEMA XML
+@@ -269,7 +269,7 @@ The following options are also available:
+   --er-diagram=DIAGRAM.PIC    include E-R diagram from DIAGRAM.PIC
+   --version=VERSION           use VERSION to display on document footer
+   -h, --help                  display this help message\
+-""" % {'argv0': argv0}
++""" % {'argv0': argv0})
+     sys.exit(0)
+ 
+ if __name__ == "__main__":
+@@ -304,7 +304,7 @@ if __name__ == "__main__":
+         for line in s.split("\n"):
+             line = line.strip()
+             if len(line):
+-                print line
++                print(line)
+ 
+     except error.Error, e:
+         sys.stderr.write("%s: %s\n" % (argv0, e.msg))
+diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
+index 721ab50..1064448 100755
+--- a/ovsdb/ovsdb-idlc.in
++++ b/ovsdb/ovsdb-idlc.in
+@@ -1,5 +1,6 @@
+ #! @PYTHON@
+ 
++from __future__ import print_function
+ import getopt
+ import os
+ import re
+@@ -123,7 +124,7 @@ def sorted_columns(table):
+ def printCIDLHeader(schemaFile):
+     schema = parseSchema(schemaFile)
+     prefix = schema.idlPrefix
+-    print '''\
++    print('''\
+ /* Generated automatically -- do not modify!    -*- buffer-read-only: t -*- */
+ 
+ #ifndef %(prefix)sIDL_HEADER
+@@ -135,39 +136,39 @@ def printCIDLHeader(schemaFile):
+ #include "ovsdb-data.h"
+ #include "ovsdb-idl-provider.h"
+ #include "smap.h"
+-#include "uuid.h"''' % {'prefix': prefix.upper()}
++#include "uuid.h"''' % {'prefix': prefix.upper()})
+ 
+     for tableName, table in sorted(schema.tables.iteritems()):
+         structName = "%s%s" % (prefix, tableName.lower())
+ 
+-        print ""
+-        print "/* %s table. */" % tableName
+-        print "struct %s {" % structName
+-        print "\tstruct ovsdb_idl_row header_;"
++        print("")
++        print("/* %s table. */" % tableName)
++        print("struct %s {" % structName)
++        print("\tstruct ovsdb_idl_row header_;")
+         for columnName, column in sorted_columns(table):
+-            print "\n\t/* %s column. */" % columnName
++            print("\n\t/* %s column. */" % columnName)
+             comment, members = cMembers(prefix, tableName,
+                                         columnName, column, False)
+             for member in members:
+-                print "\t%(type)s%(name)s;%(comment)s" % member
+-        print "};"
++                print("\t%(type)s%(name)s;%(comment)s" % member)
++        print("};")
+ 
+         # Column indexes.
+         printEnum("%s_column_id" % structName.lower(), ["%s_COL_%s" % (structName.upper(), columnName.upper())
+                                                         for columnName, column in sorted_columns(table)]
+                   + ["%s_N_COLUMNS" % structName.upper()])
+ 
+-        print
++        print("")
+         for columnName in table.columns:
+-            print "#define %(s)s_col_%(c)s (%(s)s_columns[%(S)s_COL_%(C)s])" % {
++            print("#define %(s)s_col_%(c)s (%(s)s_columns[%(S)s_COL_%(C)s])" % {
+                 's': structName,
+                 'S': structName.upper(),
+                 'c': columnName,
+-                'C': columnName.upper()}
++                'C': columnName.upper()})
+ 
+-        print "\nextern struct ovsdb_idl_column %s_columns[%s_N_COLUMNS];" % (structName, structName.upper())
++        print("\nextern struct ovsdb_idl_column %s_columns[%s_N_COLUMNS];" % (structName, structName.upper()))
+ 
+-        print '''
++        print('''
+ const struct %(s)s *%(s)s_get_for_uuid(const struct ovsdb_idl *, const struct uuid *);
+ const struct %(s)s *%(s)s_first(const struct ovsdb_idl *);
+ const struct %(s)s *%(s)s_next(const struct %(s)s *);
+@@ -205,87 +206,87 @@ void %(s)s_init(struct %(s)s *);
+ void %(s)s_delete(const struct %(s)s *);
+ struct %(s)s *%(s)s_insert(struct ovsdb_idl_txn *);
+ bool %(s)s_is_updated(const struct %(s)s *, enum %(s)s_column_id);
+-''' % {'s': structName, 'S': structName.upper()}
++''' % {'s': structName, 'S': structName.upper()})
+ 
+         for columnName, column in sorted_columns(table):
+-            print 'void %(s)s_verify_%(c)s(const struct %(s)s *);' % {'s': structName, 'c': columnName}
++            print('void %(s)s_verify_%(c)s(const struct %(s)s *);' % {'s': structName, 'c': columnName})
+ 
+-        print
++        print("")
+         for columnName, column in sorted_columns(table):
+             if column.type.value:
+                 valueParam = ', enum ovsdb_atomic_type value_type'
+             else:
+                 valueParam = ''
+-            print 'const struct ovsdb_datum *%(s)s_get_%(c)s(const struct %(s)s *, enum ovsdb_atomic_type key_type%(v)s);' % {
+-                's': structName, 'c': columnName, 'v': valueParam}
++            print('const struct ovsdb_datum *%(s)s_get_%(c)s(const struct %(s)s *, enum ovsdb_atomic_type key_type%(v)s);' % {
++                's': structName, 'c': columnName, 'v': valueParam})
+ 
+-        print
++        print("")
+         for columnName, column in sorted_columns(table):
+-            print 'void %(s)s_set_%(c)s(const struct %(s)s *,' % {'s': structName, 'c': columnName},
++            print('void %(s)s_set_%(c)s(const struct %(s)s *,' % {'s': structName, 'c': columnName}, end=' ')
+             if column.type.is_smap():
+                 args = ['const struct smap *']
+             else:
+                 comment, members = cMembers(prefix, tableName, columnName,
+                                             column, True)
+                 args = ['%(type)s%(name)s' % member for member in members]
+-            print '%s);' % ', '.join(args)
++            print('%s);' % ', '.join(args))
+ 
+-        print
++        print("")
+         for columnName, column in sorted_columns(table):
+             if column.type.is_map():
+-                print 'void %(s)s_update_%(c)s_setkey(const struct %(s)s *, ' % {'s': structName, 'c': columnName},
+-                print '%(coltype)s, %(valtype)s);' % {'coltype':column.type.key.to_const_c_type(prefix), 'valtype':column.type.value.to_const_c_type(prefix)}
+-                print 'void %(s)s_update_%(c)s_delkey(const struct %(s)s *, ' % {'s': structName, 'c': columnName},
+-                print '%(coltype)s);' % {'coltype':column.type.key.to_const_c_type(prefix)}
++                print('void %(s)s_update_%(c)s_setkey(const struct %(s)s *, ' % {'s': structName, 'c': columnName}, end=' ')
++                print('%(coltype)s, %(valtype)s);' % {'coltype':column.type.key.to_const_c_type(prefix), 'valtype':column.type.value.to_const_c_type(prefix)})
++                print('void %(s)s_update_%(c)s_delkey(const struct %(s)s *, ' % {'s': structName, 'c': columnName}, end=' ')
++                print('%(coltype)s);' % {'coltype':column.type.key.to_const_c_type(prefix)})
+             if column.type.is_set():
+-                print 'void %(s)s_update_%(c)s_addvalue(const struct %(s)s *, ' % {'s': structName, 'c': columnName},
+-                print '%(valtype)s);' % {'valtype':column.type.key.to_const_c_type(prefix)}
+-                print 'void %(s)s_update_%(c)s_delvalue(const struct %(s)s *, ' % {'s': structName, 'c': columnName},
+-                print '%(valtype)s);' % {'valtype':column.type.key.to_const_c_type(prefix)}
++                print('void %(s)s_update_%(c)s_addvalue(const struct %(s)s *, ' % {'s': structName, 'c': columnName}, end=' ')
++                print('%(valtype)s);' % {'valtype':column.type.key.to_const_c_type(prefix)})
++                print('void %(s)s_update_%(c)s_delvalue(const struct %(s)s *, ' % {'s': structName, 'c': columnName}, end=' ')
++                print('%(valtype)s);' % {'valtype':column.type.key.to_const_c_type(prefix)})
+ 
+-            print 'void %(s)s_add_clause_%(c)s(struct ovsdb_idl_condition *, enum ovsdb_function function,' % {'s': structName, 'c': columnName},
++            print('void %(s)s_add_clause_%(c)s(struct ovsdb_idl_condition *, enum ovsdb_function function,' % {'s': structName, 'c': columnName}, end=' ')
+             if column.type.is_smap():
+                 args = ['const struct smap *']
+             else:
+                 comment, members = cMembers(prefix, tableName, columnName,
+                                             column, True, refTable=False)
+                 args = ['%(type)s%(name)s' % member for member in members]
+-            print '%s);' % ', '.join(args)
++            print('%s);' % ', '.join(args))
+ 
+-            print 'void %(s)s_set_condition(struct ovsdb_idl *, struct ovsdb_idl_condition *);' % {'s': structName},
++            print('void %(s)s_set_condition(struct ovsdb_idl *, struct ovsdb_idl_condition *);' % {'s': structName})
+ 
+-        print
++        print("")
+ 
+     # Table indexes.
+     printEnum("%stable_id" % prefix.lower(), ["%sTABLE_%s" % (prefix.upper(), tableName.upper()) for tableName in sorted(schema.tables)] + ["%sN_TABLES" % prefix.upper()])
+-    print
++    print("")
+     for tableName in schema.tables:
+-        print "#define %(p)stable_%(t)s (%(p)stable_classes[%(P)sTABLE_%(T)s])" % {
++        print("#define %(p)stable_%(t)s (%(p)stable_classes[%(P)sTABLE_%(T)s])" % {
+             'p': prefix,
+             'P': prefix.upper(),
+             't': tableName.lower(),
+-            'T': tableName.upper()}
+-    print "\nextern struct ovsdb_idl_table_class %stable_classes[%sN_TABLES];" % (prefix, prefix.upper())
++            'T': tableName.upper()})
++    print("\nextern struct ovsdb_idl_table_class %stable_classes[%sN_TABLES];" % (prefix, prefix.upper()))
+ 
+-    print "\nextern struct ovsdb_idl_class %sidl_class;" % prefix
++    print("\nextern struct ovsdb_idl_class %sidl_class;" % prefix)
+ 
+-    print "\nconst char * %sget_db_version(void);" % prefix
+-    print "\n#endif /* %(prefix)sIDL_HEADER */" % {'prefix': prefix.upper()}
++    print("\nconst char * %sget_db_version(void);" % prefix)
++    print("\n#endif /* %(prefix)sIDL_HEADER */" % {'prefix': prefix.upper()})
+ 
+ def printEnum(type, members):
+     if len(members) == 0:
+         return
+ 
+-    print "\nenum %s {" % type
++    print("\nenum %s {" % type)
+     for member in members[:-1]:
+-        print "    %s," % member
+-    print "    %s" % members[-1]
+-    print "};"
++        print("    %s," % member)
++    print("    %s" % members[-1])
++    print("};")
+ 
+ def printCIDLSource(schemaFile):
+     schema = parseSchema(schemaFile)
+     prefix = schema.idlPrefix
+-    print '''\
++    print('''\
+ /* Generated automatically -- do not modify!    -*- buffer-read-only: t -*- */
+ 
+ #include <config.h>
+@@ -296,33 +297,33 @@ def printCIDLSource(schemaFile):
+ #include "ovsdb-error.h"
+ #include "util.h"
+ 
+-''' % schema.idlHeader
++''' % schema.idlHeader)
+ 
+     # Cast functions.
+     for tableName, table in sorted(schema.tables.iteritems()):
+         structName = "%s%s" % (prefix, tableName.lower())
+-        print '''
++        print('''
+ static struct %(s)s *
+ %(s)s_cast(const struct ovsdb_idl_row *row)
+ {
+     return row ? CONTAINER_OF(row, struct %(s)s, header_) : NULL;
+ }\
+-''' % {'s': structName}
++''' % {'s': structName})
+ 
+ 
+     for tableName, table in sorted(schema.tables.iteritems()):
+         structName = "%s%s" % (prefix, tableName.lower())
+-        print ""
+-        print "/* %s table. */" % (tableName)
++        print("")
++        print("/* %s table. */" % (tableName))
+ 
+         # Parse functions.
+         for columnName, column in sorted_columns(table):
+-            print '''
++            print('''
+ static void
+ %(s)s_parse_%(c)s(struct ovsdb_idl_row *row_, const struct ovsdb_datum *datum)
+ {
+     struct %(s)s *row = %(s)s_cast(row_);''' % {'s': structName,
+-                                                'c': columnName}
++                                                'c': columnName})
+             type = column.type
+             if type.value:
+                 keyVar = "row->key_%s" % columnName
+@@ -332,89 +333,89 @@ static void
+                 valueVar = None
+ 
+             if type.is_smap():
+-                print "    smap_init(&row->%s);" % columnName
+-                print "    for (size_t i = 0; i < datum->n; i++) {"
+-                print "        smap_add(&row->%s," % columnName
+-                print "                 datum->keys[i].string,"
+-                print "                 datum->values[i].string);"
+-                print "    }"
++                print("    smap_init(&row->%s);" % columnName)
++                print("    for (size_t i = 0; i < datum->n; i++) {")
++                print("        smap_add(&row->%s," % columnName)
++                print("                 datum->keys[i].string,")
++                print("                 datum->values[i].string);")
++                print("    }")
+             elif (type.n_min == 1 and type.n_max == 1) or type.is_optional_pointer():
+-                print
+-                print "    if (datum->n >= 1) {"
++                print("")
++                print("    if (datum->n >= 1) {")
+                 if not type.key.ref_table:
+-                    print "        %s = datum->keys[0].%s;" % (keyVar, type.key.type.to_string())
++                    print("        %s = datum->keys[0].%s;" % (keyVar, type.key.type.to_string()))
+                 else:
+-                    print "        %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->keys[0].uuid));" % (keyVar, prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower())
++                    print("        %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->keys[0].uuid));" % (keyVar, prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower()))
+ 
+                 if valueVar:
+                     if not type.value.ref_table:
+-                        print "        %s = datum->values[0].%s;" % (valueVar, type.value.type.to_string())
++                        print("        %s = datum->values[0].%s;" % (valueVar, type.value.type.to_string()))
+                     else:
+-                        print "        %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->values[0].uuid));" % (valueVar, prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower())
+-                print "    } else {"
+-                print "        %s" % type.key.initCDefault(keyVar, type.n_min == 0)
++                        print("        %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->values[0].uuid));" % (valueVar, prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower()))
++                print("    } else {")
++                print("        %s" % type.key.initCDefault(keyVar, type.n_min == 0))
+                 if valueVar:
+-                    print "        %s" % type.value.initCDefault(valueVar, type.n_min == 0)
+-                print "    }"
++                    print("        %s" % type.value.initCDefault(valueVar, type.n_min == 0))
++                print("    }")
+             else:
+                 if type.n_max != sys.maxint:
+-                    print "    size_t n = MIN(%d, datum->n);" % type.n_max
++                    print("    size_t n = MIN(%d, datum->n);" % type.n_max)
+                     nMax = "n"
+                 else:
+                     nMax = "datum->n"
+-                print "    %s = NULL;" % keyVar
++                print("    %s = NULL;" % keyVar)
+                 if valueVar:
+-                    print "    %s = NULL;" % valueVar
+-                print "    row->n_%s = 0;" % columnName
+-                print "    for (size_t i = 0; i < %s; i++) {" % nMax
++                    print("    %s = NULL;" % valueVar)
++                print("    row->n_%s = 0;" % columnName)
++                print("    for (size_t i = 0; i < %s; i++) {" % nMax)
+                 if type.key.ref_table:
+-                    print """\
++                    print("""\
+         struct %s%s *keyRow = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->keys[i].uuid));
+         if (!keyRow) {
+             continue;
+         }\
+-""" % (prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower())
++""" % (prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower()))
+                     keySrc = "keyRow"
+                 else:
+                     keySrc = "datum->keys[i].%s" % type.key.type.to_string()
+                 if type.value and type.value.ref_table:
+-                    print """\
++                    print("""\
+         struct %s%s *valueRow = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->values[i].uuid));
+         if (!valueRow) {
+             continue;
+         }\
+-""" % (prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower())
++""" % (prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower()))
+                     valueSrc = "valueRow"
+                 elif valueVar:
+                     valueSrc = "datum->values[i].%s" % type.value.type.to_string()
+-                print "        if (!row->n_%s) {" % (columnName)
++                print("        if (!row->n_%s) {" % (columnName))
+ 
+-                print "            %s = xmalloc(%s * sizeof *%s);" % (
+-                    keyVar, nMax, keyVar)
++                print("            %s = xmalloc(%s * sizeof *%s);" % (
++                    keyVar, nMax, keyVar))
+                 if valueVar:
+-                    print "            %s = xmalloc(%s * sizeof *%s);" % (
+-                        valueVar, nMax, valueVar)
+-                print "        }"
+-                print "        %s[row->n_%s] = %s;" % (keyVar, columnName, keySrc)
++                    print("            %s = xmalloc(%s * sizeof *%s);" % (
++                        valueVar, nMax, valueVar))
++                print("        }")
++                print("        %s[row->n_%s] = %s;" % (keyVar, columnName, keySrc))
+                 if valueVar:
+-                    print "        %s[row->n_%s] = %s;" % (valueVar, columnName, valueSrc)
+-                print "        row->n_%s++;" % columnName
+-                print "    }"
+-            print "}"
++                    print("        %s[row->n_%s] = %s;" % (valueVar, columnName, valueSrc))
++                print("        row->n_%s++;" % columnName)
++                print("    }")
++            print("}")
+ 
+         # Unparse functions.
+         for columnName, column in sorted_columns(table):
+             type = column.type
+             if type.is_smap() or (type.n_min != 1 or type.n_max != 1) and not type.is_optional_pointer():
+-                print '''
++                print('''
+ static void
+ %(s)s_unparse_%(c)s(struct ovsdb_idl_row *row_)
+ {
+     struct %(s)s *row = %(s)s_cast(row_);''' % {'s': structName,
+-                                                'c': columnName}
++                                                'c': columnName})
+ 
+                 if type.is_smap():
+-                    print "    smap_destroy(&row->%s);" % columnName
++                    print("    smap_destroy(&row->%s);" % columnName)
+                 else:
+                     if type.value:
+                         keyVar = "row->key_%s" % columnName
+@@ -422,45 +423,45 @@ static void
+                     else:
+                         keyVar = "row->%s" % columnName
+                         valueVar = None
+-                    print "    free(%s);" % keyVar
++                    print("    free(%s);" % keyVar)
+                     if valueVar:
+-                        print "    free(%s);" % valueVar
+-                print '}'
++                        print("    free(%s);" % valueVar)
++                print('}')
+             else:
+-                print '''
++                print('''
+ static void
+ %(s)s_unparse_%(c)s(struct ovsdb_idl_row *row OVS_UNUSED)
+ {
+     /* Nothing to do. */
+-}''' % {'s': structName, 'c': columnName}
++}''' % {'s': structName, 'c': columnName})
+ 
+         # Generic Row Initialization function.
+-        print """
++        print("""
+ static void
+ %(s)s_init__(struct ovsdb_idl_row *row)
+ {
+     %(s)s_init(%(s)s_cast(row));
+-}""" % {'s': structName}
++}""" % {'s': structName})
+ 
+         # Row Initialization function.
+-        print """
++        print("""
+ /* Clears the contents of 'row' in table "%(t)s". */
+ void
+ %(s)s_init(struct %(s)s *row)
+ {
+-    memset(row, 0, sizeof *row); """ % {'s': structName, 't': tableName}
++    memset(row, 0, sizeof *row); """ % {'s': structName, 't': tableName})
+         for columnName, column in sorted_columns(table):
+             if column.type.is_smap():
+-                print "    smap_init(&row->%s);" % columnName
++                print("    smap_init(&row->%s);" % columnName)
+             elif (column.type.n_min == 1 and
+                   column.type.n_max == 1 and
+                   column.type.key.type == ovs.db.types.StringType and
+                   not column.type.value):
+-                print "    row->%s = \"\";" % columnName
+-        print "}"
++                print("    row->%s = \"\";" % columnName)
++        print("}")
+ 
+         # First, next functions.
+-        print '''
++        print('''
+ /* Searches table "%(t)s" in 'idl' for a row with UUID 'uuid'.  Returns
+  * a pointer to the row if there is one, otherwise a null pointer.  */
+ const struct %(s)s *
+@@ -514,9 +515,9 @@ const struct %(s)s
+         'P': prefix.upper(),
+         't': tableName,
+         'tl': tableName.lower(),
+-        'T': tableName.upper()}
++        'T': tableName.upper()})
+ 
+-        print '''
++        print('''
+ 
+ /* Deletes 'row' from table "%(t)s".  'row' may be freed, so it must not be
+  * accessed afterward.
+@@ -550,11 +551,11 @@ bool
+         'P': prefix.upper(),
+         't': tableName,
+         'tl': tableName.lower(),
+-        'T': tableName.upper()}
++        'T': tableName.upper()})
+ 
+         # Verify functions.
+         for columnName, column in sorted_columns(table):
+-            print '''
++            print('''
+ /* Causes the original contents of column "%(c)s" in 'row' to be
+  * verified as a prerequisite to completing the transaction.  That is, if
+  * "%(c)s" in 'row' changed (or if 'row' was deleted) between the
+@@ -585,7 +586,7 @@ void
+ }''' % {'s': structName,
+         'S': structName.upper(),
+         'c': columnName,
+-        'C': columnName.upper()}
++        'C': columnName.upper()})
+ 
+         # Get functions.
+         for columnName, column in sorted_columns(table):
+@@ -597,7 +598,7 @@ void
+                 valueParam = ''
+                 valueType = ''
+                 valueComment = ''
+-            print """
++            print("""
+ /* Returns the "%(c)s" column's value from the "%(t)s" table in 'row'
+  * as a struct ovsdb_datum.  This is useful occasionally: for example,
+  * ovsdb_datum_find_key() is an easier and more efficient way to search
+@@ -625,7 +626,7 @@ const struct ovsdb_datum *
+     return ovsdb_idl_read(&row->header_, &%(s)s_col_%(c)s);
+ }""" % {'t': tableName, 's': structName, 'c': columnName,
+        'kt': column.type.key.toAtomicType(),
+-       'v': valueParam, 'vt': valueType, 'vc': valueComment}
++       'v': valueParam, 'vt': valueType, 'vc': valueComment})
+ 
+         # Set functions.
+         for columnName, column in sorted_columns(table):
+@@ -635,8 +636,8 @@ const struct ovsdb_datum *
+                                         column, True)
+ 
+             if type.is_smap():
+-                print comment
+-                print """void
++                print(comment)
++                print("""void
+ %(s)s_set_%(c)s(const struct %(s)s *row, const struct smap *%(c)s)
+ {
+     struct ovsdb_datum datum;
+@@ -654,7 +655,7 @@ const struct ovsdb_datum *
+        's': structName,
+        'S': structName.upper(),
+        'c': columnName,
+-       'C': columnName.upper()}
++       'C': columnName.upper()})
+                 continue
+ 
+             keyVar = members[0]['name']
+@@ -668,84 +669,84 @@ const struct ovsdb_datum *
+                 if len(members) > 1:
+                     nVar = members[1]['name']
+ 
+-            print comment
+-            print """\
++            print(comment)
++            print("""\
+ void
+ %(s)s_set_%(c)s(const struct %(s)s *row, %(args)s)
+ {
+     struct ovsdb_datum datum;""" % {'s': structName,
+         'c': columnName,
+         'args': ', '.join(['%(type)s%(name)s'
+-                           % m for m in members])}
++                           % m for m in members])})
+             if type.n_min == 1 and type.n_max == 1:
+-                print "    union ovsdb_atom key;"
++                print("    union ovsdb_atom key;")
+                 if type.value:
+-                    print "    union ovsdb_atom value;"
+-                print
+-                print "    datum.n = 1;"
+-                print "    datum.keys = &key;"
+-                print "    " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar)
++                    print("    union ovsdb_atom value;")
++                print("")
++                print("    datum.n = 1;")
++                print("    datum.keys = &key;")
++                print("    " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar))
+                 if type.value:
+-                    print "    datum.values = &value;"
+-                    print "    "+ type.value.assign_c_value_casting_away_const("value.%s" % type.value.type.to_string(), valueVar)
++                    print("    datum.values = &value;")
++                    print("    "+ type.value.assign_c_value_casting_away_const("value.%s" % type.value.type.to_string(), valueVar))
+                 else:
+-                    print "    datum.values = NULL;"
++                    print("    datum.values = NULL;")
+                 txn_write_func = "ovsdb_idl_txn_write_clone"
+             elif type.is_optional_pointer():
+-                print "    union ovsdb_atom key;"
+-                print
+-                print "    if (%s) {" % keyVar
+-                print "        datum.n = 1;"
+-                print "        datum.keys = &key;"
+-                print "        " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar)
+-                print "    } else {"
+-                print "        datum.n = 0;"
+-                print "        datum.keys = NULL;"
+-                print "    }"
+-                print "    datum.values = NULL;"
++                print("    union ovsdb_atom key;")
++                print("")
++                print("    if (%s) {" % keyVar)
++                print("        datum.n = 1;")
++                print("        datum.keys = &key;")
++                print("        " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar))
++                print("    } else {")
++                print("        datum.n = 0;")
++                print("        datum.keys = NULL;")
++                print("    }")
++                print("    datum.values = NULL;")
+                 txn_write_func = "ovsdb_idl_txn_write_clone"
+             elif type.n_max == 1:
+-                print "    union ovsdb_atom key;"
+-                print
+-                print "    if (%s) {" % nVar
+-                print "        datum.n = 1;"
+-                print "        datum.keys = &key;"
+-                print "        " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), "*" + keyVar)
+-                print "    } else {"
+-                print "        datum.n = 0;"
+-                print "        datum.keys = NULL;"
+-                print "    }"
+-                print "    datum.values = NULL;"
++                print("    union ovsdb_atom key;")
++                print("")
++                print("    if (%s) {" % nVar)
++                print("        datum.n = 1;")
++                print("        datum.keys = &key;")
++                print("        " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), "*" + keyVar))
++                print("    } else {")
++                print("        datum.n = 0;")
++                print("        datum.keys = NULL;")
++                print("    }")
++                print("    datum.values = NULL;")
+                 txn_write_func = "ovsdb_idl_txn_write_clone"
+             else:
+-                print
+-                print "    datum.n = %s;" % nVar
+-                print "    datum.keys = %s ? xmalloc(%s * sizeof *datum.keys) : NULL;" % (nVar, nVar)
++                print("")
++                print("    datum.n = %s;" % nVar)
++                print("    datum.keys = %s ? xmalloc(%s * sizeof *datum.keys) : NULL;" % (nVar, nVar))
+                 if type.value:
+-                    print "    datum.values = xmalloc(%s * sizeof *datum.values);" % nVar
++                    print("    datum.values = xmalloc(%s * sizeof *datum.values);" % nVar)
+                 else:
+-                    print "    datum.values = NULL;"
+-                print "    for (size_t i = 0; i < %s; i++) {" % nVar
+-                print "        " + type.key.copyCValue("datum.keys[i].%s" % type.key.type.to_string(), "%s[i]" % keyVar)
++                    print("    datum.values = NULL;")
++                print("    for (size_t i = 0; i < %s; i++) {" % nVar)
++                print("        " + type.key.copyCValue("datum.keys[i].%s" % type.key.type.to_string(), "%s[i]" % keyVar))
+                 if type.value:
+-                    print "        " + type.value.copyCValue("datum.values[i].%s" % type.value.type.to_string(), "%s[i]" % valueVar)
+-                print "    }"
++                    print("        " + type.value.copyCValue("datum.values[i].%s" % type.value.type.to_string(), "%s[i]" % valueVar))
++                print("    }")
+                 if type.value:
+                     valueType = type.value.toAtomicType()
+                 else:
+                     valueType = "OVSDB_TYPE_VOID"
+                 txn_write_func = "ovsdb_idl_txn_write"
+-            print "    %(f)s(&row->header_, &%(s)s_col_%(c)s, &datum);" \
++            print("    %(f)s(&row->header_, &%(s)s_col_%(c)s, &datum);" \
+                 % {'f': txn_write_func,
+                    's': structName,
+                    'S': structName.upper(),
+-                   'c': columnName}
+-            print "}"
++                   'c': columnName})
++            print("}")
+         # Update/Delete of partial map column functions
+         for columnName, column in sorted_columns(table):
+             type = column.type
+             if type.is_map():
+-                print '''
++                print('''
+ /* Sets an element of the "%(c)s" map column from the "%(t)s" table in 'row'
+  * to 'new_value' given the key value 'new_key'.
+  *
+@@ -761,17 +762,17 @@ void
+     datum->values = xmalloc(datum->n * sizeof *datum->values);
+ ''' % {'s': structName, 'c': columnName,'coltype':column.type.key.to_const_c_type(prefix),
+         'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper(),
+-        'C': columnName.upper(), 't': tableName}
++        'C': columnName.upper(), 't': tableName})
+ 
+-                print "    "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "new_key")
+-                print "    "+ type.value.copyCValue("datum->values[0].%s" % type.value.type.to_string(), "new_value")
+-                print '''
++                print("    "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "new_key"))
++                print("    "+ type.value.copyCValue("datum->values[0].%s" % type.value.type.to_string(), "new_value"))
++                print('''
+     ovsdb_idl_txn_write_partial_map(&row->header_,
+                                     &%(s)s_col_%(c)s,
+                                     datum);
+ }''' % {'s': structName, 'c': columnName,'coltype':column.type.key.toCType(prefix),
+-        'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper()}
+-                print '''
++        'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper()})
++                print('''
+ /* Deletes an element of the "%(c)s" map column from the "%(t)s" table in 'row'
+  * given the key value 'delete_key'.
+  *
+@@ -787,19 +788,19 @@ void
+     datum->values = NULL;
+ ''' % {'s': structName, 'c': columnName,'coltype':column.type.key.to_const_c_type(prefix),
+         'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper(),
+-        'C': columnName.upper(), 't': tableName}
++        'C': columnName.upper(), 't': tableName})
+ 
+-                print "    "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "delete_key")
+-                print '''
++                print("    "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "delete_key"))
++                print('''
+     ovsdb_idl_txn_delete_partial_map(&row->header_,
+                                     &%(s)s_col_%(c)s,
+                                     datum);
+ }''' % {'s': structName, 'c': columnName,'coltype':column.type.key.toCType(prefix),
+-        'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper()}
++        'valtype':column.type.value.to_const_c_type(prefix), 'S': structName.upper()})
+         # End Update/Delete of partial maps
+         # Update/Delete of partial set column functions
+             if type.is_set():
+-                print '''
++                print('''
+ /* Adds the value 'new_value' to the "%(c)s" set column from the "%(t)s" table
+  * in 'row'.
+  *
+@@ -814,16 +815,16 @@ void
+     datum->keys = xmalloc(datum->n * sizeof *datum->values);
+     datum->values = NULL;
+ ''' % {'s': structName, 'c': columnName,
+-        'valtype':column.type.key.to_const_c_type(prefix), 't': tableName}
++        'valtype':column.type.key.to_const_c_type(prefix), 't': tableName})
+ 
+-                print "    "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "new_value")
+-                print '''
++                print("    "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "new_value"))
++                print('''
+     ovsdb_idl_txn_write_partial_set(&row->header_,
+                                     &%(s)s_col_%(c)s,
+                                     datum);
+ }''' % {'s': structName, 'c': columnName,'coltype':column.type.key.toCType(prefix),
+-        'valtype':column.type.key.to_const_c_type(prefix), 'S': structName.upper()}
+-                print '''
++        'valtype':column.type.key.to_const_c_type(prefix), 'S': structName.upper()})
++                print('''
+ /* Deletes the value 'delete_value' from the "%(c)s" set column from the
+  * "%(t)s" table in 'row'.
+  *
+@@ -839,15 +840,15 @@ void
+     datum->values = NULL;
+ ''' % {'s': structName, 'c': columnName,'coltype':column.type.key.to_const_c_type(prefix),
+         'valtype':column.type.key.to_const_c_type(prefix), 'S': structName.upper(),
+-        'C': columnName.upper(), 't': tableName}
++        'C': columnName.upper(), 't': tableName})
+ 
+-                print "    "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "delete_value")
+-                print '''
++                print("    "+ type.key.copyCValue("datum->keys[0].%s" % type.key.type.to_string(), "delete_value"))
++                print('''
+     ovsdb_idl_txn_delete_partial_set(&row->header_,
+                                     &%(s)s_col_%(c)s,
+                                     datum);
+ }''' % {'s': structName, 'c': columnName,'coltype':column.type.key.toCType(prefix),
+-        'valtype':column.type.key.to_const_c_type(prefix), 'S': structName.upper()}
++        'valtype':column.type.key.to_const_c_type(prefix), 'S': structName.upper()})
+         # End Update/Delete of partial set
+ 
+         # Add clause functions.
+@@ -858,8 +859,8 @@ void
+                                         column, True, refTable=False)
+ 
+             if type.is_smap():
+-                print comment
+-                print """void
++                print(comment)
++                print("""void
+ %(s)s_add_clause_%(c)s(struct ovsdb_idl_condition *cond, enum ovsdb_function function, const struct smap *%(c)s)
+ {
+     struct ovsdb_datum datum;
+@@ -884,7 +885,7 @@ void
+        'P': prefix.upper(),
+        's': structName,
+        'S': structName.upper(),
+-       'c': columnName}
++       'c': columnName})
+                 continue
+ 
+             keyVar = members[0]['name']
+@@ -898,73 +899,73 @@ void
+                 if len(members) > 1:
+                     nVar = members[1]['name']
+ 
+-            print comment
+-            print 'void'
+-            print '%(s)s_add_clause_%(c)s(struct ovsdb_idl_condition *cond, enum ovsdb_function function, %(args)s)' % \
++            print(comment)
++            print('void')
++            print('%(s)s_add_clause_%(c)s(struct ovsdb_idl_condition *cond, enum ovsdb_function function, %(args)s)' % \
+                 {'s': structName, 'c': columnName,
+-                 'args': ', '.join(['%(type)s%(name)s' % m for m in members])}
+-            print "{"
+-            print "    struct ovsdb_datum datum;"
++                 'args': ', '.join(['%(type)s%(name)s' % m for m in members])})
++            print("{")
++            print("    struct ovsdb_datum datum;")
+             free = []
+             if type.n_min == 1 and type.n_max == 1:
+-                print "    union ovsdb_atom key;"
++                print("    union ovsdb_atom key;")
+                 if type.value:
+-                    print "    union ovsdb_atom value;"
+-                print
+-                print "    datum.n = 1;"
+-                print "    datum.keys = &key;"
+-                print "    " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar, refTable=False)
++                    print("    union ovsdb_atom value;")
++                print("")
++                print("    datum.n = 1;")
++                print("    datum.keys = &key;")
++                print("    " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar, refTable=False))
+                 if type.value:
+-                    print "    datum.values = &value;"
+-                    print "    "+ type.value.assign_c_value_casting_away_const("value.%s" % type.value.type.to_string(), valueVar, refTable=False)
++                    print("    datum.values = &value;")
++                    print("    "+ type.value.assign_c_value_casting_away_const("value.%s" % type.value.type.to_string(), valueVar, refTable=False))
+                 else:
+-                    print "    datum.values = NULL;"
++                    print("    datum.values = NULL;")
+             elif type.is_optional_pointer():
+-                print "    union ovsdb_atom key;"
+-                print
+-                print "    if (%s) {" % keyVar
+-                print "        datum.n = 1;"
+-                print "        datum.keys = &key;"
+-                print "        " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar, refTable=False)
+-                print "    } else {"
+-                print "        datum.n = 0;"
+-                print "        datum.keys = NULL;"
+-                print "    }"
+-                print "    datum.values = NULL;"
++                print("    union ovsdb_atom key;")
++                print("")
++                print("    if (%s) {" % keyVar)
++                print("        datum.n = 1;")
++                print("        datum.keys = &key;")
++                print("        " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar, refTable=False))
++                print("    } else {")
++                print("        datum.n = 0;")
++                print("        datum.keys = NULL;")
++                print("    }")
++                print("    datum.values = NULL;")
+             elif type.n_max == 1:
+-                print "    union ovsdb_atom key;"
+-                print
+-                print "    if (%s) {" % nVar
+-                print "        datum.n = 1;"
+-                print "        datum.keys = &key;"
+-                print "        " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), "*" + keyVar, refTable=False)
+-                print "    } else {"
+-                print "        datum.n = 0;"
+-                print "        datum.keys = NULL;"
+-                print "    }"
+-                print "    datum.values = NULL;"
++                print("    union ovsdb_atom key;")
++                print("")
++                print("    if (%s) {" % nVar)
++                print("        datum.n = 1;")
++                print("        datum.keys = &key;")
++                print("        " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), "*" + keyVar, refTable=False))
++                print("    } else {")
++                print("        datum.n = 0;")
++                print("        datum.keys = NULL;")
++                print("    }")
++                print("    datum.values = NULL;")
+             else:
+-                print "    datum.n = %s;" % nVar
+-                print "    datum.keys = %s ? xmalloc(%s * sizeof *datum.keys) : NULL;" % (nVar, nVar)
++                print("    datum.n = %s;" % nVar)
++                print("    datum.keys = %s ? xmalloc(%s * sizeof *datum.keys) : NULL;" % (nVar, nVar))
+                 free += ['datum.keys']
+                 if type.value:
+-                    print "    datum.values = xmalloc(%s * sizeof *datum.values);" % nVar
++                    print("    datum.values = xmalloc(%s * sizeof *datum.values);" % nVar)
+                     free += ['datum.values']
+                 else:
+-                    print "    datum.values = NULL;"
+-                print "    for (size_t i = 0; i < %s; i++) {" % nVar
+-                print "        " + type.key.assign_c_value_casting_away_const("datum.keys[i].%s" % type.key.type.to_string(), "%s[i]" % keyVar, refTable=False)
++                    print("    datum.values = NULL;")
++                print("    for (size_t i = 0; i < %s; i++) {" % nVar)
++                print("        " + type.key.assign_c_value_casting_away_const("datum.keys[i].%s" % type.key.type.to_string(), "%s[i]" % keyVar, refTable=False))
+                 if type.value:
+-                    print "        " + type.value.assign_c_value_casting_away_const("datum.values[i].%s" % type.value.type.to_string(), "%s[i]" % valueVar, refTable=False)
+-                print "    }"
++                    print("        " + type.value.assign_c_value_casting_away_const("datum.values[i].%s" % type.value.type.to_string(), "%s[i]" % valueVar, refTable=False))
++                print("    }")
+                 if type.value:
+                     valueType = type.value.toAtomicType()
+                 else:
+                     valueType = "OVSDB_TYPE_VOID"
+-                print "    ovsdb_datum_sort_unique(&datum, %s, %s);" % (
+-                    type.key.toAtomicType(), valueType)
++                print("    ovsdb_datum_sort_unique(&datum, %s, %s);" % (
++                    type.key.toAtomicType(), valueType))
+ 
+-            print"""    ovsdb_idl_condition_add_clause(cond,
++            print("""    ovsdb_idl_condition_add_clause(cond,
+                           function,
+                           &%(s)s_col_%(c)s,
+                           &datum);\
+@@ -974,28 +975,28 @@ void
+        'P': prefix.upper(),
+        's': structName,
+        'S': structName.upper(),
+-       'c': columnName}
++       'c': columnName})
+             for var in free:
+-                print "    free(%s);" % var
+-            print "}"
++                print("    free(%s);" % var)
++            print("}")
+ 
+-        print """
++        print("""
+ void
+ %(s)s_set_condition(struct ovsdb_idl *idl, struct ovsdb_idl_condition *condition)
+ {
+     ovsdb_idl_set_condition(idl, &%(p)stable_%(tl)s, condition);
+ }""" % {'p': prefix,
+         's': structName,
+-        'tl': tableName.lower()}
++        'tl': tableName.lower()})
+ 
+         # Table columns.
+         for columnName, column in sorted_columns(table):
+             prereqs = []
+             x = column.type.cInitType("%s_col_%s" % (tableName, columnName), prereqs)
+             if prereqs:
+-                print '\n'.join(prereqs)
+-        print "\nstruct ovsdb_idl_column %s_columns[%s_N_COLUMNS] = {" % (
+-            structName, structName.upper())
++                print('\n'.join(prereqs))
++        print("\nstruct ovsdb_idl_column %s_columns[%s_N_COLUMNS] = {" % (
++            structName, structName.upper()))
+         for columnName, column in sorted_columns(table):
+             if column.mutable:
+                 mutable = "true"
+@@ -1003,7 +1004,7 @@ void
+                 mutable = "false"
+             type_init = '\n'.join("            " + x
+                                   for x in column.type.cInitType("%s_col_%s" % (tableName, columnName), prereqs))
+-            print """\
++            print("""\
+     [%(P)s%(T)s_COL_%(C)s] = {
+          .name = "%(c)s",
+          .type = {
+@@ -1018,38 +1019,38 @@ void
+                'C': columnName.upper(),
+                's': structName,
+                'mutable': mutable,
+-               'type': type_init}
+-        print "};"
++               'type': type_init})
++        print("};")
+ 
+     # Table classes.
+-    print ""
+-    print "struct ovsdb_idl_table_class %stable_classes[%sN_TABLES] = {" % (prefix, prefix.upper())
++    print("")
++    print("struct ovsdb_idl_table_class %stable_classes[%sN_TABLES] = {" % (prefix, prefix.upper()))
+     for tableName, table in sorted(schema.tables.iteritems()):
+         structName = "%s%s" % (prefix, tableName.lower())
+         if table.is_root:
+             is_root = "true"
+         else:
+             is_root = "false"
+-        print "    {\"%s\", %s," % (tableName, is_root)
+-        print "     %s_columns, ARRAY_SIZE(%s_columns)," % (
+-            structName, structName)
+-        print "     sizeof(struct %s), %s_init__}," % (structName, structName)
+-    print "};"
++        print("    {\"%s\", %s," % (tableName, is_root))
++        print("     %s_columns, ARRAY_SIZE(%s_columns)," % (
++            structName, structName))
++        print("     sizeof(struct %s), %s_init__}," % (structName, structName))
++    print("};")
+ 
+     # IDL class.
+-    print "\nstruct ovsdb_idl_class %sidl_class = {" % prefix
+-    print "    \"%s\", %stable_classes, ARRAY_SIZE(%stable_classes)" % (
+-        schema.name, prefix, prefix)
+-    print "};"
++    print("\nstruct ovsdb_idl_class %sidl_class = {" % prefix)
++    print("    \"%s\", %stable_classes, ARRAY_SIZE(%stable_classes)" % (
++        schema.name, prefix, prefix))
++    print("};")
+ 
+-    print """
++    print("""
+ /* Return the schema version.  The caller must not free the returned value. */
+ const char *
+ %sget_db_version(void)
+ {
+     return "%s";
+ }
+-""" % (prefix, schema.version)
++""" % (prefix, schema.version))
+ 
+ 
+ 
+@@ -1075,7 +1076,7 @@ def ovsdb_escape(string):
+     return re.sub(r'["\\\000-\037]', escape, string)
+ 
+ def usage():
+-    print """\
++    print("""\
+ %(argv0)s: ovsdb schema compiler
+ usage: %(argv0)s [OPTIONS] COMMAND ARG...
+ 
+@@ -1087,7 +1088,7 @@ The following commands are supported:
+ The following options are also available:
+   -h, --help                  display this help message
+   -V, --version               display version information\
+-""" % {'argv0': argv0}
++""" % {'argv0': argv0})
+     sys.exit(0)
+ 
+ if __name__ == "__main__":
+@@ -1105,7 +1106,7 @@ if __name__ == "__main__":
+             if key in ['-h', '--help']:
+                 usage()
+             elif key in ['-V', '--version']:
+-                print "ovsdb-idlc (Open vSwitch) @VERSION@"
++                print("ovsdb-idlc (Open vSwitch) @VERSION@")
+             elif key in ['-C', '--directory']:
+                 os.chdir(value)
+             else:
+-- 
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0002-Python3-compatibility-exception-cleanup.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0002-Python3-compatibility-exception-cleanup.patch
new file mode 100644
index 0000000..59c0f3e
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0002-Python3-compatibility-exception-cleanup.patch
@@ -0,0 +1,79 @@
+From c98fee41d130cb946aa4e60fefaa6cbf203f6790 Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 2/8] Python3 compatibility: exception cleanup
+
+Commit 52e4a477f0b3c0a0ece7adeede6e06e07814f8b9 from
+https://github.com/openvswitch/ovs.git
+
+The exception syntax which is compatible with python2 and python3 is
+to use the "as" form for "except:".
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ build-aux/extract-ofp-fields | 2 +-
+ ovsdb/ovsdb-doc              | 4 ++--
+ ovsdb/ovsdb-idlc.in          | 4 ++--
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/build-aux/extract-ofp-fields b/build-aux/extract-ofp-fields
+index 425a85f..61e752b 100755
+--- a/build-aux/extract-ofp-fields
++++ b/build-aux/extract-ofp-fields
+@@ -784,7 +784,7 @@ if __name__ == "__main__":
+     try:
+         options, args = getopt.gnu_getopt(sys.argv[1:], 'h',
+                                           ['help', 'ovs-version='])
+-    except getopt.GetoptError, geo:
++    except getopt.GetoptError as geo:
+         sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
+         sys.exit(1)
+ 
+diff --git a/ovsdb/ovsdb-doc b/ovsdb/ovsdb-doc
+index b34fb11..918e88a 100755
+--- a/ovsdb/ovsdb-doc
++++ b/ovsdb/ovsdb-doc
+@@ -278,7 +278,7 @@ if __name__ == "__main__":
+             options, args = getopt.gnu_getopt(sys.argv[1:], 'hV',
+                                               ['er-diagram=',
+                                                'version=', 'help'])
+-        except getopt.GetoptError, geo:
++        except getopt.GetoptError as geo:
+             sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
+             sys.exit(1)
+ 
+@@ -306,7 +306,7 @@ if __name__ == "__main__":
+             if len(line):
+                 print(line)
+ 
+-    except error.Error, e:
++    except error.Error as e:
+         sys.stderr.write("%s: %s\n" % (argv0, e.msg))
+         sys.exit(1)
+ 
+diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
+index 1064448..8b85f0d 100755
+--- a/ovsdb/ovsdb-idlc.in
++++ b/ovsdb/ovsdb-idlc.in
+@@ -1098,7 +1098,7 @@ if __name__ == "__main__":
+                                               ['directory',
+                                                'help',
+                                                'version'])
+-        except getopt.GetoptError, geo:
++        except getopt.GetoptError as geo:
+             sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
+             sys.exit(1)
+ 
+@@ -1136,7 +1136,7 @@ if __name__ == "__main__":
+             sys.exit(1)
+ 
+         func(*args[1:])
+-    except ovs.db.error.Error, e:
++    except ovs.db.error.Error as e:
+         sys.stderr.write("%s: %s\n" % (argv0, e))
+         sys.exit(1)
+ 
+-- 
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0003-Python3-compatibility-execfile-to-exec.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0003-Python3-compatibility-execfile-to-exec.patch
new file mode 100644
index 0000000..a85980e
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0003-Python3-compatibility-execfile-to-exec.patch
@@ -0,0 +1,33 @@
+From 9cbae86be03756df76560c15720756f9ac088144 Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 3/8] Python3 compatibility: execfile to exec
+
+Commit a4d10a7ca937d73873f6f98619d88682e69f5dbe from
+https://github.com/openvswitch/ovs.git
+
+Allow compability with python3 and python2 by changing execfile() to
+exec().
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ ovsdb/ovsdb-idlc.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
+index 8b85f0d..3fa1a0f 100755
+--- a/ovsdb/ovsdb-idlc.in
++++ b/ovsdb/ovsdb-idlc.in
+@@ -17,7 +17,7 @@ def parseSchema(filename):
+ 
+ def annotateSchema(schemaFile, annotationFile):
+     schemaJson = ovs.json.from_file(schemaFile)
+-    execfile(annotationFile, globals(), {"s": schemaJson})
++    exec(compile(open(annotationFile, "rb").read(), annotationFile, 'exec'), globals(), {"s": schemaJson})
+     ovs.json.to_stream(schemaJson, sys.stdout)
+     sys.stdout.write('\n')
+ 
+-- 
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0004-Python3-compatibility-iteritems-to-items.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0004-Python3-compatibility-iteritems-to-items.patch
new file mode 100644
index 0000000..ddc86db
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0004-Python3-compatibility-iteritems-to-items.patch
@@ -0,0 +1,102 @@
+From 0f318e472d9897d99395adcfb17cbeaff05677ba Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 4/8] Python3 compatibility: iteritems to items
+
+Commit 4ab665623cbb4c6506e48b82e0c9fe8585f42e13 from
+https://github.com/openvswitch/ovs.git
+
+Allow compability with python3 and python2 by changing iteritems() to
+items().
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ build-aux/extract-ofp-actions | 2 +-
+ build-aux/extract-ofp-errors  | 2 +-
+ build-aux/extract-ofp-fields  | 2 +-
+ ovsdb/ovsdb-idlc.in           | 8 ++++----
+ 4 files changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/build-aux/extract-ofp-actions b/build-aux/extract-ofp-actions
+index 874e6b4..c11297c 100755
+--- a/build-aux/extract-ofp-actions
++++ b/build-aux/extract-ofp-actions
+@@ -13,7 +13,7 @@ version_map = {"1.0": 0x01,
+                "1.3": 0x04,
+                "1.4": 0x05,
+                "1.5": 0x06}
+-version_reverse_map = dict((v, k) for (k, v) in version_map.iteritems())
++version_reverse_map = dict((v, k) for (k, v) in version_map.items())
+ 
+ # Map from vendor name to the length of the action header.
+ vendor_map = {"OF": (0x00000000,  4),
+diff --git a/build-aux/extract-ofp-errors b/build-aux/extract-ofp-errors
+index 336a240..71ae0bd 100755
+--- a/build-aux/extract-ofp-errors
++++ b/build-aux/extract-ofp-errors
+@@ -14,7 +14,7 @@ version_map = {"1.0": 0x01,
+                "1.4": 0x05,
+                "1.5": 0x06,
+                "1.6": 0x07}
+-version_reverse_map = dict((v, k) for (k, v) in version_map.iteritems())
++version_reverse_map = dict((v, k) for (k, v) in version_map.items())
+ 
+ token = None
+ line = ""
+diff --git a/build-aux/extract-ofp-fields b/build-aux/extract-ofp-fields
+index 61e752b..ef997dd 100755
+--- a/build-aux/extract-ofp-fields
++++ b/build-aux/extract-ofp-fields
+@@ -16,7 +16,7 @@ VERSION = {"1.0": 0x01,
+            "1.3": 0x04,
+            "1.4": 0x05,
+            "1.5": 0x06}
+-VERSION_REVERSE = dict((v,k) for k, v in VERSION.iteritems())
++VERSION_REVERSE = dict((v,k) for k, v in VERSION.items())
+ 
+ TYPES = {"u8":       (1,   False),
+          "be16":     (2,   False),
+diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
+index 3fa1a0f..615548f 100755
+--- a/ovsdb/ovsdb-idlc.in
++++ b/ovsdb/ovsdb-idlc.in
+@@ -138,7 +138,7 @@ def printCIDLHeader(schemaFile):
+ #include "smap.h"
+ #include "uuid.h"''' % {'prefix': prefix.upper()})
+ 
+-    for tableName, table in sorted(schema.tables.iteritems()):
++    for tableName, table in sorted(schema.tables.items()):
+         structName = "%s%s" % (prefix, tableName.lower())
+ 
+         print("")
+@@ -300,7 +300,7 @@ def printCIDLSource(schemaFile):
+ ''' % schema.idlHeader)
+ 
+     # Cast functions.
+-    for tableName, table in sorted(schema.tables.iteritems()):
++    for tableName, table in sorted(schema.tables.items()):
+         structName = "%s%s" % (prefix, tableName.lower())
+         print('''
+ static struct %(s)s *
+@@ -311,7 +311,7 @@ static struct %(s)s *
+ ''' % {'s': structName})
+ 
+ 
+-    for tableName, table in sorted(schema.tables.iteritems()):
++    for tableName, table in sorted(schema.tables.items()):
+         structName = "%s%s" % (prefix, tableName.lower())
+         print("")
+         print("/* %s table. */" % (tableName))
+@@ -1025,7 +1025,7 @@ void
+     # Table classes.
+     print("")
+     print("struct ovsdb_idl_table_class %stable_classes[%sN_TABLES] = {" % (prefix, prefix.upper()))
+-    for tableName, table in sorted(schema.tables.iteritems()):
++    for tableName, table in sorted(schema.tables.items()):
+         structName = "%s%s" % (prefix, tableName.lower())
+         if table.is_root:
+             is_root = "true"
+-- 
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0005-Python3-compatibility-fix-integer-problems.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0005-Python3-compatibility-fix-integer-problems.patch
new file mode 100644
index 0000000..717a97d
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0005-Python3-compatibility-fix-integer-problems.patch
@@ -0,0 +1,51 @@
+From bc29f98f0137fa1083a4cacf832d52f740d150a8 Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 5/8] Python3 compatibility: fix integer problems
+
+Commit fa145f1a53943243f94a32ce98525db8494b0052 from
+https://github.com/openvswitch/ovs.git
+
+In python3 maxint is not defined, but maxsize is defined in both
+python2 and python3.
+
+The put_text() will not automatically use a value which came in as
+float due to a pior math function and python3 will throw an exception.
+The simple answer is to convert it with int() and move on.
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ ovsdb/ovsdb-idlc.in   | 2 +-
+ python/build/nroff.py | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
+index 615548f..7cbcbf5 100755
+--- a/ovsdb/ovsdb-idlc.in
++++ b/ovsdb/ovsdb-idlc.in
+@@ -358,7 +358,7 @@ static void
+                     print("        %s" % type.value.initCDefault(valueVar, type.n_min == 0))
+                 print("    }")
+             else:
+-                if type.n_max != sys.maxint:
++                if type.n_max != sys.maxsize:
+                     print("    size_t n = MIN(%d, datum->n);" % type.n_max)
+                     nMax = "n"
+                 else:
+diff --git a/python/build/nroff.py b/python/build/nroff.py
+index c23837f..401f699 100644
+--- a/python/build/nroff.py
++++ b/python/build/nroff.py
+@@ -148,6 +148,8 @@ def fatal(msg):
+ 
+ 
+ def put_text(text, x, y, s):
++    x = int(x)
++    y = int(y)
+     extend = x + len(s) - len(text[y])
+     if extend > 0:
+         text[y] += ' ' * extend
+-- 
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0006-Python3-compatibility-math-error-compatibility.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0006-Python3-compatibility-math-error-compatibility.patch
new file mode 100644
index 0000000..54905cd
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0006-Python3-compatibility-math-error-compatibility.patch
@@ -0,0 +1,56 @@
+From 3a9fcf1c8f60c160c282c9755ee1c7f9f7e113c3 Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 6/8] Python3 compatibility: math error compatibility
+
+Commit 3fa5aa4294377e0f35267936d0c5caea3e61db48 from
+https://github.com/openvswitch/ovs.git
+
+The way math is handled with typing is completely different in python3.
+
+% python2<<EOF
+x=10
+y=8
+print((x + (y - 1)) / y * y)
+EOF
+16
+
+python3<<EOF
+x=10
+y=8
+print((x + (y - 1)) / y * y)
+EOF
+17.0
+
+So we need to force an integer for the round function as follows and
+maintain compatibility with python2.
+
+python3<<EOF
+x=10
+y=8
+print(int((x + (y - 1)) / y) * y)
+EOF
+16
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ build-aux/extract-ofp-actions | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/build-aux/extract-ofp-actions b/build-aux/extract-ofp-actions
+index c11297c..bd7131f 100755
+--- a/build-aux/extract-ofp-actions
++++ b/build-aux/extract-ofp-actions
+@@ -35,7 +35,7 @@ line = ""
+ arg_structs = set()
+ 
+ def round_up(x, y):
+-    return (x + (y - 1)) / y * y
++    return int((x + (y - 1)) / y) * y
+ 
+ def open_file(fn):
+     global file_name
+-- 
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0007-Python3-compatibility-unicode-to-str.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0007-Python3-compatibility-unicode-to-str.patch
new file mode 100644
index 0000000..faa32b7
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0007-Python3-compatibility-unicode-to-str.patch
@@ -0,0 +1,51 @@
+From 2fe58f87b00d0ec24d6997930d0bcdb130c84396 Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Thu, 29 Jun 2017 20:33:23 -0700
+Subject: [PATCH 7/8] Python3 compatibility: unicode to str
+
+Commit 7430959d4ad17db89b8387c3aef58c8b230cad10 from
+https://github.com/openvswitch/ovs.git
+
+When transitioning from python2 to python3 the following type class
+changes occured:
+
+python2 -> python3
+unicode -> str
+str -> bytes
+
+That means we have to check the python version and do the right type
+check python3 will throw an error when it tries to use the unicode
+type because it doesn't exist.
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ ovsdb/ovsdb-doc | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/ovsdb/ovsdb-doc b/ovsdb/ovsdb-doc
+index 918e88a..406c293 100755
+--- a/ovsdb/ovsdb-doc
++++ b/ovsdb/ovsdb-doc
+@@ -65,9 +65,15 @@ def columnGroupToNroff(table, groupXml, documented_columns):
+                 if node.hasAttribute('type'):
+                     type_string = node.attributes['type'].nodeValue
+                     type_json = ovs.json.from_string(str(type_string))
+-                    if type(type_json) in (str, unicode):
+-                        raise error.Error("%s %s:%s has invalid 'type': %s" 
+-                                          % (table.name, name, key, type_json))
++                    # py2 -> py3 means str -> bytes and unicode -> str
++                    try:
++                        if type(type_json) in (str, unicode):
++                            raise error.Error("%s %s:%s has invalid 'type': %s" 
++                                              % (table.name, name, key, type_json))
++                    except:
++                        if type(type_json) in (bytes, str):
++                            raise error.Error("%s %s:%s has invalid 'type': %s" 
++                                              % (table.name, name, key, type_json))
+                     type_ = ovs.db.types.BaseType.from_json(type_json)
+                 else:
+                     type_ = column.type.value
+-- 
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0008-AUTHORS-Add-Jason-Wessel.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0008-AUTHORS-Add-Jason-Wessel.patch
new file mode 100644
index 0000000..d2c2be7
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/0008-AUTHORS-Add-Jason-Wessel.patch
@@ -0,0 +1,28 @@
+From a3289add8368e0c970ae1c1c84f5df1f817ed43c Mon Sep 17 00:00:00 2001
+From: Ben Pfaff <blp@ovn.org>
+Date: Thu, 6 Jul 2017 14:01:27 -0700
+Subject: [PATCH 8/8] AUTHORS: Add Jason Wessel.
+
+Commit a91c4cfaf863718bc94fb9c88939bd0b0385a6fe from
+https://github.com/openvswitch/ovs.git
+
+Signed-off-by: Ben Pfaff <blp@ovn.org>
+---
+ AUTHORS.rst | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/AUTHORS.rst b/AUTHORS.rst
+index 63e6a8d..d0dc70d 100644
+--- a/AUTHORS.rst
++++ b/AUTHORS.rst
+@@ -156,6 +156,7 @@ Jan Scheurich                   jan.scheurich@ericsson.com
+ Jan Vansteenkiste               jan@vstone.eu
+ Jarno Rajahalme                 jarno@ovn.org
+ Jason Kölker                    jason@koelker.net
++Jason Wessel                    jason.wessel@windriver.com
+ Jasper Capel                    jasper@capel.tv
+ Jean Tourrilhes                 jt@hpl.hp.com
+ Jeremy Stribling                strib@nicira.com
+-- 
+2.5.0
+
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/CVE-2017-9263.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/CVE-2017-9263.patch
new file mode 100644
index 0000000..0fc3aa1
--- /dev/null
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/CVE-2017-9263.patch
@@ -0,0 +1,29 @@
+A buggy or malicious switch could send a role status message with a bad
+reason code, which if printed by OVS would cause it to abort.  This fixes
+the problem.
+
+CVE: CVE-2017-9263
+Upstream-Status: Submitted
+
+Reported-by: Bhargava Shastry <bshastry at sec.t-labs.tu-berlin.de>
+Signed-off-by: Ben Pfaff <blp at ovn.org>
+---
+ lib/ofp-print.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/lib/ofp-print.c b/lib/ofp-print.c
+index 7ca953100539..1932baf4871f 100644
+--- a/lib/ofp-print.c
++++ b/lib/ofp-print.c
+@@ -2147,7 +2147,8 @@ ofp_print_role_status_message(struct ds *string, const struct ofp_header *oh)
+         break;
+     case OFPCRR_N_REASONS:
+     default:
+-        OVS_NOT_REACHED();
++        ds_put_cstr(string, "(unknown)");
++        break;
+     }
+ }
+ 
+-- 
+2.10.2
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/openvswitch-add-ptest-c298ef781c2d35d939fe163cbc2f41ea7b1cb8d1.patch b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/openvswitch-add-ptest-b29cb89e9e9fe3119b2e5dd5d4fb79141635b7cc.patch
similarity index 100%
rename from import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/openvswitch-add-ptest-c298ef781c2d35d939fe163cbc2f41ea7b1cb8d1.patch
rename to import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch-git/openvswitch-add-ptest-b29cb89e9e9fe3119b2e5dd5d4fb79141635b7cc.patch
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch.inc b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch.inc
index 1f0b52b..58e0fcb 100644
--- a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch.inc
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch.inc
@@ -11,11 +11,11 @@
 SECTION = "networking"
 LICENSE = "Apache-2"
 
-DEPENDS += "bridge-utils openssl python perl python-six-native coreutils-native"
+DEPENDS += "bridge-utils openssl python3 perl python3-six-native coreutils-native"
 
 RDEPENDS_${PN} += "util-linux-uuidgen util-linux-libuuid coreutils \
-	python perl perl-module-strict ${PN}-switch \
-        bash python-twisted python-six"
+        python3 perl perl-module-strict ${PN}-switch \
+        bash python3-twisted python3-six"
 RDEPENDS_${PN}-testcontroller = "${PN} lsb ${PN}-pki"
 RDEPENDS_${PN}-switch = "${PN} openssl procps util-linux-uuidgen"
 RDEPENDS_${PN}-pki = "${PN}"
@@ -34,7 +34,7 @@
 	"
 
 EXTRA_OECONF += "\
-	PYTHON=python \
+	PYTHON=python3 \
 	PYTHON3=python3 \
 	PERL=${bindir}/perl \
 	"
@@ -70,7 +70,7 @@
 FILES_${PN} += "/run"
 
 FILES_${PN} += "${libdir}/python${PYTHON_BASEVERSION}/"
-inherit autotools update-rc.d systemd pythonnative
+inherit autotools update-rc.d systemd python3native
 
 SYSTEMD_PACKAGES = "${PN}-switch"
 SYSTEMD_SERVICE_${PN}-switch = " \
@@ -86,6 +86,12 @@
 INITSCRIPT_NAME_${PN}-testcontroller = "openvswitch-testcontroller"
 INITSCRIPT_PARAMS_${PN}-testcontroller = "defaults 72"
 
+do_configure_prepend() {
+	# Work around the for Makefile CC=$(if ....) by swapping out any
+	# "-Wa," assembly directives with "-Xassembler
+	CC=`echo '${CC}' | sed 's/-Wa,/-Xassembler /g'`
+}
+
 do_install_append() {
 	install -d ${D}/${sysconfdir}/default/
 	install -m 660 ${WORKDIR}/openvswitch-switch-setup ${D}/${sysconfdir}/default/openvswitch-switch
diff --git a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch_git.bb b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch_git.bb
index 1fb82ae..b4aab35 100644
--- a/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch_git.bb
+++ b/import-layers/meta-virtualization/recipes-networking/openvswitch/openvswitch_git.bb
@@ -3,20 +3,20 @@
 DEPENDS += "virtual/kernel"
 
 RDEPENDS_${PN}-ptest += "\
-	python-logging python-syslog python-argparse python-io \
-	python-fcntl python-shell python-lang python-xml python-math \
-	python-datetime python-netclient python sed \
+	python3-logging python3-syslog python3-argparse python3-io \
+	python3-fcntl python3-shell python3-lang python3-xml python3-math \
+	python3-datetime python3-netclient python3 sed \
 	ldd perl-module-socket perl-module-carp perl-module-exporter \
-	perl-module-xsloader python-netserver python-threading \
-	python-resource python-subprocess \
+	perl-module-xsloader python3-netserver python3-threading \
+	python3-resource python3-subprocess findutils which \
 	"
 
 S = "${WORKDIR}/git"
-PV = "2.7.0+${SRCREV}"
+PV = "2.7.1+${SRCREV}"
 
 FILESEXTRAPATHS_append := "${THISDIR}/${PN}-git:"
 
-SRCREV = "c298ef781c2d35d939fe163cbc2f41ea7b1cb8d1"
+SRCREV = "b29cb89e9e9fe3119b2e5dd5d4fb79141635b7cc"
 SRC_URI = "file://openvswitch-switch \
            file://openvswitch-switch-setup \
            file://openvswitch-testcontroller \
@@ -29,12 +29,30 @@
            file://python-make-remaining-scripts-use-usr-bin-env.patch \
            file://0001-use-the-linux-if_packet.h-Interface-directly.patch \
            file://0002-Define-WAIT_ANY-if-not-provided-by-system.patch \
+           file://CVE-2017-9263.patch \
+           file://python-switch-remaining-scripts-to-use-python3.patch \
            "
 
+# Temporarily backport patches to better support py3. These have been
+# merged upstream but are not part of v2.7.1.
+SRC_URI += " \
+           file://0001-Python3-compatibility-Convert-print-statements.patch \
+           file://0002-Python3-compatibility-exception-cleanup.patch \
+           file://0003-Python3-compatibility-execfile-to-exec.patch \
+           file://0004-Python3-compatibility-iteritems-to-items.patch \
+           file://0005-Python3-compatibility-fix-integer-problems.patch \
+           file://0006-Python3-compatibility-math-error-compatibility.patch \
+           file://0007-Python3-compatibility-unicode-to-str.patch \
+           file://0008-AUTHORS-Add-Jason-Wessel.patch \
+"
+
 LIC_FILES_CHKSUM = "file://COPYING;md5=17b2c9d4c70853a09c0e143137754b35"
 
-PACKAGECONFIG ?= ""
-PACKAGECONFIG[dpdk] = "--with-dpdk=${STAGING_DIR_TARGET}/opt/dpdk/${TARGET_ARCH}-native-linuxapp-gcc,,dpdk,"
+DPDK_INSTALL_DIR ?= "/opt/dpdk"
+
+PACKAGECONFIG ?= "libcap-ng"
+PACKAGECONFIG[dpdk] = "--with-dpdk=${STAGING_DIR_TARGET}${DPDK_INSTALL_DIR}/share/${TARGET_ARCH}-native-linuxapp-gcc,,dpdk,dpdk"
+PACKAGECONFIG[libcap-ng] = "--enable-libcapng,--disable-libcapng,libcap-ng,"
 
 # Don't compile kernel modules by default since it heavily depends on
 # kernel version. Use the in-kernel module for now.