openvswitch: add support for definining bridge ports in the config
Add limited procd support to handle config reload Option drop_unknown_ports can be used to ensure that only configured ports are part of the bridge Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
238046303d
commit
1038ac1235
1 changed files with 61 additions and 0 deletions
|
@ -2,7 +2,9 @@
|
||||||
# Copyright (C) 2013 Julius Schulz-Zander <julius@net.t-labs.tu-berlin.de>
|
# Copyright (C) 2013 Julius Schulz-Zander <julius@net.t-labs.tu-berlin.de>
|
||||||
# Copyright (C) 2014-2017 OpenWrt.org
|
# Copyright (C) 2014-2017 OpenWrt.org
|
||||||
# Copyright (C) 2018 Yousong Zhou <yszhou4tech@gmail.com>
|
# Copyright (C) 2018 Yousong Zhou <yszhou4tech@gmail.com>
|
||||||
|
# Copyright (C) 2021 Felix Fietkau <nbd@nbd.name>
|
||||||
|
|
||||||
|
. /lib/functions/procd.sh
|
||||||
START=15
|
START=15
|
||||||
|
|
||||||
ovs_ctl="/usr/share/openvswitch/scripts/ovs-ctl"; [ -x "$ovs_ctl" ] || ovs_ctl=:
|
ovs_ctl="/usr/share/openvswitch/scripts/ovs-ctl"; [ -x "$ovs_ctl" ] || ovs_ctl=:
|
||||||
|
@ -10,15 +12,35 @@ ovn_ctl="/usr/share/ovn/scripts/ovn-ctl"; [ -x "$ovn_ctl" ] || ovn_ctl=:
|
||||||
|
|
||||||
extra_command "status" "Get status information"
|
extra_command "status" "Get status information"
|
||||||
|
|
||||||
|
service_triggers() {
|
||||||
|
procd_add_reload_trigger openvswitch
|
||||||
|
}
|
||||||
|
|
||||||
|
init_triggers() {
|
||||||
|
procd_open_service "$(basename ${basescript:-$initscript})" "$initscript"
|
||||||
|
procd_close_service set
|
||||||
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
|
init_triggers
|
||||||
ovs_action start "$@"
|
ovs_action start "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reload() {
|
||||||
|
start
|
||||||
|
}
|
||||||
|
|
||||||
|
running() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
stop() {
|
stop() {
|
||||||
|
procd_kill "$(basename ${basescript:-$initscript})"
|
||||||
ovs_action stop "$@"
|
ovs_action stop "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
restart() {
|
restart() {
|
||||||
|
init_triggers
|
||||||
ovs_action restart "$@"
|
ovs_action restart "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,6 +90,41 @@ ovs_xx() {
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ovs_bridge_parse_port() {
|
||||||
|
case "$1" in
|
||||||
|
*:*)
|
||||||
|
port="${1%%:*}"
|
||||||
|
type="${1#*:}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
port="$1"
|
||||||
|
type=""
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
ovs_bridge_port_add() {
|
||||||
|
[ -n "$1" ] || return
|
||||||
|
|
||||||
|
ovs_bridge_parse_port "$1"
|
||||||
|
cur_type="$(ovs-vsctl get interface "$port" type 2>/dev/null)"
|
||||||
|
[ "$?" = 0 ] && {
|
||||||
|
[ "$type" = "$cur_type" ] || ovs-vsctl del-port "$port"
|
||||||
|
}
|
||||||
|
|
||||||
|
ovs-vsctl --may-exist add-port "$name" "$port" ${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
|
||||||
|
*" $port "*);;
|
||||||
|
*) ovs-vsctl del-port "$port";;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
ovs_bridge_init() {
|
ovs_bridge_init() {
|
||||||
local cfg="$1"
|
local cfg="$1"
|
||||||
|
|
||||||
|
@ -81,6 +138,10 @@ ovs_bridge_init() {
|
||||||
config_get name "$cfg" name $cfg
|
config_get name "$cfg" name $cfg
|
||||||
ovs-vsctl --may-exist add-br "$name"
|
ovs-vsctl --may-exist add-br "$name"
|
||||||
|
|
||||||
|
config_list_foreach "$cfg" "ports" ovs_bridge_port_add
|
||||||
|
config_get_bool drop "$cfg" "drop_unknown_ports" 0
|
||||||
|
[ "$drop" == 1 ] && ovs_bridge_port_cleanup
|
||||||
|
|
||||||
config_get controller "$cfg" controller
|
config_get controller "$cfg" controller
|
||||||
[ -n "$controller" ] && \
|
[ -n "$controller" ] && \
|
||||||
ovs-vsctl set-controller "$name" "$controller"
|
ovs-vsctl set-controller "$name" "$controller"
|
||||||
|
|
Loading…
Reference in a new issue