Search in sources :

Example 1 with OFCalientFlowStatsEntry

use of org.projectfloodlight.openflow.protocol.OFCalientFlowStatsEntry in project onos by opennetworkinglab.

the class OpenFlowControllerImpl method processStatsReply.

private void processStatsReply(Dpid dpid, OFStatsReply reply) {
    switch(reply.getStatsType()) {
        case QUEUE:
            Collection<OFQueueStatsEntry> queueStatsEntries = publishQueueStats(dpid, (OFQueueStatsReply) reply);
            if (queueStatsEntries != null) {
                OFQueueStatsReply.Builder rep = OFFactories.getFactory(reply.getVersion()).buildQueueStatsReply();
                rep.setEntries(ImmutableList.copyOf(queueStatsEntries));
                rep.setXid(reply.getXid());
                executorMsgs.execute(new OFMessageHandler(dpid, rep.build()));
            }
            break;
        case PORT_DESC:
            for (OpenFlowSwitchListener l : ofSwitchListener) {
                l.switchChanged(dpid);
            }
            break;
        case FLOW:
            Collection<OFFlowStatsEntry> flowStats = publishFlowStats(dpid, (OFFlowStatsReply) reply);
            if (flowStats != null) {
                OFFlowStatsReply.Builder rep = OFFactories.getFactory(reply.getVersion()).buildFlowStatsReply();
                rep.setEntries(ImmutableList.copyOf(flowStats));
                rep.setXid(reply.getXid());
                executorMsgs.execute(new OFMessageHandler(dpid, rep.build()));
            }
            break;
        case FLOW_LIGHTWEIGHT:
            Collection<OFFlowLightweightStatsEntry> flowLightweightStats = publishFlowStatsLightweight(dpid, (OFFlowLightweightStatsReply) reply);
            if (flowLightweightStats != null) {
                OFFlowLightweightStatsReply.Builder rep = OFFactories.getFactory(reply.getVersion()).buildFlowLightweightStatsReply();
                rep.setEntries(ImmutableList.copyOf(flowLightweightStats));
                rep.setXid(reply.getXid());
                executorMsgs.execute(new OFMessageHandler(dpid, rep.build()));
            }
            break;
        case TABLE:
            Collection<OFTableStatsEntry> tableStats = publishTableStats(dpid, (OFTableStatsReply) reply);
            if (tableStats != null) {
                OFTableStatsReply.Builder rep = OFFactories.getFactory(reply.getVersion()).buildTableStatsReply();
                rep.setEntries(ImmutableList.copyOf(tableStats));
                executorMsgs.execute(new OFMessageHandler(dpid, rep.build()));
            }
            break;
        case GROUP:
            Collection<OFGroupStatsEntry> groupStats = publishGroupStats(dpid, (OFGroupStatsReply) reply);
            if (groupStats != null) {
                OFGroupStatsReply.Builder rep = OFFactories.getFactory(reply.getVersion()).buildGroupStatsReply();
                rep.setEntries(ImmutableList.copyOf(groupStats));
                rep.setXid(reply.getXid());
                executorMsgs.execute(new OFMessageHandler(dpid, rep.build()));
            }
            break;
        case GROUP_DESC:
            Collection<OFGroupDescStatsEntry> groupDescStats = publishGroupDescStats(dpid, (OFGroupDescStatsReply) reply);
            if (groupDescStats != null) {
                OFGroupDescStatsReply.Builder rep = OFFactories.getFactory(reply.getVersion()).buildGroupDescStatsReply();
                rep.setEntries(ImmutableList.copyOf(groupDescStats));
                rep.setXid(reply.getXid());
                executorMsgs.execute(new OFMessageHandler(dpid, rep.build()));
            }
            break;
        case PORT:
            executorMsgs.execute(new OFMessageHandler(dpid, reply));
            break;
        case METER:
            executorMsgs.execute(new OFMessageHandler(dpid, reply));
            break;
        case EXPERIMENTER:
            if (reply instanceof OFCalientFlowStatsReply) {
                OpenFlowSwitch sw = this.getSwitch(dpid);
                // TODO: parse remaining fields such as power levels etc. when we have proper monitoring API
                if (sw == null) {
                    log.error("Switch {} is not found", dpid);
                    break;
                }
                OFFlowStatsReply.Builder fsr = sw.factory().buildFlowStatsReply();
                List<OFFlowStatsEntry> entries = new ArrayList<>();
                for (OFCalientFlowStatsEntry entry : ((OFCalientFlowStatsReply) reply).getEntries()) {
                    // Single instruction, i.e., output to port
                    OFActionOutput action = sw.factory().actions().buildOutput().setPort(entry.getOutPort()).build();
                    OFInstruction instruction = sw.factory().instructions().applyActions(Collections.singletonList(action));
                    OFFlowStatsEntry fs = sw.factory().buildFlowStatsEntry().setMatch(entry.getMatch()).setTableId(entry.getTableId()).setDurationSec(entry.getDurationSec()).setDurationNsec(entry.getDurationNsec()).setPriority(entry.getPriority()).setIdleTimeout(entry.getIdleTimeout()).setHardTimeout(entry.getHardTimeout()).setFlags(entry.getFlags()).setCookie(entry.getCookie()).setInstructions(Collections.singletonList(instruction)).build();
                    entries.add(fs);
                }
                fsr.setEntries(entries);
                flowStats = publishFlowStats(dpid, fsr.build());
                if (flowStats != null) {
                    OFFlowStatsReply.Builder rep = sw.factory().buildFlowStatsReply();
                    rep.setEntries(ImmutableList.copyOf(flowStats));
                    executorMsgs.execute(new OFMessageHandler(dpid, rep.build()));
                }
            } else {
                executorMsgs.execute(new OFMessageHandler(dpid, reply));
            }
            break;
        default:
            log.warn("Discarding unknown stats reply type {}", reply.getStatsType());
            break;
    }
}
Also used : OpenFlowSwitchListener(org.onosproject.openflow.controller.OpenFlowSwitchListener) OFQueueStatsEntry(org.projectfloodlight.openflow.protocol.OFQueueStatsEntry) OFGroupDescStatsEntry(org.projectfloodlight.openflow.protocol.OFGroupDescStatsEntry) OFFlowLightweightStatsEntry(org.projectfloodlight.openflow.protocol.OFFlowLightweightStatsEntry) ArrayList(java.util.ArrayList) OFInstruction(org.projectfloodlight.openflow.protocol.instruction.OFInstruction) OpenFlowSwitch(org.onosproject.openflow.controller.OpenFlowSwitch) OFFlowLightweightStatsReply(org.projectfloodlight.openflow.protocol.OFFlowLightweightStatsReply) OFCalientFlowStatsEntry(org.projectfloodlight.openflow.protocol.OFCalientFlowStatsEntry) OFFlowStatsEntry(org.projectfloodlight.openflow.protocol.OFFlowStatsEntry) OFActionOutput(org.projectfloodlight.openflow.protocol.action.OFActionOutput) OFCalientFlowStatsReply(org.projectfloodlight.openflow.protocol.OFCalientFlowStatsReply) OFTableStatsReply(org.projectfloodlight.openflow.protocol.OFTableStatsReply) OFGroupStatsReply(org.projectfloodlight.openflow.protocol.OFGroupStatsReply) OFGroupStatsEntry(org.projectfloodlight.openflow.protocol.OFGroupStatsEntry) OFTableStatsEntry(org.projectfloodlight.openflow.protocol.OFTableStatsEntry) OFGroupDescStatsReply(org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply) OFFlowStatsReply(org.projectfloodlight.openflow.protocol.OFFlowStatsReply) OFQueueStatsReply(org.projectfloodlight.openflow.protocol.OFQueueStatsReply)

Aggregations

ArrayList (java.util.ArrayList)1 OpenFlowSwitch (org.onosproject.openflow.controller.OpenFlowSwitch)1 OpenFlowSwitchListener (org.onosproject.openflow.controller.OpenFlowSwitchListener)1 OFCalientFlowStatsEntry (org.projectfloodlight.openflow.protocol.OFCalientFlowStatsEntry)1 OFCalientFlowStatsReply (org.projectfloodlight.openflow.protocol.OFCalientFlowStatsReply)1 OFFlowLightweightStatsEntry (org.projectfloodlight.openflow.protocol.OFFlowLightweightStatsEntry)1 OFFlowLightweightStatsReply (org.projectfloodlight.openflow.protocol.OFFlowLightweightStatsReply)1 OFFlowStatsEntry (org.projectfloodlight.openflow.protocol.OFFlowStatsEntry)1 OFFlowStatsReply (org.projectfloodlight.openflow.protocol.OFFlowStatsReply)1 OFGroupDescStatsEntry (org.projectfloodlight.openflow.protocol.OFGroupDescStatsEntry)1 OFGroupDescStatsReply (org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply)1 OFGroupStatsEntry (org.projectfloodlight.openflow.protocol.OFGroupStatsEntry)1 OFGroupStatsReply (org.projectfloodlight.openflow.protocol.OFGroupStatsReply)1 OFQueueStatsEntry (org.projectfloodlight.openflow.protocol.OFQueueStatsEntry)1 OFQueueStatsReply (org.projectfloodlight.openflow.protocol.OFQueueStatsReply)1 OFTableStatsEntry (org.projectfloodlight.openflow.protocol.OFTableStatsEntry)1 OFTableStatsReply (org.projectfloodlight.openflow.protocol.OFTableStatsReply)1 OFActionOutput (org.projectfloodlight.openflow.protocol.action.OFActionOutput)1 OFInstruction (org.projectfloodlight.openflow.protocol.instruction.OFInstruction)1