【问题标题】:How to create and send a PacketOut?如何创建和发送 PacketOut?
【发布时间】:2017-11-07 03:08:31
【问题描述】:

我正在尝试基于 OpenNetMon 的想法做一个延迟监控系统。我想要做的是向交换机注入一个数据包,以便该节点将数据包转发到另一台交换机,然后这个节点将其发送回控制器。最后,控制器将测量延迟。

为了区分这种探测数据包以进行测量,我将从 IPv4 数据包中修改 DSCP 字段。

我的想法是当 Opendaylight 控制器收到一个 PacketIn 时,这个会被复制,但 DSCP 字段被修改,然后copyed_pa​​cket/probe_packet 会将它发送到数据平面。

我可以从 PacketChain 中提取 RawPacket、EthernetPacket、IPv4Packet:

    RawPacket rawPacket = null;
    EthernetPacket ethernetPacket = null;
    Ipv4Packet ipv4Packet = null;

    for (PacketChain packetChain : packetReceived.getPacketChain()) {
        if (packetChain.getPacket() instanceof RawPacket) {
            rawPacket = (RawPacket) packetChain.getPacket();
        } else if (packetChain.getPacket() instanceof EthernetPacket) {
            ethernetPacket = (EthernetPacket) packetChain.getPacket();
        } else if (packetChain.getPacket() instanceof Ipv4Packet) {
            ipv4Packet = (Ipv4Packet) packetChain.getPacket();
        }
    }

如何发送这些数据包?

【问题讨论】:

    标签: java sdn mininet opendaylight


    【解决方案1】:

    您想要使用 PacketProcessingService 进行以下操作:

    NodeConnectorId egress = TABLE_PORT;
    TransmitPacketInput input = new TransmitPacketInputBuilder()
                                    .setNode(nodeRef(linkDef.srcNodeId))
                                    .setEgress(nodeConnectorRef(linkDef.srcNodeId, egress))
                                    .setPayload(STUFF)
                                    .build();
    packetProcessingService.transmitPacket(input);
    

    使用以下实用程序:

    // reserved ports
    public final static NodeConnectorId INGRESS_PORT = new NodeConnectorId("0xfffffff8");
    public final static NodeConnectorId TABLE_PORT = new NodeConnectorId("0xfffffff9");
    public final static NodeConnectorId NORMAL_PORT = new NodeConnectorId("0xfffffffa"); // optional functionality
    public final static NodeConnectorId FLOOD_PORT = new NodeConnectorId("0xfffffffb"); // optional functionality
    public final static NodeConnectorId ALL_PORT = new NodeConnectorId("0xfffffffc");
    public final static NodeConnectorId CONTROLLER_PORT = new NodeConnectorId("0xfffffffd");
    public final static NodeConnectorId LOCAL_PORT = new NodeConnectorId("0xfffffffe");
    public final static NodeConnectorId ANY_PORT = new NodeConnectorId("0xffffffff");
    
    public static final InstanceIdentifier<Nodes> NODES_IID = InstanceIdentifier.builder(Nodes.class).build();
    
    public static InstanceIdentifier<Node> nodeIId(NodeId nodeId) {
        return NODES_IID.child(Node.class, new NodeKey(nodeId));
    }
    
    public static NodeRef nodeRef(NodeId nodeId) {
        return new NodeRef(nodeIId(nodeId));
    }
    
    public static InstanceIdentifier<NodeConnector> nodeConnectorIId(NodeId nodeId, NodeConnectorId ncId) {
        return NODES_IID.child(Node.class, new NodeKey(nodeId)).child(NodeConnector.class, new NodeConnectorKey(ncId));
    }
    
    public static NodeConnectorRef nodeConnectorRef(NodeId nodeId, NodeConnectorId ncId) {
        return new NodeConnectorRef(nodeConnectorIId(nodeId, ncId));
    }
    

    此外,您还可以设置 Ingress,即数据包“来自”的端口,供入端口匹配器使用。

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 2018-06-16
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多