Pox控制器如何在不安装流规则的情况下发送数据包

时间:2016-04-20 14:35:58

标签: python network-programming sdn pox

我正在使用 pox 控制器编写蠕虫检测代码任何人都可以告诉我如何编写一个函数,我的控制器将直接向主机发送数据包我的意思是假设主机A发送**** TCPSYN ****数据包到主机B现在因为流量规则不可用而不是交换机将数据包发送到控制器现在我想写功能****控制器****将数据包发送到主机B而不安装任何流量规则。我正在编写包含handeling代码的数据包

def _handle_PacketIn(self,event):

packet = event.parsed
log.info("Packet come in %s"%packet.type)
dpidstr = dpid_to_str(event.dpid)
# updating out mac to port mapping
self.macToPort[(event.connection,packet.src)] = event.port
dst_port = self.macToPort.get((event.connection,packet.dst))

tcpp = packet.find('tcp')
if tcpp and tcpp.SYN:
        #here i want to write code where my controller will send tcp syn packet received from host A to the destination host(B) with installing any flow rules
if tcpp and tcpp.ACK:
        #here i want to write code where my controller will receive tcp synack packet and send this syn ack packet to the sender(A) which has sent syn packet to host (B) 

实际上我的算法就像

  1. 假设内部主机A将TCP SYN发送到新的外部主机 B.由于交换机中没有与该数据包匹配的流,因此它将被发送到POX控制器。
  2. 在POX控制器上运行的TRW-CB实例只是转发它 通过交换机分组,无需设置任何流量。与此同时, 算法也进行正常处理(即将B添加到主机列表中 由A亲自联系并将连接请求添加到A的队列中。
  3. B的两个可能的回答是: (a)如果收到从B到A的TCP SYNACK,则再次转发 这到NOX控制器(因为它仍然不匹配任何流量)。上 收到SYNACK后,控制器上的TRW-CB实例安装完毕 交换机中有两个流量。第一个流匹配从中发送的所有数据包 A到B.它包含IP src字段中的A的IP地址和B的IP地址 在IP dst字段中。除了Ether类型(设置为IP),所有其他类型 流中的字段是通配符。第二个流程类似于第一个, 但匹配从B发送到A的所有数据包。每个流包含一个动作 将匹配的数据包转发出交换机的相关端口。广告- 此外,TRW-CB也进行正常处理(即删除它 来自A队列的连接请求和降低A的似然比) (b)如果连接超时,则TRW-CB进行常规处理 (对于连接失败的情况),不与交换机交互。因此没有安装流量。

1 个答案:

答案 0 :(得分:0)

有一些代码可以帮助处理数据包,但无论如何,让我尝试覆盖最简单和通用的情况。

假设您在主类init函数中的事件中有一个数据包监听器,如

core.openflow.addListenerByName("PacketIn", self._handle_PacketIn)

然后在处理事件的函数

def _handle_PacketIn (self, event): msg = of.ofp_packet_out(data=event.ofp) msg.actions.append(of.ofp_action_output(port=of.OFPP_FLOOD)) event.connection.send(msg)

所以msg是控制器发送给交换机的那个,并覆盖所有端口,你只是将传入的数据包充斥到各处。如果您知道目的地,则可以在此处调整以仅将数据包发送到所需的端口。这将在闭环中失败,但它会给你一个起点。 在http://archive.openflow.org/wk/index.php/OpenFlow_Tutorial#ofp_action_output_class处查看forp_action_output类的更多内容。