Search in sources :

Example 6 with ImmutableByteSequence

use of org.onlab.util.ImmutableByteSequence in project onos by opennetworkinglab.

the class PiRangeFieldMatchTest method testConstruction.

/**
 * Checks the construction of a PiRangeFieldMatch object.
 */
@Test
public void testConstruction() {
    final ImmutableByteSequence high = copyFrom(0x50);
    final ImmutableByteSequence low = copyFrom(0x00);
    final PiMatchFieldId piMatchField = PiMatchFieldId.of(VLAN_HEADER_NAME + DOT + VID);
    PiRangeFieldMatch piRangeFieldMatch = new PiRangeFieldMatch(piMatchField, low, high);
    assertThat(piRangeFieldMatch, is(notNullValue()));
    assertThat(piRangeFieldMatch.lowValue(), is(low));
    assertThat(piRangeFieldMatch.highValue(), is(high));
    assertThat(piRangeFieldMatch.type(), is(PiMatchType.RANGE));
}
Also used : PiMatchFieldId(org.onosproject.net.pi.model.PiMatchFieldId) ImmutableByteSequence(org.onlab.util.ImmutableByteSequence) Test(org.junit.Test)

Example 7 with ImmutableByteSequence

use of org.onlab.util.ImmutableByteSequence in project onos by opennetworkinglab.

the class CriterionTranslatorHelper method translateCriterion.

/**
 * Translates a given criterion instance to a PiFieldMatch with the given id, match type, and bit-width.
 *
 * @param fieldId   PI match field identifier
 * @param criterion criterion
 * @param matchType match type
 * @param bitWidth  size of the field match in bits
 * @return a PI field match
 * @throws PiTranslationException if the criterion cannot be translated (see exception message)
 */
static PiFieldMatch translateCriterion(Criterion criterion, PiMatchFieldId fieldId, PiMatchType matchType, int bitWidth) throws PiTranslationException {
    if (!TRANSLATORS.containsKey(criterion.getClass())) {
        throw new PiTranslationException(format("Translation of criterion class %s is not implemented.", criterion.getClass().getSimpleName()));
    }
    try {
        final CriterionTranslator translator = TRANSLATORS.get(criterion.getClass()).newInstance();
        translator.init(criterion, bitWidth);
        switch(matchType) {
            case EXACT:
                return new PiExactFieldMatch(fieldId, translator.exactMatch());
            case OPTIONAL:
                return new PiOptionalFieldMatch(fieldId, translator.exactMatch());
            case TERNARY:
                final Pair<ImmutableByteSequence, ImmutableByteSequence> tp = translator.ternaryMatch();
                return new PiTernaryFieldMatch(fieldId, tp.getLeft(), tp.getRight());
            case LPM:
                final Pair<ImmutableByteSequence, Integer> lp = translator.lpmMatch();
                return new PiLpmFieldMatch(fieldId, lp.getLeft(), lp.getRight());
            default:
                throw new PiTranslationException(format("Translation of criterion %s (%s class) to match type %s is not implemented.", criterion.type().name(), criterion.getClass().getSimpleName(), matchType.name()));
        }
    } catch (ByteSequenceTrimException e) {
        throw new PiTranslationException(format("Size mismatch for criterion %s: %s", criterion.type(), e.getMessage()));
    } catch (CriterionTranslatorException e) {
        throw new PiTranslationException(format("Unable to translate criterion %s: %s", criterion.type(), e.getMessage()));
    } catch (InstantiationException | IllegalAccessException e) {
        // Was not able to instantiate the criterion translator.
        throw new IllegalStateException(e);
    }
}
Also used : IPv6NDTargetAddressCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.IPv6NDTargetAddressCriterionTranslator) IPEcnCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.IPEcnCriterionTranslator) IpCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.IpCriterionTranslator) ArpPaCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.ArpPaCriterionTranslator) PbbIsidCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.PbbIsidCriterionTranslator) TcpPortCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.TcpPortCriterionTranslator) IPv6FlowLabelCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.IPv6FlowLabelCriterionTranslator) TunnelIdCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.TunnelIdCriterionTranslator) EthTypeCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.EthTypeCriterionTranslator) PortCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.PortCriterionTranslator) TcpFlagsCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.TcpFlagsCriterionTranslator) IPv6ExthdrFlagsCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.IPv6ExthdrFlagsCriterionTranslator) EthCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.EthCriterionTranslator) IPProtocolCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.IPProtocolCriterionTranslator) ArpOpCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.ArpOpCriterionTranslator) IPv6NDLinkLayerAddressCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.IPv6NDLinkLayerAddressCriterionTranslator) Icmpv6CodeCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.Icmpv6CodeCriterionTranslator) IcmpTypeCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.IcmpTypeCriterionTranslator) MplsBosCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.MplsBosCriterionTranslator) MetadataCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.MetadataCriterionTranslator) VlanPcpCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.VlanPcpCriterionTranslator) UdpPortCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.UdpPortCriterionTranslator) IPDscpCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.IPDscpCriterionTranslator) VlanIdCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.VlanIdCriterionTranslator) SctpPortCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.SctpPortCriterionTranslator) MplsTcCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.MplsTcCriterionTranslator) ArpHaCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.ArpHaCriterionTranslator) MplsCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.MplsCriterionTranslator) IcmpCodeCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.IcmpCodeCriterionTranslator) Icmpv6TypeCriterionTranslator(org.onosproject.net.pi.impl.CriterionTranslators.Icmpv6TypeCriterionTranslator) PiTernaryFieldMatch(org.onosproject.net.pi.runtime.PiTernaryFieldMatch) PiTranslationException(org.onosproject.net.pi.service.PiTranslationException) PiLpmFieldMatch(org.onosproject.net.pi.runtime.PiLpmFieldMatch) PiOptionalFieldMatch(org.onosproject.net.pi.runtime.PiOptionalFieldMatch) CriterionTranslatorException(org.onosproject.net.pi.impl.CriterionTranslator.CriterionTranslatorException) PiExactFieldMatch(org.onosproject.net.pi.runtime.PiExactFieldMatch) ByteSequenceTrimException(org.onlab.util.ImmutableByteSequence.ByteSequenceTrimException) ImmutableByteSequence(org.onlab.util.ImmutableByteSequence)

Example 8 with ImmutableByteSequence

use of org.onlab.util.ImmutableByteSequence in project onos by opennetworkinglab.

the class PacketMetadataCodec method decode.

@Override
protected PiPacketMetadata decode(P4RuntimeOuterClass.PacketMetadata message, P4InfoOuterClass.Preamble ctrlPktMetaPreamble, PiPipeconf pipeconf, P4InfoBrowser browser) throws P4InfoBrowser.NotFoundException, CodecException {
    final P4InfoOuterClass.ControllerPacketMetadata.Metadata pktMeta = browser.packetMetadatas(ctrlPktMetaPreamble.getId()).getById(message.getMetadataId());
    final ImmutableByteSequence value;
    if (browser.isTypeString(pktMeta.getTypeName())) {
        value = copyFrom(new String(message.getValue().toByteArray()));
    } else {
        try {
            value = copyAndFit(message.getValue().asReadOnlyByteBuffer(), pktMeta.getBitwidth());
        } catch (ImmutableByteSequence.ByteSequenceTrimException e) {
            throw new CodecException(e.getMessage());
        }
    }
    return PiPacketMetadata.builder().withId(PiPacketMetadataId.of(pktMeta.getName())).withValue(value).build();
}
Also used : ByteString(com.google.protobuf.ByteString) ImmutableByteSequence(org.onlab.util.ImmutableByteSequence)

Example 9 with ImmutableByteSequence

use of org.onlab.util.ImmutableByteSequence in project onos by opennetworkinglab.

the class FabricInterpreter method mapInboundPacket.

@Override
public InboundPacket mapInboundPacket(PiPacketOperation packetIn, DeviceId deviceId) throws PiInterpreterException {
    // Assuming that the packet is ethernet, which is fine since fabric.p4
    // can deparse only ethernet packets.
    Ethernet ethPkt;
    try {
        ethPkt = Ethernet.deserializer().deserialize(packetIn.data().asArray(), 0, packetIn.data().size());
    } catch (DeserializationException dex) {
        throw new PiInterpreterException(dex.getMessage());
    }
    // Returns the ingress port packet metadata.
    Optional<PiPacketMetadata> packetMetadata = packetIn.metadatas().stream().filter(m -> m.id().equals(FabricConstants.INGRESS_PORT)).findFirst();
    if (packetMetadata.isPresent()) {
        ImmutableByteSequence portByteSequence = packetMetadata.get().value();
        short s = portByteSequence.asReadOnlyBuffer().getShort();
        ConnectPoint receivedFrom = new ConnectPoint(deviceId, PortNumber.portNumber(s));
        if (!receivedFrom.port().hasName()) {
            receivedFrom = translateSwitchPort(receivedFrom);
        }
        ByteBuffer rawData = ByteBuffer.wrap(packetIn.data().asArray());
        return new DefaultInboundPacket(receivedFrom, ethPkt, rawData);
    } else {
        throw new PiInterpreterException(format("Missing metadata '%s' in packet-in received from '%s': %s", FabricConstants.INGRESS_PORT, deviceId, packetIn));
    }
}
Also used : PiTableId(org.onosproject.net.pi.model.PiTableId) PiPacketMetadata(org.onosproject.net.pi.runtime.PiPacketMetadata) PACKET_OUT(org.onosproject.net.pi.model.PiPacketOperationType.PACKET_OUT) ImmutableByteSequence(org.onlab.util.ImmutableByteSequence) PortNumber(org.onosproject.net.PortNumber) DeviceService(org.onosproject.net.device.DeviceService) ByteBuffer(java.nio.ByteBuffer) ConnectPoint(org.onosproject.net.ConnectPoint) Ethernet(org.onlab.packet.Ethernet) ImmutableList(com.google.common.collect.ImmutableList) DeserializationException(org.onlab.packet.DeserializationException) OutboundPacket(org.onosproject.net.packet.OutboundPacket) ImmutableByteSequence.copyFrom(org.onlab.util.ImmutableByteSequence.copyFrom) Port(org.onosproject.net.Port) PiPacketOperation(org.onosproject.net.pi.runtime.PiPacketOperation) Criterion(org.onosproject.net.flow.criteria.Criterion) TrafficTreatment(org.onosproject.net.flow.TrafficTreatment) FLOOD(org.onosproject.net.PortNumber.FLOOD) Instructions(org.onosproject.net.flow.instructions.Instructions) PiPipelineInterpreter(org.onosproject.net.pi.model.PiPipelineInterpreter) ImmutableSet(com.google.common.collect.ImmutableSet) ImmutableMap(com.google.common.collect.ImmutableMap) DefaultInboundPacket(org.onosproject.net.packet.DefaultInboundPacket) Collection(java.util.Collection) Set(java.util.Set) PiMatchFieldId(org.onosproject.net.pi.model.PiMatchFieldId) FabricConstants(org.onosproject.pipelines.fabric.FabricConstants) String.format(java.lang.String.format) CONTROLLER(org.onosproject.net.PortNumber.CONTROLLER) PiAction(org.onosproject.net.pi.runtime.PiAction) TABLE(org.onosproject.net.PortNumber.TABLE) List(java.util.List) Collectors.toList(java.util.stream.Collectors.toList) DriverHandler(org.onosproject.net.driver.DriverHandler) InboundPacket(org.onosproject.net.packet.InboundPacket) Optional(java.util.Optional) DeviceId(org.onosproject.net.DeviceId) OUTPUT(org.onosproject.net.flow.instructions.Instruction.Type.OUTPUT) DefaultInboundPacket(org.onosproject.net.packet.DefaultInboundPacket) PiPacketMetadata(org.onosproject.net.pi.runtime.PiPacketMetadata) Ethernet(org.onlab.packet.Ethernet) ConnectPoint(org.onosproject.net.ConnectPoint) ByteBuffer(java.nio.ByteBuffer) DeserializationException(org.onlab.packet.DeserializationException) ImmutableByteSequence(org.onlab.util.ImmutableByteSequence)

Example 10 with ImmutableByteSequence

use of org.onlab.util.ImmutableByteSequence in project onos by opennetworkinglab.

the class BasicInterpreterImpl method mapInboundPacket.

@Override
public InboundPacket mapInboundPacket(PiPacketOperation packetIn, DeviceId deviceId) throws PiInterpreterException {
    // Assuming that the packet is ethernet, which is fine since basic.p4
    // can deparse only ethernet packets.
    Ethernet ethPkt;
    try {
        ethPkt = Ethernet.deserializer().deserialize(packetIn.data().asArray(), 0, packetIn.data().size());
    } catch (DeserializationException dex) {
        throw new PiInterpreterException(dex.getMessage());
    }
    // Returns the ingress port packet metadata.
    Optional<PiPacketMetadata> packetMetadata = packetIn.metadatas().stream().filter(m -> m.id().equals(INGRESS_PORT)).findFirst();
    if (packetMetadata.isPresent()) {
        ImmutableByteSequence portByteSequence = packetMetadata.get().value();
        short s = portByteSequence.asReadOnlyBuffer().getShort();
        ConnectPoint receivedFrom = new ConnectPoint(deviceId, PortNumber.portNumber(s));
        ByteBuffer rawData = ByteBuffer.wrap(packetIn.data().asArray());
        return new DefaultInboundPacket(receivedFrom, ethPkt, rawData);
    } else {
        throw new PiInterpreterException(format("Missing metadata '%s' in packet-in received from '%s': %s", INGRESS_PORT, deviceId, packetIn));
    }
}
Also used : PiTableId(org.onosproject.net.pi.model.PiTableId) PortNumber(org.onosproject.net.PortNumber) DeviceService(org.onosproject.net.device.DeviceService) PiActionParam(org.onosproject.net.pi.runtime.PiActionParam) ByteBuffer(java.nio.ByteBuffer) ConnectPoint(org.onosproject.net.ConnectPoint) Ethernet(org.onlab.packet.Ethernet) ImmutableByteSequence.copyFrom(org.onlab.util.ImmutableByteSequence.copyFrom) INGRESS_WCMP_CONTROL_WCMP_TABLE(org.onosproject.pipelines.basic.BasicConstants.INGRESS_WCMP_CONTROL_WCMP_TABLE) Port(org.onosproject.net.Port) Map(java.util.Map) HDR_STANDARD_METADATA_INGRESS_PORT(org.onosproject.pipelines.basic.BasicConstants.HDR_STANDARD_METADATA_INGRESS_PORT) INGRESS_PORT(org.onosproject.pipelines.basic.BasicConstants.INGRESS_PORT) OutputInstruction(org.onosproject.net.flow.instructions.Instructions.OutputInstruction) ImmutableMap(com.google.common.collect.ImmutableMap) Collection(java.util.Collection) EGRESS_PORT(org.onosproject.pipelines.basic.BasicConstants.EGRESS_PORT) String.format(java.lang.String.format) HDR_HDR_ETHERNET_DST_ADDR(org.onosproject.pipelines.basic.BasicConstants.HDR_HDR_ETHERNET_DST_ADDR) List(java.util.List) InboundPacket(org.onosproject.net.packet.InboundPacket) PORT(org.onosproject.pipelines.basic.BasicConstants.PORT) Optional(java.util.Optional) DeviceId(org.onosproject.net.DeviceId) PiPacketMetadata(org.onosproject.net.pi.runtime.PiPacketMetadata) PACKET_OUT(org.onosproject.net.pi.model.PiPacketOperationType.PACKET_OUT) HDR_HDR_ETHERNET_ETHER_TYPE(org.onosproject.pipelines.basic.BasicConstants.HDR_HDR_ETHERNET_ETHER_TYPE) ImmutableByteSequence(org.onlab.util.ImmutableByteSequence) INGRESS_TABLE0_CONTROL_DROP(org.onosproject.pipelines.basic.BasicConstants.INGRESS_TABLE0_CONTROL_DROP) AbstractHandlerBehaviour(org.onosproject.net.driver.AbstractHandlerBehaviour) HDR_HDR_ETHERNET_SRC_ADDR(org.onosproject.pipelines.basic.BasicConstants.HDR_HDR_ETHERNET_SRC_ADDR) ImmutableList(com.google.common.collect.ImmutableList) DeserializationException(org.onlab.packet.DeserializationException) OutboundPacket(org.onosproject.net.packet.OutboundPacket) PiPacketOperation(org.onosproject.net.pi.runtime.PiPacketOperation) Criterion(org.onosproject.net.flow.criteria.Criterion) TrafficTreatment(org.onosproject.net.flow.TrafficTreatment) FLOOD(org.onosproject.net.PortNumber.FLOOD) PiPipelineInterpreter(org.onosproject.net.pi.model.PiPipelineInterpreter) DefaultInboundPacket(org.onosproject.net.packet.DefaultInboundPacket) Instruction(org.onosproject.net.flow.instructions.Instruction) NO_ACTION(org.onosproject.pipelines.basic.BasicConstants.NO_ACTION) INGRESS_TABLE0_CONTROL_SEND_TO_CPU(org.onosproject.pipelines.basic.BasicConstants.INGRESS_TABLE0_CONTROL_SEND_TO_CPU) PiMatchFieldId(org.onosproject.net.pi.model.PiMatchFieldId) INGRESS_TABLE0_CONTROL_SET_EGRESS_PORT(org.onosproject.pipelines.basic.BasicConstants.INGRESS_TABLE0_CONTROL_SET_EGRESS_PORT) CONTROLLER(org.onosproject.net.PortNumber.CONTROLLER) HDR_HDR_IPV4_DST_ADDR(org.onosproject.pipelines.basic.BasicConstants.HDR_HDR_IPV4_DST_ADDR) INGRESS_WCMP_CONTROL_SET_EGRESS_PORT(org.onosproject.pipelines.basic.BasicConstants.INGRESS_WCMP_CONTROL_SET_EGRESS_PORT) PiAction(org.onosproject.net.pi.runtime.PiAction) INGRESS_TABLE0_CONTROL_TABLE0(org.onosproject.pipelines.basic.BasicConstants.INGRESS_TABLE0_CONTROL_TABLE0) Collectors.toList(java.util.stream.Collectors.toList) HDR_HDR_IPV4_SRC_ADDR(org.onosproject.pipelines.basic.BasicConstants.HDR_HDR_IPV4_SRC_ADDR) OUTPUT(org.onosproject.net.flow.instructions.Instruction.Type.OUTPUT) PiActionId(org.onosproject.net.pi.model.PiActionId) DefaultInboundPacket(org.onosproject.net.packet.DefaultInboundPacket) PiPacketMetadata(org.onosproject.net.pi.runtime.PiPacketMetadata) Ethernet(org.onlab.packet.Ethernet) ConnectPoint(org.onosproject.net.ConnectPoint) ByteBuffer(java.nio.ByteBuffer) DeserializationException(org.onlab.packet.DeserializationException) ImmutableByteSequence(org.onlab.util.ImmutableByteSequence)

Aggregations

ImmutableByteSequence (org.onlab.util.ImmutableByteSequence)20 PiMatchFieldId (org.onosproject.net.pi.model.PiMatchFieldId)10 Test (org.junit.Test)8 TrafficTreatment (org.onosproject.net.flow.TrafficTreatment)5 PiAction (org.onosproject.net.pi.runtime.PiAction)5 ImmutableList (com.google.common.collect.ImmutableList)4 ImmutableMap (com.google.common.collect.ImmutableMap)4 String.format (java.lang.String.format)4 ByteBuffer (java.nio.ByteBuffer)4 Collection (java.util.Collection)4 List (java.util.List)4 Optional (java.util.Optional)4 Collectors.toList (java.util.stream.Collectors.toList)4 DeserializationException (org.onlab.packet.DeserializationException)4 Ethernet (org.onlab.packet.Ethernet)4 ImmutableByteSequence.copyFrom (org.onlab.util.ImmutableByteSequence.copyFrom)4 ConnectPoint (org.onosproject.net.ConnectPoint)4 DeviceId (org.onosproject.net.DeviceId)4 Port (org.onosproject.net.Port)4 PortNumber (org.onosproject.net.PortNumber)4