## start ##
## ----- ##
+# Keep track of removed vports so we can reload them if needed
+removed_vports=""
+
+insert_mods () {
+ # Try loading openvswitch again.
+ action "Inserting openvswitch module" modprobe openvswitch
+
+ for vport in $removed_vports; do
+ # Don't treat failures to load vports as fatal error
+ action "Inserting $vport module" modprobe $vport || true
+ done
+}
+
insert_mod_if_required () {
# If this kernel has no module support, expect we're done.
if test ! -e /proc/modules
return 0
# Load openvswitch. If that's successful then we're done.
- action "Inserting openvswitch module" modprobe openvswitch && return 0
+ insert_mods && return 0
# If the bridge module is loaded, then that might be blocking
# openvswitch. Try to unload it, if there are no bridges.
action "removing bridge module" rmmod bridge || return 1
# Try loading openvswitch again.
- action "Inserting openvswitch module" modprobe openvswitch
+ insert_mods
}
ovs_vsctl () {
fi
}
+del_transient_ports () {
+ for port in `ovs-vsctl --bare -- --columns=name find port other_config:transient=true`; do
+ ovs_vsctl -- del-port "$port"
+ done
+}
+
start_ovsdb () {
check_force_cores
set_system_ids || return 1
if test X"$DELETE_BRIDGES" = Xyes; then
for bridge in `ovs_vsctl list-br`; do
- ovs_vsctl del-br $bridge
+ ovs_vsctl del-br $bridge
done
fi
+ if test X"$DELETE_TRANSIENT_PORTS" = Xyes; then
+ del_transient_ports
+ fi
fi
}
esac
}
+save_flows_if_required () {
+ if test X"$DELETE_BRIDGES" != Xyes; then
+ action "Saving flows" ovs_save save-flows "${script_flows}"
+ fi
+}
+
save_interfaces () {
"$datadir/scripts/ovs-save" save-interfaces ${ifaces} \
> "${script_interfaces}"
action "Detected internal interfaces: $ifaces" true
init_restore_scripts
-
- action "Saving flows" ovs_save save-flows "${script_flows}"
-
+ save_flows_if_required
save_ofports_if_required
# Restart the database first, since a large database may take a
action "Removing datapath: $dp" ovs-dpctl del-dp "$dp"
done
+ for vport in `awk '/^vport_/ { print $1 }' /proc/modules`; do
+ action "Removing $vport module" rmmod $vport
+ if ! grep -q $vport /proc/modules; then
+ removed_vports="$removed_vports $vport"
+ fi
+ done
+
# try both old and new names in case this is post upgrade
if test -e /sys/module/openvswitch_mod; then
action "Removing openvswitch module" rmmod openvswitch_mod
if daemon_is_running ovsdb-server && daemon_is_running ovs-vswitchd; then
init_restore_scripts
save_interfaces_if_required
- action "Saving flows" ovs_save save-flows "${script_flows}"
+ save_flows_if_required
save_ofports_if_required
fi
SYSTEM_ID=
DELETE_BRIDGES=no
+ DELETE_TRANSIENT_PORTS=no
DAEMON_CWD=/
FORCE_COREFILES=yes
done
case $command in
start)
- start_ovsdb
+ start_ovsdb || exit 1
start_forwarding
add_managers
;;