Dear all,
Currently, I am trying to make a connection between Ryu Controller and OVS,
and trying to modify OVS from controller (add bridge, add port, delete
port, etc) dynamically.
Currently, the OVS and Ryu controller can be connected. They are running in
different VM. However, when I try to run my simple app, it didn't work. In
the code, I am trying to delete one port that I have already set up from
OVS terminal. I always got this in controller:
----------------------------
d5f55957-26e1-4e24-8b9c-bb15210aa220
New OVSDB connection from system id d5f55957-26e1-4e24-8b9c-bb15210aa220
New connection from 10.0.0.11:47985
instantiating app None of RemoteOvsdb
BRICK RemoteOvsdb-d5f55957-26e1-4e24-8b9c-bb15210aa220
EVENT OVSDB->SimpleSwitch EventNewOVSDBConnection
EventNewOVSDBConnection<system_id=d5f55957-26e1-4e24-8b9c-bb15210aa220>
d5f55957-26e1-4e24-8b9c-bb15210aa220
New OVSDB connection from system id d5f55957-26e1-4e24-8b9c-bb15210aa220
instantiating app None of RemoteOvsdb
BRICK RemoteOvsdb-d5f55957-26e1-4e24-8b9c-bb15210aa220
EVENT OVSDB->SimpleSwitch EventNewOVSDBConnection
EventNewOVSDBConnection<system_id=d5f55957-26e1-4e24-8b9c-bb15210aa220>
d5f55957-26e1-4e24-8b9c-bb15210aa220
New OVSDB connection from system id d5f55957-26e1-4e24-8b9c-bb15210aa220
New connection from 10.0.0.11:47986
---------------------------------
For your information, I customize the code and I put it in attachment.
Please give some hints for doing this, especially with the code. Thank you.
Best regards,
Deni Lumbantoruan
# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
An OpenFlow 1.0 L2 learning switch implementation.
"""
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_0
from ryu.lib.mac import haddr_to_bin
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
from ryu.lib.packet import ether_types
from ryu.services.protocols.ovsdb import api as ovsdb
from ryu.services.protocols.ovsdb import event as ovsdb_event
import ryu.lib.ovs.vsctl as ovs_vsctl
import ryu.lib.ovs.bridge as OVSBridge
class SimpleSwitch(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]
def __init__(self, *args, **kwargs):
super(SimpleSwitch, self).__init__(*args, **kwargs)
self.mac_to_port = {}
def add_flow(self, datapath, in_port, dst, actions):
ofproto = datapath.ofproto
match = datapath.ofproto_parser.OFPMatch(
in_port=in_port, dl_dst=haddr_to_bin(dst))
mod = datapath.ofproto_parser.OFPFlowMod(
datapath=datapath, match=match, cookie=0,
command=ofproto.OFPFC_ADD, idle_timeout=0, hard_timeout=0,
priority=ofproto.OFP_DEFAULT_PRIORITY,
flags=ofproto.OFPFF_SEND_FLOW_REM, actions=actions)
datapath.send_msg(mod)
"ovsdb connection"
@set_ev_cls(ovsdb_event.EventNewOVSDBConnection)
def handle_new_ovsdb_connection(self, ev):
print("")
print(ev)
system_id = ev.system_id
print("")
print system_id
self.logger.info('New OVSDB connection from system id %s',
system_id)
"add the bridge and port"
ovs_vsctl = ovs_vsctl.VSCtl("tcp:10.0.0.11:6640")
def add_port(self, eth1):
command = ovs_vsctl.VSCtlCommand('add-port', ('s1', 'eth1'))
vsctl.run_command([command])
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def _packet_in_handler(self, ev):
msg = ev.msg
datapath = msg.datapath
ofproto = datapath.ofproto
pkt = packet.Packet(msg.data)
eth = pkt.get_protocol(ethernet.ethernet)
if eth.ethertype == ether_types.ETH_TYPE_LLDP:
# ignore lldp packet
return
dst = eth.dst
src = eth.src
dpid = datapath.id
self.mac_to_port.setdefault(dpid, {})
self.logger.info("packet in %s %s %s %s", dpid, src, dst, msg.in_port)
# learn a mac address to avoid FLOOD next time.
self.mac_to_port[dpid][src] = msg.in_port
if dst in self.mac_to_port[dpid]:
out_port = self.mac_to_port[dpid][dst]
else:
out_port = ofproto.OFPP_FLOOD
actions = [datapath.ofproto_parser.OFPActionOutput(out_port)]
# install a flow to avoid packet_in next time
if out_port != ofproto.OFPP_FLOOD:
self.add_flow(datapath, msg.in_port, dst, actions)
data = None
if msg.buffer_id == ofproto.OFP_NO_BUFFER:
data = msg.data
out = datapath.ofproto_parser.OFPPacketOut(
datapath=datapath, buffer_id=msg.buffer_id, in_port=msg.in_port,
actions=actions, data=data)
datapath.send_msg(out)
@set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
def _port_status_handler(self, ev):
msg = ev.msg
reason = msg.reason
port_no = msg.desc.port_no
ofproto = msg.datapath.ofproto
if reason == ofproto.OFPPR_ADD:
self.logger.info("port added %s", port_no)
elif reason == ofproto.OFPPR_DELETE:
self.logger.info("port deleted %s", port_no)
elif reason == ofproto.OFPPR_MODIFY:
self.logger.info("port modified %s", port_no)
else:
self.logger.info("Illeagal port state %s %s", port_no, reason)------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel