AUTHORS: Add Kyle Mestery.
[openvswitch] / utilities / ovs-ctl.in
index c1024190329677a3f8c19f3065d325e637d02721..674c3c31e5c7e302a35b9876d2afdd32972dcaed 100755 (executable)
@@ -1,5 +1,5 @@
 #! /bin/sh
 #! /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.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@ case $0 in
     */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;;
     *) dir0=./ ;;
 esac
     */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;;
     *) dir0=./ ;;
 esac
-. "$dir0/ovs-lib.sh" || exit 1
+. "$dir0/ovs-lib" || exit 1
 
 for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do
     case :$PATH: in
 
 for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do
     case :$PATH: in
@@ -31,14 +31,15 @@ done
 ## ----- ##
 
 insert_openvswitch_mod_if_required () {
 ## ----- ##
 
 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
 
     # 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
     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
@@ -47,13 +48,29 @@ insert_openvswitch_mod_if_required () {
     fi
     action "removing bridge module" rmmod bridge || return 1
 
     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 () {
 }
 
 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
+        if insert_brcompat_mod_if_required; then
+            :
+        else
+            log_warning_msg "could not load brcompat module, disabling bridge compatibility"
+            BRCOMPAT=no
+        fi
+    fi
 }
 
 ovs_vsctl () {
 }
 
 ovs_vsctl () {
@@ -61,7 +78,7 @@ ovs_vsctl () {
 }
 
 ovsdb_tool () {
 }
 
 ovsdb_tool () {
-    ovsdb-tool -vANY:console:off "$@"
+    ovsdb-tool -vconsole:off "$@"
 }
 
 create_db () {
 }
 
 create_db () {
@@ -155,65 +172,72 @@ set_system_ids () {
     action "Configuring Open vSwitch system IDs" "$@" $extra_ids
 }
 
     action "Configuring Open vSwitch system IDs" "$@" $extra_ids
 }
 
-start () {
+check_force_cores () {
     if test X"$FORCE_COREFILES" = Xyes; then
         ulimit -Sc 67108864
     fi
     if test X"$FORCE_COREFILES" = Xyes; then
         ulimit -Sc 67108864
     fi
+}
 
 
-    insert_openvswitch_mod_if_required || return 1
-    if test X"$BRCOMPAT" = Xyes; then
-        insert_brcompat_mod_if_required || return 1
-    fi
+start_ovsdb () {
+    check_force_cores
 
     if daemon_is_running ovsdb-server; then
 
     if daemon_is_running ovsdb-server; then
-       log_success_msg "ovsdb-server is already running"
+        log_success_msg "ovsdb-server is already running"
     else
     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
             for bridge in `ovs_vsctl list-br`; do
-               ovs_vsctl del-br $bridge
+        ovs_vsctl del-br $bridge
             done
             done
-       fi
+        fi
     fi
     fi
+}
+
+start_forwarding () {
+    check_force_cores
+
+    insert_mod_if_required || return 1
 
     if daemon_is_running ovs-vswitchd; then
 
     if daemon_is_running ovs-vswitchd; then
-       log_success_msg "ovs-vswitchd is already running"
+        log_success_msg "ovs-vswitchd is already running"
     else
     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
     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
     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
 }
 
     fi
 }
 
@@ -221,10 +245,13 @@ start () {
 ## stop ##
 ## ---- ##
 
 ## stop ##
 ## ---- ##
 
-stop () {
+stop_ovsdb () {
+    stop_daemon ovsdb-server
+}
+
+stop_forwarding () {
     stop_daemon ovs-brcompatd
     stop_daemon ovs-vswitchd
     stop_daemon ovs-brcompatd
     stop_daemon ovs-vswitchd
-    stop_daemon ovsdb-server
 }
 
 ## ----------------- ##
 }
 
 ## ----------------- ##
@@ -244,11 +271,11 @@ internal_interfaces () {
     # But ignore interfaces that don't really exist.
     for d in `(ovs_vsctl --bare \
                 -- --columns=name find Interface type=internal \
     # 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
     do
         if test -e "/sys/class/net/$d"; then
-           printf "%s " "$d"
-       fi
+               printf "%s " "$d"
+           fi
     done
 }
 
     done
 }
 
@@ -260,7 +287,12 @@ force_reload_kmod () {
     ifaces=`internal_interfaces`
     action "Detected internal interfaces: $ifaces" true
 
     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
 
     script=`mktemp`
     trap 'rm -f "$script"' 0 1 2 13 15
@@ -268,7 +300,7 @@ force_reload_kmod () {
         :
     else
         log_warning_msg "Failed to save configuration, not replacing kernel module"
         :
     else
         log_warning_msg "Failed to save configuration, not replacing kernel module"
-        start
+        start_forwarding
         exit 1
     fi
     chmod +x "$script"
         exit 1
     fi
     chmod +x "$script"
@@ -277,14 +309,19 @@ force_reload_kmod () {
         action "Removing datapath: $dp" ovs-dpctl del-dp "$dp"
     done
 
         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
     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
     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
 
     fi
 
-    start
+    start_forwarding
 
     action "Restoring interface configuration" "$script"
     rc=$?
 
     action "Restoring interface configuration" "$script"
     rc=$?
@@ -296,6 +333,8 @@ force_reload_kmod () {
     log="logger -p daemon.$level -t ovs-save"
     $log "force-reload-kmod interface restore script exited with status $rc:"
     $log -f "$script"
     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"
 }
 
 ## --------------- ##
 }
 
 ## --------------- ##
@@ -360,8 +399,11 @@ set_defaults () {
     OVSDB_SERVER_PRIORITY=-10
     OVS_VSWITCHD_PRIORITY=-10
     OVS_BRCOMPATD_PRIORITY=-10
     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_FILE=$dbdir/conf.db
     DB_SOCK=$rundir/db.sock
     DB_SCHEMA=$datadir/vswitch.ovsschema
 
     DB_SOCK=$rundir/db.sock
     DB_SCHEMA=$datadir/vswitch.ovsschema
 
@@ -369,7 +411,13 @@ set_defaults () {
     DPORT=
     SPORT=
 
     DPORT=
     SPORT=
 
-    if (lsb_release --id) >/dev/null 2>&1; then
+    type_file=$etcdir/system-type.conf
+    version_file=$etcdir/system-version.conf
+
+    if test -e "$type_file" ; then
+        SYSTEM_TYPE=`cat $type_file`
+        SYSTEM_VERSION=`cat $version_file`
+    elif (lsb_release --id) >/dev/null 2>&1; then
         SYSTEM_TYPE=`lsb_release --id -s`
         system_release=`lsb_release --release -s`
         system_codename=`lsb_release --codename -s`
         SYSTEM_TYPE=`lsb_release --id -s`
         system_release=`lsb_release --release -s`
         system_codename=`lsb_release --codename -s`
@@ -394,6 +442,7 @@ Commands:
   stop               stop Open vSwitch daemons
   status             check whether Open vSwitch daemons are running
   version            print versions of Open vSwitch daemons
   stop               stop Open vSwitch daemons
   status             check whether Open vSwitch daemons are running
   version            print versions of Open vSwitch daemons
+  load-kmod          insert modules if not already present
   force-reload-kmod  save OVS network device state, stop OVS, unload kernel
                      module, reload kernel module, start OVS, restore state
   enable-protocol    enable protocol specified in options with iptables
   force-reload-kmod  save OVS network device state, stop OVS, unload kernel
                      module, reload kernel module, start OVS, restore state
   enable-protocol    enable protocol specified in options with iptables
@@ -418,7 +467,13 @@ Less important options for "start" and "force-reload-kmod":
   --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)
 
   --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)
 
-Options for "start", "force-reload-kmod", "status", and "version":
+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
 
 File location options:
   --brcompat         enable Linux bridge compatibility module and daemon
 
 File location options:
@@ -436,8 +491,9 @@ Other options:
   -V, --version               display version information
 
 Default directories with "configure" option and environment variable override:
   -V, --version               display version information
 
 Default directories with "configure" option and environment variable override:
-  logs: @LOGDIR@ (--log-dir, OVS_LOGDIR)
-  pidfiles and sockets: @RUNDIR@ (--run-dir, OVS_RUNDIR)
+  logs: @LOGDIR@ (--with-logdir, OVS_LOGDIR)
+  pidfiles and sockets: @RUNDIR@ (--with-rundir, OVS_RUNDIR)
+  conf.db: @DBDIR@ (--with-dbdir, OVS_DBDIR)
   system configuration: @sysconfdir@ (--sysconfdir, OVS_SYSCONFDIR)
   data files: @pkgdatadir@ (--pkgdatadir, OVS_PKGDATADIR)
   user binaries: @bindir@ (--bindir, OVS_BINDIR)
   system configuration: @sysconfdir@ (--sysconfdir, OVS_SYSCONFDIR)
   data files: @pkgdatadir@ (--pkgdatadir, OVS_PKGDATADIR)
   user binaries: @bindir@ (--bindir, OVS_BINDIR)
@@ -479,7 +535,7 @@ do
             usage
             ;;
         -V | --version)
             usage
             ;;
         -V | --version)
-            echo "$0 (Open vSwitch) $VERSION$BUILDNR"
+            echo "$0 (Open vSwitch) $VERSION"
             exit 0
             ;;
         --external-id=*)
             exit 0
             ;;
         --external-id=*)
@@ -528,10 +584,12 @@ do
 done
 case $command in
     start)
 done
 case $command in
     start)
-        start
+        start_ovsdb
+        start_forwarding
         ;;
     stop)
         ;;
     stop)
-        stop
+        stop_forwarding
+        stop_ovsdb
         ;;
     status)
         rc=0
         ;;
     status)
         rc=0
@@ -546,7 +604,10 @@ case $command in
         done
         ;;
     force-reload-kmod)
         done
         ;;
     force-reload-kmod)
-       force_reload_kmod
+           force_reload_kmod
+        ;;
+    load-kmod)
+        insert_mod_if_required
         ;;
     enable-protocol)
         enable_protocol
         ;;
     enable-protocol)
         enable_protocol