Hello, I've been having a problem for days, I can not capture tcp packets
with the controller.
My topology is below:

     +---------------------------+
     |                              |
     |      C0 - Controller   |
     |                              |
     +-------------+-------------+
               c0-eth0
                  |
                  |
              +-+--+--+-+                  +-+--+--+
              | Switch  | ---------------- |      H2   |
              +-+--+--+-+                  +-+--+--+
                  |
                  |
              s1-eth0.2
     +-------------+-------------+------+
     |                                      |
     |      S1 - OpenFlow AP     |
     |                                      |
     |                                      |
     +-+----------+----------+---+
     s1-eth0.1
      +
      |
      |
      v
h1-eth0
+-+--+
| H1 |
+-+--+

I want to modify tcp packets sent by server h1 to another h2 server
connected to the common switch, but when I print the packages, there is no
tcp package, just other types of packages like udp, dhcp, igmp, ipv4, ipv6. I
have no idea why, I'd like the opinion of you.

My code is below, just an example to test here:

from ryu.base import app_manager
# from ryu.ofproto import ofproto_v1_0
from ryu.ofproto import ofproto_v1_5
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
from ryu.lib.packet import ipv4
from ryu.lib.packet import tcp
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER, CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.topology import event

#iperf tcp example

class L2Forwarding(app_manager.RyuApp):
    # OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]
    OFP_VERSIONS = [ofproto_v1_5.OFP_VERSION]

    def __init__(self, *args, **kwargs):
        super(L2Forwarding, self).__init__(*args, **kwargs)

    @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
        print("install the table-miss flow entry")
        # install the table-miss flow entry.
        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):
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser
        print("construct flow_mod message and send it")
        # construct flow_mod message and send it.
        inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,
                                             actions)]
        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):
        msg = ev.msg               # Object representing a packet_in data
structure.
        datapath = msg.datapath    # Switch Datapath ID
        ofproto = datapath.ofproto # OpenFlow Protocol version the entities
negotiated. In our case OF1.3
        parser = datapath.ofproto_parser
        out_port = ofproto.OFPP_LOCAL
        in_port = ofproto.OFPP_LOCAL

        pkt = packet.Packet(msg.data)
        eth = pkt.get_protocol(ethernet.ethernet)

        dst = eth.dst
        src = eth.src

        print(pkt.get_protocol)

        self.logger.info("packet in %s %s", src, dst)

        v4 = pkt.get_protocol(ipv4.ipv4)
        if v4:
            print("IPV4: %s ==> %s " % (v4.src, v4.dst))

            server_ip = v4.dst
            in_port = msg.match['in_port']

            if pkt.get_protocol(tcp.tcp):
                src_port = pkt.src_port
                print("TCP GET %s", "=" * 100)

                #Match in protocol tcp "in_proto=6" and ipv4
"eth_type=0x0800"
                match_tcp = parser.OFPMatch(in_port=in_port,
eth_type=0x0800, ip_proto=6, tcp_flags=0x010, ipv4_dst=server_ip,
tcp_src=src_port)
                actions =
[datapath.ofproto_parser.OFPActionOutput(out_port)]

                self.add_flow(datapath, 1, match_tcp, actions)
------------------------------------------------------------------------------
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