◆ 【Open vSwitchのみで OpenFlowプログラミング】VLAN ID コンバータ 改
OpenFlow コントーラを使わずに(※) Open vSwitch を OpenFlow スイッチとして使って VLAN ID を変換する機能を実装してみましたという前回の記事の最後に書いた気になった点を改善しました。OpenFlow コントローラなしの OpenFlow スイッチを仮想ネットワークに追加する addStandaloneOFSwitch を共通ファイル vnetcommon.sh に追加しました。
※OpenFlow コントローラなしで OpenFlow スイッチを使うというのは OpenFlow の仕様上はありえない構成です。でも、Open vSwitch では可能であり、お手軽に OpenFlow を試すには便利な機能だと思います。
ネットワーク構成図などは、前回記事を参照ください。
■仮想ネットワークの作成・削除シェルスクリプト
引数 delete で削除、add で追加です。
共通ファイル vnetcommon.sh がカレントディレクトリにおいてあることを前提としています。
#!/bin/sh
. ./vnetcommon.sh
delete() {
deleteVSwitch "ofs1" "vswitch1" "vswitch2"
deleteVLink "vlinkSW1" "vlinkSW2"
deleteVHost "vhost1" "vhost2" "vhost3" "vhost4"
deleteVLink "vlink1" "vlink2" "vlink3" "vlink4"
}
config_ofs1() {
sudo ovs-ofctl add-flow "ofs1" in_port=1,dl_vlan=10,actions=mod_vlan_vid:30,output:2
sudo ovs-ofctl add-flow "ofs1" in_port=2,dl_vlan=30,actions=mod_vlan_vid:10,output:1
sudo ovs-ofctl add-flow "ofs1" in_port=1,dl_vlan=20,actions=mod_vlan_vid:40,output:2
sudo ovs-ofctl add-flow "ofs1" in_port=2,dl_vlan=40,actions=mod_vlan_vid:20,output:1
sudo ovs-ofctl add-flow "ofs1" priority=100,actions=drop
}
add() {
addStandaloneOFSwitch "ofs1"
addVSwitch "vswitch1"
addVSwitch "vswitch2"
connectVSwitchToVSwitch "vswitch1" "vlinkSW1" "ofs1"
connectVSwitchToVSwitch "vswitch2" "vlinkSW2" "ofs1"
addVHost "vhost1"
connectVHostToVSwitch "vhost1" "vlink1" "vswitch1" tag=10
vhostExec "vhost1" ifconfig "vlink1" "192.168.0.1"
addVHost "vhost2"
connectVHostToVSwitch "vhost2" "vlink2" "vswitch1" tag=20
vhostExec "vhost2" ifconfig "vlink2" "192.168.0.2"
addVHost "vhost3"
connectVHostToVSwitch "vhost3" "vlink3" "vswitch2" tag=30
vhostExec "vhost3" ifconfig "vlink3" "192.168.0.3"
addVHost "vhost4"
connectVHostToVSwitch "vhost4" "vlink4" "vswitch2" tag=40
vhostExec "vhost4" ifconfig "vlink4" "192.168.0.4"
config_ofs1
}
case "$1" in
add)
sudo sh -c exit
set -x
add
;;
delete)
sudo sh -c exit
delete > /dev/null 2>&1
;;
*)
echo "usage: $0 { add | delete }"
esac
■共通ファイル vnetcommon.sh
修正版の vnetcommon.sh コードは以下です。addStandaloneOFSwitch を追加しました。
# version: 2013-08-10
deleteVHost() {
local host
for host in "$@"; do
sudo ip netns delete "$host"
done
}
deleteVSwitch() {
local switch
for switch in "$@"; do
sudo ovs-vsctl del-br "$switch"
done
}
deleteVLink() {
local link
for link in "$@"; do
sudo ip link delete "$link"
sudo ip link delete "${link}-0"
sudo ip link delete "${link}-1"
done
}
addVHost() {
local host="$1"
sudo ip netns add "$host"
sudo ip netns exec "$host" ifconfig lo 127.0.0.1
}
addVSwitch() {
local switch="$1"
sudo ovs-vsctl add-br "$switch"
}
setupVSwitchAsOpenFlowSwitch() {
local switch="$1"
local datapath_id="$2"
if [ "$datapath_id" != "" ]; then
sudo ovs-vsctl set bridge "$switch" other-config:datapath-id=`printf \"%016x\" $datapath_id`
fi
sudo ovs-vsctl set-fail-mode "$switch" secure
sudo ovs-vsctl set-controller "$switch" tcp:127.0.0.1 -- \
set controller "$switch" connection-mode=out-of-band -- \
set controller "$switch" inactivity-probe=180 -- \
set controller "$switch" controller-rate-limit=40000 -- \
set controller "$switch" controller-burst-limit=20000
}
addOFSwitch() {
addVSwitch "$1"
setupVSwitchAsOpenFlowSwitch "$1" "$2"
}
addStandaloneOFSwitch() {
local switch="$1"
addVSwitch "$switch"
sudo ovs-vsctl set-fail-mode "$switch" secure
sudo ovs-ofctl del-flows "$switch"
}
connectVSwitchToVSwitch() {
local switch1="$1"
local link="$2"
local switch2="$3"
sudo ip link add name "${link}-0" type veth peer name "${link}-1"
sudo ip link set "${link}-0" up
sudo ovs-vsctl add-port "$switch1" "${link}-0"
sudo ip link set "${link}-1" up
sudo ovs-vsctl add-port "$switch2" "${link}-1"
}
connectVHostToVSwitch() {
local host="$1"
local link="$2"
local switch="$3"
local opt="$4"
sudo ip link add name "${link}" type veth peer name "${link}-1"
sudo ip link set "${link}-1" netns "$host"
sudo ip netns exec "$host" ip link set "${link}-1" name "${link}"
sudo ip netns exec "$host" ifconfig "${link}" up
sudo ip link set "${link}" up
sudo ovs-vsctl add-port "$switch" "${link}" $opt
}
vhostExec() {
sudo ip netns exec "$@"
}
最近のコメント