package net.floodlightcontroller.core; import java.util.ArrayList; import java.util.Collection; import java.util.List; import net.floodlightcontroller.util.EnumBitmaps; import net.floodlightcontroller.util.MACAddress; import org.openflow.protocol.OFFeaturesReply; import org.openflow.protocol.OFPhysicalPort; import org.openflow.protocol.OFPhysicalPort.OFPortState; import org.openflow.protocol.statistics.OFDescriptionStatistics; import org.openflow.util.HexString; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; /** * Represents a switch in the BigSync store. It works out nicely that we * just need to store the FeaturesReply and the DescriptionStatistics in the * store. * @author gregor * */ public class SwitchSyncRepresentation { public static class SyncedPort { @JsonProperty public short portNumber; @JsonProperty public long hardwareAddress; @JsonProperty public String name; @JsonProperty public int config; @JsonProperty public int state; @JsonProperty public int currentFeatures; @JsonProperty public int advertisedFeatures; @JsonProperty public int supportedFeatures; @JsonProperty public int peerFeatures; public static SyncedPort fromImmutablePort(ImmutablePort p) { SyncedPort rv = new SyncedPort(); rv.portNumber = p.getPortNumber(); if (p.getHardwareAddress() == null) { rv.hardwareAddress = 0; } else { rv.hardwareAddress = MACAddress.valueOf(p.getHardwareAddress()).toLong(); } rv.name = p.getName(); rv.config = EnumBitmaps.toBitmap(p.getConfig()); rv.state = p.getStpState().getValue(); if (p.isLinkDown()) rv.state |= OFPortState.OFPPS_LINK_DOWN.getValue(); rv.currentFeatures = EnumBitmaps.toBitmap(p.getCurrentFeatures()); rv.advertisedFeatures = EnumBitmaps.toBitmap(p.getAdvertisedFeatures()); rv.supportedFeatures = EnumBitmaps.toBitmap(p.getSupportedFeatures()); rv.peerFeatures = EnumBitmaps.toBitmap(p.getPeerFeatures()); return rv; } public OFPhysicalPort toOFPhysicalPort() { OFPhysicalPort p = new OFPhysicalPort(); p.setPortNumber(portNumber); p.setHardwareAddress(MACAddress.valueOf(hardwareAddress).toBytes()); p.setName(name); p.setConfig(config); p.setState(state); p.setCurrentFeatures(currentFeatures); p.setAdvertisedFeatures(advertisedFeatures); p.setSupportedFeatures(supportedFeatures); p.setPeerFeatures(peerFeatures); return p; } } // From FeaturesReply private final long dpid; private final int buffers; private final byte tables; private final int capabilities; private final int actions; private final List<SyncedPort> ports; // From OFDescriptionStatistics private final String manufacturerDescription; private final String hardwareDescription; private final String softwareDescription; private final String serialNumber; private final String datapathDescription; /** * @param dpid * @param buffers * @param tables * @param capabilities * @param actions * @param ports * @param manufacturerDescription * @param hardwareDescription * @param softwareDescription * @param serialNumber * @param datapathDescription */ @JsonCreator public SwitchSyncRepresentation( @JsonProperty("dpid") long dpid, @JsonProperty("buffers") int buffers, @JsonProperty("tables") byte tables, @JsonProperty("capabilities") int capabilities, @JsonProperty("actions") int actions, @JsonProperty("ports") List<SyncedPort> ports, @JsonProperty("manufacturerDescription") String manufacturerDescription, @JsonProperty("hardwareDescription") String hardwareDescription, @JsonProperty("softwareDescription") String softwareDescription, @JsonProperty("serialNumber") String serialNumber, @JsonProperty("datapathDescription") String datapathDescription) { this.dpid = dpid; this.buffers = buffers; this.tables = tables; this.capabilities = capabilities; this.actions = actions; this.ports = ports; this.manufacturerDescription = manufacturerDescription; this.hardwareDescription = hardwareDescription; this.softwareDescription = softwareDescription; this.serialNumber = serialNumber; this.datapathDescription = datapathDescription; } public SwitchSyncRepresentation(IOFSwitch sw) { this.dpid = sw.getId(); this.buffers = sw.getBuffers(); this.tables = sw.getTables(); this.capabilities = sw.getCapabilities(); this.actions = sw.getActions(); this.ports = toSyncedPortList(sw.getPorts()); OFDescriptionStatistics d = sw.getDescriptionStatistics(); this.manufacturerDescription = d.getManufacturerDescription(); this.hardwareDescription = d.getHardwareDescription(); this.softwareDescription = d.getSoftwareDescription(); this.serialNumber = d.getSerialNumber(); this.datapathDescription = d.getDatapathDescription(); } public SwitchSyncRepresentation(OFFeaturesReply fr, OFDescriptionStatistics d) { this.dpid = fr.getDatapathId(); this.buffers = fr.getBuffers(); this.tables = fr.getTables(); this.capabilities = fr.getCapabilities(); this.actions = fr.getActions(); this.ports = toSyncedPortList( ImmutablePort.immutablePortListOf(fr.getPorts())); this.manufacturerDescription = d.getManufacturerDescription(); this.hardwareDescription = d.getHardwareDescription(); this.softwareDescription = d.getSoftwareDescription(); this.serialNumber = d.getSerialNumber(); this.datapathDescription = d.getDatapathDescription(); } private static List<SyncedPort> toSyncedPortList(Collection<ImmutablePort> ports) { List<SyncedPort> rv = new ArrayList<SyncedPort>(ports.size()); for (ImmutablePort p: ports) { rv.add(SyncedPort.fromImmutablePort(p)); } return rv; } private static List<OFPhysicalPort> toOFPhysicalPortList(Collection<SyncedPort> ports) { List<OFPhysicalPort> rv = new ArrayList<OFPhysicalPort>(ports.size()); for (SyncedPort p: ports) { rv.add(p.toOFPhysicalPort()); } return rv; } @JsonIgnore public OFFeaturesReply getFeaturesReply() { OFFeaturesReply fr = new OFFeaturesReply(); fr.setDatapathId(dpid); fr.setBuffers(buffers); fr.setTables(tables); fr.setCapabilities(capabilities); fr.setActions(actions); fr.setPorts(toOFPhysicalPortList(ports)); return fr; } @JsonIgnore public OFDescriptionStatistics getDescription() { OFDescriptionStatistics desc = new OFDescriptionStatistics(); desc.setManufacturerDescription(manufacturerDescription); desc.setHardwareDescription(hardwareDescription); desc.setSoftwareDescription(softwareDescription); desc.setSerialNumber(serialNumber); desc.setDatapathDescription(datapathDescription); return desc; } public long getDpid() { return dpid; } public int getBuffers() { return buffers; } public byte getTables() { return tables; } public int getCapabilities() { return capabilities; } public int getActions() { return actions; } public List<SyncedPort> getPorts() { return ports; } public String getManufacturerDescription() { return manufacturerDescription; } public String getHardwareDescription() { return hardwareDescription; } public String getSoftwareDescription() { return softwareDescription; } public String getSerialNumber() { return serialNumber; } public String getDatapathDescription() { return datapathDescription; } @Override public String toString() { String dpidString; dpidString = HexString.toHexString(dpid); return "SwitchSyncRepresentation [DPID=" + dpidString + "]"; } }