private void sendGroupStatistic() { if (log.isTraceEnabled()) { log.trace("sendGroupStatistics {}:{}", sw.getStringId(), sw.getRole()); } if (sw.getRole() != RoleState.MASTER) { return; } Long statsXid = OpenFlowGroupProvider.getXidAndAdd(2); OFGroupStatsRequest statsRequest = sw.factory().buildGroupStatsRequest() .setGroup(OFGroup.ALL) .setXid(statsXid) .build(); sw.sendMsg(statsRequest); Long descXid = statsXid + 1; OFGroupDescStatsRequest descStatsRequest = sw.factory().buildGroupDescStatsRequest() .setXid(descXid) .build(); sw.sendMsg(descStatsRequest); }
/** * {@inheritDoc} */ @Override public OFFlowStatsReply dumpFlowTable(final DatapathId dpid) { OFFlowStatsReply values = null; IOFSwitch sw = ofSwitchService.getSwitch(dpid); if (sw == null) { throw new IllegalArgumentException(String.format("Switch %s was not found", dpid.toString())); } OFFactory ofFactory = sw.getOFFactory(); OFFlowStatsRequest flowRequest = ofFactory.buildFlowStatsRequest() .setMatch(sw.getOFFactory().matchWildcardAll()) .setTableId(TableId.ALL) .setOutPort(OFPort.ANY) .setOutGroup(OFGroup.ANY) .setCookieMask(U64.ZERO) .build(); try { ListenableFuture<OFFlowStatsReply> future = sw.writeRequest(flowRequest); values = future.get(10, TimeUnit.SECONDS); } catch (ExecutionException | InterruptedException | TimeoutException e) { logger.error("Could not get flow stats: {}", e.getMessage()); } return values; }
@Override public void startDriverHandshake() { if (startDriverHandshakeCalled) { throw new SwitchDriverSubHandshakeAlreadyStarted(); } startDriverHandshakeCalled = true; OFFlowMod fm = factory().buildFlowDelete() .setTableId(TableId.ALL) .setOutGroup(OFGroup.ANY) .build(); sendMsg(Collections.singletonList(fm)); OFGroupMod gm = factory().buildGroupDelete() .setGroup(OFGroup.ALL) .setGroupType(OFGroupType.ALL) .build(); sendMsg(Collections.singletonList(gm)); OFMeterMod mm = factory().buildMeterMod() .setMeterId(MeterId.ALL.id()) .build(); sendMsg(Collections.singletonList(mm)); barrierXid = getNextTransactionId(); OFBarrierRequest barrier = factory().buildBarrierRequest() .setXid(barrierXid).build(); sendHandshakeMessage(barrier); }
/** * Builds the GroupAdd OF message. * * @return GroupAdd OF message */ public OFGroupAdd buildGroupAdd() { List<OFBucket> ofBuckets = new ArrayList<OFBucket>(); for (GroupBucket bucket: buckets.buckets()) { List<OFAction> actions = buildActions(bucket.treatment()); OFBucket.Builder bucketBuilder = factory.buildBucket(); bucketBuilder.setActions(actions); if (type == GroupDescription.Type.SELECT) { bucketBuilder.setWeight(1); } if (type == GroupDescription.Type.FAILOVER && bucket.watchPort() != null) { bucketBuilder.setWatchPort(OFPort.of((int) bucket.watchPort().toLong())); } else { bucketBuilder.setWatchPort(OFPort.ANY); } if (type == GroupDescription.Type.FAILOVER && bucket.watchGroup() != null) { bucketBuilder.setWatchGroup(OFGroup.of(bucket.watchGroup().id())); } else { bucketBuilder.setWatchGroup(OFGroup.ANY); } OFBucket ofBucket = bucketBuilder.build(); ofBuckets.add(ofBucket); } OFGroupAdd groupMsg = factory.buildGroupAdd() .setGroup(OFGroup.of(groupId.id())) .setBuckets(ofBuckets) .setGroupType(getOFGroupType(type)) .setXid(xid) .build(); return groupMsg; }
/** * Builds the GroupMod OF message. * * @return GroupMod OF message */ public OFGroupMod buildGroupMod() { List<OFBucket> ofBuckets = new ArrayList<OFBucket>(); for (GroupBucket bucket: buckets.buckets()) { List<OFAction> actions = buildActions(bucket.treatment()); OFBucket.Builder bucketBuilder = factory.buildBucket(); bucketBuilder.setActions(actions); if (type == GroupDescription.Type.SELECT) { bucketBuilder.setWeight(1); } if (type == GroupDescription.Type.FAILOVER && bucket.watchPort() != null) { bucketBuilder.setWatchPort(OFPort.of((int) bucket.watchPort().toLong())); } else { bucketBuilder.setWatchPort(OFPort.ANY); } if (type == GroupDescription.Type.FAILOVER && bucket.watchGroup() != null) { bucketBuilder.setWatchGroup(OFGroup.of(bucket.watchGroup().id())); } else { bucketBuilder.setWatchGroup(OFGroup.ANY); } OFBucket ofBucket = bucketBuilder.build(); ofBuckets.add(ofBucket); } OFGroupMod groupMsg = factory.buildGroupModify() .setGroup(OFGroup.of(groupId.id())) .setBuckets(ofBuckets) .setGroupType(getOFGroupType(type)) .setXid(xid) .build(); return groupMsg; }
/** * Builds the GroupDel OF message. * * @return GroupDel OF message */ public OFGroupDelete buildGroupDel() { OFGroupDelete groupMsg = factory.buildGroupDelete() .setGroup(OFGroup.of(groupId.id())) .setGroupType(OFGroupType.SELECT) .setXid(xid) .build(); return groupMsg; }
@Test public void groupModFailure() { TestOpenFlowGroupProviderService testProviderService = (TestOpenFlowGroupProviderService) providerService; GroupId groupId = new DefaultGroupId(1); List<GroupBucket> bucketList = Lists.newArrayList(); TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder(); builder.setOutput(PortNumber.portNumber(1)); GroupBucket bucket = DefaultGroupBucket.createSelectGroupBucket(builder.build()); bucketList.add(bucket); GroupBuckets buckets = new GroupBuckets(bucketList); List<GroupOperation> operationList = Lists.newArrayList(); GroupOperation operation = GroupOperation.createAddGroupOperation(groupId, GroupDescription.Type.SELECT, buckets); operationList.add(operation); GroupOperations operations = new GroupOperations(operationList); provider.performGroupOperation(deviceId, operations); OFGroupModFailedErrorMsg.Builder errorBuilder = OFFactories.getFactory(OFVersion.OF_13).errorMsgs().buildGroupModFailedErrorMsg(); OFGroupMod.Builder groupBuilder = OFFactories.getFactory(OFVersion.OF_13).buildGroupModify(); groupBuilder.setGroupType(OFGroupType.ALL); groupBuilder.setGroup(OFGroup.of(1)); errorBuilder.setCode(OFGroupModFailedCode.GROUP_EXISTS); errorBuilder.setXid(provider.getXidAndAdd(0) - 1); controller.processPacket(dpid1, errorBuilder.build()); assertNotNull("Operation failed should not be null", testProviderService.failedOperation); }
@Override public void switchActivated(DatapathId switchId) { IOFSwitch sw = switchService.getSwitch(switchId); if (sw == null) { log.warn("Switch {} was activated but had no switch object in the switch service. Perhaps it quickly disconnected", switchId); return; } if (OFDPAUtils.isOFDPASwitch(sw)) { sw.write(sw.getOFFactory().buildFlowDelete() .setTableId(TableId.ALL) .build() ); sw.write(sw.getOFFactory().buildGroupDelete() .setGroup(OFGroup.ANY) .setGroupType(OFGroupType.ALL) .build() ); sw.write(sw.getOFFactory().buildGroupDelete() .setGroup(OFGroup.ANY) .setGroupType(OFGroupType.INDIRECT) .build() ); sw.write(sw.getOFFactory().buildBarrierRequest().build()); List<OFPortModeTuple> portModes = new ArrayList<OFPortModeTuple>(); for (OFPortDesc p : sw.getPorts()) { portModes.add(OFPortModeTuple.of(p.getPortNo(), OFPortMode.ACCESS)); } if (log.isWarnEnabled()) { log.warn("For OF-DPA switch {}, initializing VLAN {} on ports {}", new Object[] { switchId, VlanVid.ZERO, portModes}); } OFDPAUtils.addLearningSwitchPrereqs(sw, VlanVid.ZERO, portModes); } }
/** * Only bits 0-9 of index are used. Bits 10-15 are ignored. * @param index * @param tunnelId * @return */ public static OFGroup createL2DCOFloodOverUnicastTunnels(U16 index, U16 tunnelId) { //8 return OFGroup.of(0 | (index.getRaw() & 0x03ff) | (tunnelId.getRaw() << 12) | (L2OverlaySubType.L2_OVERLAY_FLOOD_OVER_UNICAST_TUNNELS << 10) | (OFDPAGroupType.L2_DATA_CENTER_OVERLAY << 28)); }
/** * Only bits 0-9 of index are used. Bits 10-15 are ignored. * @param index * @param tunnelId * @return */ public static OFGroup createL2DCOFloodOverMulticastTunnels(U16 index, U16 tunnelId) { //8 return OFGroup.of(0 | (index.getRaw() & 0x03ff) | (tunnelId.getRaw() << 12) | (L2OverlaySubType.L2_OVERLAY_FLOOD_OVER_MULTICAST_TUNNELS << 10) | (OFDPAGroupType.L2_DATA_CENTER_OVERLAY << 28)); }
/** * Only bits 0-9 of index are used. Bits 10-15 are ignored. * @param index * @param tunnelId * @return */ public static OFGroup createL2DCOMulticastOverUnicastTunnels(U16 index, U16 tunnelId) { //8 return OFGroup.of(0 | (index.getRaw() & 0x03ff) | (tunnelId.getRaw() << 12) | (L2OverlaySubType.L2_OVERLAY_MULTICAST_OVER_UNICAST_TUNNELS << 10) | (OFDPAGroupType.L2_DATA_CENTER_OVERLAY << 28)); }
/** * Only bits 0-9 of index are used. Bits 10-15 are ignored. * @param index * @param tunnelId * @return */ public static OFGroup createL2DCOMulticastOverMulticastTunnels(U16 index, U16 tunnelId) { //8 return OFGroup.of(0 | (index.getRaw() & 0x03ff) | (tunnelId.getRaw() << 12) | (L2OverlaySubType.L2_OVERLAY_MULTICAST_OVER_MULTICAST_TUNNELS << 10) | (OFDPAGroupType.L2_DATA_CENTER_OVERLAY << 28)); }
private void pushOFCreateGroup(IOFSwitch sw) { /* Creates group flow with set queue option */ OFFactory of13Factory = sw.getOFFactory(); OFGroupAdd addGroup = of13Factory.buildGroupAdd() .setGroup(OFGroup.of(multicastGroup.ofGroupId)) .setGroupType(OFGroupType.ALL) .setBuckets(multicastGroup.getMemberOFBucketList(sw.getId())) .build(); sw.write(addGroup); }
private void pushOFModifyGroup(IOFSwitch sw) { /* Creates group flow with set queue option */ OFFactory of13Factory = sw.getOFFactory(); OFGroupMod modGroup = of13Factory.buildGroupModify() .setGroup(OFGroup.of(multicastGroup.ofGroupId)) .setGroupType(OFGroupType.ALL) .setBuckets(multicastGroup.getMemberOFBucketList(sw.getId())) .build(); sw.write(modGroup); }
protected void pushOFDeleteGroup(IOFSwitch sw) { /* Delete the queues attached to all the member ports*/ long queueId = -1; OFPort ofp = null; ArrayList<OFBucket> ofBuckets = multicastGroup.getMemberOFBucketList(sw.getId()); OVSDBContext ovsdbContext = mcObject.ovsdbChannelMap.get(sw.getId()); for (OFBucket ofb : ofBuckets) { queueId = -1; ofp = null; for (OFAction ofa: ofb.getActions()){ if (ofa.getType() == OFActionType.SET_QUEUE){ OFActionSetQueue ofas = (OFActionSetQueue) ofa; queueId = ofas.getQueueId(); /* removes queue using OVSDBContext on the switch */ } if (ofa.getType() == OFActionType.OUTPUT){ OFActionOutput ofo = (OFActionOutput) ofa; ofp = ofo.getPort(); /* removes queue using OVSDBContext on the switch */ } } if (ofp != null && queueId != -1) ovsdbContext.deleteQueueOnPort(ofp, (int)queueId); else logger.error("pushOFDeleteGroup: unexpected actionset in group bucket"); } /* Creates group flow with set queue option */ OFFactory of13Factory = sw.getOFFactory(); OFGroupDelete delGroup = of13Factory.buildGroupDelete() .setGroup(OFGroup.of(multicastGroup.ofGroupId)) .setGroupType(OFGroupType.ALL) .build(); sw.write(delGroup); }
private void addQoSOFBucketToGroup(IOFSwitch sw, OFPort destPort, long bandwidth) { /* creates queue using OVSDBContext on the switch */ OVSDBContext ovsdbContext = mcObject.ovsdbChannelMap.get(sw.getId()); /* FIXME: hardcoded priority '1' for all flows */ int queueId = ovsdbContext.createQueueOnPort(destPort, Long.toString(bandwidth), "1"); OFFactory of13Factory = sw.getOFFactory(); /* creates actions for the bucket */ ArrayList<OFAction> actionList = new ArrayList<OFAction>(); OFActions actions = of13Factory.actions(); OFActionSetQueue setQueue = actions.buildSetQueue().setQueueId(queueId).build(); actionList.add(setQueue); OFActionOutput output = actions.buildOutput() .setMaxLen(0xFFffFFff) .setPort(destPort).build(); actionList.add(output); /* creates a bucket */ OFBucket bucket = of13Factory.buildBucket() .setActions(actionList) .setWatchGroup(OFGroup.ANY) .setWatchPort(OFPort.ANY) .build(); /* store the bucket in multicastGroup object */ multicastGroup.addMemberOFBucket(sw.getId(), destPort.getShortPortNumber(), bucket); }
private List<OFAction> buildActions(List<Instruction> treatments) { if (treatment == null) { return Collections.emptyList(); } boolean tableFound = false; List<OFAction> actions = new LinkedList<>(); for (Instruction i : treatments) { switch (i.type()) { case NOACTION: return Collections.emptyList(); case L0MODIFICATION: actions.add(buildL0Modification(i)); break; case L1MODIFICATION: actions.add(buildL1Modification(i)); break; case L2MODIFICATION: actions.add(buildL2Modification(i)); break; case L3MODIFICATION: actions.add(buildL3Modification(i)); break; case L4MODIFICATION: actions.add(buildL4Modification(i)); break; case OUTPUT: OutputInstruction out = (OutputInstruction) i; OFActionOutput.Builder action = factory().actions().buildOutput() .setPort(OFPort.of((int) out.port().toLong())); if (out.port().equals(PortNumber.CONTROLLER)) { action.setMaxLen(OFPCML_NO_BUFFER); } actions.add(action.build()); break; case GROUP: GroupInstruction group = (GroupInstruction) i; OFActionGroup.Builder groupBuilder = factory().actions().buildGroup() .setGroup(OFGroup.of(group.groupId().id())); actions.add(groupBuilder.build()); break; case QUEUE: SetQueueInstruction queue = (SetQueueInstruction) i; OFActionSetQueue.Builder queueBuilder = factory().actions().buildSetQueue() .setQueueId(queue.queueId()); actions.add(queueBuilder.build()); break; case TABLE: //FIXME: should not occur here. tableFound = true; break; case EXTENSION: actions.add(buildExtensionAction(((Instructions.ExtensionInstructionWrapper) i) .extensionInstruction())); break; default: log.warn("Instruction type {} not yet implemented.", i.type()); } } if (tableFound && actions.isEmpty()) { // handles the case where there are no actions, but there is // a goto instruction for the next table return Collections.emptyList(); } return actions; }
private List<OFAction> buildActions(TrafficTreatment treatment) { if (treatment == null) { return Collections.emptyList(); } List<OFAction> actions = new LinkedList<>(); for (Instruction i : treatment.allInstructions()) { switch (i.type()) { case L0MODIFICATION: actions.add(buildL0Modification(i)); break; case L2MODIFICATION: actions.add(buildL2Modification(i)); break; case L3MODIFICATION: actions.add(buildL3Modification(i)); break; case OUTPUT: Instructions.OutputInstruction out = (Instructions.OutputInstruction) i; OFActionOutput.Builder action = factory.actions().buildOutput() .setPort(OFPort.of((int) out.port().toLong())); if (out.port().equals(PortNumber.CONTROLLER)) { action.setMaxLen(OFPCML_NO_BUFFER); } actions.add(action.build()); break; case GROUP: Instructions.GroupInstruction grp = (Instructions.GroupInstruction) i; OFActionGroup.Builder actgrp = factory.actions().buildGroup() .setGroup(OFGroup.of(grp.groupId().id())); actions.add(actgrp.build()); break; case EXTENSION: Instructions.ExtensionInstructionWrapper wrapper = (Instructions.ExtensionInstructionWrapper) i; actions.add(buildExtensionAction( wrapper.extensionInstruction(), wrapper.deviceId())); break; default: log.warn("Instruction type {} not yet implemented.", i.type()); } } return actions; }
public static OFGroup createL2Interface(OFPort p, VlanVid v) { //0 return OFGroup.of(0 | p.getShortPortNumber() | (v.getVlan() << 16) | (OFDPAGroupType.L2_INTERFACE << 28)); }
public static OFGroup createL2Multicast(U16 id, VlanVid v) { //3 return OFGroup.of(0 | id.getRaw() | (v.getVlan() << 16) | (OFDPAGroupType.L2_MULTICAST << 28)); }
public static OFGroup createL2Flood(U16 id, VlanVid v) { //4 return OFGroup.of(0 | id.getRaw() | (v.getVlan() << 16) | (OFDPAGroupType.L2_FLOOD << 28)); }