Dear Fujimoto san, thank you very much for your information.

I have tried to put the code to the file: simple_switch.py (as in
attachment), and try to run it in Ryu controller machine.
The code is running, how ever, when I checked in the OVS machine (VM IP:
10.0.0.5), there is no changes. The port eth1 is still there.
Is there anything wrong in putting the code to file simple_switch.py?
thank you.

regards,

deni toruan


On Tue, Apr 25, 2017 at 1:40 AM, Fujimoto Satoshi <
satoshi.fujimo...@gmail.com> wrote:

> Hi, Deni
>
> You can make a connection by instantiating OVSBridge:
>         ovs_bridge = OVSBridge(None, datapath.id, 'tcp:127.0.0.1:6632',
> timeout=1)
>
> And by the following code, for example, you can delete a port:
>         ovs_bridge = OVSBridge(None, datapath.id, 'tcp:127.0.0.1:6632',
> timeout=1)
>         ovs_bridge.init()
>         ports = ovs_bridge.get_port_name_list()
>         ovs_bridge.del_port(ports[0])
>
> OVSBridge provides some other APIs.
> For details, please check this code:
>         https://github.com/osrg/ryu/blob/master/ryu/lib/ovs/bridge.py
>
>
> Thanks,
> Fujimoto
>
>
> On 2017年04月24日 16:18, Deni Toruan wrote:
>
> Hi Satoshi san, thank you for your kind reply.
>
>
> On Mon, Apr 24, 2017 at 5:07 AM, Fujimoto Satoshi <
> satoshi.fujimo...@gmail.com> wrote:
>
>> Hi, Deni
>>
>> The problem may be caused by that you use "ovsdb_event" and "ovs_vsctl"
>> at the same time.
>> If you don't need to monitor the status of OVS, you should not use
>> "ovsdb_event".
>>
>
> Is it mean I should not use initiation : 
> "ovsdb_event.EventNewOVSDBConnection)"?
> So how I will make (realize) a connection between controller and OVSDB
> Server?
>
>
>> Also, you can use "OVSBridge" to control your OVS.
>> "OVSBridge" calls "ovs_vsctl.VSCtl()" in __init__(), and wraps some
>> operations including adding a port.
>>
>>
> Thank you for your suggestion.Would you mind to give me some clue for
> using the "OVSBridge" and for calling the "ovs_vsctl.VSCtl()"?
>
>
>
>> Thanks,
>> Fujimoto
>>
>>
>>
> Thank you.
>
> Regards, Deni
>
>
>
>
>> On 2017年04月23日 19:23, Deni Toruan wrote:
>>
>>
>> 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
>>
>>
>> ------------------------------------------------------------------------------
>> 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 
>> listRyu-devel@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/ryu-devel
>>
>> --
> Deni Toruan
> Dosen IT Del
> Sitoluama
>
>
> ------------------------------------------------------------------------------
> 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 
> listRyu-devel@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/ryu-devel
>
>


-- 
Deni Toruan
Dosen IT Del
Sitoluama
# 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 = {}

    "delete the port eth1 "

    def ovs_bridge(self, CONF, datapath_id, ovsdb_addr, timeout=None, exception=None):
        ovs_bridge = OVSBridge(None, datapath.id, 'tcp:10.0.0.5:6640', timeout=1)
        ovs_bridge.init()
        ports = ovs_bridge.get_port_name_list()
        ovs_bridge.del_port(ports[eth1])


    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)

    @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
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to