Hi,

Sorry, please attach your code to the mail next time, instead of pasting it.
Indentations in the code are broken in my mail client.

Umm, I could not reproduce your situation...

I sent a packet from h1(10.0.0.1/00.00.00.00.00.01) to h2(10.0.0.2/00.00.00.00.00.02).

Before sending, I confirmed that flows are installed like below:
    $ovs-ofctl -O OpenFlow13 dump-flows s1
    OFPST_FLOW reply (OF1.3) (xid=0x2):
     # to h1(sender)
cookie=0x0, duration=284.712s, table=0, n_packets=8, n_bytes=528, priority=1,in_port=2,dl_dst=00:00:00:00:00:01 actions=output:1
     # to h2(receiver)
cookie=0x0, duration=283.712s, table=0, n_packets=8, n_bytes=416, priority=1,in_port=1,dl_dst=00:00:00:00:00:02 actions=output:2 cookie=0x0, duration=302.615s, table=0, n_packets=5, n_bytes=298, priority=0 actions=CONTROLLER:65535

And I generated a packet and sent it from h1 with this code:
    from scapy.all import *
pkt = Ether(src="00:00:00:00:00:01", dst="00:00:00:00:00:02")/IP(src="10.0.0.1", dst="10.0.0.2", proto=150)
    sendp(pkt)

Then, the packet arrives h2 without any Packet-In.

I don't know how you generated the packet with Scapy, but I think the problem is in the usage of Scapy. Please confirm that the src/dst ethernet address in the generated packet are as you expect.
I think that these address may be changed by Scapy unexpectedly.


Thanks,
Fujimoto




On 2017年08月21日 10:54, Attitude Killer wrote:
Hi Fujimoto

I am generating proto==150 using Scapy tool(packet generator).
So every time I send a packet from sender_host to receiver_host with (proto = 150 and length < 2000), it should be sent to the controller as packet_in and store in a buffer(list) for 5 seconds according to my changes in the code. But, I see flow entry of both sender_host and receiver_host in the flow table after I send the first generated packet. Also I noticed that every packet which I generate is satisfying the proto and length conditions and is storing in the buffer for 5 seconds and is then sent as a packet_out. This is the behavior I don't understand, generated packets are going to controller then how come there is entry in flow table for the hosts?

Can you please put a light on this matter.

I am sorry if it was not clear last time.

Thank You
Sheenam


On Mon, Aug 21, 2017 at 9:05 AM, Fujimoto Satoshi <satoshi.fujimo...@gmail.com <mailto:satoshi.fujimo...@gmail.com>> wrote:

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

Reply via email to