Ryu/OpenFlow 如何将 in_port 号码映射到物理端口

Ryu/OpenFlow how to map in_port number to physical port

对于外行 - 我在问一个 Python/SDN 问题。 一道编程题。

关于这方面的文献不多,我在 the specification. I have built a Ryu controller based on the documentation 中没有看到它并且一切正常,但我有一个相当简单的问题:

如何将 in_port 号映射到实际端口号?在我的例子中,它说我的 in_port 为 5。但是,它实际上进入了我的 Dell 4112F-ON 上的物理端口 1/1/2。两者之间似乎没有任何关联。

如果我想基于每个端口控制流量,我如何知道流量来自哪个物理端口?

编辑:我知道如何转换为 MAC 地址,但我还没有找到一种干净的方法来以编程方式从 MAC 地址确定端口号。

我发现在 Ryu 中,物理端口的名称在 dpset 数据结构中,它是 ryu.controller 的一部分。在 dpset 中有一个名为 port_state 的属性,它是一个类型为 {: } 的字典。您可以使用以下代码提取数据:

    port_list = []

    for port, port_info in simple_switch.dpset.port_state[dpid].items():
        port_list.append(
            {"hw_addr": port_info.hw_addr, "name": port_info.name.decode("utf-8"), "openflow_port": port})

在我的案例中,simpleswitch 是来自 here 的 Ryu REST 控制器的一个实例。但是,您无需休息即可获取数据 - 它是 dpset 中由控制器维护的数据的一部分。