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 an OFInstructionMetadata 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 writeMetadataToString(OFInstructionWriteMetadata inst, Logger log) { /* * U64.toString() formats with a leading 0x */ if (inst.getMetadataMask().equals(U64.NO_MASK)) { // don't give the mask if it's all 1's --> omit "/" return inst.getMetadata().toString(); } else { return inst.getMetadata().toString() + "/" + inst.getMetadataMask().toString(); } }
/** * Convert an OFInstructionMetadata 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 writeMetadataToString(OFInstructionWriteMetadata inst, Logger log) { /* * U64.toString() looks like it formats with a leading 0x. getLong() will allow us to work with just the value * For the rest api though, will the user provide a hex value or a long? I'd guess a hex value would be more useful. */ return STR_SUB_WRITE_METADATA_METADATA + "=" + Long.toString(inst.getMetadata().getValue()) + "," + STR_SUB_WRITE_METADATA_MASK + "=" + Long.toString(inst.getMetadataMask().getValue()); }
/** * Convert the string representation of an OFInstructionMetadata to * an OFInstructionMetadata. 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 writeMetadataFromString(OFFlowMod.Builder fmb, String inst, Logger log) { if (inst == null || inst.equals("")) { return; } if (fmb.getVersion().compareTo(OFVersion.OF_11) < 0) { log.error("Write Metadata Instruction not supported in OpenFlow 1.0"); return; } // Split into pairs of key=value String[] tokens = inst.split(","); if (tokens.length != 2) { throw new IllegalArgumentException("Tokens " + tokens + " does not have form '[t1, t2]' parsing " + inst); } OFInstructionWriteMetadata.Builder ib = OFFactories.getFactory(fmb.getVersion()).instructions().buildWriteMetadata(); // Process tokens (should be metadata or its mask) for (int i = 0; i < tokens.length; i++) { String[] keyValue = tokens[0].split("="); if (keyValue.length != 2) { throw new IllegalArgumentException("[Key, Value] " + keyValue + " does not have form 'key=value' parsing " + inst); } switch (keyValue[0]) { case STR_SUB_WRITE_METADATA_METADATA: ib.setMetadata(U64.of(Long.parseLong(keyValue[1]))); break; case STR_SUB_WRITE_METADATA_MASK: ib.setMetadataMask(U64.of(Long.parseLong(keyValue[1]))); default: log.error("Invalid String key for OFInstructionWriteMetadata: {}", keyValue[0]); } } log.debug("Appending WriteMetadata instruction: {}", ib.build()); appendInstruction(fmb, ib.build()); log.debug("All instructions after append: {}", fmb.getInstructions()); }
/** * Convert the string representation of an OFInstructionMetadata to * an OFInstructionMetadata. 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 writeMetadataFromString(OFFlowMod.Builder fmb, String inst, Logger log) { if (inst == null || inst.equals("")) { return; } if (fmb.getVersion().compareTo(OFVersion.OF_11) < 0) { log.error("Write Metadata Instruction not supported in OpenFlow 1.0"); return; } OFInstructionWriteMetadata.Builder ib = OFFactories.getFactory(fmb.getVersion()).instructions().buildWriteMetadata(); // Process tokens (should be metadata or its mask) String[] keyValue = inst.split("/"); if (keyValue.length > 2) { throw new IllegalArgumentException("[Metadata, Mask] " + keyValue + " does not have form 'metadata/mask' or 'metadata' for parsing " + inst); } else if (keyValue.length == 1) { log.debug("No mask detected in OFInstructionWriteMetaData string."); } else if (keyValue.length == 2) { log.debug("Detected mask in OFInstructionWriteMetaData string."); } // Get the metadata if (keyValue[0].startsWith("0x")) { ib.setMetadata(U64.of(Long.valueOf(keyValue[0].replaceFirst("0x", ""), 16))); } else { ib.setMetadata(U64.of(Long.valueOf(keyValue[0]))); } // Get the optional mask if (keyValue.length == 2) { if (keyValue[1].startsWith("0x")) { ib.setMetadataMask(U64.of(Long.valueOf(keyValue[1].replaceFirst("0x", ""), 16))); } else { ib.setMetadataMask(U64.of(Long.valueOf(keyValue[1]))); } } else { ib.setMetadataMask(U64.NO_MASK); } log.debug("Appending WriteMetadata instruction: {}", ib.build()); appendInstruction(fmb, ib.build()); log.debug("All instructions after append: {}", fmb.getInstructions()); }
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(); }