#! /bin/sh
-# Copyright (C) 2009, 2010, 2011 Nicira Networks, Inc.
+# Copyright (C) 2009, 2010, 2011, 2012 Nicira, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
## ----- ##
insert_openvswitch_mod_if_required () {
- # If openvswitch_mod is already loaded then we're done.
- test -e /sys/module/openvswitch_mod && return 0
+ # If openvswitch is already loaded then we're done.
+ test -e /sys/module/openvswitch -o -e /sys/module/openvswitch_mod && \
+ return 0
- # Load openvswitch_mod. If that's successful then we're done.
- action "Inserting openvswitch module" modprobe openvswitch_mod && return 0
+ # Load openvswitch. If that's successful then we're done.
+ action "Inserting openvswitch module" modprobe openvswitch && return 0
# If the bridge module is loaded, then that might be blocking
- # openvswitch_mod. Try to unload it, if there are no bridges.
+ # openvswitch. Try to unload it, if there are no bridges.
test -e /sys/module/bridge || return 1
bridges=`echo /sys/class/net/*/bridge | sed 's,/sys/class/net/,,g;s,/bridge,,g'`
if test "$bridges" != "*"; then
fi
action "removing bridge module" rmmod bridge || return 1
- # Try loading openvswitch_mod again.
- action "Inserting openvswitch module" modprobe openvswitch_mod
+ # Try loading openvswitch again.
+ action "Inserting openvswitch module" modprobe openvswitch
}
insert_brcompat_mod_if_required () {
- test -e /sys/module/brcompat_mod && return 0
- action "Inserting brcompat module" modprobe brcompat_mod
+ if test -e /sys/module/bridge; then
+ log_warning_msg "bridge module is loaded, not loading brcompat"
+ return 1
+ fi
+ test -e /sys/module/brcompat -o -e /sys/module/brcompat_mod && return 0
+ action "Inserting brcompat module" modprobe brcompat
}
insert_mod_if_required () {
insert_openvswitch_mod_if_required || return 1
if test X"$BRCOMPAT" = Xyes; then
- insert_brcompat_mod_if_required || return 1
+ if insert_brcompat_mod_if_required; then
+ :
+ else
+ log_warning_msg "could not load brcompat module, disabling bridge compatibility"
+ BRCOMPAT=no
+ fi
fi
}
}
ovsdb_tool () {
- ovsdb-tool -vANY:console:off "$@"
+ ovsdb-tool -vconsole:off "$@"
}
create_db () {
action "Configuring Open vSwitch system IDs" "$@" $extra_ids
}
-start () {
+check_force_cores () {
if test X"$FORCE_COREFILES" = Xyes; then
ulimit -Sc 67108864
fi
+}
- insert_mod_if_required || return 1
+start_ovsdb () {
+ check_force_cores
if daemon_is_running ovsdb-server; then
- log_success_msg "ovsdb-server is already running"
+ log_success_msg "ovsdb-server is already running"
else
- # Create initial database or upgrade database schema.
- upgrade_db || return 1
-
- # Start ovsdb-server.
- set ovsdb-server "$DB_FILE"
- set "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO
- set "$@" --remote=punix:"$DB_SOCK"
- set "$@" --remote=db:Open_vSwitch,manager_options
- set "$@" --private-key=db:SSL,private_key
- set "$@" --certificate=db:SSL,certificate
- set "$@" --bootstrap-ca-cert=db:SSL,ca_cert
- start_daemon "$OVSDB_SERVER_PRIORITY" "$@" || return 1
-
- # Initialize database settings.
- ovs_vsctl -- init -- set Open_vSwitch . db-version="$schemaver" \
- || return 1
- set_system_ids || return 1
- if test X"$DELETE_BRIDGES" = Xyes; then
+ # Create initial database or upgrade database schema.
+ upgrade_db || return 1
+
+ # Start ovsdb-server.
+ set ovsdb-server "$DB_FILE"
+ set "$@" -vconsole:emer -vsyslog:err -vfile:info
+ set "$@" --remote=punix:"$DB_SOCK"
+ set "$@" --remote=db:Open_vSwitch,manager_options
+ set "$@" --private-key=db:SSL,private_key
+ set "$@" --certificate=db:SSL,certificate
+ set "$@" --bootstrap-ca-cert=db:SSL,ca_cert
+ start_daemon "$OVSDB_SERVER_PRIORITY" "$OVSDB_SERVER_WRAPPER" "$@" \
+ || return 1
+
+ # Initialize database settings.
+ ovs_vsctl -- init -- set Open_vSwitch . db-version="$schemaver" \
+ || return 1
+ 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
+ fi
fi
+}
+
+start_forwarding () {
+ check_force_cores
+
+ insert_mod_if_required || return 1
if daemon_is_running ovs-vswitchd; then
- log_success_msg "ovs-vswitchd is already running"
+ log_success_msg "ovs-vswitchd is already running"
else
- # Increase the limit on the number of open file descriptors since
- # ovs-vswitchd needs a few per bridge
- ulimit -n 4096
-
- # Start ovs-vswitchd.
- set ovs-vswitchd unix:"$DB_SOCK"
- set "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO
- if test X"$MLOCKALL" != Xno; then
- set "$@" --mlockall
- fi
- start_daemon "$OVS_VSWITCHD_PRIORITY" "$@"
+ # Increase the limit on the number of open file descriptors.
+ # ovs-vswitchd needs 16 per datapath, plus a few extra, so this
+ # should allow for 256 (or more) bridges.
+ ulimit -n 5000
+
+ # Start ovs-vswitchd.
+ set ovs-vswitchd unix:"$DB_SOCK"
+ set "$@" -vconsole:emer -vsyslog:err -vfile:info
+ if test X"$MLOCKALL" != Xno; then
+ set "$@" --mlockall
+ fi
+ start_daemon "$OVS_VSWITCHD_PRIORITY" "$OVS_VSWITCHD_WRAPPER" "$@"
fi
if daemon_is_running ovs-brcompatd; then
- log_success_msg "ovs-brcompatd is already running"
+ log_success_msg "ovs-brcompatd is already running"
elif test X"$BRCOMPAT" = Xyes; then
set ovs-brcompatd
- set "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO
- start_daemon "$OVS_BRCOMPATD_PRIORITY" "$@"
+ set "$@" -vconsole:emer -vsyslog:err -vfile:info
+ start_daemon "$OVS_BRCOMPATD_PRIORITY" "$OVS_BRCOMPATD_WRAPPER" "$@"
fi
}
## stop ##
## ---- ##
-stop () {
+stop_ovsdb () {
+ stop_daemon ovsdb-server
+}
+
+stop_forwarding () {
stop_daemon ovs-brcompatd
stop_daemon ovs-vswitchd
- stop_daemon ovsdb-server
}
## ----------------- ##
# But ignore interfaces that don't really exist.
for d in `(ovs_vsctl --bare \
-- --columns=name find Interface type=internal \
- -- list-br) | sort -u`
+ -- list-br) | sort -u`
do
if test -e "/sys/class/net/$d"; then
- printf "%s " "$d"
- fi
+ printf "%s " "$d"
+ fi
done
}
ifaces=`internal_interfaces`
action "Detected internal interfaces: $ifaces" true
- stop
+ # Restart the database first, since a large database may take a
+ # while to load, and we want to minimize forwarding disruption.
+ stop_ovsdb
+ start_ovsdb
+
+ stop_forwarding
script=`mktemp`
trap 'rm -f "$script"' 0 1 2 13 15
:
else
log_warning_msg "Failed to save configuration, not replacing kernel module"
- start
+ start_forwarding
exit 1
fi
chmod +x "$script"
action "Removing datapath: $dp" ovs-dpctl del-dp "$dp"
done
+ # try both old and new names in case this is post upgrade
if test -e /sys/module/brcompat_mod; then
action "Removing brcompat module" rmmod brcompat_mod
+ elif test -e /sys/module/brcompat; then
+ action "Removing brcompat module" rmmod brcompat
fi
if test -e /sys/module/openvswitch_mod; then
action "Removing openvswitch module" rmmod openvswitch_mod
+ elif test -e /sys/module/openvswitch; then
+ action "Removing openvswitch module" rmmod openvswitch
fi
- start
+ start_forwarding
action "Restoring interface configuration" "$script"
rc=$?
log="logger -p daemon.$level -t ovs-save"
$log "force-reload-kmod interface restore script exited with status $rc:"
$log -f "$script"
+
+ "$datadir/scripts/ovs-check-dead-ifs"
}
## --------------- ##
OVSDB_SERVER_PRIORITY=-10
OVS_VSWITCHD_PRIORITY=-10
OVS_BRCOMPATD_PRIORITY=-10
+ OVSDB_SERVER_WRAPPER=
+ OVS_VSWITCHD_WRAPPER=
+ OVS_BRCOMPATD_WRAPPER=
DB_FILE=$etcdir/conf.db
DB_SOCK=$rundir/db.sock
--ovs-vswitchd-priority=NICE set ovs-vswitchd's niceness (default: $OVS_VSWITCHD_PRIORITY)
--ovs-brcompatd-priority=NICE set ovs-brcompatd's niceness (default: $OVS_BRCOMPATD_PRIORITY)
+Debugging options for "start" and "force-reload-kmod":
+ --ovsdb-server-wrapper=WRAPPER
+ --ovs-vswitchd-wrapper=WRAPPER
+ --ovs-vswitchd-wrapper=WRAPPER
+ run specified daemon under WRAPPER (either 'valgrind' or 'strace')
+
Options for "start", "force-reload-kmod", "load-kmod", "status", and "version":
--brcompat enable Linux bridge compatibility module and daemon
usage
;;
-V | --version)
- echo "$0 (Open vSwitch) $VERSION$BUILDNR"
+ echo "$0 (Open vSwitch) $VERSION"
exit 0
;;
--external-id=*)
done
case $command in
start)
- start
+ start_ovsdb
+ start_forwarding
;;
stop)
- stop
+ stop_forwarding
+ stop_ovsdb
;;
status)
rc=0
done
;;
force-reload-kmod)
- force_reload_kmod
+ force_reload_kmod
;;
load-kmod)
insert_mod_if_required