openvswitch: support setting OpenFlow datapath ID
By default, Open vSwitch will generate the OpenFlow datapath ID of a bridge based on the MAC address of one of its ports. Due to this, it's possible that the datapath ID changes when new ports are added. When the datapath ID changes, Open vSwitch disconnects from the controller, as there is no way to notify the controller that the datapath ID has changed. Add an option to set the datapath ID so that the above situation can be avoided. The option takes either exactly 16 hex characters, or when prefixed with 0x, between 1 and 16 hex characters. Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
This commit is contained in:
parent
a167eed837
commit
4a4c1634e6
4 changed files with 29 additions and 6 deletions
|
@ -17,7 +17,7 @@ include ./openvswitch.mk
|
||||||
#
|
#
|
||||||
PKG_NAME:=openvswitch
|
PKG_NAME:=openvswitch
|
||||||
PKG_VERSION:=$(ovs_version)
|
PKG_VERSION:=$(ovs_version)
|
||||||
PKG_RELEASE:=4
|
PKG_RELEASE:=5
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
PKG_SOURCE_URL:=https://www.openvswitch.org/releases/
|
PKG_SOURCE_URL:=https://www.openvswitch.org/releases/
|
||||||
PKG_HASH:=7d5797f2bf2449c6a266149e88f72123540f7fe7f31ad52902057ae8d8f88c38
|
PKG_HASH:=7d5797f2bf2449c6a266149e88f72123540f7fe7f31ad52902057ae8d8f88c38
|
||||||
|
|
|
@ -73,10 +73,11 @@ The ovs_bridge section also supports the options below,
|
||||||
for initialising a virtual bridge with an OpenFlow controller.
|
for initialising a virtual bridge with an OpenFlow controller.
|
||||||
|
|
||||||
| Name | Type | Required | Default | Description |
|
| Name | Type | Required | Default | Description |
|
||||||
|------------|---------|----------|--------------------------------|------------------------------------------------------------|
|
|-------------|---------|----------|--------------------------------|------------------------------------------------------------|
|
||||||
| disabled | boolean | no | 0 | If set to true, disable initialisation of the named bridge |
|
| disabled | boolean | no | 0 | If set to true, disable initialisation of the named bridge |
|
||||||
| name | string | no | Inherits UCI config block name | The name of the switch in the OVS daemon |
|
| name | string | no | Inherits UCI config block name | The name of the switch in the OVS daemon |
|
||||||
| controller | string | no | (none) | The endpoint of an OpenFlow controller for this bridge |
|
| controller | string | no | (none) | The endpoint of an OpenFlow controller for this bridge |
|
||||||
|
| datapath_id | string | no | (none) | The OpenFlow datapath ID for this bridge |
|
||||||
|
|
||||||
The ovs_port section can be used to add ports to a bridge. It supports the options below.
|
The ovs_port section can be used to add ports to a bridge. It supports the options below.
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ config ovs_bridge
|
||||||
option disabled 1
|
option disabled 1
|
||||||
option name 'my-bridge'
|
option name 'my-bridge'
|
||||||
option controller 'tcp:192.168.0.1'
|
option controller 'tcp:192.168.0.1'
|
||||||
|
option datapath_id ''
|
||||||
|
|
||||||
config ovs_port
|
config ovs_port
|
||||||
option disabled 1
|
option disabled 1
|
||||||
|
|
|
@ -171,12 +171,26 @@ ovs_bridge_port_cleanup() {
|
||||||
done
|
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() {
|
ovs_bridge_init() {
|
||||||
local cfg="$1"
|
local cfg="$1"
|
||||||
|
|
||||||
local disabled
|
local disabled
|
||||||
local name
|
local name
|
||||||
local controller
|
local controller
|
||||||
|
local datapath_id
|
||||||
|
|
||||||
config_get_bool disabled "$cfg" disabled 0
|
config_get_bool disabled "$cfg" disabled 0
|
||||||
[ "$disabled" == "0" ] || return
|
[ "$disabled" == "0" ] || return
|
||||||
|
@ -184,6 +198,13 @@ 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_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_list_foreach "$cfg" "ports" ovs_bridge_port_add
|
||||||
config_foreach ovs_bridge_port_add_complex ovs_port "$name"
|
config_foreach ovs_bridge_port_add_complex ovs_port "$name"
|
||||||
config_get_bool drop "$cfg" "drop_unknown_ports" 0
|
config_get_bool drop "$cfg" "drop_unknown_ports" 0
|
||||||
|
|
Loading…
Reference in a new issue