]> git.proxmox.com Git - mirror_ovs.git/blobdiff - utilities/ovs-save
ofp-ed-props: Fix using uninitialized padding for NSH encap actions.
[mirror_ovs.git] / utilities / ovs-save
index 4ae8fde2b8273645f8ec0dcc60e4d7fd5699e913..7d810cb40efe2e841009392a04b44628856dc94d 100755 (executable)
@@ -38,7 +38,7 @@ EOF
 }
 
 save_interfaces () {
-    if (ip -V) > /dev/null 2>&1; then :; else
+    if (ip link show) > /dev/null 2>&1; then :; else
         echo "$0: ip not found in $PATH" >&2
         exit 1
     fi
@@ -99,24 +99,60 @@ save_interfaces () {
     fi
 }
 
+get_highest_ofp_version() {
+    ovs-vsctl get bridge "$1" protocols | \
+        awk -F '"' '{ print (NF>1)? $(NF-1) : "OpenFlow14" }'
+}
+
 save_flows () {
     if (ovs-ofctl --version) > /dev/null 2>&1; then :; else
         echo "$0: ovs-ofctl not found in $PATH" >&2
         exit 1
     fi
 
+    # OVS 2.7 and earlier do not enable OpenFlow 1.4 (by default) and lack
+    # other features needed to save and restore flows.  Don't try.
+    case `ovs-appctl version | sed 1q` in
+        "ovs-vswitchd (Open vSwitch) 1."*.*)
+            return
+            ;;
+        "ovs-vswitchd (Open vSwitch) 2."[0-7].*)
+            return
+            ;;
+    esac
+
+    workdir=$(mktemp -d "${TMPDIR:-/tmp}/ovs-save.XXXXXXXXXX")
     for bridge in "$@"; do
-        echo -n "ovs-ofctl add-tlv-map ${bridge} '"
-        ovs-ofctl dump-tlv-map br-int | \
-        awk '/^ 0x/ {if (cnt != 0) printf ","; \
+        # Get the highest enabled OpenFlow version
+        ofp_version=$(get_highest_ofp_version "$bridge")
+
+        printf "%s" "ovs-ofctl add-tlv-map ${bridge} '"
+        ovs-ofctl dump-tlv-map ${bridge} | \
+        awk '/^  *0x/ {if (cnt != 0) printf ","; \
              cnt++;printf "{class="$1",type="$2",len="$3"}->"$4}'
         echo "'"
 
-        echo "ovs-ofctl add-flows ${bridge} - << EOF"
-        ovs-ofctl dump-flows "${bridge}" | sed -e '/NXST_FLOW/d' \
-            -e 's/\(idle\|hard\)_age=[^,]*,//g'
-        echo "EOF"
+        # If possible use OpenFlow 1.4 atomic bundle txn for flows and groups
+        [ ${ofp_version#OpenFlow} -ge 14 ] && bundle=" --bundle" || bundle=""
+
+        echo "ovs-ofctl -O $ofp_version add-groups ${bridge} \
+              \"$workdir/$bridge.groups.dump\" ${bundle}"
+
+        echo "ovs-ofctl -O $ofp_version replace-flows ${bridge} \
+              \"$workdir/$bridge.flows.dump\" ${bundle}"
+
+        ovs-ofctl -O $ofp_version dump-groups "$bridge" | \
+            sed -e '/^OFPST_GROUP_DESC/d' \
+                -e '/^NXST_GROUP_DESC/d' > \
+                "$workdir/$bridge.groups.dump"
+
+        ovs-ofctl -O $ofp_version dump-flows --no-names --no-stats "$bridge" | \
+            sed -e '/NXST_FLOW/d' \
+                -e '/OFPST_FLOW/d' \
+                -e 's/\(idle\|hard\)_age=[^,]*,//g' > \
+                "$workdir/$bridge.flows.dump"
     done
+    echo "rm -rf \"$workdir\""
 }
 
 while [ $# -ne 0 ]