searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

RYU控制器中实现一个packet out一个ARP报文

2023-03-17 08:09:56
39
0

 

在如下这段代码示例中,我们定义一个名为PacketOutArp的RYU应用程序,它将使用OpenFlow协议版本1.0进行通信。在应用程序的初始化方法中,我们不需要执行任何操作,因此我们只是调用了父类的初始化方法。

然后,我们定义了一个名为switch_features_handler的方法,该方法将在交换机连接到控制器并发送交换机特性消息时被调用。在这个方法中,我们首先从事件消息中获取datapath、ofproto和parser对象。然后,我们构建了一个ARP请求报文,并将其封装在一个Packet对象中。

接下来,我们创建了一个输出动作列表,该列表只包含一个动作:将数据包输出到与接收到数据包的输入端口相同的端口。我们使用datapath和parser对象构建了一个packet-out消息,其中包含了上述动作列表和我们构建的ARP报文。最后,我们通过datapath对象的send_msg方法将packet-out消息发送给交换机,从而实现了发送ARP请求报文的目的。

请注意,这个代码是使用OpenFlow 1.0协议编写的,如果使用其他版本的协议,一些细节上的差异需要

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_0, ether
from ryu.lib.packet import ethernet, arp
from ryu.lib.packet.packet import Packet
from ryu.lib.packet import packet

class PacketOutArp(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]

    def __init__(self, *args, **kwargs):
        super(PacketOutArp, 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

        # 构建ARP报文
        src_mac = '00:00:00:01:01:01'
        dst_mac = 'ff:ff:ff:ff:ff:ff'
        src_ip = '192.168.2.1'
        dst_ip = '192.168.2.2'
        pkt = Packet()
        pkt.add_protocol(ethernet.ethernet(src=src_mac, dst=dst_mac, ethertype=ether.ETH_TYPE_ARP))
        pkt.add_protocol(arp.arp(opcode=arp.ARP_REQUEST, src_mac=src_mac, src_ip=src_ip, dst_mac=dst_mac, dst_ip=dst_ip))
        pkt.serialize()

        # 构建packet-out消息
        actions = [parser.OFPActionOutput(ofproto.OFPP_IN_PORT)]
        out = parser.OFPPacketOut(datapath=datapath, buffer_id=ofproto.OFP_NO_BUFFER, in_port=ofproto.OFPP_CONTROLLER,
                                  actions=actions, data=pkt.data)
        datapath.send_msg(out)

 

 

0条评论
0 / 1000
云云生息
20文章数
0粉丝数
云云生息
20 文章 | 0 粉丝
原创

RYU控制器中实现一个packet out一个ARP报文

2023-03-17 08:09:56
39
0

 

在如下这段代码示例中,我们定义一个名为PacketOutArp的RYU应用程序,它将使用OpenFlow协议版本1.0进行通信。在应用程序的初始化方法中,我们不需要执行任何操作,因此我们只是调用了父类的初始化方法。

然后,我们定义了一个名为switch_features_handler的方法,该方法将在交换机连接到控制器并发送交换机特性消息时被调用。在这个方法中,我们首先从事件消息中获取datapath、ofproto和parser对象。然后,我们构建了一个ARP请求报文,并将其封装在一个Packet对象中。

接下来,我们创建了一个输出动作列表,该列表只包含一个动作:将数据包输出到与接收到数据包的输入端口相同的端口。我们使用datapath和parser对象构建了一个packet-out消息,其中包含了上述动作列表和我们构建的ARP报文。最后,我们通过datapath对象的send_msg方法将packet-out消息发送给交换机,从而实现了发送ARP请求报文的目的。

请注意,这个代码是使用OpenFlow 1.0协议编写的,如果使用其他版本的协议,一些细节上的差异需要

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_0, ether
from ryu.lib.packet import ethernet, arp
from ryu.lib.packet.packet import Packet
from ryu.lib.packet import packet

class PacketOutArp(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]

    def __init__(self, *args, **kwargs):
        super(PacketOutArp, 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

        # 构建ARP报文
        src_mac = '00:00:00:01:01:01'
        dst_mac = 'ff:ff:ff:ff:ff:ff'
        src_ip = '192.168.2.1'
        dst_ip = '192.168.2.2'
        pkt = Packet()
        pkt.add_protocol(ethernet.ethernet(src=src_mac, dst=dst_mac, ethertype=ether.ETH_TYPE_ARP))
        pkt.add_protocol(arp.arp(opcode=arp.ARP_REQUEST, src_mac=src_mac, src_ip=src_ip, dst_mac=dst_mac, dst_ip=dst_ip))
        pkt.serialize()

        # 构建packet-out消息
        actions = [parser.OFPActionOutput(ofproto.OFPP_IN_PORT)]
        out = parser.OFPPacketOut(datapath=datapath, buffer_id=ofproto.OFP_NO_BUFFER, in_port=ofproto.OFPP_CONTROLLER,
                                  actions=actions, data=pkt.data)
        datapath.send_msg(out)

 

 

文章来自个人专栏
网络技术
20 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0