Search in sources :

Example 1 with TruncateInstruction

use of org.onosproject.net.flow.instructions.Instructions.TruncateInstruction in project onos by opennetworkinglab.

the class PiReplicationGroupTranslatorImpl method translate.

/**
 * Returns a PI PRE entry equivalent to the given group, for the given
 * pipeconf and device.
 * <p>
 * The passed group is expected to have type {@link GroupDescription.Type#ALL}
 * or {@link GroupDescription.Type#CLONE}.
 *
 * @param group    group
 * @param pipeconf pipeconf
 * @param device   device
 * @return PI PRE entry
 * @throws PiTranslationException if the group cannot be translated
 */
static PiPreEntry translate(Group group, PiPipeconf pipeconf, Device device) throws PiTranslationException {
    checkNotNull(group);
    final List<OutputInstruction> outInstructions = Lists.newArrayList();
    int truncateMaxLen = PiCloneSessionEntry.DO_NOT_TRUNCATE;
    for (GroupBucket bucket : group.buckets().buckets()) {
        int numInstructionsInBucket = bucket.treatment().allInstructions().size();
        List<OutputInstruction> outputs = getInstructions(bucket, Instruction.Type.OUTPUT, OutputInstruction.class);
        List<TruncateInstruction> truncates = getInstructions(bucket, Instruction.Type.TRUNCATE, TruncateInstruction.class);
        if (outputs.size() != 1) {
            throw new PiTranslationException("support only groups with just one OUTPUT instruction per bucket");
        }
        outInstructions.add(outputs.get(0));
        if (truncates.size() != 0) {
            if (group.type() != GroupDescription.Type.CLONE) {
                throw new PiTranslationException("only CLONE group support truncate instruction");
            }
            if (truncates.size() != 1) {
                throw new PiTranslationException("support only groups with just one TRUNCATE instruction per bucket");
            }
            int truncateInstMaxLen = truncates.get(0).maxLen();
            if (truncateMaxLen != PiCloneSessionEntry.DO_NOT_TRUNCATE && truncateMaxLen != truncateInstMaxLen) {
                throw new PiTranslationException("all TRUNCATE instruction must be the same in a CLONE group");
            }
            truncateMaxLen = truncateInstMaxLen;
        } else if (truncateMaxLen != PiCloneSessionEntry.DO_NOT_TRUNCATE) {
            // No truncate instruction found in this bucket, but previous bucket contains one.
            throw new PiTranslationException("all TRUNCATE instruction must be the same in a CLONE group");
        }
        if (numInstructionsInBucket != outputs.size() + truncates.size()) {
            throw new PiTranslationException("bucket contains unsupported instruction(s)");
        }
    }
    switch(group.type()) {
        case ALL:
            return PiMulticastGroupEntry.builder().withGroupId(group.id().id()).addReplicas(getReplicas(outInstructions, device)).build();
        case CLONE:
            return PiCloneSessionEntry.builder().withSessionId(group.id().id()).addReplicas(getReplicas(outInstructions, device)).withMaxPacketLengthBytes(truncateMaxLen).build();
        default:
            throw new PiTranslationException(format("group type %s not supported", group.type()));
    }
}
Also used : OutputInstruction(org.onosproject.net.flow.instructions.Instructions.OutputInstruction) TruncateInstruction(org.onosproject.net.flow.instructions.Instructions.TruncateInstruction) GroupBucket(org.onosproject.net.group.GroupBucket) PiTranslationException(org.onosproject.net.pi.service.PiTranslationException)

Aggregations

OutputInstruction (org.onosproject.net.flow.instructions.Instructions.OutputInstruction)1 TruncateInstruction (org.onosproject.net.flow.instructions.Instructions.TruncateInstruction)1 GroupBucket (org.onosproject.net.group.GroupBucket)1 PiTranslationException (org.onosproject.net.pi.service.PiTranslationException)1