ovs-ctl: Raise the limit on the number of open file descriptors.
[cascardo/ovs.git] / utilities / ovs-ctl.in
1 #! /bin/sh
2 # Copyright (C) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15
16 case $0 in
17     */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;;
18     *) dir0=./ ;;
19 esac
20 . "$dir0/ovs-lib" || exit 1
21
22 for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do
23     case :$PATH: in
24         *:$dir:*) ;;
25         *) PATH=$PATH:$dir ;;
26     esac
27 done
28
29 ## ----- ##
30 ## start ##
31 ## ----- ##
32
33 insert_mod_if_required () {
34     # If openvswitch is already loaded then we're done.
35     test -e /sys/module/openvswitch -o -e /sys/module/openvswitch_mod && \
36      return 0
37
38     # Load openvswitch.  If that's successful then we're done.
39     action "Inserting openvswitch module" modprobe openvswitch && return 0
40
41     # If the bridge module is loaded, then that might be blocking
42     # openvswitch.  Try to unload it, if there are no bridges.
43     test -e /sys/module/bridge || return 1
44     bridges=`echo /sys/class/net/*/bridge | sed 's,/sys/class/net/,,g;s,/bridge,,g'`
45     if test "$bridges" != "*"; then
46         log_warning_msg "not removing bridge module because bridges exist ($bridges)"
47         return 1
48     fi
49     action "removing bridge module" rmmod bridge || return 1
50
51     # Try loading openvswitch again.
52     action "Inserting openvswitch module" modprobe openvswitch
53 }
54
55 ovs_vsctl () {
56     ovs-vsctl --no-wait "$@"
57 }
58
59 ovsdb_tool () {
60     ovsdb-tool -vconsole:off "$@"
61 }
62
63 create_db () {
64     action "Creating empty database $DB_FILE" ovsdb_tool create "$DB_FILE" "$DB_SCHEMA"
65 }
66
67 upgrade_db () {
68     schemaver=`ovsdb_tool schema-version "$DB_SCHEMA"`
69     if test ! -e "$DB_FILE"; then
70         log_warning_msg "$DB_FILE does not exist"
71         install -d -m 755 -o root -g root `dirname $DB_FILE`
72         create_db
73     elif test X"`ovsdb_tool needs-conversion "$DB_FILE" "$DB_SCHEMA"`" != Xno; then
74         # Back up the old version.
75         version=`ovsdb_tool db-version "$DB_FILE"`
76         cksum=`ovsdb_tool db-cksum "$DB_FILE" | awk '{print $1}'`
77         backup=$DB_FILE.backup$version-$cksum
78         action "Backing up database to $backup" cp "$DB_FILE" "$backup" || return 1
79
80         # Compact database.  This is important if the old schema did not enable
81         # garbage collection (i.e. if it did not have any tables with "isRoot":
82         # true) but the new schema does.  In that situation the old database
83         # may contain a transaction that creates a record followed by a
84         # transaction that creates the first use of the record.  Replaying that
85         # series of transactions against the new database schema (as "convert"
86         # does) would cause the record to be dropped by the first transaction,
87         # then the second transaction would cause a referential integrity
88         # failure (for a strong reference).
89         #
90         # Errors might occur on an Open vSwitch downgrade if ovsdb-tool doesn't
91         # understand some feature of the schema used in the OVSDB version that
92         # we're downgrading from, so we don't give up on error.
93         action "Compacting database" ovsdb_tool compact "$DB_FILE"
94
95         # Upgrade or downgrade schema.
96         if action "Converting database schema" ovsdb_tool convert "$DB_FILE" "$DB_SCHEMA"; then
97             :
98         else
99             log_warning_msg "Schema conversion failed, using empty database instead"
100             rm -f "$DB_FILE"
101             create_db
102         fi
103     fi
104 }
105
106 set_system_ids () {
107     set ovs_vsctl set Open_vSwitch .
108
109     OVS_VERSION=`ovs-vswitchd --version | sed 's/.*) //;1q'`
110     set "$@" ovs-version="$OVS_VERSION"
111
112     case $SYSTEM_ID in
113         random)
114             id_file=$etcdir/system-id.conf
115             uuid_file=$etcdir/install_uuid.conf
116             if test -e "$id_file"; then
117                 SYSTEM_ID=`cat "$id_file"`
118             elif test -e "$uuid_file"; then
119                 # Migrate from old file name.
120                 . "$uuid_file"
121                 SYSTEM_ID=$INSTALLATION_UUID
122                 echo "$SYSTEM_ID" > "$id_file"
123             elif SYSTEM_ID=`uuidgen`; then
124                 echo "$SYSTEM_ID" > "$id_file"
125             else
126                 log_failure_msg "missing uuidgen, could not generate system ID"
127             fi
128             ;;
129
130         '')
131             log_failure_msg "system ID not configured, please use --system-id"
132             ;;
133
134         *)
135             ;;
136     esac
137     set "$@" external-ids:system-id="\"$SYSTEM_ID\""
138
139     if test X"$SYSTEM_TYPE" != X; then
140         set "$@" system-type="\"$SYSTEM_TYPE\""
141     else
142         log_failure_msg "no default system type, please use --system-type"
143     fi
144
145     if test X"$SYSTEM_VERSION" != X; then
146         set "$@" system-version="\"$SYSTEM_VERSION\""
147     else
148         log_failure_msg "no default system version, please use --system-version"
149     fi
150
151     action "Configuring Open vSwitch system IDs" "$@" $extra_ids
152 }
153
154 check_force_cores () {
155     if test X"$FORCE_COREFILES" = Xyes; then
156         ulimit -c 67108864
157     fi
158 }
159
160 start_ovsdb () {
161     check_force_cores
162
163     if daemon_is_running ovsdb-server; then
164         log_success_msg "ovsdb-server is already running"
165     else
166         # Create initial database or upgrade database schema.
167         upgrade_db || return 1
168
169         # Start ovsdb-server.
170         set ovsdb-server "$DB_FILE"
171         for db in $EXTRA_DBS; do
172             case $db in
173                 /*) ;;
174                 *) db=$dbdir/$db ;;
175             esac
176
177             if test ! -f "$db"; then
178                 log_warning_msg "$db (from \$EXTRA_DBS) does not exist."
179             elif ovsdb-tool db-version "$db" >/dev/null; then
180                 set "$@" "$db"
181             else
182                 log_warning_msg "$db (from \$EXTRA_DBS) cannot be read as a database (see error message above)"
183             fi
184         done
185         set "$@" -vconsole:emer -vsyslog:err -vfile:info
186         set "$@" --remote=punix:"$DB_SOCK"
187         set "$@" --private-key=db:Open_vSwitch,SSL,private_key
188         set "$@" --certificate=db:Open_vSwitch,SSL,certificate
189         set "$@" --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert
190         start_daemon "$OVSDB_SERVER_PRIORITY" "$OVSDB_SERVER_WRAPPER" "$@" \
191             || return 1
192
193         # Initialize database settings.
194         ovs_vsctl -- init -- set Open_vSwitch . db-version="$schemaver" \
195             || return 1
196         set_system_ids || return 1
197         if test X"$DELETE_BRIDGES" = Xyes; then
198             for bridge in `ovs_vsctl list-br`; do
199         ovs_vsctl del-br $bridge
200             done
201         fi
202     fi
203 }
204
205 add_managers () {
206     # Now that ovs-vswitchd has started and completed its initial
207     # configuration, tell ovsdb-server to conenct to the remote managers.  We
208     # used to do this at ovsdb-server startup time, but waiting for
209     # ovs-vswitchd to finish configuring means that remote managers see less
210     # churn in the database at startup or restart.  (For example, managers
211     # won't briefly see empty datapath-id or ofport columns for records that
212     # exist at startup.)
213     action "Enabling remote OVSDB managers" \
214         ovs-appctl -t ovsdb-server ovsdb-server/add-remote \
215             db:Open_vSwitch,Open_vSwitch,manager_options
216 }
217
218 start_forwarding () {
219     check_force_cores
220
221     insert_mod_if_required || return 1
222
223     if daemon_is_running ovs-vswitchd; then
224         log_success_msg "ovs-vswitchd is already running"
225     else
226         # Increase the limit on the number of open file descriptors.
227         # On Linux, ovs-vswitchd needs about three file descriptors
228         # per bridge and "n-handler-threads" file descriptors per bridge
229         # port, so this allows a very large number of bridges and ports.
230         MAXFD=65535
231         if [ $(ulimit -n) -lt $MAXFD ]; then
232             ulimit -n $MAXFD
233         fi
234
235             # Start ovs-vswitchd.
236             set ovs-vswitchd unix:"$DB_SOCK"
237             set "$@" -vconsole:emer -vsyslog:err -vfile:info
238             if test X"$MLOCKALL" != Xno; then
239                 set "$@" --mlockall
240             fi
241             start_daemon "$OVS_VSWITCHD_PRIORITY" "$OVS_VSWITCHD_WRAPPER" "$@"
242     fi
243 }
244
245 ## ---- ##
246 ## stop ##
247 ## ---- ##
248
249 stop_ovsdb () {
250     stop_daemon ovsdb-server
251 }
252
253 stop_forwarding () {
254     stop_daemon ovs-vswitchd
255 }
256
257 ## ----------------- ##
258 ## force-reload-kmod ##
259 ## ----------------- ##
260
261 internal_interfaces () {
262     # Outputs a list of internal interfaces:
263     #
264     #   - There is an internal interface for every bridge, whether it
265     #     has an Interface record or not and whether the Interface
266     #     record's 'type' is properly set or not.
267     #
268     #   - There is an internal interface for each Interface record whose
269     #     'type' is 'internal'.
270     #
271     # But ignore interfaces that don't really exist.
272     for d in `(ovs_vsctl --bare \
273                 -- --columns=name find Interface type=internal \
274                     -- list-br) | sort -u`
275     do
276         if test -e "/sys/class/net/$d"; then
277                 printf "%s " "$d"
278             fi
279     done
280 }
281
282 ovs_save () {
283     bridges=`ovs_vsctl -- --real list-br`
284     if [ -n "${bridges}" ] && \
285         "$datadir/scripts/ovs-save" "$1" ${bridges} > "$2"; then
286         chmod +x "$2"
287         return 0
288     fi
289     [ -z "${bridges}" ] && return 0
290 }
291
292 save_ofports_if_required () {
293     # Save ofports if we are upgrading from a pre-1.10 branch.
294     case `ovs-appctl version | sed 1q` in
295         "ovs-vswitchd (Open vSwitch) 1."[0-9].*)
296             action "Saving ofport values" ovs_save save-ofports \
297                 "${script_ofports}"
298             ;;
299     esac
300 }
301
302 save_interfaces () {
303     "$datadir/scripts/ovs-save" save-interfaces ${ifaces} \
304         > "${script_interfaces}"
305 }
306
307 restore_ofports () {
308     [ -x "${script_ofports}" ] && \
309         action "Restoring ofport values" "${script_ofports}"
310 }
311
312 flow_restore_wait () {
313     ovs_vsctl set open_vswitch . other_config:flow-restore-wait="true"
314 }
315
316 flow_restore_complete () {
317     ovs_vsctl --if-exists remove open_vswitch . other_config \
318         flow-restore-wait="true"
319 }
320
321 restore_flows () {
322     [ -x "${script_flows}" ] && \
323         action "Restoring saved flows" "${script_flows}"
324 }
325
326 restore_interfaces () {
327     [ ! -x "${script_interfaces}" ] && return 0
328     action "Restoring interface configuration" "${script_interfaces}"
329     rc=$?
330     if test $rc = 0; then
331         level=debug
332     else
333         level=err
334     fi
335     log="logger -p daemon.$level -t ovs-save"
336     $log "interface restore script exited with status $rc:"
337     $log -f "$script_interfaces"
338 }
339
340 init_restore_scripts () {
341     script_interfaces=`mktemp`
342     script_flows=`mktemp`
343     script_ofports=`mktemp`
344     trap 'rm -f "${script_interfaces}" "${script_flows}" "${script_ofports}"' 0
345 }
346
347 force_reload_kmod () {
348     ifaces=`internal_interfaces`
349     action "Detected internal interfaces: $ifaces" true
350
351     init_restore_scripts
352
353     action "Saving flows" ovs_save save-flows "${script_flows}"
354
355     save_ofports_if_required
356
357     # Restart the database first, since a large database may take a
358     # while to load, and we want to minimize forwarding disruption.
359     stop_ovsdb
360     start_ovsdb
361
362     # Restore of ofports should happen before vswitchd is restarted.
363     restore_ofports
364
365     stop_forwarding
366
367     if action "Saving interface configuration" save_interfaces; then
368         :
369     else
370         log_warning_msg "Failed to save configuration, not replacing kernel module"
371         start_forwarding
372         add_managers
373         exit 1
374     fi
375     chmod +x "$script_interfaces"
376
377     for dp in `ovs-dpctl dump-dps`; do
378         action "Removing datapath: $dp" ovs-dpctl del-dp "$dp"
379     done
380
381     # try both old and new names in case this is post upgrade
382     if test -e /sys/module/openvswitch_mod; then
383         action "Removing openvswitch module" rmmod openvswitch_mod
384     elif test -e /sys/module/openvswitch; then
385         action "Removing openvswitch module" rmmod openvswitch
386     fi
387
388     # Start vswitchd by asking it to wait till flow restore is finished.
389     flow_restore_wait
390     start_forwarding
391
392     # Restore saved flows and inform vswitchd that we are done.
393     restore_flows
394     flow_restore_complete
395     add_managers
396
397     restore_interfaces
398
399     "$datadir/scripts/ovs-check-dead-ifs"
400 }
401
402 ## ------- ##
403 ## restart ##
404 ## ------- ##
405
406 save_interfaces_if_required () {
407     # Save interfaces if we are upgrading from a pre-1.10 branch.
408     case `ovs-appctl version | sed 1q` in
409         "ovs-vswitchd (Open vSwitch) 1."[0-9].*)
410             ifaces=`internal_interfaces`
411             action "Detected internal interfaces: $ifaces" true
412             if action "Saving interface configuration" save_interfaces; then
413                 chmod +x "$script_interfaces"
414             fi
415             ;;
416     esac
417 }
418
419 restart () {
420     if daemon_is_running ovsdb-server && daemon_is_running ovs-vswitchd; then
421         init_restore_scripts
422         save_interfaces_if_required
423         action "Saving flows" ovs_save save-flows "${script_flows}"
424         save_ofports_if_required
425     fi
426
427     # Restart the database first, since a large database may take a
428     # while to load, and we want to minimize forwarding disruption.
429     stop_ovsdb
430     start_ovsdb
431
432     # Restore of ofports, if required, should happen before vswitchd is
433     # restarted.
434     restore_ofports
435
436     stop_forwarding
437
438     # Start vswitchd by asking it to wait till flow restore is finished.
439     flow_restore_wait
440     start_forwarding
441
442     # Restore saved flows and inform vswitchd that we are done.
443     restore_flows
444     flow_restore_complete
445     add_managers
446
447     # Restore the interfaces if required. Return true even if restore fails.
448     restore_interfaces || true
449 }
450
451 ## --------------- ##
452 ## enable-protocol ##
453 ## --------------- ##
454
455 enable_protocol () {
456     # Translate the protocol name to a number, because "iptables -n -L" prints
457     # some protocols by name (despite the -n) and therefore we need to look for
458     # both forms.
459     #
460     # (iptables -S output is more uniform but old iptables doesn't have it.)
461     protonum=`grep "^$PROTOCOL[         ]" /etc/protocols | awk '{print $2}'`
462     if expr X"$protonum" : X'[0-9]\{1,\}$' > /dev/null; then :; else
463         log_failure_msg "unknown protocol $PROTOCOL"
464         return 1
465     fi
466
467     name=$PROTOCOL
468     match="(\$2 == \"$PROTOCOL\" || \$2 == $protonum)"
469     insert="iptables -I INPUT -p $PROTOCOL"
470     if test X"$DPORT" != X; then
471         name="$name to port $DPORT"
472         match="$match && /dpt:$DPORT/"
473         insert="$insert --dport $DPORT"
474     fi
475     if test X"$SPORT" != X; then
476         name="$name from port $SPORT"
477         match="$match && /spt:$SPORT/"
478         insert="$insert --sport $SPORT"
479     fi
480     insert="$insert -j ACCEPT"
481
482     if (iptables -n -L INPUT) >/dev/null 2>&1; then
483         if iptables -n -L INPUT | awk "$match { n++ } END { exit n == 0 }"
484         then
485             # There's already a rule for this protocol.  Don't override it.
486             log_success_msg "iptables already has a rule for $name, not explicitly enabling"
487         else
488             action "Enabling $name with iptables" $insert
489         fi
490     elif (iptables --version) >/dev/null 2>&1; then
491         action "cannot list iptables rules, not adding a rule for $name"
492     else
493         action "iptables binary not installed, not adding a rule for $name"
494     fi
495 }
496
497 ## ---- ##
498 ## main ##
499 ## ---- ##
500
501 set_defaults () {
502     SYSTEM_ID=
503
504     DELETE_BRIDGES=no
505
506     DAEMON_CWD=/
507     FORCE_COREFILES=yes
508     MLOCKALL=yes
509     OVSDB_SERVER_PRIORITY=-10
510     OVS_VSWITCHD_PRIORITY=-10
511     OVSDB_SERVER_WRAPPER=
512     OVS_VSWITCHD_WRAPPER=
513
514     DB_FILE=$dbdir/conf.db
515     DB_SOCK=$rundir/db.sock
516     DB_SCHEMA=$datadir/vswitch.ovsschema
517     EXTRA_DBS=
518
519     PROTOCOL=gre
520     DPORT=
521     SPORT=
522
523     type_file=$etcdir/system-type.conf
524     version_file=$etcdir/system-version.conf
525
526     if test -e "$type_file" ; then
527         SYSTEM_TYPE=`cat $type_file`
528         SYSTEM_VERSION=`cat $version_file`
529     elif (lsb_release --id) >/dev/null 2>&1; then
530         SYSTEM_TYPE=`lsb_release --id -s`
531         system_release=`lsb_release --release -s`
532         system_codename=`lsb_release --codename -s`
533         SYSTEM_VERSION="${system_release}-${system_codename}"
534     else
535         SYSTEM_TYPE=unknown
536         SYSTEM_VERSION=unknown
537     fi
538 }
539
540 usage () {
541     set_defaults
542     cat <<EOF
543 $0: controls Open vSwitch daemons
544 usage: $0 [OPTIONS] COMMAND
545
546 This program is intended to be invoked internally by Open vSwitch startup
547 scripts.  System administrators should not normally invoke it directly.
548
549 Commands:
550   start              start Open vSwitch daemons
551   stop               stop Open vSwitch daemons
552   restart            stop and start Open vSwitch daemons
553   status             check whether Open vSwitch daemons are running
554   version            print versions of Open vSwitch daemons
555   load-kmod          insert modules if not already present
556   force-reload-kmod  save OVS network device state, stop OVS, unload kernel
557                      module, reload kernel module, start OVS, restore state
558   enable-protocol    enable protocol specified in options with iptables
559   help               display this help message
560
561 One of the following options is required for "start", "restart" and "force-reload-kmod":
562   --system-id=UUID   set specific ID to uniquely identify this system
563   --system-id=random  use a random but persistent UUID to identify this system
564
565 Other important options for "start", "restart" and "force-reload-kmod":
566   --system-type=TYPE  set system type (e.g. "XenServer")
567   --system-version=VERSION  set system version (e.g. "5.6.100-39265p")
568   --external-id="key=value"
569                      add given key-value pair to Open_vSwitch external-ids
570   --delete-bridges   delete all bridges just before starting ovs-vswitchd
571
572 Less important options for "start", "restart" and "force-reload-kmod":
573   --daemon-cwd=DIR               set working dir for OVS daemons (default: $DAEMON_CWD)
574   --no-force-corefiles           do not force on core dumps for OVS daemons
575   --no-mlockall                  do not lock all of ovs-vswitchd into memory
576   --ovsdb-server-priority=NICE   set ovsdb-server's niceness (default: $OVSDB_SERVER_PRIORITY)
577   --ovs-vswitchd-priority=NICE   set ovs-vswitchd's niceness (default: $OVS_VSWITCHD_PRIORITY)
578
579 Debugging options for "start", "restart" and "force-reload-kmod":
580   --ovsdb-server-wrapper=WRAPPER
581   --ovs-vswitchd-wrapper=WRAPPER
582   --ovs-vswitchd-wrapper=WRAPPER
583      run specified daemon under WRAPPER (either 'valgrind' or 'strace')
584
585 File location options:
586   --db-file=FILE     database file name (default: $DB_FILE)
587   --db-sock=SOCKET   JSON-RPC socket name (default: $DB_SOCK)
588   --db-schema=FILE   database schema file name (default: $DB_SCHEMA)
589
590 Options for "enable-protocol":
591   --protocol=PROTOCOL  protocol to enable with iptables (default: gre)
592   --sport=PORT       source port to match (for tcp or udp protocol)
593   --dport=PORT       ddestination port to match (for tcp or udp protocol)
594
595 Other options:
596   -h, --help                  display this help message
597   -V, --version               display version information
598
599 Default directories with "configure" option and environment variable override:
600   logs: @LOGDIR@ (--with-logdir, OVS_LOGDIR)
601   pidfiles and sockets: @RUNDIR@ (--with-rundir, OVS_RUNDIR)
602   conf.db: @DBDIR@ (--with-dbdir, OVS_DBDIR)
603   system configuration: @sysconfdir@ (--sysconfdir, OVS_SYSCONFDIR)
604   data files: @pkgdatadir@ (--pkgdatadir, OVS_PKGDATADIR)
605   user binaries: @bindir@ (--bindir, OVS_BINDIR)
606   system binaries: @sbindir@ (--sbindir, OVS_SBINDIR)
607
608 Please report bugs to bugs@openvswitch.org (see REPORTING-BUGS for details).
609 EOF
610
611     exit 0
612 }
613
614 set_option () {
615     var=`echo "$option" | tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`
616     eval set=\${$var+yes}
617     eval old_value=\$$var
618     if test X$set = X || \
619         (test $type = bool && \
620         test X"$old_value" != Xno && test X"$old_value" != Xyes); then
621         echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
622         return
623     fi
624     eval $var=\$value
625 }
626
627 daemons () {
628     echo ovsdb-server ovs-vswitchd
629 }
630
631 set_defaults
632 extra_ids=
633 command=
634 for arg
635 do
636     case $arg in
637         -h | --help)
638             usage
639             ;;
640         -V | --version)
641             echo "$0 (Open vSwitch) $VERSION"
642             exit 0
643             ;;
644         --external-id=*)
645             value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
646             case $value in
647                 *=*)
648                     extra_ids="$extra_ids external-ids:$value"
649                     ;;
650                 *)
651                     echo >&2 "$0: --external-id argument not in the form \"key=value\""
652                     exit 1
653                     ;;
654             esac
655             ;;
656         --[a-z]*=*)
657             option=`expr X"$arg" : 'X--\([^=]*\)'`
658             value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
659             type=string
660             set_option
661             ;;
662         --no-[a-z]*)
663             option=`expr X"$arg" : 'X--no-\(.*\)'`
664             value=no
665             type=bool
666             set_option
667             ;;
668         --[a-z]*)
669             option=`expr X"$arg" : 'X--\(.*\)'`
670             value=yes
671             type=bool
672             set_option
673             ;;
674         -*)
675             echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
676             exit 1
677             ;;
678         *)
679             if test X"$command" = X; then
680                 command=$arg
681             else
682                 echo >&2 "$0: exactly one non-option argument required (use --help for help)"
683                 exit 1
684             fi
685             ;;
686     esac
687 done
688 case $command in
689     start)
690         start_ovsdb
691         start_forwarding
692         add_managers
693         ;;
694     stop)
695         stop_forwarding
696         stop_ovsdb
697         ;;
698     restart)
699         restart
700         ;;
701     status)
702         rc=0
703         for daemon in `daemons`; do
704             daemon_status $daemon || rc=$?
705         done
706         exit $rc
707         ;;
708     version)
709         for daemon in `daemons`; do
710             $daemon --version
711         done
712         ;;
713     force-reload-kmod)
714             force_reload_kmod
715         ;;
716     load-kmod)
717         insert_mod_if_required
718         ;;
719     enable-protocol)
720         enable_protocol
721         ;;
722     help)
723         usage
724         ;;
725     '')
726         echo >&2 "$0: missing command name (use --help for help)"
727         exit 1
728         ;;
729     *)
730         echo >&2 "$0: unknown command \"$command\" (use --help for help)"
731         exit 1
732         ;;
733 esac