private TrafficTreatment buildTreatment() { TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder(); for (OFInstruction in : instructions) { switch (in.getType()) { case GOTO_TABLE: builder.transition(((int) ((OFInstructionGotoTable) in) .getTableId().getValue())); break; case WRITE_METADATA: OFInstructionWriteMetadata m = (OFInstructionWriteMetadata) in; builder.writeMetadata(m.getMetadata().getValue(), m.getMetadataMask().getValue()); break; case WRITE_ACTIONS: builder.deferred(); buildActions(((OFInstructionWriteActions) in).getActions(), builder); break; case APPLY_ACTIONS: builder.immediate(); buildActions(((OFInstructionApplyActions) in).getActions(), builder); break; case CLEAR_ACTIONS: builder.wipeDeferred(); break; case EXPERIMENTER: break; case METER: break; default: log.warn("Unknown instructions type {}", in.getType()); } } return builder.build(); }
/** * Convert the string representation of an OFInstructionWriteActions to * an OFInstructionWriteActions. The instruction will be set within the * OFFlowMod.Builder provided. Notice nothing is returned, but the * side effect is the addition of an instruction in the OFFlowMod.Builder. * @param fmb; The FMB in which to append the new instruction * @param instStr; The string to parse the instruction from * @param log */ public static void writeActionsFromString(OFFlowMod.Builder fmb, String inst, Logger log) { if (fmb.getVersion().compareTo(OFVersion.OF_11) < 0) { log.error("Write Actions Instruction not supported in OpenFlow 1.0"); return; } OFFlowMod.Builder tmpFmb = OFFactories.getFactory(fmb.getVersion()).buildFlowModify(); // ActionUtils.fromString() will use setActions(), which should not be used for OF1.3; use temp to avoid overwriting any applyActions data OFInstructionWriteActions.Builder ib = OFFactories.getFactory(fmb.getVersion()).instructions().buildWriteActions(); ActionUtils.fromString(tmpFmb, inst, log); ib.setActions(tmpFmb.getActions()); log.debug("Appending WriteActions instruction: {}", ib.build()); appendInstruction(fmb, ib.build()); log.debug("All instructions after append: {}", fmb.getInstructions()); }
private TrafficTreatment buildTreatment() { TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder(); // If this is a drop rule if (instructions.size() == 0) { builder.drop(); return builder.build(); } for (OFInstruction in : instructions) { switch (in.getType()) { case GOTO_TABLE: builder.transition(tableType); break; case WRITE_METADATA: break; case WRITE_ACTIONS: builder.deferred(); buildActions(((OFInstructionWriteActions) in).getActions(), builder); break; case APPLY_ACTIONS: builder.immediate(); buildActions(((OFInstructionApplyActions) in).getActions(), builder); break; case CLEAR_ACTIONS: builder.wipeDeferred(); break; case EXPERIMENTER: break; case METER: break; default: log.warn("Unknown instructions type {}", in.getType()); } } return builder.build(); }
public static void serializeInstructionList(JsonGenerator jGen, List<OFInstruction> instructions) throws IOException, JsonProcessingException { jGen.writeObjectFieldStart("instructions"); if (instructions.isEmpty()) { jGen.writeStringField("none", "drop"); } else { for (OFInstruction i : instructions) { switch (i.getType()) { case CLEAR_ACTIONS: jGen.writeObjectFieldStart(InstructionUtils.STR_CLEAR_ACTIONS); break; case WRITE_METADATA: jGen.writeObjectFieldStart(InstructionUtils.STR_WRITE_METADATA); jGen.writeNumberField(InstructionUtils.STR_WRITE_METADATA, ((OFInstructionWriteMetadata)i).getMetadata().getValue()); jGen.writeNumberField(InstructionUtils.STR_WRITE_METADATA + "_mask", ((OFInstructionWriteMetadata)i).getMetadataMask().getValue()); break; case EXPERIMENTER: jGen.writeObjectFieldStart(InstructionUtils.STR_EXPERIMENTER); jGen.writeNumberField(InstructionUtils.STR_EXPERIMENTER, ((OFInstructionExperimenter)i).getExperimenter()); break; case GOTO_TABLE: jGen.writeObjectFieldStart(InstructionUtils.STR_GOTO_TABLE); jGen.writeNumberField(InstructionUtils.STR_GOTO_TABLE, ((OFInstructionGotoTable)i).getTableId().getValue()); break; case METER: jGen.writeObjectFieldStart(InstructionUtils.STR_GOTO_METER); jGen.writeNumberField(InstructionUtils.STR_GOTO_METER, ((OFInstructionMeter)i).getMeterId()); break; case APPLY_ACTIONS: jGen.writeObjectFieldStart(InstructionUtils.STR_APPLY_ACTIONS); OFActionListSerializer.serializeActions(jGen, ((OFInstructionApplyActions)i).getActions()); break; case WRITE_ACTIONS: jGen.writeObjectFieldStart(InstructionUtils.STR_WRITE_ACTIONS); OFActionListSerializer.serializeActions(jGen, ((OFInstructionWriteActions)i).getActions()); default: // shouldn't ever get here break; } // end switch on instruction jGen.writeEndObject(); // end specific instruction } // end for instructions } // end process instructions (OF1.1+ only) jGen.writeEndObject(); // end object (either has instructions or a "none":"drop" key:value as specified above) }
public static void serializeInstructionList(JsonGenerator jGen, List<OFInstruction> instructions) throws IOException, JsonProcessingException { jGen.writeObjectFieldStart("instructions"); if (instructions.isEmpty()) { jGen.writeStringField("none", "drop"); } else { for (OFInstruction i : instructions) { switch (i.getType()) { case CLEAR_ACTIONS: jGen.writeObjectFieldStart(InstructionUtils.STR_CLEAR_ACTIONS); break; case WRITE_METADATA: jGen.writeStartObject(); jGen.writeNumberField(InstructionUtils.STR_WRITE_METADATA, ((OFInstructionWriteMetadata)i).getMetadata().getValue()); jGen.writeNumberField(InstructionUtils.STR_WRITE_METADATA + "_mask", ((OFInstructionWriteMetadata)i).getMetadataMask().getValue()); break; case EXPERIMENTER: jGen.writeStartObject(); jGen.writeNumberField(InstructionUtils.STR_EXPERIMENTER, ((OFInstructionExperimenter)i).getExperimenter()); break; case GOTO_TABLE: jGen.writeStartObject(); jGen.writeNumberField(InstructionUtils.STR_GOTO_TABLE, ((OFInstructionGotoTable)i).getTableId().getValue()); break; case METER: jGen.writeStartObject(); jGen.writeNumberField(InstructionUtils.STR_GOTO_METER, ((OFInstructionMeter)i).getMeterId()); break; case APPLY_ACTIONS: jGen.writeObjectFieldStart(InstructionUtils.STR_APPLY_ACTIONS); OFActionListSerializer.serializeActions(jGen, ((OFInstructionApplyActions)i).getActions()); break; case WRITE_ACTIONS: jGen.writeObjectFieldStart(InstructionUtils.STR_WRITE_ACTIONS); OFActionListSerializer.serializeActions(jGen, ((OFInstructionWriteActions)i).getActions()); default: // shouldn't ever get here break; } // end switch on instruction jGen.writeEndObject(); // end specific instruction } // end for instructions jGen.writeEndObject(); } // end process instructions (OF1.1+ only) }
private TrafficTreatment buildTreatment() { TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder(); for (OFInstruction in : instructions) { switch (in.getType()) { case GOTO_TABLE: builder.transition(((int) ((OFInstructionGotoTable) in) .getTableId().getValue())); break; case WRITE_METADATA: OFInstructionWriteMetadata m = (OFInstructionWriteMetadata) in; builder.writeMetadata(m.getMetadata().getValue(), m.getMetadataMask().getValue()); break; case WRITE_ACTIONS: builder.deferred(); buildActions(((OFInstructionWriteActions) in).getActions(), builder); break; case APPLY_ACTIONS: builder.immediate(); buildActions(((OFInstructionApplyActions) in).getActions(), builder); break; case CLEAR_ACTIONS: builder.wipeDeferred(); break; case STAT_TRIGGER: OFInstructionStatTrigger statTrigger = (OFInstructionStatTrigger) in; buildStatTrigger(statTrigger.getThresholds(), statTrigger.getFlags(), builder); break; case EXPERIMENTER: break; case METER: break; default: log.warn("Unknown instructions type {}", in.getType()); } } return builder.build(); }
/** * Convert an OFInstructionWriteActions to string form. The string will be formatted * in a dpctl/ofctl-style syntax. * @param inst; The instruction to convert to a string * @param log * @return */ public static String writeActionsToString(OFInstructionWriteActions inst, Logger log) throws Exception { return ActionUtils.actionsToString(inst.getActions(), log); }