Hi,

Sorry, Please confirm me.
Your problem is that, Packet-in comes for every packet which matches some condition(proto == 150 and total_len <= 2000),
even though flow entry is added in OVS switch, right?

I could not make your app work (I don't know how to send packets whose proto is 150),
but I guess that the packet does not matches with installed flow entries.

Please make sure that the packet matches with installed flows, especially "eth_dst".
(You can see "eth_dst" in packets by using Wireshark or some other tools.)

Or, could you let me see the flow table in your OVS?


Thanks,
Fujimoto

On 2017年08月20日 20:11, Attitude Killer wrote:
Hi

Thanks Fujimoto for your response.

I corrected that and it is running now.
I am stuck with another problem.
Here is the code I am running. Everything is going good but I don't understand why there is a flow entry added in ovs switch. As, when a packet arrives it matches the if condition if proto == 150 and total_len <= 2000: and generates a packet_in to the controller every time. When I look into the switch flow table I see entries for both sender and the receiver. If both sender and receiver enteries are in flow table then how come packet_in is being generated everytime?Can you please explain why? I am confused with this. Please help me.



# 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.

from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_3
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet,ipv4,udp
from ryu.lib.packet import ether_types
import time
from struct import *


class SimpleSwitch13(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]

    def __init__(self, *args, **kwargs):
        super(SimpleSwitch13, self).__init__(*args, **kwargs)
        self.mac_to_port = {}
        self.start_time = time.time()
        self.iot_data = []
        self.iot_data_size = 0
        self.ip_ihl=5
        self.ip_ver=4
        self.ip_tos = 0
        self.ip_tot_len = 0  # kernel will fill the correct total length
        self.ip_id = 54321   #Id of this packet
        self.ip_frag_off = 0
        self.ip_ttl = 255
        self.ip_proto = 0
        self.ip_check = 0    # kernel will fill the correct checksum
        self.ip_saddr = 0   #Spoof the source ip address if you want to
        self.ip_daddr = 0
        self.ip_ihl_ver = (self.ip_ver << 4) + self.ip_ihl

@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
    def switch_features_handler(self, ev):
        datapath = ev.msg.datapath
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser

        # install table-miss flow entry
        #
        # We specify NO BUFFER to max_len of the output action due to
        # OVS bug. At this moment, if we specify a lesser number, e.g.,
        # 128, OVS will send Packet-In with invalid buffer_id and
        # truncated packet data. In that case, we cannot output packets
        # correctly.  The bug has been fixed in OVS v2.1.0.
        match = parser.OFPMatch()
        actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,
      ofproto.OFPCML_NO_BUFFER)]
        self.add_flow(datapath, 0, match, actions)


def add_flow(self, datapath, priority, match, actions, buffer_id=None):
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser
        inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,
         actions)]
        if buffer_id:
mod = parser.OFPFlowMod(datapath=datapath, buffer_id=buffer_id,
priority=priority, match=match,
instructions=inst)
        else:
            mod = parser.OFPFlowMod(datapath=datapath, priority=priority,
match=match, instructions=inst)
        datapath.send_msg(mod)

@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
    def _packet_in_handler(self, ev):
        # If you hit this you might want to increase
        # the "miss_send_length" of your switch
        if ev.msg.msg_len < ev.msg.total_len:
self.logger.debug("packet truncated: only %s of %s bytes",
ev.msg.msg_len, ev.msg.total_len)
        msg = ev.msg
        datapath = msg.datapath
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser
        in_port = msg.match['in_port']

        pkt = packet.Packet(msg.data)
        eth = pkt.get_protocols(ethernet.ethernet)[0]

        if eth.ethertype == ether_types.ETH_TYPE_LLDP:
            # ignore lldp packet
            return
        dst = eth.dst
        src = eth.src

        # get ipv4 packet
        ipv4_packet = pkt.get_protocol(ipv4.ipv4)
        if ipv4_packet:
            proto = ipv4_packet.proto
            total_len = ipv4_packet.total_length
            source=ipv4_packet.src
            destination= ipv4_packet.dst
            print "INFORMATION:", proto
            print total_len
        else:
            proto=total_len=0
                #ip_pkt = pkt.get_protocols(ipv4.ipv4)[3]
                        #ip_src = ip_pkt.src



        dpid = datapath.id <http://datapath.id>
self.mac_to_port.setdefault(dpid, {})

self.logger.info <http://self.logger.info>("packet in %s %s %s %s", dpid, src, dst, in_port)
        if proto == 150 and total_len <= 2000:
                data = msg.data
            #print " # stores the packet data"
self.iot_data.append(data)
            #print "# increment size counter"
self.iot_data_size += total_len
elapsed_time = time.time() - self.start_time
                        print "ELAPSED: ", elapsed_time
                        print "BUFFER: ", self.iot_data

                        if elapsed_time > 5 or self.iot_data_size > 3500:
                #if self.iot_server_mac in self.mac_to_port[dpid]:

                 #out_port = self.mac_to_port[dpid][dst]
                    #print "1st condition"
self.no_of_data=len(self.iot_data)
self.ip_proto=proto
self.ip_saddr=source
self.ip_daddr=destination
ip_head= pack('!BBHHHBBH16s16s' , self.ip_ihl_ver, self.ip_tos, self.ip_tot_len, self.ip_id, self.ip_frag_off, self.ip_ttl,self.ip_check,self.ip_proto, self.ip_saddr, self.ip_daddr)
total_pkts= pack('!I', self.no_of_data)
print "TOTALLLL,,,,",self.no_of_data
ip_head="{" + ip_head + "}"
total_pkts="{" + total_pkts + "}"
s='|startofdata|'
data = s.join(self.iot_data)
data="|startofdata|" + data
pckt= ip_head + total_pkts + data
#print repr(ip_head)

self.iot_data = []
print "BUFFER: ", self.iot_data
self.iot_data_size = 0
self.start_time = time.time()

out_port = 2 #ofproto.OFPP_FLOOD
actions = [parser.OFPActionOutput(out_port)]
          #data = ''.join(self.iot_data)
          out = parser.OFPPacketOut(datapath=datapath,
              buffer_id=ofproto.OFP_NO_BUFFER,
              in_port=in_port, actions=actions,
             data=pckt)
print "out--->" , out
datapath.send_msg(out)


        else:

        # learn a mac address to avoid FLOOD next time.
self.mac_to_port[dpid][src] = 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 = [parser.OFPActionOutput(out_port)]

        # install a flow to avoid packet_in next time
            if out_port != ofproto.OFPP_FLOOD:
                match = parser.OFPMatch(in_port=in_port, eth_dst=dst)
# verify if we have a valid buffer_id, if yes avoid to send both
            # flow_mod & packet_out
                if msg.buffer_id != ofproto.OFP_NO_BUFFER:
self.add_flow(datapath, 1, match, actions, msg.buffer_id)
                  return
                else:
 self.add_flow(datapath, 1, match, actions)
            data = None
            if msg.buffer_id == ofproto.OFP_NO_BUFFER:
                data = msg.data
out = parser.OFPPacketOut(datapath=datapath, buffer_id=msg.buffer_id,
in_port=in_port, actions=actions, data=data)
            datapath.send_msg(out)




Thank You
Sheenam

On Fri, Aug 18, 2017 at 12:50 PM, Fujimoto Satoshi <satoshi.fujimo...@gmail.com <mailto:satoshi.fujimo...@gmail.com>> wrote:

    Hi,

    from ryu.ryu.app import simple_switch_13.py
    The above line should be removed.
    It causes a SyntaxError and Ryu fails to load your app.

    Furthermore, other errors seem to exist in your code, such like
    "global name 'time' is not defined".
    Please make sure.

    Thanks,
    Fujimoto



    On 2017年08月18日 12:16, Attitude Killer wrote:
    Hi

    I am trying to run a modified application of simple_switch_13.py.

    I am getting this error:

    loading app simple_switch_13.py
    Traceback (most recent call last):
      File "/usr/local/bin/ryu-manager", line 9, in <module>
        load_entry_point('ryu==4.16', 'console_scripts', 'ryu-manager')()
      File
    "/home/server/.local/lib/python2.7/site-packages/ryu/cmd/manager.py",
    line 98, in main
        app_mgr.load_apps(app_lists)
      File
    "/home/server/.local/lib/python2.7/site-packages/ryu/base/app_manager.py",
    line 415, in load_apps
        cls = self.load_app(app_cls_name)
      File
    "/home/server/.local/lib/python2.7/site-packages/ryu/base/app_manager.py",
    line 392, in load_app
        mod = utils.import_module(name)
      File
    "/home/server/.local/lib/python2.7/site-packages/ryu/utils.py",
    line 106, in import_module
        return importlib.import_module(modname)
      File "/usr/lib/python2.7/importlib/__init__.py", line 37, in
    import_module
        __import__(name)
    ImportError: No module named simple_switch_13.py


    This is my modified code:

    # 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
    <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.

    from ryu.base import app_manager
    from ryu.controller import ofp_event
    from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER
    from ryu.controller.handler import set_ev_cls
    from ryu.ofproto import ofproto_v1_3
    from ryu.lib.packet import packet
    from ryu.lib.packet import ethernet
    from ryu.lib.packet import ether_types
    from ryu.ryu.app import simple_switch_13.py


    class SimpleSwitch13(app_manager.RyuApp):
        OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]

        def __init__(self, *args, **kwargs):
            super(SimpleSwitch13, self).__init__(*args, **kwargs)
            self.mac_to_port = {}
        self.start_time = time.time()
            self.iot_data = []
            self.iot_data_size = 0
            self.ip_ihl=5
            self.ip_ver=4
            self.ip_tos = 0
            self.ip_tot_len = 0  # kernel will fill the correct total
    length
            self.ip_id = 54321   #Id of this packet
            self.ip_frag_off = 0
            self.ip_ttl = 255
            self.ip_proto = 0
            self.ip_check = 0    # kernel will fill the correct checksum
            self.ip_saddr = 0   #Spoof the source ip address if you
    want to
            self.ip_daddr = 0
            self.ip_ihl_ver = (self.ip_ver << 4) + self.ip_ihl

        @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
        def switch_features_handler(self, ev):
            datapath = ev.msg.datapath
            ofproto = datapath.ofproto
            parser = datapath.ofproto_parser

            # install table-miss flow entry
            #
            # We specify NO BUFFER to max_len of the output action due to
            # OVS bug. At this moment, if we specify a lesser number,
    e.g.,
            # 128, OVS will send Packet-In with invalid buffer_id and
            # truncated packet data. In that case, we cannot output
    packets
            # correctly.  The bug has been fixed in OVS v2.1.0.
            match = parser.OFPMatch()
            actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,
    ofproto.OFPCML_NO_BUFFER)]
            self.add_flow(datapath, 0, match, actions)

        def add_flow(self, datapath, priority, match, actions,
    buffer_id=None):
            ofproto = datapath.ofproto
            parser = datapath.ofproto_parser

            inst =
    [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,
    actions)]
            if buffer_id:
                mod = parser.OFPFlowMod(datapath=datapath,
    buffer_id=buffer_id,
    priority=priority, match=match,
    instructions=inst)
            else:
                mod = parser.OFPFlowMod(datapath=datapath,
    priority=priority,
    match=match, instructions=inst)
            datapath.send_msg(mod)

        @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
        def _packet_in_handler(self, ev):
            # If you hit this you might want to increase
            # the "miss_send_length" of your switch
            if ev.msg.msg_len < ev.msg.total_len:
                self.logger.debug("packet truncated: only %s of %s
    bytes",
    ev.msg.msg_len, ev.msg.total_len)
            msg = ev.msg
            datapath = msg.datapath
            ofproto = datapath.ofproto
            parser = datapath.ofproto_parser
            in_port = msg.match['in_port']

            pkt = packet.Packet(msg.data)
            eth = pkt.get_protocols(ethernet.ethernet)[0]

            if eth.ethertype == ether_types.ETH_TYPE_LLDP:
                # ignore lldp packet
                return
            dst = eth.dst
            src = eth.src

            #udp
            udp_pkt= pkt.get_protocol(udp.udp)
            if udp_pkt:
    total_len=udp_pkt.total_length
                    sr_port = udp_pkt.src_port
                    ds_port = udp_pkt.dst_port
                    print "UDPPP PORT --->" , sr_port
                    print "UDP DESTINATION----> ", ds_port
                    print "INFORMATION:UDP LENGTH:", total_len
            else:
                    total_len=0

            # get ipv4 packet
            ipv4_packet = pkt.get_protocol(ipv4.ipv4)
            if ipv4_packet:
                proto = ipv4_packet.proto
                total_len = ipv4_packet.total_length
                source=ipv4_packet.src
                destination= ipv4_packet.dst
                print "INFORMATION:", proto
                print total_len
            else:
                proto=total_len=0
                    #ip_pkt = pkt.get_protocols(ipv4.ipv4)[3]
                            #ip_src = ip_pkt.src

    #ip_dst = ip_pkt.dst

    #               print "IP --->SOURCE:",ip_src'''

            dpid = datapath.id <http://datapath.id>
            self.mac_to_port.setdefault(dpid, {})

    self.logger.info <http://self.logger.info>("packet in %s %s %s
    %s", dpid, src, dst, in_port)
        if proto == 150 and total_len <= 2000:
            #if udp_pkt:
    #       if udp_pkt and ds_port == 5006 and total_len <=2000:
                            data = msg.data
                #print " # stores the packet data"
    self.iot_data.append(data)
                #print "# increment size counter"
                            self.iot_data_size += total_len
                            elapsed_time = time.time() - self.start_time
                            print "ELAPSED: ", elapsed_time
                            print "BUFFER: ", self.iot_data

                            if elapsed_time > 5 or self.iot_data_size
    > 3500:
                    #if self.iot_server_mac in self.mac_to_port[dpid]:

    #          out_port = self.mac_to_port[dpid][dst]
                        #print "1st condition"
    self.no_of_data=len(self.iot_data)
    self.ip_proto=proto
    self.ip_saddr='10.0.11.6'
    self.ip_daddr='10.0.11.5'


    ip_head= pack('!BBHHHBBH16s16s' , self.ip_ihl_ver, self.ip_tos,
    self.ip_tot_len, self.ip_id, self.ip_frag_off,
    self.ip_ttl,self.ip_check,self.ip_proto, self.ip_saddr,
    self.ip_daddr)
    total_pkts= pack('!I', self.no_of_data)
      print "TOTALLLL,,,,",self.no_of_data
    ip_head="{" + ip_head + "}"
    total_pkts="{" + total_pkts + "}"
    s='|startofdata|'
      data = s.join(self.iot_data)
    data="|startofdata|" + data
      pckt= ip_head + total_pkts + data
      #print repr(ip_head)

                    self.iot_data = []
      print "BUFFER: ", self.iot_data
     self.iot_data_size = 0
    self.start_time = time.time()

    out_port = 2 #ofproto.OFPP_FLOOD
      actions = [parser.OFPActionOutput(out_port)]


      #data = ''.join(self.iot_data)


      out = parser.OFPPacketOut(datapath=datapath,
    buffer_id=ofproto.OFP_NO_BUFFER,
    in_port=in_port, actions=actions,
    data=data)
      print "out--->" , out
    datapath.send_msg(out)


        else:
            # learn a mac address to avoid FLOOD next time.
                self.mac_to_port[dpid][src] = 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 = [parser.OFPActionOutput(out_port)]

                # install a flow to avoid packet_in next time
                if out_port != ofproto.OFPP_FLOOD:
                    match = parser.OFPMatch(in_port=in_port, eth_dst=dst)
                    # verify if we have a valid buffer_id, if yes
    avoid to send both
                    # flow_mod & packet_out
                    if msg.buffer_id != ofproto.OFP_NO_BUFFER:
                        self.add_flow(datapath, 1, match, actions,
    msg.buffer_id)
                        return
                    else:
                        self.add_flow(datapath, 1, match, actions)
                data = None
                if msg.buffer_id == ofproto.OFP_NO_BUFFER:
                    data = msg.data

                out = parser.OFPPacketOut(datapath=datapath,
    buffer_id=msg.buffer_id,
    in_port=in_port, actions=actions, data=data)
                datapath.send_msg(out)

    Please help me in knowing what I am doing wrong. I will
    appreciate your help. Thank  You

    Thanks
    Sheenam


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




------------------------------------------------------------------------------
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

------------------------------------------------------------------------------
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