Как создать и отправить PacketOut?

Я пытаюсь создать систему контроля задержек, основанную на идее OpenNetMon. Что я хочу сделать, так это ввести пакет в коммутатор, чтобы этот узел переслал пакет на другой коммутатор, а этот отправил его обратно на контроллер. Наконец, контроллер измерит задержку.

Чтобы отличить этот тип тестовых пакетов для проведения измерений, я изменю поле DSCP из пакета IPv4.

Я имел в виду, что когда контроллер Opendaylight получает PacketIn, этот пакет будет скопирован, но поле DSCP изменено, а затем copy_packet/probe_packet отправит его в плоскость данных.

Я могу извлечь RawPacket, EthernetPacket, IPv4Packet из PacketChain:

    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();
        }
    }

Как я могу отправить эти пакеты?


person Daniel Romero    schedule 25.10.2017    source источник


Ответы (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, который является портом, откуда «приходит» пакет, который используется для сопоставления портов.

person Tama Yoshi    schedule 06.11.2017