On Thu, Apr 13, 2017 at 12:01 PM, Yusuke Iwase <[email protected]>
wrote:

> Hi Deni,
>
> I added cc to Ryu-devel mailing list, and please keep it.
>
>
> 2017/04/13 19:11、Deni Toruan <[email protected]> のメッセージ:
>
> Dear Iwase, how do you do.
>
> I got your email address from ryu-dev forum.
> For your information, I am trying to connect ovs switch and ryu controller
> in different VM. I am trying to set up the connection from Ryu controller,
> and to make possible to add/delete port of OVS from controller.
>
> I have been using this code :(http://ryu.readthedocs.io/en
> /latest/library_ovsdb_manager.html), and it's look running. How ever, I
> only got this in controller:
>
> -----------------------
> ubuntu@sdnhubvm:~/ryu[02:59] (master)$ cd /home/ubuntu/ryu &&
> ./bin/ryu-manager --verbose
> ryu.app.MyApp
> loading app ryu.app.MyApp
> loading app ryu.services.protocols.ovsdb.manager
> instantiating app ryu.services.protocols.ovsdb.manager of OVSDB
> instantiating app ryu.app.MyApp of MyApp
> BRICK OVSDB
>   PROVIDES EventReadRequest TO {'OVSDB': set([])}
>   PROVIDES EventNewOVSDBConnection TO {'MyApp': set([])}
>   PROVIDES EventModifyRequest TO {'OVSDB': set([])}
>   CONSUMES EventReadRequest
>   CONSUMES EventModifyRequest
> BRICK MyApp
>   CONSUMES EventNewOVSDBConnection
> Listening on 0.0.0.0:6640 for clients
> ------------------------
>
> Do you have any experience about this situation. How I can communicate and
> connecting to OVS in another VM? thank you
>
>
> I guess ovsdb manager library work as the passive mode server, and you
> need to tell your OVS on which IP:port the server (Ryu) is listing.
> http://manpages.ubuntu.com/manpages/trusty/man8/ovs-vsctl.8.html
> e.g.) ovs-vsctl set-manager tcp:RYU-IP:6640
>
> Thanks,
> Iwase
>
>
>
Dear Iwase, thank you very much for the information.

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. 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.
Actually, I want to have an access from Ryu to OVS and doing add bridge,
add port, delete port dynamically. 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

Reply via email to