Cleaning up driver
Change-Id: I01979232c893496cc117a02a92af4a7b2aebd469
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
index 442dd68..094eef0 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
@@ -750,8 +750,8 @@
}
if (log.isDebugEnabled()) {
- log.debug("Handling OFPortStatus: {} for {}",
- reason, ps);
+ log.debug("Handling OFPortStatus: {} for {} in sw {}",
+ reason, ps, getStringId());
}
if (reason == OFPortReason.DELETE)
diff --git a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
index 0931eca..ad84268 100644
--- a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
+++ b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
@@ -87,7 +87,6 @@
import org.projectfloodlight.openflow.types.TableId;
import org.projectfloodlight.openflow.types.TransportPort;
import org.projectfloodlight.openflow.types.U32;
-import org.projectfloodlight.openflow.types.U64;
import org.projectfloodlight.openflow.util.HexString;
import com.google.common.collect.Sets;
@@ -99,7 +98,6 @@
* None
*/
public class OFSwitchImplCPqD13 extends OFSwitchImplBase implements IOF13Switch {
- private static final int VLAN_ID_OFFSET = 16;
private AtomicBoolean driverHandshakeComplete;
private AtomicBoolean haltStateMachine;
private OFFactory factory;
@@ -123,15 +121,11 @@
private static final int TABLE_TMAC = 1;
private static final int TABLE_IPv4_UNICAST = 2;
private static final int TABLE_MPLS = 3;
- private static final int TABLE_META = 4;
private static final int TABLE_ACL = 5;
private static final short MAX_PRIORITY = (short) 0xffff;
private static final short PRIORITY_MULTIPLIER = (short) 2046;
private static final short MIN_PRIORITY = 0x0;
- private static final U64 METADATA_MASK = U64.of(Long.MAX_VALUE << 1 | 0x1);
-
- ConcurrentHashMap<Integer, OFGroup> l2groups;
private long barrierXidToWaitFor = -1;
private DriverState driverState;
@@ -147,7 +141,6 @@
haltStateMachine = new AtomicBoolean(false);
driverState = DriverState.INIT;
driverHandshakeComplete = new AtomicBoolean(false);
- l2groups = new ConcurrentHashMap<Integer, OFGroup>();
setSwitchDescription(desc);
neighbors = new ConcurrentHashMap<Dpid, Set<PortNumber>>();
ecmpGroups = new ConcurrentHashMap<NeighborSet, EcmpInfo>();
@@ -186,7 +179,6 @@
}
}
-
@Override
public boolean isDriverHandshakeComplete() {
if (!startDriverHandshakeCalled)
@@ -228,8 +220,9 @@
protected void nextDriverState() throws IOException {
DriverState currentState = driverState;
- if (haltStateMachine.get())
+ if (haltStateMachine.get()) {
return;
+ }
switch (currentState) {
case INIT:
driverState = DriverState.SET_TABLE_MISS_ENTRIES;
@@ -602,10 +595,9 @@
}
private void setNeighbors(List<LinkConfig> linkConfigList) {
- List<PortNumber> portlist = new ArrayList<PortNumber>();
for (LinkConfig lg : linkConfigList) {
if (!lg.getType().equals(NetworkConfigManager.PKT_LINK)) {
- return;
+ continue;
}
PktLinkConfig plg = (PktLinkConfig) lg;
if (plg.getDpid1() == getId()) {
@@ -1137,27 +1129,10 @@
}
// *****************************
- // Old Hardcoded Stuff
+ // Unused
// *****************************
- private void configureSwitch() throws IOException {
- // setAsyncConfig();
- // getTableFeatures();
- sendGroupFeaturesRequest();
- setL2Groups();
- sendHandshakeBarrier();
- setL3Groups();
- setL25Groups();
- // setEcmpGroup();
- sendGroupDescRequest();
- populateTableVlan();
- populateTableTMac();
- populateIpTable();
- populateMplsTable();
- populateTableMissEntry(TABLE_ACL, false, false, false, -1);
- sendHandshakeBarrier();
- }
-
+ @SuppressWarnings("unused")
private void setAsyncConfig() throws IOException {
List<OFMessage> msglist = new ArrayList<OFMessage>(3);
OFMessage setAC = null;
@@ -1198,6 +1173,7 @@
write(msglist);
}
+ @SuppressWarnings("unused")
private void decodeAsyncGetReply(OFAsyncGetReply rep) {
long frm = rep.getFlowRemovedMaskEqualMaster();
long frs = rep.getFlowRemovedMaskSlave();
@@ -1214,6 +1190,7 @@
}
+ @SuppressWarnings("unused")
private void getTableFeatures() throws IOException {
OFMessage gtf = factory.buildTableFeaturesStatsRequest()
.setXid(getNextTransactionId())
@@ -1221,6 +1198,7 @@
write(gtf, null);
}
+ @SuppressWarnings("unused")
private void sendGroupFeaturesRequest() throws IOException {
OFMessage gfr = factory.buildGroupFeaturesStatsRequest()
.setXid(getNextTransactionId())
@@ -1228,684 +1206,8 @@
write(gfr, null);
}
-
- /*Create L2 interface groups for all physical ports
- Naming convention followed is the same as OF-DPA spec
- eg. port 1 with allowed vlan 10, is enveloped in group with id,
- 0x0 00a 0001, where the uppermost 4 bits identify an L2 interface,
- the next 12 bits identify the vlan-id, and the lowermost 16 bits
- identify the port number.*/
- private void setL2Groups() throws IOException {
- List<OFMessage> msglist = new ArrayList<OFMessage>();
- for (OFPortDesc p : getPorts()) {
- int pnum = p.getPortNo().getPortNumber();
- int portVlan = getVlanConfig(pnum);
- if (U32.of(pnum).compareTo(U32.of(OFPort.MAX.getPortNumber())) < 1) {
- OFGroup gl2 = OFGroup.of(pnum | (portVlan << VLAN_ID_OFFSET));
- OFAction out = factory.actions().buildOutput()
- .setPort(p.getPortNo()).build();
- OFAction popVlan = factory.actions().popVlan();
- List<OFAction> actions = new ArrayList<OFAction>();
- // actions.add(popVlan);
- actions.add(out);
- OFBucket bucket = factory.buildBucket()
- .setActions(actions).build();
- List<OFBucket> buckets = Collections.singletonList(bucket);
- OFMessage gmAdd = factory.buildGroupAdd()
- .setGroup(gl2)
- .setBuckets(buckets)
- .setGroupType(OFGroupType.INDIRECT)
- .setXid(getNextTransactionId())
- .build();
- msglist.add(gmAdd);
- l2groups.put(pnum, gl2);
- }
- }
- log.debug("Creating {} L2 groups in sw {}", msglist.size(), getStringId());
- write(msglist);
- }
-
- private int getVlanConfig(int portnum) {
- int portVlan = 10 * portnum;
- if ((getId() == 0x1 && portnum == 6) ||
- (getId() == 0x2) ||
- (getId() == 0x3 && portnum == 2)) {
- portVlan = 192; // 0xc0
- }
- return portVlan;
- }
-
-
- // only for ports connected to other routers
- private OFAction getDestAction(int portnum) {
- OFAction setDA = null;
- MacAddress dAddr = null;
- if (getId() == 0x1 && portnum == 6) { // connected to switch 2
- dAddr = MacAddress.of("00:00:02:02:02:80");
- }
- if (getId() == 0x1 && portnum == 7) { // connected to switch 2
- dAddr = MacAddress.of("00:00:02:02:02:80");
- }
- if (getId() == 0x2) {
- if (portnum == 1) { // connected to sw 1
- dAddr = MacAddress.of("00:00:01:01:01:80");
- } else if (portnum == 2) { // connected to sw 3
- dAddr = MacAddress.of("00:00:07:07:07:80");
- }
- }
- if (getId() == 0x3) {
- if (portnum == 2) { // connected to switch 2
- dAddr = MacAddress.of("00:00:02:02:02:80");
- }
- }
-
- if (dAddr != null) {
- OFOxmEthDst dstAddr = factory.oxms().ethDst(dAddr);
- setDA = factory.actions().buildSetField()
- .setField(dstAddr).build();
- }
- return setDA;
- }
-
- /*
- * L3 groups are created for all router ports and they all point to corresponding
- * L2 groups. Only the ports that connect to other routers will have the
- * DA set.
- */
- private void setL3Groups() throws IOException {
- List<OFMessage> msglist = new ArrayList<OFMessage>();
- for (OFGroup gl2 : l2groups.values()) {
- int gnum = gl2.getGroupNumber();
- int portnum = gnum & 0x0000ffff;
- int vlanid = ((gnum & 0x0fff0000) >> VLAN_ID_OFFSET);
- MacAddress sAddr = getRouterMacAddr();
-
- OFGroup gl3 = OFGroup.of(0x20000000 | portnum);
- OFAction group = factory.actions().buildGroup()
- .setGroup(gl2).build();
- OFOxmEthSrc srcAddr = factory.oxms().ethSrc(sAddr);
- OFAction setSA = factory.actions().buildSetField()
- .setField(srcAddr).build();
- OFOxmVlanVid vid = factory.oxms().vlanVid(OFVlanVidMatch.ofVlan(vlanid));
- OFAction setVlan = factory.actions().buildSetField()
- .setField(vid).build();
- OFAction decTtl = factory.actions().decNwTtl();
-
- List<OFAction> actions = new ArrayList<OFAction>();
- actions.add(decTtl); // decrement the IP TTL/do-checksum/check TTL
- // and MTU
- // actions.add(setVlan); // set the vlan-id of the exit-port (and
- // l2group)
- actions.add(setSA); // set this routers mac address
- // make L3Unicast group setDA for known (configured) ports
- // that connect to other routers
- OFAction setDA = getDestAction(portnum);
- if (setDA != null)
- actions.add(setDA);
- actions.add(group);
-
- OFBucket bucket = factory.buildBucket()
- .setActions(actions).build();
- List<OFBucket> buckets = Collections.singletonList(bucket);
- OFMessage gmAdd = factory.buildGroupAdd()
- .setGroup(gl3)
- .setBuckets(buckets)
- .setGroupType(OFGroupType.INDIRECT)
- .setXid(getNextTransactionId())
- .build();
- msglist.add(gmAdd);
- }
- write(msglist);
- log.debug("Creating {} L3 groups in sw {}", msglist.size(), getStringId());
- }
-
- /*
- * L2.5 or mpls-unicast groups are only created for those router ports
- * connected to other router ports. They differ from the corresponding
- * L3-unicast group only by the fact that they decrement the MPLS TTL
- * instead of the IP ttl
- */
- private void setL25Groups() throws IOException {
- List<OFMessage> msglist = new ArrayList<OFMessage>();
- for (OFGroup gl2 : l2groups.values()) {
- int gnum = gl2.getGroupNumber();
- int portnum = gnum & 0x0000ffff;
- int vlanid = ((gnum & 0x0fff0000) >> VLAN_ID_OFFSET);
- MacAddress sAddr = getRouterMacAddr();
- OFAction setDA = getDestAction(portnum);
- // setDA will only be non-null for ports connected to routers
- if (setDA != null) {
- OFGroup gl3 = OFGroup.of(0xa0000000 | portnum); // different id
- // for mpls
- // group
- OFAction group = factory.actions().buildGroup()
- .setGroup(gl2).build();
- OFOxmEthSrc srcAddr = factory.oxms().ethSrc(sAddr);
- OFAction setSA = factory.actions().buildSetField()
- .setField(srcAddr).build();
- OFOxmVlanVid vid = factory.oxms().vlanVid(OFVlanVidMatch.ofVlan(vlanid));
- OFAction setVlan = factory.actions().buildSetField()
- .setField(vid).build();
- OFAction decMplsTtl = factory.actions().decMplsTtl();
- List<OFAction> actions = new ArrayList<OFAction>();
- actions.add(decMplsTtl); // decrement the MPLS
- // TTL/do-checksum/check TTL and MTU
- // actions.add(setVlan); // set the vlan-id of the exit-port
- // (and
- // l2group)
- actions.add(setSA); // set this routers mac address
- actions.add(setDA);
- actions.add(group);
- OFBucket bucket = factory.buildBucket()
- .setActions(actions).build();
- List<OFBucket> buckets = Collections.singletonList(bucket);
- OFMessage gmAdd = factory.buildGroupAdd()
- .setGroup(gl3)
- .setBuckets(buckets)
- .setGroupType(OFGroupType.INDIRECT)
- .setXid(getNextTransactionId())
- .build();
- msglist.add(gmAdd);
- }
- }
- write(msglist);
- log.debug("Creating {} MPLS groups in sw {}", msglist.size(), getStringId());
- }
-
-
private void processGroupFeatures(OFGroupFeaturesStatsReply gfsr) {
log.info("Sw: {} Group Features {}", getStringId(), gfsr);
}
-
-
- private List<String> getMyIps() { // send to controller
- List<String> myIps = new ArrayList<String>();
- if (getId() == 0x1) {
- myIps.add("10.0.2.128");
- myIps.add("10.0.3.128");
- myIps.add("10.0.1.128");
- myIps.add("192.168.0.1");
- }
- if (getId() == 0x2) {
- myIps.add("192.168.0.2");
- }
- if (getId() == 0x3) {
- myIps.add("192.168.0.3");
- myIps.add("7.7.7.128");
- }
- return myIps;
- }
-
- private List<String> getMySubnetIps() { // send to controller
- List<String> subnetIps = new ArrayList<String>();
- if (getId() == 0x1) {
- subnetIps.add("10.0.2.0");
- subnetIps.add("10.0.3.0");
- subnetIps.add("10.0.1.0");
- }
- if (getId() == 0x2) {
- }
- if (getId() == 0x3) {
- subnetIps.add("7.7.7.0");
- }
- return subnetIps;
- }
-
- private class RouteEntry {
- String prefix;
- String mask;
- int nextHopPort;
- String dstMac;
- int label;
-
- public RouteEntry(String prefix, String mask, int nextHopPort, int label) {
- this.prefix = prefix;
- this.mask = mask;
- this.nextHopPort = nextHopPort;
- this.label = label;
- }
-
- public RouteEntry(String prefix, int nextHopPort, String dstMac) {
- this.prefix = prefix;
- this.nextHopPort = nextHopPort;
- this.dstMac = dstMac;
- }
- }
-
- // send out of mpls-group where the next-hop mac-da is already set
- private List<RouteEntry> getRouterNextHopIps() {
- List<RouteEntry> routerNextHopIps = new ArrayList<RouteEntry>();
- if (getId() == 0x1) {
- routerNextHopIps
- .add(new RouteEntry("192.168.0.2", "255.255.255.255", 6, 102));
- routerNextHopIps
- .add(new RouteEntry("192.168.0.3", "255.255.255.255", 6, 103));
- routerNextHopIps.add(new RouteEntry("7.7.7.0", "255.255.255.0", 6, 103));
- }
- if (getId() == 0x2) {
- /* These are required for normal IP routing without labels.
- routerNextHopIps.add(new RouteEntry("192.168.0.1","255.255.255.255",1));
- routerNextHopIps.add(new RouteEntry("192.168.0.3","255.255.255.255",2));
- routerNextHopIps.add(new RouteEntry("10.0.1.0","255.255.255.0",1));
- routerNextHopIps.add(new RouteEntry("10.0.2.0","255.255.255.0",1));
- routerNextHopIps.add(new RouteEntry("10.0.3.0","255.255.255.0",1));
- routerNextHopIps.add(new RouteEntry("7.7.7.0","255.255.255.0",2));*/
- }
- if (getId() == 0x3) {
- routerNextHopIps
- .add(new RouteEntry("192.168.0.2", "255.255.255.255", 2, 102));
- routerNextHopIps
- .add(new RouteEntry("192.168.0.1", "255.255.255.255", 2, 101));
- routerNextHopIps.add(new RouteEntry("10.0.1.0", "255.255.255.0", 2, 101));
- routerNextHopIps.add(new RouteEntry("10.0.2.0", "255.255.255.0", 2, 101));
- routerNextHopIps.add(new RouteEntry("10.0.3.0", "255.255.255.0", 2, 101));
- }
- return routerNextHopIps;
- }
-
- // known host mac-addr, setDA/send out of l3group
- private List<RouteEntry> getHostNextHopIps() {
- List<RouteEntry> hostNextHopIps = new ArrayList<RouteEntry>();
- if (getId() == 0x1) {
- //hostNextHopIps.add(new RouteEntry("10.0.1.1", 1, "00:00:00:00:01:01")); // Just for Test - SSH
- hostNextHopIps.add(new RouteEntry("10.0.2.1", 4, "00:00:00:00:02:01"));
- hostNextHopIps.add(new RouteEntry("10.0.3.1", 5, "00:00:00:00:03:01"));
- }
- if (getId() == 0x2) {
- }
- if (getId() == 0x3) {
- hostNextHopIps.add(new RouteEntry("7.7.7.7", 1, "00:00:07:07:07:07"));
- }
- return hostNextHopIps;
- }
-
- private void populateIpTable() throws IOException {
- // populateMyIps();
- // populateMySubnets();
- populateRoutes();
- populateHostRoutes();
-
- // match for everything else to send to ACL table. Essentially
- // the table miss flow entry
- populateTableMissEntry(TABLE_IPv4_UNICAST, false, true,
- true, TABLE_ACL);
- }
-
- private void populateMyIps() throws IOException {
- List<OFMessage> msglist = new ArrayList<OFMessage>();
- // first all my ip's as exact-matches
- // write-action instruction to send to controller
- List<String> myIps = getMyIps();
- for (int i = 0; i < myIps.size(); i++) {
- OFOxmEthType ethTypeIp = factory.oxms()
- .ethType(EthType.IPv4);
- OFOxmIpv4DstMasked ipPrefix = factory.oxms()
- .ipv4DstMasked(IPv4Address.of(myIps.get(i)), IPv4Address.NO_MASK);
- OFOxmList oxmListSlash32 = OFOxmList.of(ethTypeIp, ipPrefix);
- OFMatchV3 match = factory.buildMatchV3()
- .setOxmList(oxmListSlash32).build();
- OFAction outc = factory.actions().buildOutput()
- .setPort(OFPort.CONTROLLER).setMaxLen(OFPCML_NO_BUFFER)
- .build();
- OFInstruction writeInstr = factory.instructions().buildWriteActions()
- .setActions(Collections.singletonList(outc)).build();
- OFInstruction gotoInstr = factory.instructions().buildGotoTable()
- .setTableId(TableId.of(TABLE_ACL)).build();
- List<OFInstruction> instructions = new ArrayList<OFInstruction>();
- instructions.add(writeInstr);
- instructions.add(gotoInstr);
- OFMessage myIpEntry = factory.buildFlowAdd()
- .setTableId(TableId.of(TABLE_IPv4_UNICAST))
- .setMatch(match)
- .setInstructions(instructions)
- .setPriority(MAX_PRIORITY) // highest priority for exact
- // match
- .setBufferId(OFBufferId.NO_BUFFER)
- .setIdleTimeout(0)
- .setHardTimeout(0)
- .setXid(getNextTransactionId())
- .build();
- msglist.add(myIpEntry);
- }
- write(msglist);
- log.debug("Adding {} my-ip-rules in sw {}", msglist.size(), getStringId());
- }
-
- private void populateMySubnets() throws IOException {
- List<OFMessage> msglist = new ArrayList<OFMessage>();
- // next prefix-based subnet-IP's configured on my interfaces
- // need to ARP for exact-IP, so write-action instruction to send to
- // controller
- // this has different mask and priority than earlier case
- List<String> subnetIps = getMySubnetIps();
- for (int i = 0; i < subnetIps.size(); i++) {
- OFOxmEthType ethTypeIp = factory.oxms()
- .ethType(EthType.IPv4);
- OFOxmIpv4DstMasked ipPrefix = factory.oxms().ipv4DstMasked(
- IPv4Address.of(subnetIps.get(i)),
- IPv4Address.of(0xffffff00)); // '/24' mask
- OFOxmList oxmListSlash24 = OFOxmList.of(ethTypeIp, ipPrefix);
- OFMatchV3 match = factory.buildMatchV3()
- .setOxmList(oxmListSlash24).build();
- OFAction outc = factory.actions().buildOutput()
- .setPort(OFPort.CONTROLLER).setMaxLen(OFPCML_NO_BUFFER)
- .build();
- OFInstruction writeInstr = factory.instructions().buildWriteActions()
- .setActions(Collections.singletonList(outc)).build();
- OFInstruction gotoInstr = factory.instructions().buildGotoTable()
- .setTableId(TableId.of(TABLE_ACL)).build();
- List<OFInstruction> instructions = new ArrayList<OFInstruction>();
- instructions.add(writeInstr);
- instructions.add(gotoInstr);
- OFMessage myIpEntry = factory.buildFlowAdd()
- .setTableId(TableId.of(TABLE_IPv4_UNICAST))
- .setMatch(match)
- .setInstructions(instructions)
- .setPriority((short) 0xfff0)
- .setBufferId(OFBufferId.NO_BUFFER)
- .setIdleTimeout(0)
- .setHardTimeout(0)
- .setXid(getNextTransactionId())
- .build();
- msglist.add(myIpEntry);
- }
- write(msglist);
- log.debug("Adding {} subnet-ip-rules in sw {}", msglist.size(), getStringId());
- msglist.clear();
- }
-
- private void populateRoutes() throws IOException {
- List<OFMessage> msglist = new ArrayList<OFMessage>();
- // addresses where I know the next-hop's mac-address because it is a
- // router port - so I have an L3 interface to it (and an MPLS interface)
- List<RouteEntry> routerNextHopIps = getRouterNextHopIps();
- for (int i = 0; i < routerNextHopIps.size(); i++) {
- OFOxmEthType ethTypeIp = factory.oxms()
- .ethType(EthType.IPv4);
- OFOxmIpv4DstMasked ipPrefix = factory.oxms()
- .ipv4DstMasked(
- IPv4Address.of(routerNextHopIps.get(i).prefix),
- IPv4Address.of(routerNextHopIps.get(i).mask)
- );
- OFOxmList oxmListSlash32 = OFOxmList.of(ethTypeIp, ipPrefix);
- OFMatchV3 match = factory.buildMatchV3()
- .setOxmList(oxmListSlash32).build();
- OFAction outg = factory.actions().buildGroup()
- .setGroup(OFGroup.of(0xa0000000 | // mpls group id
- routerNextHopIps.get(i).nextHopPort))
- .build();
- // lots of actions before forwarding to mpls group, and
- // unfortunately
- // they need to be apply-actions
-
- OFAction pushlabel = factory.actions().pushMpls(EthType.MPLS_UNICAST);
- OFOxmMplsLabel l = factory.oxms()
- .mplsLabel(U32.of(routerNextHopIps.get(i).label));
- OFAction setlabelid = factory.actions().buildSetField()
- .setField(l).build();
- OFAction copyTtlOut = factory.actions().copyTtlOut();
- // OFAction setBos =
- // factory.actions().buildSetField().setField(bos).build();
-
- List<OFAction> writeActions = new ArrayList<OFAction>();
- writeActions.add(pushlabel);
- writeActions.add(copyTtlOut);
- writeActions.add(setlabelid);
- // writeActions.add(setBos); no support in loxigen
-
- // List<OFAction> applyActions = new ArrayList<OFAction>();
- // applyActions.add(pushlabel);
- // applyActions.add(copyTtlOut);
- // OFInstruction applyInstr =
- // factory.instructions().buildApplyActions()
- // .setActions(applyActions).build();
-
- if (getId() == 0x1) {
- OFAction group47 = factory.actions().buildGroup()
- .setGroup(OFGroup.of(47)).build();
- writeActions.add(group47);
- } else {
- writeActions.add(outg); // group will decr mpls-ttl, set
- // mac-sa/da,
- // vlan
- }
-
- OFInstruction writeInstr = factory.instructions().buildWriteActions()
- .setActions(writeActions).build();
- OFInstruction gotoInstr = factory.instructions().buildGotoTable()
- .setTableId(TableId.of(TABLE_ACL)).build();
- List<OFInstruction> instructions = new ArrayList<OFInstruction>();
- instructions.add(writeInstr);
-
- // necessary to match in pseudo-table to overcome cpqd 1.3 flaw
- /*OFInstruction writeMeta = factory.instructions().buildWriteMetadata()
- .setMetadata(U64.of(routerNextHopIps.get(i).label))
- .setMetadataMask(METADATA_MASK).build();
- OFInstruction gotoInstr = factory.instructions().buildGotoTable()
- .setTableId(TableId.of(TABLE_META)).build();*/
- /*instructions.add(applyInstr);
- instructions.add(writeMeta);*/
-
- instructions.add(gotoInstr);
- int priority = -1;
- if (routerNextHopIps.get(i).mask.equals("255.255.255.255"))
- priority = MAX_PRIORITY;
- else
- priority = (short) 0xfff0;
- OFMessage myIpEntry = factory.buildFlowAdd()
- .setTableId(TableId.of(TABLE_IPv4_UNICAST))
- .setMatch(match)
- .setInstructions(instructions)
- .setPriority(priority)
- .setBufferId(OFBufferId.NO_BUFFER)
- .setIdleTimeout(0)
- .setHardTimeout(0)
- .setXid(getNextTransactionId())
- .build();
- msglist.add(myIpEntry);
-
- // need to also handle psuedo-table entries to match-metadata and
- // set mpls
- // label-id
- /*OFOxmEthType ethTypeMpls = factory.oxms()
- .ethType(EthType.MPLS_UNICAST);
- OFOxmMetadataMasked meta = factory.oxms()
- .metadataMasked(
- OFMetadata.ofRaw(routerNextHopIps.get(i).label),
- OFMetadata.NO_MASK);
- OFOxmList oxmListMeta = OFOxmList.of(ethTypeMpls, meta);
- OFMatchV3 matchMeta = factory.buildMatchV3()
- .setOxmList(oxmListMeta).build();
- List<OFAction> writeActions2 = new ArrayList<OFAction>();
- writeActions2.add(setlabelid);
- OFAction outg2 = factory.actions().buildGroup()
- .setGroup(OFGroup.of(routerNextHopIps.get(i).nextHopPort |
- (192 << VLAN_ID_OFFSET)))
- .build();
- writeActions2.add(outg2);
- OFInstruction writeInstr2 = factory.instructions().buildWriteActions()
- .setActions(writeActions2).build();
- OFInstruction gotoInstr2 = factory.instructions().buildGotoTable()
- .setTableId(TableId.of(TABLE_ACL)).build();
- List<OFInstruction> instructions2 = new ArrayList<OFInstruction>();
- // unfortunately have to apply this action too
- OFInstruction applyInstr2 = factory.instructions().buildApplyActions()
- .setActions(writeActions2).build();
- instructions2.add(applyInstr2); */
- // instructions2.add(writeInstr2);
- // instructions2.add(gotoInstr2);
-
- /*OFMatchV3 match3 = factory.buildMatchV3()
- .setOxmList(OFOxmList.of(meta)).build();
- OFInstruction clearInstruction = factory.instructions().clearActions();
- List<OFInstruction> instructions3 = new ArrayList<OFInstruction>();
- OFAction outc = factory.actions().buildOutput()
- .setPort(OFPort.CONTROLLER).setMaxLen(OFPCML_NO_BUFFER)
- .build();
- OFInstruction writec = factory.instructions()
- .writeActions(Collections.singletonList(outc));
- instructions3.add(clearInstruction);
- instructions3.add(writec);
- instructions3.add(gotoInstr2); */
- /*OFMessage myMetaEntry = factory.buildFlowAdd()
- .setTableId(TableId.of(TABLE_META))
- .setMatch(matchMeta)
- .setInstructions(instructions2)
- .setPriority(MAX_PRIORITY)
- .setBufferId(OFBufferId.NO_BUFFER)
- .setIdleTimeout(0)
- .setHardTimeout(0)
- .setXid(getNextTransactionId())
- .build();
- msglist.add(myMetaEntry); */
-
- }
- write(msglist);
- log.debug("Adding {} next-hop-router-rules in sw {}", msglist.size(),
- getStringId());
-
- // add a table-miss entry to table 4 for debugging - leave it out
- // unclear packet state - causes switch to crash
- // populateTableMissEntry(TABLE_META, false, true,
- // true, TABLE_ACL);
- }
-
- private void populateHostRoutes() throws IOException {
- List<OFMessage> msglist = new ArrayList<OFMessage>();
- // addresses where I know the next hop's mac-address and I can set the
- // destination mac in the match-instruction.write-action
- // either I sent out arp-request or I got an arp-request from this host
- List<RouteEntry> hostNextHopIps = getHostNextHopIps();
- for (int i = 0; i < hostNextHopIps.size(); i++) {
- OFOxmEthType ethTypeIp = factory.oxms()
- .ethType(EthType.IPv4);
- OFOxmIpv4DstMasked ipPrefix = factory.oxms()
- .ipv4DstMasked(
- IPv4Address.of(hostNextHopIps.get(i).prefix),
- IPv4Address.NO_MASK); // host addr should be /32
- OFOxmList oxmListSlash32 = OFOxmList.of(ethTypeIp, ipPrefix);
- OFMatchV3 match = factory.buildMatchV3()
- .setOxmList(oxmListSlash32).build();
- OFAction setDmac = null, outg = null;
- OFOxmEthDst dmac = factory.oxms()
- .ethDst(MacAddress.of(hostNextHopIps.get(i).dstMac));
- setDmac = factory.actions().buildSetField()
- .setField(dmac).build();
- outg = factory.actions().buildGroup()
- .setGroup(OFGroup.of(0x20000000 | hostNextHopIps.get(i).nextHopPort)) // l3group
- // id
- .build();
- List<OFAction> writeActions = new ArrayList<OFAction>();
- writeActions.add(setDmac);
- writeActions.add(outg);
- OFInstruction writeInstr = factory.instructions().buildWriteActions()
- .setActions(writeActions).build();
- OFInstruction gotoInstr = factory.instructions().buildGotoTable()
- .setTableId(TableId.of(TABLE_ACL)).build();
- List<OFInstruction> instructions = new ArrayList<OFInstruction>();
- instructions.add(writeInstr);
- instructions.add(gotoInstr);
- OFMessage myIpEntry = factory.buildFlowAdd()
- .setTableId(TableId.of(TABLE_IPv4_UNICAST))
- .setMatch(match)
- .setInstructions(instructions)
- .setPriority(MAX_PRIORITY) // highest priority for exact
- // match
- .setBufferId(OFBufferId.NO_BUFFER)
- .setIdleTimeout(0)
- .setHardTimeout(0)
- .setXid(getNextTransactionId())
- .build();
- msglist.add(myIpEntry);
- }
- write(msglist);
- log.debug("Adding {} next-hop-host-rules in sw {}", msglist.size(), getStringId());
- }
-
- private class MplsEntry {
- int labelid;
- int portnum;
-
- public MplsEntry(int labelid, int portnum) {
- this.labelid = labelid;
- this.portnum = portnum;
- }
- }
-
- private List<MplsEntry> getMplsEntries() {
- List<MplsEntry> myLabels = new ArrayList<MplsEntry>();
- if (getId() == 0x1) {
- myLabels.add(new MplsEntry(101, OFPort.CONTROLLER.getPortNumber()));
- myLabels.add(new MplsEntry(103, 6));
- }
- if (getId() == 0x2) {
- myLabels.add(new MplsEntry(103, 2));
- myLabels.add(new MplsEntry(102, OFPort.CONTROLLER.getPortNumber()));
- myLabels.add(new MplsEntry(101, 1));
- }
- if (getId() == 0x3) {
- myLabels.add(new MplsEntry(103, OFPort.CONTROLLER.getPortNumber()));
- myLabels.add(new MplsEntry(101, 2));
- }
- return myLabels;
- }
-
- private void populateMplsTable() throws IOException {
- List<OFMessage> msglist = new ArrayList<OFMessage>();
- List<MplsEntry> lfibEntries = getMplsEntries();
- for (int i = 0; i < lfibEntries.size(); i++) {
- OFOxmEthType ethTypeMpls = factory.oxms()
- .ethType(EthType.MPLS_UNICAST);
- OFOxmMplsLabel labelid = factory.oxms()
- .mplsLabel(U32.of(lfibEntries.get(i).labelid));
- OFOxmList oxmList = OFOxmList.of(ethTypeMpls, labelid);
- OFMatchV3 matchlabel = factory.buildMatchV3()
- .setOxmList(oxmList).build();
- OFAction poplabel = factory.actions().popMpls(EthType.IPv4);
- OFAction copyttlin = factory.actions().copyTtlIn();
- OFAction sendTo = null;
- if (lfibEntries.get(i).portnum == OFPort.CONTROLLER.getPortNumber()) {
- sendTo = factory.actions().output(OFPort.CONTROLLER,
- OFPCML_NO_BUFFER);
- } else {
- // after popping send to L3 intf, not MPLS intf
- sendTo = factory.actions().group(OFGroup.of(
- 0x20000000 | lfibEntries.get(i).portnum));
- }
- List<OFAction> writeActions = new ArrayList<OFAction>();
- writeActions.add(copyttlin);
- writeActions.add(poplabel);
- writeActions.add(sendTo);
- OFInstruction writeInstr = factory.instructions().buildWriteActions()
- .setActions(writeActions).build();
- OFInstruction gotoInstr = factory.instructions().buildGotoTable()
- .setTableId(TableId.of(TABLE_ACL)).build();
- List<OFInstruction> instructions = new ArrayList<OFInstruction>();
- instructions.add(writeInstr);
- instructions.add(gotoInstr);
- OFMessage myMplsEntry = factory.buildFlowAdd()
- .setTableId(TableId.of(TABLE_MPLS))
- .setMatch(matchlabel)
- .setInstructions(instructions)
- .setPriority(MAX_PRIORITY) // exact match and exclusive
- .setBufferId(OFBufferId.NO_BUFFER)
- .setIdleTimeout(0)
- .setHardTimeout(0)
- .setXid(getNextTransactionId())
- .build();
- msglist.add(myMplsEntry);
- }
- write(msglist);
- log.debug("Adding {} mpls-forwarding-rules in sw {}", msglist.size(),
- getStringId());
-
- // match for everything else to send to ACL table. Essentially
- // the table miss flow entry
- populateTableMissEntry(TABLE_MPLS, false, true,
- true, TABLE_ACL);
-
- }
-
-
}