X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflow-protocol-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowjava%2Fprotocol%2Fimpl%2Fdeserialization%2Ffactories%2FPacketInMessageFactory.java;h=44679569d44ec2eaef87abfd0626b37feb8901c4;hb=29a2a074c78708f6d18583779ece96bb6573f0c6;hp=a8733aff4f3b9f3f1409ab4a2c67e267b854e67a;hpb=221d25d81c123970bcc912f0a6329a9aa45fb5f7;p=openflowjava.git diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/PacketInMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/PacketInMessageFactory.java index a8733aff..44679569 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/PacketInMessageFactory.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/PacketInMessageFactory.java @@ -1,56 +1,62 @@ -package org.opendaylight.openflowjava.protocol.impl.deserialization.factories; - -import io.netty.buffer.ByteBuf; - -import java.math.BigInteger; - -import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder; - -/** - * @author michal.polkorab - * @author timotej.kubas - */ -public class PacketInMessageFactory implements OFDeserializer { - - private static PacketInMessageFactory instance; - private static final byte PADDING_IN_PACKET_IN_HEADER = 2; - - private PacketInMessageFactory() { - // Singleton - } - - /** - * @return singleton factory - */ - public static PacketInMessageFactory getInstance(){ - if(instance == null){ - instance = new PacketInMessageFactory(); - } - - return instance; - } - - @Override - public PacketInMessage bufferToMessage(ByteBuf rawMessage, short version) { - PacketInMessageBuilder pimb = new PacketInMessageBuilder(); - pimb.setVersion(version); - pimb.setXid(rawMessage.readUnsignedInt()); - pimb.setBufferId(rawMessage.readUnsignedInt()); - pimb.setTotalLen(rawMessage.readUnsignedShort()); - pimb.setReason(rawMessage.readUnsignedByte()); - pimb.setTableId(new TableId((long)rawMessage.readUnsignedByte())); - - byte[] cookie = new byte[8]; - rawMessage.readBytes(cookie); - pimb.setCookie(new BigInteger(cookie)); - // TODO - implement match factories to finish this factory - rawMessage.skipBytes(PADDING_IN_PACKET_IN_HEADER); - - pimb.setData(rawMessage.readBytes(rawMessage.readableBytes()).array()); - - return pimb.build(); - } -} +/* + * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.openflowjava.protocol.impl.deserialization.factories; + +import io.netty.buffer.ByteBuf; + +import java.math.BigInteger; + +import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry; +import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; +import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder; + +/** + * Translates PacketIn messages + * @author michal.polkorab + * @author timotej.kubas + */ +public class PacketInMessageFactory implements OFDeserializer, + DeserializerRegistryInjector { + + private static final byte PADDING_IN_PACKET_IN_HEADER = 2; + private static final MessageCodeKey MATCH_KEY = new MessageCodeKey( + EncodeConstants.OF13_VERSION_ID, EncodeConstants.EMPTY_VALUE, Match.class); + private DeserializerRegistry registry; + + @Override + public PacketInMessage deserialize(final ByteBuf rawMessage) { + PacketInMessageBuilder builder = new PacketInMessageBuilder(); + builder.setVersion((short) EncodeConstants.OF13_VERSION_ID); + builder.setXid(rawMessage.readUnsignedInt()); + builder.setBufferId(rawMessage.readUnsignedInt()); + builder.setTotalLen(rawMessage.readUnsignedShort()); + builder.setReason(PacketInReason.forValue(rawMessage.readUnsignedByte())); + builder.setTableId(new TableId((long)rawMessage.readUnsignedByte())); + byte[] cookie = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES]; + rawMessage.readBytes(cookie); + builder.setCookie(new BigInteger(1, cookie)); + OFDeserializer matchDeserializer = registry.getDeserializer(MATCH_KEY); + builder.setMatch(matchDeserializer.deserialize(rawMessage)); + rawMessage.skipBytes(PADDING_IN_PACKET_IN_HEADER); + builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array()); + return builder.build(); + } + + @Override + public void injectDeserializerRegistry(final DeserializerRegistry deserializerRegistry) { + registry = deserializerRegistry; + } +}