class SimpleBridge4 < Controller
MIN_PACKET_DATA_LEN = 60
def start
@port_list = [ 1, 2, 3 ] # all port numbers
end
def switch_ready( datapath_id )
info "Switch[0x%016x] is up." % datapath_id
send_flow_mod_add( datapath_id, :priority => 100 )
@port_list.each do | port |
send_flow_mod_add( datapath_id,
:match => Match.new( :in_port => port ),
:actions => SendOutPort.new( OFPP_CONTROLLER ) )
end
end
def switch_disconnected( datapath_id )
info "Switch[0x%016x] is disconnected." % datapath_id
end
def packet_in( datapath_id, message )
return unless message.reason == Trema::PacketIn::OFPR_ACTION
# padding. length of sending data must be >= 60
data_len = message.data.length
if ( data_len < MIN_PACKET_DATA_LEN )
data = message.data + "\x00" * ( MIN_PACKET_DATA_LEN - data_len )
else
data = message.data
end
actions = [ ]
@port_list.each do | port |
if ( message.in_port != port )
actions.push( SendOutPort.new( port ) )
end
end
send_packet_out( datapath_id,
:in_port => message.in_port,
:data => data, :actions => actions )
end
end
■再現環境
(1)再現環境の作り方 以下のコマンドを実行します。当然、すでに Open vSwitch がインストール済であることが前提です。
sudo ovs-vsctl add-br ofs1
sudo ovs-vsctl set-fail-mode ofs1 secure
sudo ip netns add vhost1
sudo ip link add name vlink1-0 type veth peer name vlink1-1
sudo ip link set vlink1-1 netns vhost1
sudo ip netns exec vhost1 ifconfig vlink1-1 up 192.168.0.1
sudo ip link set vlink1-0 up
sudo ovs-vsctl add-port ofs1 vlink1-0
sudo ip netns add vhost2
sudo ip link add name vlink2-0 type veth peer name vlink2-1
sudo ip link set vlink2-1 netns vhost2
sudo ip netns exec vhost2 ifconfig vlink2-1 up 192.168.0.2
sudo ip link set vlink2-0 up
sudo ovs-vsctl add-port ofs1 vlink2-0
sudo ovs-vsctl set-controller ofs1 tcp:127.0.0.1:6653
sudo ovs-vsctl set controller ofs1 connection-mode=out-of-band
sudo ovs-vsctl set controller ofs1 inactivity-probe=180
MAC[02:00:00:00:00:01] is found at Port 3. MAC[02:00:00:00:00:02] is found at Port 1. MAC[02:00:00:00:00:03] is found at Port 2. MAC[02:00:00:00:00:04] is found at Port 4.
最近のコメント