Hi, Boyan

get_protocol() returns None if the argument doesn't match to the packet.
So, I guess Ryu might catch a packet other than TCP or UDP, such as SCTP.

If you doesn't need to make a flow for other than TCP or UDP, the code should be like this:

    if pkt.get_protocol(tcp.tcp):
        l4 = pkt.get_protocol(tcp.tcp)
    else if pkt.get_protocol(udp.udp):
        l4 = pkt.get_protocol(udp.udp)
    else:
        # ignore packets other than TCP or UDP
        return

Thanks,
Fujimoto

On 2017年07月28日 17:39, Boyan Mladenov wrote:
Hi, Fujimoto Satoshi

Thank you very much for the attachment, it is really helpful.

When i run the application i get the following error and i just can't understand why, because everything seems right.
Any suggestions?

File "/home/boyan/.local/lib/python2.7/site-packages/ryu/base/app_manager.py", line 290, in _event_loop
    handler(ev)
  File "/home/boyan/ryu/ryu/app/test99.py", line 93, in _packet_in_handler
    src_port = l4.src_port
AttributeError: 'NoneType' object has no attribute 'src_port'

The code is:

 if pkt.get_protocol(ipv4.ipv4):
            ip = pkt.get_protocol(ipv4.ipv4)
            src_addr = ip.src
            dst_addr = ip.dst

            if pkt.get_protocol(tcp.tcp):
                l4 = pkt.get_protocol(tcp.tcp)
            else:
                l4 = pkt.get_protocol(udp.udp)
            src_port = l4.src_port
            dst_port = l4.dst_port

            out_port = self.mac_to_port[dpid][eth.dst]

            actions = [parser.OFPActionOutput(out_port)]

Thanks

On Thu, Jul 27, 2017 at 4:59 AM, Fujimoto Satoshi <satoshi.fujimo...@gmail.com <mailto:satoshi.fujimo...@gmail.com>> wrote:

    Hi, Boyan
    Sorry for delaying.

    You can use get_protocol() to extract informations from packet.
    For example, get_protocol(tcp.tcp) will get a TCP instance if the
    packet is a TCP protocol packet.
    And the TCP instance has sport/dport fields, so you can get
    informations to build your flows:
    http://ryu.readthedocs.io/en/latest/library_packet_ref/packet_tcp.html
    <http://ryu.readthedocs.io/en/latest/library_packet_ref/packet_tcp.html>

    I tried to modify simple_switch_13.py to build flows for each IP
    src/dst TCP/UDP sport/dport and attach it to this mail.
    I wish it will help your understanding.

    Thanks,
    Fujimoto


    On 2017年07月25日 09:41, Boyan Mladenov wrote:
    Dear, all

    I am trying to modify the simple_switch_13.py so that i can
    extract and save flow statistics about the IP src/dst TCP/UDP
    sport/dport. I got familiar with the simple switch and the
    traffic monitor from where i get the function for continuously
    showing and the data. Also the functions about flow stats request
    and reply.

    I am having problems creating the match fields in order to modify
    the flow table to show ip_src, ip_dst, tcp_sport, tcp_dport,
    protocols.
    I have to create each single line (flow) in the table, In simple
    switch the match is the ingress port, but in my case i have to
    modify it in order to display the IPs IPd TCPs UDPs TCPd UDPd.
    Probably the steps to follow are to extract the info from the
    packet in, building a table like mac_to_port in order to get the
    instructions out to specific port build the flow mod, putting
    together the match and the action and send it to the switch - to
    fill the table.
    I have read the ryubook and ryureadthedocs - saw the functions
    under messages and structures, and other but still çan't figure
    out where to to write the new functions, and what to leave from
    the simple switch.

    I will greatly appreciate if someone is willing to help me. it
    will be really nice to see an example of match field of IPs/d
    build into the simplle switch.
     Thank you in advance .

    from operator import attrgetter
    from ryu.base import app_manager
    from ryu.controller import ofp_event
    from ryu.controller.handler import CONFIG_DISPATCHER,
    MAIN_DISPATCHER, DEAD_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 ipv4
    from ryu.lib.packet import tcp
    from ryu.lib.packet import ethernet
    from ryu.lib.packet import ether_types
    from ryu.lib import hub


    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.datapaths = {}
            self.monitor_thread = hub.spawn(self._monitor)

        @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
            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 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_protocol(ethernet.ethernet)









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