aboutsummaryrefslogtreecommitdiff
path: root/net/openvswitch/files/openvswitch.init
diff options
context:
space:
mode:
Diffstat (limited to 'net/openvswitch/files/openvswitch.init')
-rwxr-xr-xnet/openvswitch/files/openvswitch.init84
1 files changed, 83 insertions, 1 deletions
diff --git a/net/openvswitch/files/openvswitch.init b/net/openvswitch/files/openvswitch.init
index 23b75c38f..229e6869b 100755
--- a/net/openvswitch/files/openvswitch.init
+++ b/net/openvswitch/files/openvswitch.init
@@ -7,6 +7,8 @@
. /lib/functions/procd.sh
START=15
+basescript=$(readlink "$initscript")
+
ovs_ctl="/usr/share/openvswitch/scripts/ovs-ctl"; [ -x "$ovs_ctl" ] || ovs_ctl=:
ovn_ctl="/usr/share/ovn/scripts/ovn-ctl"; [ -x "$ovn_ctl" ] || ovn_ctl=:
@@ -59,7 +61,12 @@ ovs_action() {
config_foreach "ovs_xx" "$cfgtype" "$action" "$cfgtype"
done
- config_foreach ovs_bridge_init "ovs_bridge"
+ case "$action" in
+ restart|start)
+ config_foreach ovs_bridge_init "ovs_bridge"
+ ;;
+ esac
+
}
ovs_xx() {
@@ -83,6 +90,7 @@ ovs_xx() {
ovs)
"$ovs_ctl" "$action" \
--system-id=random 1000>&-
+ ovs_set_ssl
;;
ovn_*)
"$ovn_ctl" "${action}_${cfgtype#ovn_}"
@@ -116,6 +124,47 @@ ovs_bridge_port_add() {
__port_list="$__port_list ${port} "
}
+ovs_bridge_port_add_complex() {
+ local cfg="$1"
+ local cur_bridge="$2"
+
+ local bridge disabled ofport port tag type
+ local cur_tag cur_type del_port
+
+ config_get_bool disabled "$cfg" disabled 0
+ [ "$disabled" = "0" ] || return
+
+ config_get bridge "$cfg" bridge
+ [ "$bridge" = "$cur_bridge" ] || return
+ ovs-vsctl br-exists "$bridge" || return
+
+ config_get port "$cfg" port
+ [ -n "$port" ] || return
+
+ config_get ofport "$cfg" ofport
+
+ config_get tag "$cfg" tag
+ if [ -n "$tag" ]; then
+ if cur_tag="$(ovs-vsctl get port "$port" tag 2>/dev/null)"; then
+ [ "$tag" = "$cur_tag" ] || del_port=1
+ fi
+ fi
+
+ config_get type "$cfg" type
+ if [ -n "$type" ]; then
+ if cur_type="$(ovs-vsctl get interface "$port" type 2>/dev/null)"; then
+ [ "$type" = "$cur_type" ] || del_port=1
+ fi
+ fi
+
+ [ "${del_port:-0}" -eq 1 ] && ovs-vsctl --if-exists del-port "$bridge" "$port"
+
+ ovs-vsctl --may-exist add-port "$bridge" "$port" ${tag:+tag="$tag"} \
+ ${ofport:+ -- set interface "$port" ofport_request="$ofport"} \
+ ${type:+ -- set interface "$port" type="$type"}
+ __port_list="$__port_list ${port} "
+}
+
ovs_bridge_port_cleanup() {
for port in `ovs-vsctl list-ports "$name"`; do
case "$__port_list" in
@@ -125,12 +174,26 @@ ovs_bridge_port_cleanup() {
done
}
+ovs_bridge_validate_datapath_id() {
+ local dpid="$1"
+
+ if expr "$dpid" : '[[:xdigit:]]\{16\}$' > /dev/null; then
+ return 0
+ elif expr "$dpid" : '0x[[:xdigit:]]\{1,16\}$' > /dev/null; then
+ return 0
+ else
+ logger -t openvswitch "invalid datapath_id: $dpid"
+ return 1
+ fi
+}
+
ovs_bridge_init() {
local cfg="$1"
local disabled
local name
local controller
+ local datapath_id
config_get_bool disabled "$cfg" disabled 0
[ "$disabled" == "0" ] || return
@@ -138,7 +201,15 @@ ovs_bridge_init() {
config_get name "$cfg" name $cfg
ovs-vsctl --may-exist add-br "$name"
+ config_get datapath_id "$cfg" datapath_id
+ [ -n "$datapath_id" ] && {
+ ovs_bridge_validate_datapath_id "$datapath_id" && {
+ ovs-vsctl --if-exists set bridge "$name" other-config:datapath-id="$datapath_id"
+ }
+ }
+
config_list_foreach "$cfg" "ports" ovs_bridge_port_add
+ config_foreach ovs_bridge_port_add_complex ovs_port "$name"
config_get_bool drop "$cfg" "drop_unknown_ports" 0
[ "$drop" == 1 ] && ovs_bridge_port_cleanup
@@ -146,3 +217,14 @@ ovs_bridge_init() {
[ -n "$controller" ] && \
ovs-vsctl set-controller "$name" "$controller"
}
+
+ovs_set_ssl() {
+ local ca="$(uci -q get openvswitch.ovs.ca)"
+ [ -f "$ca" ] || return
+ local cert="$(uci get openvswitch.ovs.cert)"
+ [ -f "$cert" ] || return
+ local key="$(uci get openvswitch.ovs.key)"
+ [ -f "$key" ] || return
+
+ ovs-vsctl set-ssl "$key" "$cert" "$ca"
+}