2017-10-25 16 views
0

OpenNetMon 아이디어를 기반으로 대기 시간 모니터링 시스템을 수행하려고합니다. 내가하고 싶은 일은 패킷을 스위치에 주입하여이 노드가 패킷을 다른 스위치로 전달하고이 패킷을 다른 스위치로 다시 전송하는 것입니다. 마지막으로 컨트롤러는 대기 시간을 측정합니다.PacketOut을 생성하고 보내는 방법은 무엇입니까?

이러한 종류의 프로브 패킷을 구별하기 위해 측정을하기 위해 IPv4 패킷에서 DSCP 필드를 수정합니다.

Opendaylight 컨트롤러가 PacketIn을 받으면이 것이 복사되지만 DSCP 필드가 수정 된 다음 copied_packet/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(); 
     } 
    } 

가 어떻게 이러한 패킷을 보낼 수 있습니까?

답변

0

당신은 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)); 
} 

을, 당신은 또한 침투 설정할 수 있습니다, 어디 in-port matchers에 의해 사용되는 '오는 패킷'입니다.