Created basic network graph objects, and implementation for the southbound API against the Ramcloud datastore
Change-Id: I2172dacb171f27ba2099ee5a52835030d2004689
Created basic objects and southbound API to build the network graph
Change-Id: I061efdf10e5e8549f7192844d10781dc28ee62d4
Added basic northbound get switch method on network graph
Change-Id: I4f2e4d4a4df00979abc927ef0772997dcdebc4e2
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Device.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Device.java
new file mode 100644
index 0000000..5124f82
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Device.java
@@ -0,0 +1,16 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.net.InetAddress;
+import java.util.Collection;
+
+import net.floodlightcontroller.util.MACAddress;
+
+public interface Device {
+ public MACAddress getMacAddress();
+
+ public Collection<InetAddress> getIpAddress();
+
+ public Iterable<Port> getAttachmentPoints();
+
+ public long getLastSeenTime();
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
new file mode 100644
index 0000000..0619087
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
@@ -0,0 +1,37 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import org.openflow.protocol.OFPhysicalPort;
+
+import net.floodlightcontroller.core.IOFSwitch;
+
+public class FloodlightToOnosMappers {
+
+ public static Switch map(NetworkGraph graph, IOFSwitch sw) {
+ SwitchImpl onosSwitch = new SwitchImpl(graph);
+ onosSwitch.setDpid(sw.getId());
+
+ for (OFPhysicalPort port : sw.getPorts()) {
+ onosSwitch.addPort(map(graph, port));
+ }
+
+ return onosSwitch;
+ }
+
+ public static Port map(NetworkGraph graph, OFPhysicalPort port) {
+ PortImpl onosPort = new PortImpl(graph);
+ onosPort.setPortNumber(port.getPortNumber());
+ return onosPort;
+ }
+
+ public static Link map(NetworkGraph graph, net.floodlightcontroller.routing.Link link) {
+ LinkImpl onosLink = new LinkImpl(graph);
+
+ onosLink.setSrcSwitch(link.getSrc());
+ onosLink.setSrcPort(link.getSrcPort());
+ onosLink.setDstSwitch(link.getDst());
+ onosLink.setDstPort(link.getDstPort());
+
+ return onosLink;
+
+ }
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
new file mode 100644
index 0000000..6c84382
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
@@ -0,0 +1,17 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+public interface Link {
+ public Port getSourcePort();
+ public Port getDestinationPort();
+ public Switch getSourceSwitch();
+ public Switch getDestinationSwitch();
+
+ public long getLastSeenTime();
+ public int getCost();
+
+ // Not sure if we want to expose these northbound
+ public long getSourceSwitchDpid();
+ public short getSourcePortNumber();
+ public long getDestinationSwitchDpid();
+ public short getDestinationPortNumber();
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
new file mode 100644
index 0000000..888daae
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
@@ -0,0 +1,93 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+public class LinkImpl extends NetworkGraphObject implements Link {
+
+ private long srcSwitch;
+ private short srcPort;
+ private long dstSwitch;
+ private short dstPort;
+
+ private static final int DEFAULT_COST = 1;
+ private int cost = DEFAULT_COST;
+
+ public LinkImpl(NetworkGraph graph) {
+ super(graph);
+ }
+
+ @Override
+ public Port getSourcePort() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Port getDestinationPort() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Switch getSourceSwitch() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Switch getDestinationSwitch() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public long getLastSeenTime() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public int getCost() {
+ return cost;
+ }
+
+ public void setCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public long getSourceSwitchDpid() {
+ return srcSwitch;
+ }
+
+ public void setSrcSwitch(long srcSwitch) {
+ this.srcSwitch = srcSwitch;
+ }
+
+ @Override
+ public short getSourcePortNumber() {
+ return srcPort;
+ }
+
+ public void setSrcPort(short srcPort) {
+ this.srcPort = srcPort;
+ }
+
+ @Override
+ public long getDestinationSwitchDpid() {
+ return dstSwitch;
+ }
+
+ public void setDstSwitch(long dstSwitch) {
+ this.dstSwitch = dstSwitch;
+ }
+
+ @Override
+ public short getDestinationPortNumber() {
+ return dstPort;
+ }
+
+ public void setDstPort(short dstPort) {
+ this.dstPort = dstPort;
+ }
+
+
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
new file mode 100644
index 0000000..867ae98
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
@@ -0,0 +1,22 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.net.InetAddress;
+
+import net.floodlightcontroller.util.MACAddress;
+
+/**
+ * The northbound interface to the topology network graph. This interface
+ * is presented to the rest of ONOS. It is currently read-only, as we want
+ * only the discovery modules to be allowed to modify the topology.
+ *
+ */
+public interface NetworkGraph {
+ public Switch getSwitch(long dpid);
+ public Iterable<Switch> getSwitches();
+
+ public Iterable<Link> getLinks();
+ public Iterable<Link> getLinksFromSwitch(long dpid);
+
+ public Iterable<Device> getDeviceByIp(InetAddress ipAddress);
+ public Iterable<Device> getDeviceByMac(MACAddress address);
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
new file mode 100644
index 0000000..5f42ef2
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
@@ -0,0 +1,84 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.net.InetAddress;
+
+import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.datastore.topology.RCPort;
+import net.onrc.onos.datastore.topology.RCSwitch;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import edu.stanford.ramcloud.JRamCloud.ObjectDoesntExistException;
+
+public class NetworkGraphImpl implements NetworkGraph {
+
+ private static final Logger log = LoggerFactory.getLogger(NetworkGraphImpl.class);
+
+ @Override
+ public Switch getSwitch(long dpid) {
+ SwitchImpl sw = new SwitchImpl(this);
+
+ RCSwitch rcSwitch = new RCSwitch(dpid);
+ try {
+ rcSwitch.read();
+ } catch (ObjectDoesntExistException e) {
+ log.warn("Tried to get a switch that doesn't exist {}", dpid);
+ return null;
+ }
+
+ sw.setDpid(rcSwitch.getDpid());
+
+ for (byte[] portId : rcSwitch.getAllPortIds()) {
+ RCPort rcPort = RCPort.createFromKey(portId);
+ try {
+ rcPort.read();
+
+ PortImpl port = new PortImpl(this);
+ //port.setDpid(dpid);
+
+ // TODO why are port numbers long?
+ //port.setPortNumber((short)rcPort.getNumber());
+
+ port.setSwitch(sw);
+ sw.addPort(port);
+
+ } catch (ObjectDoesntExistException e) {
+ log.warn("Tried to read port that doesn't exist", rcPort);
+ }
+ }
+
+ return sw;
+ }
+
+ @Override
+ public Iterable<Switch> getSwitches() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Iterable<Link> getLinks() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Iterable<Link> getLinksFromSwitch(long dpid) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Iterable<Device> getDeviceByMac(MACAddress address) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphObject.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphObject.java
new file mode 100644
index 0000000..4bea422
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphObject.java
@@ -0,0 +1,12 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+
+public class NetworkGraphObject {
+
+ protected final NetworkGraph graph;
+
+ public NetworkGraphObject(NetworkGraph graph) {
+ this.graph = graph;
+ }
+
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
new file mode 100644
index 0000000..8299022
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
@@ -0,0 +1,13 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+
+
+public interface Port {
+ public short getNumber();
+ public String getName();
+ public long getHardwareAddress();
+
+ public Switch getSwitch();
+
+ public Link getLink();
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
new file mode 100644
index 0000000..d0b605d
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
@@ -0,0 +1,59 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+public class PortImpl extends NetworkGraphObject implements Port {
+
+ //private long dpid;
+ private Switch sw;
+ private short number;
+
+ public PortImpl(NetworkGraph graph) {
+ super(graph);
+ }
+
+ public void setPortNumber(short portNumber) {
+ number = portNumber;
+ }
+
+ @Override
+ public short getNumber() {
+ return number;
+ }
+
+ /*
+ public void setDpid(long dpid) {
+ this.dpid = dpid;
+ }
+
+ public long getDpid() {
+ return dpid;
+ }
+ */
+
+ @Override
+ public String getName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public long getHardwareAddress() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public Switch getSwitch() {
+ return sw;
+ }
+
+ public void setSwitch(Switch sw) {
+ this.sw = sw;
+ }
+
+ @Override
+ public Link getLink() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SouthboundNetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SouthboundNetworkGraph.java
new file mode 100644
index 0000000..cb52d15
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SouthboundNetworkGraph.java
@@ -0,0 +1,230 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.onrc.onos.datastore.RCObject;
+import net.onrc.onos.datastore.topology.RCLink;
+import net.onrc.onos.datastore.topology.RCPort;
+import net.onrc.onos.datastore.topology.RCSwitch;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import edu.stanford.ramcloud.JRamCloud.ObjectDoesntExistException;
+import edu.stanford.ramcloud.JRamCloud.ObjectExistsException;
+import edu.stanford.ramcloud.JRamCloud.WrongVersionException;
+
+/**
+ * The southbound interface to the network graph which allows clients to
+ * mutate the graph. This class will maintain the invariants of the network
+ * graph. The southbound discovery modules will use this interface to update
+ * the network graph as they learn about the state of the network.
+ *
+ */
+public class SouthboundNetworkGraph {
+ private static final Logger log = LoggerFactory.getLogger(SouthboundNetworkGraph.class);
+
+ private static final int NUM_RETRIES = 10;
+
+
+ public void addSwitch(Switch sw) {
+ RCSwitch rcSwitch = new RCSwitch(sw.getDpid());
+ rcSwitch.setStatus(RCSwitch.STATUS.ACTIVE);
+
+ for (Port port : sw.getPorts()) {
+ RCPort rcPort = new RCPort(sw.getDpid(), (long)port.getNumber());
+ rcPort.setStatus(RCPort.STATUS.ACTIVE);
+ rcSwitch.addPortId(rcPort.getId());
+
+ // TODO check how to write switch+ports together
+ writeObject(rcPort);
+ }
+
+ writeObject(rcSwitch);
+ }
+
+ public void deactivateSwitch(Switch sw) {
+ RCSwitch rcSwitch = new RCSwitch(sw.getDpid());
+
+ List<RCObject> objectsToDeactive = new ArrayList<RCObject>();
+
+ for (int i = 0; i < NUM_RETRIES; i++) {
+ try {
+ rcSwitch.read();
+ rcSwitch.setStatus(RCSwitch.STATUS.INACTIVE);
+ objectsToDeactive.add(rcSwitch);
+
+ for (Port p : sw.getPorts()) {
+ RCPort rcPort = new RCPort(sw.getDpid(), (long)p.getNumber());
+ rcPort.read();
+ rcPort.setStatus(RCPort.STATUS.INACTIVE);
+ objectsToDeactive.add(rcPort);
+ }
+ } catch (ObjectDoesntExistException e) {
+ log.warn("Trying to deactivate an object that doesn't exist", e);
+ // We don't care to much if the object wasn't there, it's
+ // being deactivated anyway
+ }
+
+ try {
+ for (RCObject rcObject : objectsToDeactive) {
+ rcObject.update();
+ }
+ break;
+ } catch (ObjectDoesntExistException e) {
+ // Unlikely, and we don't care anyway.
+ // TODO But, this will cause everything else to fail
+ log.warn("Trying to deactivate object that doesn't exist", e);
+ } catch (WrongVersionException e) {
+ // Need to re-read and retry
+ }
+ }
+ }
+
+ public void addPort(Switch sw, Port port) {
+ RCSwitch rcSwitch = new RCSwitch(sw.getDpid());
+
+ try {
+ rcSwitch.read();
+ } catch (ObjectDoesntExistException e) {
+ log.warn("Add port failed because switch {} doesn't exist", sw.getDpid(), e);
+ return;
+ }
+
+ RCPort rcPort = new RCPort(port.getSwitch().getDpid(), (long)port.getNumber());
+ rcPort.setStatus(RCPort.STATUS.ACTIVE);
+ rcSwitch.addPortId(rcPort.getId());
+
+ writeObject(rcPort);
+ writeObject(rcSwitch);
+ }
+
+ public void deactivatePort(Port port) {
+ RCPort rcPort = new RCPort(port.getSwitch().getDpid(), (long)port.getNumber());
+
+ for (int i = 0; i < NUM_RETRIES; i++) {
+ try {
+ rcPort.read();
+ } catch (ObjectDoesntExistException e) {
+ // oh well, we were deactivating anyway
+ log.warn("Trying to deactivate a port that doesn't exist: {}", port);
+ return;
+ }
+
+ rcPort.setStatus(RCPort.STATUS.INACTIVE);
+
+ try {
+ rcPort.update();
+ break;
+ } catch (ObjectDoesntExistException | WrongVersionException e) {
+ // retry
+ }
+ }
+ }
+
+ public void addLink(Link link) {
+ RCLink rcLink = new RCLink(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber(),
+ link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
+
+ RCPort rcSrcPort = new RCPort(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber());
+ RCPort rcDstPort = new RCPort(link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
+
+ for (int i = 0; i < NUM_RETRIES; i++) {
+ try {
+ rcSrcPort.read();
+ rcDstPort.read();
+ rcLink.create();
+ } catch (ObjectDoesntExistException e) {
+ // port doesn't exist
+ log.error("Add link failed {}", link, e);
+ return;
+ } catch (ObjectExistsException e) {
+ log.debug("Link already exists {}", link);
+ return;
+ }
+
+ rcSrcPort.addLinkId(rcLink.getId());
+ rcDstPort.addLinkId(rcLink.getId());
+
+ rcLink.setStatus(RCLink.STATUS.ACTIVE);
+
+ try {
+ rcLink.update();
+ rcSrcPort.update();
+ rcDstPort.update();
+ break;
+ } catch (ObjectDoesntExistException | WrongVersionException e) {
+ log.debug(" ", e);
+ // retry
+ }
+ }
+ }
+
+ public void removeLink(Link link) {
+ RCLink rcLink = new RCLink(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber(),
+ link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
+
+ RCPort rcSrcPort = new RCPort(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber());
+ RCPort rcDstPort = new RCPort(link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
+
+ for (int i = 0; i < NUM_RETRIES; i++) {
+ try {
+ rcSrcPort.read();
+ rcDstPort.read();
+ rcLink.read();
+ } catch (ObjectDoesntExistException e) {
+ log.error("Remove link failed {}", link, e);
+ return;
+ }
+
+ rcSrcPort.removeLinkId(rcLink.getId());
+ rcDstPort.removeLinkId(rcLink.getId());
+
+ try {
+ rcSrcPort.update();
+ rcDstPort.update();
+ rcLink.delete();
+ } catch (ObjectDoesntExistException e) {
+ log.error("Remove link failed {}", link, e);
+ return;
+ } catch (WrongVersionException e) {
+ // retry
+ }
+ }
+ }
+
+ public void updateDevice(Device device) {
+ // TODO implement
+ }
+
+ public void removeDevice(Device device) {
+ // TODO implement
+ }
+
+ // TODO what happens if this fails? why could it fail?
+ private void writeObject(RCObject object) {
+ for (int i = 0; i < NUM_RETRIES; i++) {
+ try {
+ object.create();
+ } catch (ObjectExistsException e) {
+ try {
+ object.read();
+ } catch (ObjectDoesntExistException e1) {
+ // TODO Auto-generated catch block
+ log.error(" ", e);
+ return;
+ }
+ }
+
+ try {
+ // TODO check API for writing without caring what's there
+ object.update();
+ break;
+ } catch (ObjectDoesntExistException | WrongVersionException e) {
+ log.debug(" ", e);
+ // re-read and retry
+ }
+ }
+ }
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
new file mode 100644
index 0000000..3de47ce
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
@@ -0,0 +1,26 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.util.Collection;
+
+import net.onrc.onos.ofcontroller.util.FlowEntry;
+
+public interface Switch {
+ public long getDpid();
+
+ public Collection<Port> getPorts();
+
+ public Port getPort(short number);
+
+
+ // Flows
+ public Collection<FlowEntry> getFlowEntries();
+
+ // Graph traversal API
+ public Iterable<Switch> getNeighbors();
+
+ public Iterable<Link> getLinks();
+
+ public Link getLinkToNeighbor(long dpid);
+
+ public Collection<Device> getDevices();
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
new file mode 100644
index 0000000..7b83224
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
@@ -0,0 +1,99 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import edu.stanford.ramcloud.JRamCloud.ObjectDoesntExistException;
+import edu.stanford.ramcloud.JRamCloud.WrongVersionException;
+import net.onrc.onos.datastore.topology.RCPort;
+import net.onrc.onos.datastore.topology.RCSwitch;
+import net.onrc.onos.ofcontroller.util.FlowEntry;
+
+public class SwitchImpl extends NetworkGraphObject implements Switch {
+
+ private long dpid;
+ private final Map<Short, Port> ports;
+
+ public SwitchImpl(NetworkGraph graph) {
+ super(graph);
+
+ ports = new HashMap<Short, Port>();
+ }
+
+ @Override
+ public long getDpid() {
+ return dpid;
+ }
+
+ @Override
+ public Collection<Port> getPorts() {
+ return Collections.unmodifiableCollection(ports.values());
+ }
+
+ @Override
+ public Port getPort(short number) {
+ return ports.get(number);
+ }
+
+ @Override
+ public Collection<FlowEntry> getFlowEntries() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Iterable<Switch> getNeighbors() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Link getLinkToNeighbor(long neighborDpid) {
+ for (Link link : graph.getLinksFromSwitch(dpid)) {
+ if (link.getDestinationSwitch().getDpid() == neighborDpid) {
+ return link;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Collection<Device> getDevices() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void setDpid(long dpid) {
+ this.dpid = dpid;
+ }
+
+ public void addPort(Port port) {
+ this.ports.put(port.getNumber(), port);
+ }
+
+ @Override
+ public Iterable<Link> getLinks() {
+ return graph.getLinksFromSwitch(dpid);
+ }
+
+ public void store() {
+ RCSwitch rcSwitch = new RCSwitch(dpid);
+
+ for (Port port : ports.values()) {
+ RCPort rcPort = new RCPort(dpid, (long)port.getNumber());
+ rcSwitch.addPortId(rcPort.getId());
+ }
+
+
+ try {
+ rcSwitch.update();
+
+ } catch (ObjectDoesntExistException | WrongVersionException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+}