我正在尝试学习POX控制器中的forwarding.l3_learning示例
在到期处理程序中,如果缓冲区中的数据包的时间到期,则为
从控制器中删除。
稍后控制器指示交换机丢弃这些行中的数据包:
po = of.ofp_packet_out(buffer_id = buffer_id, in_port = in_port)
core.openflow.sendToDPID(dpid, po)
我没有在创建的消息中看到这样的特定指令要切换。 我不明白交换机如何知道它应该丢弃数据包。
答案 0 :(得分:1)
这是一条没有操作的PACKET_OUT
消息。由于没有操作,交换机只丢弃数据包。如果您希望交换机再次应用匹配(例如,当数据包从网络进入时),您需要将操作明确设置为output:OFPP_TABLE
。
OpenFlow规范中并未明确说明,但所有交换机实现都以这种方式工作(例如,请参阅here)。
完全没有动作发送PACKET_OUT
的原因是因为交换机将数据包保存在缓冲区中(在buffer_id
指定的插槽中)直到控制器告诉交换机什么与它有关。随着时间的推移,如果控制器从不对数据包执行任何操作,这些缓冲区将会填满,因此通过显式发送它们而不执行任何操作,缓冲区将被释放。
如果交换机中的所有缓冲区已满,则会将buffer_id
消息内的数据包(而不仅仅是PACKET_IN
)发送到控制器,从而降低性能。