use of org.onosproject.net.flow.instructions.Instruction in project onos by opennetworkinglab.
the class HPPipelineV3 method tableIdForForwardingObjective.
@Override
protected int tableIdForForwardingObjective(TrafficSelector selector, TrafficTreatment treatment) {
boolean hardwareProcess = true;
log.debug("HP V3 Driver - Evaluating the ForwardingObjective for proper TableID");
// Check criteria supported in hardware
for (Criterion criterion : selector.criteria()) {
if (!this.hardwareCriteria.contains(criterion.type())) {
log.warn("HP V3 Driver - criterion {} only supported in SOFTWARE", criterion.type());
hardwareProcess = false;
break;
}
// HP3800 does not support hardware match on ETH_TYPE of value TYPE_VLAN
if (criterion.type() == Criterion.Type.ETH_TYPE) {
if (((EthTypeCriterion) criterion).ethType().toShort() == Ethernet.TYPE_VLAN) {
log.warn("HP V3 Driver - ETH_TYPE == VLAN (0x8100) is only supported in software");
hardwareProcess = false;
break;
}
}
}
// If criteria can be processed in hardware, then check treatment
if (hardwareProcess) {
for (Instruction instruction : treatment.allInstructions()) {
// Check if the instruction type is contained in the hardware instruction
if (!this.hardwareInstructions.contains(instruction.type())) {
log.warn("HP V3 Driver - instruction {} only supported in SOFTWARE", instruction.type());
hardwareProcess = false;
break;
}
/**
* If output is CONTROLLER_PORT the flow entry could be installed in hardware
* but is anyway processed in software because OPENFLOW header has to be added
*/
if (instruction.type() == Instruction.Type.OUTPUT) {
if (((Instructions.OutputInstruction) instruction).port() == PortNumber.CONTROLLER) {
log.warn("HP V3 Driver - Forwarding to CONTROLLER only supported in software");
hardwareProcess = false;
break;
}
}
// Check if the specific L2MODIFICATION.subtype is supported in hardware
if (instruction.type() == Instruction.Type.L2MODIFICATION) {
if (!this.hardwareInstructionsL2mod.contains(((L2ModificationInstruction) instruction).subtype())) {
log.warn("HP V3 Driver - L2MODIFICATION.subtype {} only supported in SOFTWARE", ((L2ModificationInstruction) instruction).subtype());
hardwareProcess = false;
break;
}
}
// Check if the specific L3MODIFICATION.subtype is supported in hardware
if (instruction.type() == Instruction.Type.L3MODIFICATION) {
if (!this.hardwareInstructionsL3mod.contains(((L3ModificationInstruction) instruction).subtype())) {
log.warn("HP V3 Driver - L3MODIFICATION.subtype {} only supported in SOFTWARE", ((L3ModificationInstruction) instruction).subtype());
hardwareProcess = false;
break;
}
}
// Check if the specific L4MODIFICATION.subtype is supported in hardware
if (instruction.type() == Instruction.Type.L4MODIFICATION) {
if (!this.hardwareInstructionsL4mod.contains(((L4ModificationInstruction) instruction).subtype())) {
log.warn("HP V3 Driver - L4MODIFICATION.subtype {} only supported in SOFTWARE", ((L4ModificationInstruction) instruction).subtype());
hardwareProcess = false;
break;
}
}
// TODO --- check if all the buckets contains one and only one output action
if (instruction.type() == Instruction.Type.GROUP) {
boolean groupInstalled = false;
GroupId groupId = ((Instructions.GroupInstruction) instruction).groupId();
Iterable<Group> groupsOnDevice = groupService.getGroups(deviceId);
for (Group group : groupsOnDevice) {
if ((group.state() == Group.GroupState.ADDED) && (group.id().equals(groupId))) {
groupInstalled = true;
if (group.type() != Group.Type.ALL) {
log.warn("HP V3 Driver - group type {} only supported in SOFTWARE", group.type().toString());
hardwareProcess = false;
}
break;
}
}
if (!groupInstalled) {
log.warn("HP V3 Driver - referenced group is not installed on the device.");
hardwareProcess = false;
}
}
}
}
if (hardwareProcess) {
log.warn("HP V3 Driver - This flow rule is supported in HARDWARE");
return HP_HARDWARE_TABLE;
} else {
// TODO: create a specific flow in table 100 to redirect selected traffic on table 200
log.warn("HP V3 Driver - This flow rule is only supported in SOFTWARE");
return HP_SOFTWARE_TABLE;
}
}
use of org.onosproject.net.flow.instructions.Instruction in project onos by opennetworkinglab.
the class HPPipelineV3800 method checkUnSupportedFeatures.
// Return TRUE if ForwardingObjective fwd includes UNSUPPORTED features
@Override
protected boolean checkUnSupportedFeatures(TrafficSelector selector, TrafficTreatment treatment) {
boolean unsupportedFeatures = false;
for (Criterion criterion : selector.criteria()) {
if (this.unsupportedCriteria.contains(criterion.type())) {
log.warn("HP V3800 Driver - unsupported criteria {}", criterion.type());
unsupportedFeatures = true;
}
}
for (Instruction instruction : treatment.allInstructions()) {
if (this.unsupportedInstructions.contains(instruction.type())) {
log.warn("HP V3800 Driver - unsupported instruction {}", instruction.type());
unsupportedFeatures = true;
}
if (instruction.type() == Instruction.Type.L2MODIFICATION) {
if (this.unsupportedL2mod.contains(((L2ModificationInstruction) instruction).subtype())) {
log.warn("HP V3800 Driver - unsupported L2MODIFICATION instruction {}", ((L2ModificationInstruction) instruction).subtype());
unsupportedFeatures = true;
}
}
if (instruction.type() == Instruction.Type.L3MODIFICATION) {
if (this.unsupportedL3mod.contains(((L3ModificationInstruction) instruction).subtype())) {
log.warn("HP V3800 Driver - unsupported L3MODIFICATION instruction {}", ((L3ModificationInstruction) instruction).subtype());
unsupportedFeatures = true;
}
}
}
return unsupportedFeatures;
}
use of org.onosproject.net.flow.instructions.Instruction in project onos by opennetworkinglab.
the class NewAdaptiveFlowStatsCollector method ofFlowStatsRequestFlowSend.
// send openflow flow stats request message with getting the specific flow entry(fe) to a given switch sw
private void ofFlowStatsRequestFlowSend(FlowEntry fe) {
// set find match
Match match = FlowModBuilder.builder(fe, sw.factory(), Optional.empty(), Optional.of(driverService)).buildMatch();
// set find tableId
TableId tableId = TableId.of(fe.tableId());
// set output port
Instruction ins = fe.treatment().allInstructions().stream().filter(i -> (i.type() == Instruction.Type.OUTPUT)).findFirst().orElse(null);
OFPort ofPort = OFPort.NO_MASK;
if (ins != null) {
Instructions.OutputInstruction out = (Instructions.OutputInstruction) ins;
ofPort = OFPort.of((int) ((out.port().toLong())));
}
OFFlowStatsRequest request = sw.factory().buildFlowStatsRequest().setMatch(match).setTableId(tableId).setOutPort(ofPort).build();
// Wait for 1 second until the FlowRuleProvider finishes to process FlowStatReply message
int loop = 0;
boolean interrupted = false;
while (!interrupted && getFlowMissingXid() != NO_FLOW_MISSING_XID) {
if (loop++ < SLEEP_LOOP_COUNT) {
log.debug("ofFlowStatsRequestFlowSend: previous FlowStatsRequestAll (xid={})" + " does not be processed yet, do sleep for {} ms, for {}", getFlowMissingXid(), SLEEP_MS, sw.getStringId());
try {
sleep(SLEEP_MS);
} catch (InterruptedException ie) {
log.debug("ofFlowStatsRequestFlowSend: Interrupted Exception = {}, for {}", ie.toString(), sw.getStringId());
// for exiting while loop gracefully
interrupted = true;
Thread.currentThread().interrupt();
}
} else {
log.debug("ofFlowStatsRequestFlowSend: previous FlowStatsRequestAll (xid={})" + " does not be processed yet, for {} ms," + " just set xid with NO_FLOW_MISSING_XID, for {}", getFlowMissingXid(), loop * SLEEP_MS, sw.getStringId());
setFlowMissingXid(NO_FLOW_MISSING_XID);
break;
}
}
sw.sendMsg(request);
}
use of org.onosproject.net.flow.instructions.Instruction in project onos by opennetworkinglab.
the class GroupModBuilder method buildActions.
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 L4MODIFICATION:
actions.add(buildL4Modification(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;
}
use of org.onosproject.net.flow.instructions.Instruction in project onos by opennetworkinglab.
the class OpenRoadmFlowRuleProgrammable method buildFlowrule.
/**
* Builds a flow rule from a connection object (as XML object).
*
* @param connection the connection hierarchy
* @return the flow rule
*/
private FlowRule buildFlowrule(HierarchicalConfiguration connection) {
String name = connection.getString("connection-name");
if (name == null) {
log.error("OPENROADM {}: connection name not correctly retrieved", did());
return null;
}
// If the flow entry is not in the cache: return null
FlowRule flowRule = getConnectionCache().get(did(), name);
if (flowRule == null) {
log.error("OPENROADM {}: name {} not in cache. delete editConfig", did(), name);
editConfigDeleteConnection(name);
return null;
} else {
openRoadmLog("connection retrieved {}", name);
}
OpenRoadmFlowRule xc = new OpenRoadmFlowRule(flowRule, getLinePorts());
DeviceService deviceService = this.handler().get(DeviceService.class);
OpenRoadmConnection conn = OpenRoadmConnectionFactory.create(name, xc, deviceService);
OchSignal och = toOchSignalCenterWidth(conn.srcNmcFrequency, conn.srcNmcWidth);
// Build the rule selector and treatment
TrafficSelector selector = DefaultTrafficSelector.builder().matchInPort(conn.inPortNumber).add(Criteria.matchOchSignalType(OchSignalType.FIXED_GRID)).add(Criteria.matchLambda(och)).build();
Instruction ochInstruction = Instructions.modL0Lambda(och);
TrafficTreatment treatment = DefaultTrafficTreatment.builder().add(ochInstruction).setOutput(conn.outPortNumber).build();
return DefaultFlowRule.builder().forDevice(data().deviceId()).makePermanent().withSelector(selector).withTreatment(treatment).withPriority(conn.priority).withCookie(conn.id.value()).build();
}
Aggregations