}
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
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 ]